iBeaconを試してみた

iBeaconを試すにあたり、デモアプリを作りました。その際、参考にした記事等、調べたことをまとめます。


Bluetooth Low Enerygとは

Bluetooth Low Energy(以下、BLEと省略)は、Bluetooth4で追加された超低消費電力の通信仕様です。

BLEには、セントラルとペリフェラルという概念があります。通常、iPhoneがセントラル、心拍センサーなどの周辺装置がペリフェラルになります。

iOSアプリケーション開発

iOSアプリケーション開発では、クラシックBluetoothBluetooth LEデバイスとで、扱いが違います。

  • ペアリングはない

  • iOSを通さず、アプリケーションから直接、デバイスの発見と接続ができる

  • Bluetooth LE用のバックグラウンド・モードがある

  • iPhoneはセントラルとペリフェラル、どちらにもなれる

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/

http://reinforce-lab.github.io/blog/2013/07/26/blebook-ch1/

http://dev.classmethod.jp/references/ios7-ibeacon-api/