23
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

iBeaconを使ってみた

Posted at

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フレームワークをプロジェクトに追加します。

kobito.1392736919.088672.png

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"];
}

あわせて読みたい。

23
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?