ここのところ、IoT に注目が集まっていますね。さまざまなモノがインターネットにつながって、いままでに無かった価値やサービスが作り出せる、とても魅力的な技術のひとつです。そんな中 IoT 活用のためのキー技術のひとつであるビーコン (Beacon) も、とても注目されている気になる IoT 関連技術のうちのひとつです。
ビーコンは、小さなサイズの情報を一定間隔の時間で繰り返し送信します。技術的にはアドバタイズ モードの Bluetooth LE デバイスとなります。ビーコンからの電波強度などの情報をもとに、ビーコンから受信した側までのおおよその距離を計測することができるのです。そしてビーコンは iOS と Android いずれも受信することができます。このため、この仕組みを活用することにより、あらかじめビーコンを設置しておけば、iOS や Android を持ってビーコンに近づくことにより、かなり詳細な現在位置を把握することができるのです。
さて、このシナリオで IoT を活用するうえで重要になってくるのが、それら iOS や Android 上で動作するアプリが必要だという点です。そして、大抵の場合、それらはカスタムアプリであることが必要なのです。この仕組みの動作において、ビーコンの設置と、それに対応したカスタムアプリの開発が大変重要になってくるのです。
さて、RAD Studio は XE8 から、ビーコンを活用したアプリを開発するための TBeacon という新しいコンポーネントが導入されました。XE7 などの旧バージョンでも、コードをたくさん書けばビーコンを受信することが可能でした。しかし、新しい TBeacon コンポーネントによって、ビーコン活用アプリの開発は飛躍的に簡単になりました。TBeacon コンポーネントをドラッグ&ドロップして いくつかのプロパティを設定すれば、あとはイベント処理を少し書くだけでビーコン活用アプリを開発できるのです。やっかいなコードは TBeacon コンポーネントのなかにカプセリングされているのです!TBeacon は iBeacon と AltBeacon という 2 つの著名なビーコン仕様に対応しています。
今回利用する Beacon
今回の記事は、アプリックス社が提供する MyBeacon というビーコン・デバイスを利用しています。MyBeacon は iBeacon 互換のビーコンで、今回利用したデバイスは USB 給電するタイプのものです。さて、あらかじめ このビーコンのセットアップを実施して UUID をメモしておきましょう。※少なくとも、UUID を正確にメモすること、そして電波の出力を調整する必要があります。

Fig: 今回の記事で利用した、アプリックス社の MyBeacon。iBeacon 互換ビーコン
新しくフォームを作る
次に、RAD Studio をもちいて、新しい「マルチデバイス アプリケーション – Delphi」を作成します。(C++Builder の方は「マルチデバイス アプリケーション – C++Builder」を選択してください)

ここでは iPad Airでアプリを動かします。
プロジェクトのターゲットプラットフォームを iOS デバイス – 32 ビット に切り替えます

ツールパレットから「TBeacon」をみつけて、これをフォームにドラッグ&ドロップします。

これと同じ要領で、「TMemo」を見つけて、これをフォームにドラッグ&ドロップします。位置や大きさも微調整してください。すると、フォームは以下のようになります。

次に、「Beacon1」を選択した状態で、オブジェクト インスペクタの「プロパティ」の「Enabled」の「値」を「True」にします。

※ちなみに、AltBeacon のビーコンデバイスを利用する場合には、「Mode」の値を「Standard」から「Alternative」に変更する必要があります。
そして、オブジェクト インスペクタの「MonitorizedRegion」の「値」の箇所をダブルクリックします。
コレクションのダイアログが開くので「新規に作成」するアイコンをクリックします。

すると、オブジェクトインスペクタに Beacon の UUID や Major, Minor を設定できる画面が開きます。まずは、ここで UUID のみ値をセットします。(ここでは、Major、Minor は変更せず そのままとします)

※予め調べておいた Beacon の UUID を正確に入力してください。(ビーコンデバイス毎に確認方法は異なります。ご使用されるデバイスの説明書等をご確認ください)
コードを書こう
では、続けてコードの入力をおこないます。
オブジェクトインスペクタで「イベント」タブを開き、「OnBeaconProximity」の値(空欄の箇所)をダブルクリックします。(これは、近接検知したときに発生するイベントです)

ここで記述するコードは以下とします。
このコードは、コールバック・イベントとして TBeacon が検知したビーコンの情報を ABeacon に格納されて渡されるので、これを単純な文字列として TMemo に追加表示するものです。
Object Pascal (Delphi) の場合
procedure
TForm1.Beacon1BeaconProximity(const
Sender: TObject;
const
ABeacon: IBeacon; Proximity: TBeaconProximity);
begin
case
Proximity of
TBeaconProximity.Immediate:
Memo1.Lines.Add('Beacon Immediate'
);
TBeaconProximity.Near:
Memo1.Lines.Add('Beacon Near'
);
TBeaconProximity.Far:
Memo1.Lines.Add('Beacon Far'
);
TBeaconProximity.Away:
Memo1.Lines.Add('Beacon Away'
);
else
Memo1.Lines.Add('Beacon Unknown'
);
end
;
end
;
C++ (C++Builder) の場合
void
__fastcall
TForm1::Beacon1BeaconProximity(TObject * const
Sender,
IBeacon * const
ABeacon, TBeaconProximity Proximity) {
switch
(Proximity) {
case
System::Beacon::Immediate:
Memo1->Lines->Add("Beacon Immediate"
);
break
;
case
System::Beacon::Near:
Memo1->Lines->Add("Beacon Near"
);
break
;
case
System::Beacon::Far:
Memo1->Lines->Add("Beacon Far"
);
break
;
case
System::Beacon::Away:
Memo1->Lines->Add("Beacon Away"
);
break
;
default
:
Memo1->Lines->Add("Beacon Unknown"
);
break
;
}
}
アプリを動かしてみよう
そうしたら、あとは実行するだけです。

なお iOS で動作させるためには、iOS の位置情報および Bluetooth を ON にする必要があります。

Fig: 今作った ビーコン利用アプリが iOS (iPad Air) 上で動作しているところ
Android アプリの権限設定をしよう
RAD Studio の特徴として、前述の iOS 向けアプリは、ターゲットプラットフォームを切り替えることによりAndroid アプリになり、同じアプリが そのまま Android でも動作するところです。さあ、Android で動かしてみましょう。
プロジェクト マネージャのターゲットプラットフォームを Android に切り替えましょう。

なお Android アプリで Bluetooth を利用できるようにするためには設定が必要です。プロジェクト→オプションで以下のダイアログを開いて設定を行います。
「使用する権限」をクリックして、「Buletooth」および「Bluetooth 管理」の2つについて「true」を設定して、OK を押します。

アプリを動かしてみよう
さて、それでは Android でも動かしてみましょう。

あなたの、はじめての ビーコン利用アプリが Android でも動作しました。

Fig: 今作った ビーコン利用アプリが Android (Nexus 5) 上で動作しているところ