iBeaconを試してみた
iBeaconを試すにあたり、デモアプリを作りました。その際、参考にした記事等、調べたことをまとめます。
Bluetooth Low Enerygとは
Bluetooth Low Energy(以下、BLEと省略)は、Bluetooth4で追加された超低消費電力の通信仕様です。
BLEには、セントラルとペリフェラルという概念があります。通常、iPhoneがセントラル、心拍センサーなどの周辺装置がペリフェラルになります。
iOSアプリケーション開発
iOSアプリケーション開発では、クラシックBluetoothとBluetooth LEデバイスとで、扱いが違います。
ペアリングはない
iOSを通さず、アプリケーションから直接、デバイスの発見と接続ができる
Bluetooth LE用のバックグラウンド・モードがある
Bluetooth LEデバイスには、ペアリングはありません。クラシックBluetoothデバイスは、初めてiPhoneと接続するときに、ペアリングという接続認証が必要でした。Bluetooth LEデバイスでは、接続処理にiOSが一切関与しないため、ペアリングはありません。
Bluetooth LEのデバイスの発見、接続、通信そして切断も、すべてiOSアプリケーションが行います。iOSが関与することはありません。
iOSアプリケーションには、Bluetooth LE専用のバックグラウンド・モードが用意されています。バックグラウンドで、Bluetooth LEデバイスと接続して通信しつづける、あるいはデバイスを発見して接続をすることができます。
Bluetooth LEのネットワーク・トポロジーには、セントラルとペリフェラルという2つの役割があります。前節で例に上げたテレビのリモコンの場合は、テレビがセントラル、リモコンがペリフェラルです。iOS6では、iOSアプリケーションはセントラルにも、ペリフェラルにもなれます。つまり、iOSアプリケーション自体が、テレビのリモコンとして振る舞うことができます。
実装
セントラル app
セントラルの実装は、CoreLocationフレームワークのCLLocationManagerを使い、ペリフェラルを検知します。
CoreLocation framework
CLLocationManager
CLLocationManagerDelegate
CLLocationManagerの作成・モニタリング開始のコード
if ([CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]) {
// Create location manager
self.locationManager = [CLLocationManager new];
self.locationManager.delegate = self;
// Create proximity uuid
self.proximityUUID = [[NSUUID alloc] initWithUUIDString:@"C1B19D33-6EBC-434A-AC9C-39A6A6265C58"];
// Create beacon region
self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:self.proximityUUID identifier:@"testregion"];
// Start monitoring
[self.locationManager startMonitoringForRegion:self.beaconRegion];
}
Beaconを検知した時呼ばれるデリゲートメソッドの引数からCLBeaconオブジェクトを取得し、こやつから、proximityUUIDやrssi情報が取得できます。
- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region
{
if (beacons.count > 0) {
// Get nearest object
CLBeacon *nearestBeacon = beacons.firstObject;
NSString *rangeMessage;
// Decide message distance
switch (nearestBeacon.proximity) {
case CLProximityImmediate:
rangeMessage = @"Range Immediate: ";
break;
case CLProximityNear:
rangeMessage = @"Range Near: ";
break;
case CLProximityFar:
rangeMessage = @"Range Far: ";
break;
default:
rangeMessage = @"Range Unknown: ";
break;
}
ペリフェラル app
ペリフェラルの実装は、CoreBluetoothフレームワークのCBPeripheralManagerを使い、アドバタイズします。
CoreBluetooth framework
CBPeripheralManager
CBPeripheralManagerDelegate
アドバタイズ開始コード
// Create proximity uuid
self.proximityUUID = [[NSUUID alloc] initWithUUIDString:@"C1B19D33-6EBC-434A-AC9C-39A6A6265C58"];
// Create peripheral manager
self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil options:nil];
// Start advertise
if (self.peripheralManager.state == CBPeripheralManagerStatePoweredOn) {
[self startAdvertising];
}
- (void)startAdvertising
{
// Create data for advertise
CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:self.proximityUUID
major:1
minor:2
identifier:@"testregion"];
NSDictionary *beaconPeripheralData = [beaconRegion peripheralDataWithMeasuredPower:nil];
// Start advertise
[self.peripheralManager startAdvertising:beaconPeripheralData];
}
所感
アプリ側で取得できるのは、電波強度とデバイス間の大体の距離でした。
正確な距離(何メートル)とかを取得するのは難しそうです。
Beaconの設置場所へ向かって歩いて通り過ぎると検知できませんでした。
設置場所に止まって5秒くらいたつと検知しました。
今後、Bluetooth Low Enerygについて詳しく調べたいと思います。
引用/参考URL
http://reinforce-lab.github.io
http://reinforce-lab.github.io/blog/2013/01/21/ios-ble-introduction/