BLEを触ってみたかったのでiBeaconを使ってみました。
iBeaconはBluetooth LEを利用したAppleのテクノロジで、iPhone4s, 第3世代iPad以降の機種で利用することが出来ます。BLEデバイスのアドバタイズメント・パケットのフォーマットを工夫して実装しているようです(上原さんのブログより)。
AppleのBluetooth LE利用可能機種は次の通り(2014年1月時点)。
- iPhone4
- iPhone5
- iPhone5s
- iPhone5c
- iPad mini
- iPad mini Retina
- iPad 3rd gen
- iPad 4th gen
- iPad Air
とりあえず触ってみよう、ということで早速実装してみます。
iBeaconはBluetooth関連技術のためCoreBluetoothフレームワークが必要かと思いましたが、Appleでは位置情報サービスの一部として位置づけられており、CoreLocationフレームワークを必要とします。
CoreLocationフレームワークをプロジェクトに追加します。
iBeaconのアクターはビーコンとロケーションマネージャに分かれます。ビーコンは発信、ロケーションマネージャは受信を担当します。どちらもiOSで実装可能なのでデバイスが複数あれば、1つをビーコン、もう1つをロケーションマネージャとして使用することが出来ます。
適当なViewControllerでロケーションマネージャとNSUUID, CLBeaconRegionを初期化します。CLBeaconRegionがiBeaconの発信を行うオブジェクトです。なお、UUID文字列はコマンドラインからuuidgen
コマンドで作成してください。
$ uuidgen
A7622281-1189-4B1F-B890-A5F2E8D9A4D0 # この文字列を使う
static NSString *kMBBeaconIdentifier = @"com.mybikenote.beacon";
static NSString *kMBUUID = @"A7622281-1189-4B1F-B890-A5F2E8D9A4D0";
- (void)viewDidLoad
{
[super viewDidLoad];
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
self.proximityUUID = [[NSUUID alloc] initWithUUIDString:kMBUUID];
// CLBeaconRegionを作成
self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:self.proximityUUID
identifier:kMBBeaconIdentifier];
}
ロケーションマネージャの実装
iBeaconのモニタ開始処理
ロケーションマネージャのstartMonitoringForRegion
メソッドを呼び出して、ビーコンのモニタリングを開始します。
[self.locationManager startMonitoringForRegion:self.beaconRegion];
iBeaconのモニタ終了処理
モニタリングの終了はstopMonitoringForRegion
メソッドを呼び出します。この辺りは位置情報の取得とほとんど一緒ですね。
[self.locationManager stopMonitoringForRegion:self.beaconRegion];
ビーコンの検知、受信
ビーコンの検知はロケーションマネージャのdelegateメソッドを実装します。
- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region
{
[self.locationManager requestStateForRegion:self.beaconRegion];
}
// requestStateForRegionを呼ぶとコールバックされる
- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
switch (state) {
case CLRegionStateInside: // 既にリージョン内にいる
if ([region isMemberOfClass:[CLBeaconRegion class]] && [CLLocationManager isRangingAvailable]) {
[self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}
break;
case CLRegionStateOutside:
case CLRegionStateUnknown:
default:
break;
}
}
// リージョン内に入ったら呼び出される
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
NSLog(@"Enter Region"];
}
// リージョンから出たら呼び出される
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
NSLog(@"Exit Region"];
}
あわせて読みたい。
- iOS: iBeaconについて
- [iOS 7] 新たな領域観測サービス iBeacon を使ってみる
- iBeacon Tips: 正しいビーコン監視方法
- iBeaconの解説
- What is the iBeacon Bluetooth Profile iBeaconが利用するadvertising packetについて記載あり