たるこすの日記

たるこすの日記

リアルからバーチャルへ、バーチャルからリアルへ

HoloLens で iBeacon を受信する

こんにちは、たるこすです。 今回は HoloLens で iBeacon を受信してみます。

利用したバージョン

  • Unity: 2017.1.0f3

やりたいこと

iBeacon は Bluetooth Low Energy (BLE) を利用した技術です。 事前のコネクションを必要とせず、一方向のデータ送信を行うことができます。

お店やイベントでのチェックイン、クーポン発行などで利用されることが多いかと思いますが、今回は Android 端末から HoloLens アプリを操作するという目的で使ってみます。

まだそこまで作りこんでいないのですが、自作の HoloLens アプリをデモで見せる際などに、アプリを初期状態に戻したり内容を変更する操作に使えると便利な気がします。 Wi-Fi 経由でのやりとりと比べて、ネットワーク接続が不要、IP の指定が不要、複数の HoloLens を同時に操作可能、といったメリットがあります。

Android 端末での iBeacon 送信 

iBeacon の発信は iPhone であれば iPhone 4S 以降の端末で可能なようです。

Android は端末によります。以下のサイトの表で、右端が yes となっているものが発信可能なもののようです。 自分の持っている Nexus 5 は対応していなかったため、今回は妻が持っていた ZenPad を借りました。

よくわからない場合には、以下で紹介するアプリを入れて試してみるのが早いと思います。

iBeacon 送信アプリは自作することも可能ですが、まずは既存のアプリを利用してみます。「Locate Beacon」という Android アプリを使いました。

play.google.com

アプリを起動すると以下のような画面になるので、上から2番目の「Beacon Transmitter」を選択します。

選択すると、以下のような画面が表示されます。

Beacon format は iBeacon を選択します。 また、ID1 が UUID, ID2 が Major ID, ID3 が Minor ID と呼ばれるものです。UUID の付け方に特にルールはなさそうだったので、とりあえずデフォルトで入っていた値のままにしています。

下のほうの「OFF」をタップして「ON」にすれば、iBeacon が送信されます。

HoloLens での iBeacon 受信

新しくプロジェクトを作成し、HoloToolkit の導入や HoloLensCamera の設定、プロジェクト設定などを行います。

また、Bluetooth を利用するため、Player Settings の Capabilities の欄で Bluetooth にチェックを入れます。

空の GameObject を作成し BeaconManager と名前を変更します。これに、以下の BeaconReceiver.cs と BeaconHandler.cs をアタッチします。

BeaconReceiver では BluetoothLEAdvertisementWatcher を利用して BLE のアドバタイズメントパケットを受信します。データを受け取ると Watcher_Received メソッドが呼ばれ、データが iBeacon の仕様に沿っているかをチェックします。iBeacon のデータであれば、BeaconReceived アクションを呼び出します。

BeaconHandler では、先ほどの BeaconReceiver の BeaconReceived に対してコールバックを設定しており、 Inspector で設定した情報と受信した iBeacon のデータが一致していれば、設定された UnityEvent を呼び出します。Inspector での設定は以下のように行います。(Callback の設定は、この後の Cube の作成を行っている必要があります)

また、動作確認用に Cube を作成し、以下の CubeController.cs をアタッチします。

    public bool Moving { set; get; } = false;

6行目の自動プロパティに初期値を与える記法は C# 6 で導入された記法のため、Player Settings で Script Runtime Version を Experimental(.NET 4.6 Equivalent) に変更する必要があります。

CubeController では、Cube の色や動きを変更するメソッド、プロパティを作成しています。これを BeaconHandler から呼び出すように設定し、iBeacon の値に応じて Cube の色や動きを変更します。

デモ動画

実行してみた動画がこちらです。

Receive iBeacon with HoloLens

それほど遅延もなく操作できました。ただ、やはりこのままではどの値がどのコマンドに該当するのが分かりづらいため、Android 端末側のアプリも作ってボタンを押したらそれに対応する iBeacon のデータを送信するようにしたほうが良さそうです。