WebエンジニアにとってのIoT ~Physical Webが拓く未来~

第4回 Physical WebとiBeacon

この記事を読むのに必要な時間:およそ 3 分

前回までに,現状のPhysical Webの主要なポイントであるUriBeaconとMetadata Resolverについての解説をさせていただきました。

今回はAppleのiBeaconとの比較を行っていきたいと思います。

位置情報サービスの進化

ここ数年のiOSでは,GPSだけでなく,Wi-fiやBLE,iPhone 5Sから追加されたM7コプロセッサのモーションアクテビティなど,様々な技術を利用して位置情報に関連する機能の充実化が進められています。

iBeaconもその流れの中で登場した技術の1つであり,BLEのアドバタイジングパケットを利用した近接検知を利用して,サービスを提供するために使われます。

iOSのSDKにおいて,iBeaconに関するAPIは,CoreBluetoothではなくCoreLocation frameworkに含まれています。つまり位置情報に関連する機能としてカテゴライズされていることがわかります。

iBeaconの技術概要

iBeaconのアドバタイジングパケット

UriBeaconの時に紹介したBLEのアドバタイジングパケットを思い出してみましょう。パケットの中で,サービス提供者がカスタムできる領域は31バイトあり,その中に次のように任意のAd Typeのデータを選んで詰め込んでいくのでした。

図1 UriBeaconのアドバタイジングパケット

図1 UriBeaconのアドバタイジングパケット

UriBeaconのときは,Service UUIDs,Service DataといったAd Typeのデータを詰め込んでいきましたがiBeaconではManufacturer Specific Dataを使います。

図2 iBeaconのアドバタイジングパケット

図2 iBeaconのアドバタイジングパケット

ここにProximityUUIDと言うUUID,Major,Minorという2つの16ビット整数値を載せます。

図3 iBeaconのManufacturer Specific Dataのレイアウト

図3 iBeaconのManufacturer Specific Dataのレイアウト

受信側はこれらの値で,特定のビーコンへの近接検知を行ったり,複数のビーコンを並べて移動の検知を行ったりします。

iOSでのビーコン側の実装

主題が逸れてしまうので,iBeaconを利用するアプリケーションの実装方法などはここでは深く解説はしませんが,アドバタイジンングパケットを発信するビーコン側としての実装にだけ少し言及しておきます。

第2回で触れたように,iOS 6でPeripheral側のサポートも入ったのですが,アドバタイジングパケットに載せることの出来るデータの種類は制限されています。

CBPeripheralManagerのstartAdvertisingメソッドに設定値を入れたディクショナリを渡すことでアドバタイズを開始できるのですが,CBAdvertisementDataLocalNameKey,CBAdvertisementDataServiceUUIDsKeyの2つのキーしか利用することができません。

[self.peripheralManager startAdvertising:@{
  CBAdvertisementDataLocalNameKey: self.localName,
  CBAdvertisementDataServiceUUIDsKey: @[self.myUUID]}]

ですので,Service DataというAd Typeを使うUriBeaconとして振る舞わせることはiOSでは出来ません。

その一方で,CoreBluetoothだけでなくCoreLocationも利用し,CLBeaconRegionを介することで,Manufacturer Specific Dataを載せることができるので,iBeaconのビーコン側の振る舞いをさせることは出来るようになっています。

CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:self.myProximityUUID
                                                                           major:self.myMajorValue
                                                                           minor:self.myMinorValue
                                                                      identifier:@"MyBeaconID"];
NSDictionary *params = [region peripheralDataWithMeasuredPower:nil];
[self.peripheralManager startAdvertising:params];

AndroidでiBeaconの機能を利用する場合

アドバタイジングパケットのフォーマットさえわかればBLEをスキャンし,そのパケットを解析するのもそれほど難しくはありませんが,バックグラウンドでの動作のサポートや,最初からiOSのiBeacon関係のAPIとほぼ同じようなインターフェースを揃えているサードパーティ製ライブラリを利用してしまったほうが楽でしょう。

Radius Networks社が提供しているものが有名です。

サンプルコードを見れば,iOSのAPIとほぼ似たような形で実装が出来ることがわかると思います。

著者プロフィール

加藤亮(かとうりょう)

ソフトウェアエンジニア。

比較的プロトコルとフロントエンド寄り。

2014年7月よりリクルートテクノロジーズアドバンスドテクノロジーラボ所属。

コメント

コメントの記入