今回beacon関連の仕事があり、実際に某社から出ているBeacon端末を入手し動作確認を行ったので使用感をレポートします。

基本

Beaconから取得出来る情報は以下の3点です。

proximity UUID
128 bit の UUID で表現される識別子です。一番大きなカテゴリになり、組織などの単位の識別子として用いられることが想定されています。

major
16 bit unsigned integer の値で、同一 proximity UUID を持つ Beacon の識別子として利用します。例えば、数店舗の経営をしている各店舗毎の店舗識別に用いることが出来ます。

minor
16 bit unsigned integer の値で、同一 proximity UUID および major を持つ Beacon の識別子として利用します。例えば、各店舗に設置してある1つ1つの端末の認識に用いることが出来、Aエリアに近づいた、Bエリアに近づいたという判定を行うことが想定されます。

もちろん上であげた例は使用方法の1例で、1店舗経営であればmajorでエリアを分けたり、フロアを分けたりと使用方法は自由です。

使用方法

実装と理解にはそこまで時間がかからないと思います。
1.CLLocationManagerを初期化しDelegateを設定する。
2.CLLocationManagerDelegate Methodsを設定する。
Delegate Methodsはたくさんあるが、
locationManagerShouldDisplayHeadingCalibration
didStartMonitoringForRegion:(CLRegion *)region
didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region
didEnterRegion:(CLRegion *)region
didExitRegion:(CLRegion *)region
この辺を実装すれば使用することができるレベルにはなります。
3.didEnterRegion:(CLRegion *)regionにBeacon端末を検知したときのアプリ側の処理を追加
4.didExitRegion:(CLRegion *)regionにBeacon端末から離れたときのアプリ側の処理を追加

実はこんな簡単に実装できてしまいます。
所要時間は1時間程度あれば簡単に作ることが出来ます。

※各メソッドの詳細は公式のリファレンスをご覧ください

実際にテストをしてみた感想

まず思ったことは
iOS7だとdidEnterRegionが不安定
今回は検証の為にLocalPushを実装して確認してみましたが
もっと精度よくエリアに入ったり、出たりのタイミングで
didEnterRegion、didExitRegionが呼ばれると思っていましたが
エリアに入ってからタイムラグがあって通知が来たり、
一旦エリアから出て戻ってきても何も通知がないことなどがありました。

これは、外的環境の影響もあるとは思いますが
購入時に期待してたよりも精度が悪いなぁという印象でした。

しかし、いい意味で期待を裏切ったのは
didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)regionの精度がなかなかいい
このメソッドは常に呼ばれており、Beacon端末を検知すると配列であるbeaconsに検知したすべてのBeacon情報がCLBeaconの形で格納されているので、proximity UUID、major、minor、proximity、accuracy、rssiを取得することが出来ます。

このaccuracyには端末からの距離が格納されておりここの精度がなかなかいいです!
実際の距離と近いものを画面に表示することが出来ます。

ただ、やはり他のサイトでも言われているように間に障害物があったりするとその精度はかなり落ちます。
実際に確認してみたところ0.5mの値を示しているときに間に板を挟んだりすると
数mの値が表示されることがありましたので、この部分についてはやはり限界があると思います。

今回はまだテスト的な使用方法ですので、簡単な検証しか行っていませんが、各デバイスによる受信感度の違いや、各OSでの違いなど比較表ができましたらまとめて掲載したいと思います。

Beacon端末は安価でスタートキットを提供している販売会社もありますし、今後も様々な用途が考えられますので是非一度触ってみて欲しいと思います。

Follow me!