iBeacon で忍者が密会する

  • 51
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

先日、iBeacon を使ったアプリを AppStore で公開しましたので、簡単に紹介させていただきたいと思います。このアプリは複数名で開発しており、私は実装担当でした。

iBeacon の特徴

iBeacon は、ざっくり言えば、様々な機器が発するビーコン信号を iOS デバイスが検出する仕組みです。

iBeacon の特徴を簡単に述べておきます。詳しい情報は、昨日や一昨日の Advent Calendar の記事が参考になると思います。

  • BLE (Bluetooth Low Energy) を利用
    • 一般の BLE 通信と異なり、ペアリングが不要
  • 受信側デバイス
    • BLE 搭載の iOS デバイス
  • 発信側デバイス
    • BLE 搭載の機器で、iBeacon 仕様のビーコン発信を実装したもの
  • アプリがバックグラウンドのときでも、ビーコンを検出してユーザに通知できる
  • おおまかな距離の情報が取得できる

Ninja Tryst では

今回のアプリ開発ではこれらの特徴の中から、距離の情報が取得できる、という点に着目してみました。

iBeacon の実装

次に、iBeacon をアプリに組み込む実装方法を簡単に述べておきます。これも、詳しい情報は、昨日や一昨日の Advent Calendar の記事が参考になると思います。

また個人的には、WWDC のサンプルコードである AirLocate のコードを参考資料として読みました。iOS Dev Center でダウンロードできます。

ビーコンの受信

BLE を利用していますが、Core Bluetooth を使うわけではありません。iBeacon は、Region Monitoring に近い性格のものとして位置づけられているように思えます。

  • Core Location フレームワークを使う
    • 従来は、位置情報取得や Region Monitoring の機能があった
    • ここに iBeacon 受信機能が追加された
  • CLLocationManager
    • ビーコン領域の検出
      • startMonitoringForRegion: で開始
      • ビーコン領域に入ったり出たりすると locationManager:didDetermineState:forRegion: が呼ばれる
    • 個々のビーコン信号を取得
      • startRangingBeaconsInRegion: で開始
      • ビーコン信号を取得すると locationManager:didRangeBeacons:inRegion: が呼ばれる

ビーコンの発信

iOS デバイスは主にビーコンの受信側として使われることが多いと思いますが、ビーコンの発信側になることもできます。こちらは、BLE 周辺機器として実装します。

  • Core Bluetooth フレームワークを使う
  • CBPeripheralManager
    • ビーコン発信
      • startAdvertising: で発信
      • 発信するデータは CLBeaconRegion で生成する(peripheralDataWithMeasuredPower: を使う)

Ninja Tryst では

iBeacon は一般的には、ビーコン発信器を特定の場所に固定で設置して、iOS デバイスがビーコン受信器になる、という使い方です。

しかし今回のアプリ開発では、iOS デバイスが発信側にもなれる、という点に着目して、iOS デバイス同士でビーコンの発信・受信を行うようにしました。

  • ビーコンの発信と受信を同時に行う
    • CLLocationManagerCBPeripheralManager を両方動かす
  • 2台のデバイスそれぞれがお互いのビーコンを受信する

Ninja Tryst の概要

さて、アプリの紹介ですが、一言でいえば、待ち合わせを手助けするアプリです。ビーコンによって、相手までのおおまかな距離をアプリ画面に表示します。

という書き方をすると真面目なアプリのようですが、ビーコンで忍者が密会するアプリです。ぶっちゃけ、アホアプリの部類に入ります(注:「アホアプリ」という言葉は褒め言葉です)。

まあ、はっきり言って、ちゃんと使おうとすると不便なアプリです。

詳しくは、公式 Web サイトがオススメです。また、開発メンバの紹介記事も見ていただくのがいいかと思います。

距離の表示

距離は次の4段階で表示しています。

  • 隠:ビーコン未検知
  • 忍:ビーコンの proximity の値が Far
  • 獲:ビーコンの proximity の値が Near
  • 顕:ビーコンの proximity の値が Immediate

実際に動かしてみて

ビーコンから取得できる距離情報に注目したわけですが、期待していたほど距離の精度はよくないという印象を受けました。

ビーコンの accuracy プロパティが距離の数値っぽいと思いきや、この数値から正確な距離を知ることは無理でした(そもそも、Apple のドキュメントにそういう目的には使うなと書いてあります)。ビーコンの proximity プロパティがおおまかな距離を示す値ですが、これもわりとブレがあります。また、移動中に値が更新されるのが思ったよりも遅い気がしました。

また、ビーコンからは方向の情報は得られません(BLE だから当たり前といえば当たり前)。下手な使い方では、位置推定に使うのはつらい感じです。

と、欠点ばかりずらずら書きました。それでも、使えない技術だと思っているわけではありません。大事なことは、何ができるのかを把握してうまく使うことです。

iBeacon の特性をつかんで上手に生かすような使い方を考えれば、有益な技術であることは間違いないと思います。