I beaconについて

20
iBeacon をををををを をををを 一( @shiffon_1f

Transcript of I beaconについて

Page 1: I beaconについて

iBeacon を触ってみた一階武史( @shiffon_1f )

Page 2: I beaconについて

目次

1.自己紹介

2. iBeacon とは

3. Beacon の識別情報

4. Beacon からの情報

5. Estimote 社の Beacon

6. Beacon を動かしてみた

7.動かした感想

Page 3: I beaconについて

1.自己紹介

名前:一階 武史( @shiffon_1f )

URL : http://shiffon.info/blog

所属:某広告制作会社

経歴:

昔は官公庁メイン名お堅い SI でソフトウェアアーキテクト。今は180 度歩行転換して、柔らかな思考が必要な広告制作会社でテクニカルディレクターをやっています。

技術が(下手の横)好きなエンジニアです。

   

Page 4: I beaconについて

2. iBeacon とは

すごくおおざっぱに言うと、 Apple が iOS7 に搭載したBluetoothLowEnergy に準拠した Beacon を利用するための技術です。

Beacon は2秒に1回程度の発信ならボタン電池で 5 年は軽く持つと言われているので、一度設置したら当分放っておいても大丈夫な便利デバイスです。

現在は Estimote 社以外にも、 Aplix 社が iBeacon 互換のチップを販売していてます。

今購入するなら値段もサポートも Aplix 社の方がよいと思われます。

購入 URL : http://www.aplix.co.jp/?page_id=7593

Page 5: I beaconについて

3. Beacon の識別情報

Beacon は個体識別を行うために3つのパラメータを持っています。

(1) proximityUUID

  いわゆる大区分。1つのアプリには 20 個まで登録可能。

(2) major

  いわゆる中区分。

  大区分配下で Beacon をグループ分けする際に利用

(3) minor

  いわゆる小区分。

  中区分配下で Beacon をグループ分けする際に利用。

ここで重要なのは、これらの値は Beacon 個体毎に個別の値を設定する必要がないということです。

Page 6: I beaconについて

3. Beacon の識別情報

とある外食産業の各店舗に Beacon を配置する際の設定方法を、利用シーンごとに書いてみます。

・店舗を識別せずに、単純にレジにだけ Beacon を配置する場合

  proximityUUID を全て同じに設定すれば OK

・店舗を識別せずに、単純にレジとドリンクバーに Beacon を配置する場合

  proximityUUID を全て同じにし、 major をレジとドリンクバーで別々に設定すれば OK

・店舗を識別して、レジとドリンクバーに Beacon を配置する場合

  proximityUUID を全て同じにし、 major の値を各店舗で別々に、minor をレジとドリンクバーで別々に設定すれば OK

と、利用の仕方に応じてフレキシブルに設定出来ます。

Page 7: I beaconについて

4. Beacon からの情報

Beacon を認識すると識別情報に加えて、以下3つの情報が来ます。

※ 認識した Beacon の情報は Framework 側で自動的に近い順に並べてくれます。

(1) proximity

  端末との距離で、近接 / 近い / 遠い / 不明の4種類で定義

(2) accuracy

  正確さ?使わなくていいっぽい。

(3) rssi

  電波受信強度。使わなくていいっぽい。

 アプリケーション側は Beacon の識別情報と主に proximity の情報を利用して、来店回数を +1 したり、お知らせを出したりします。

Page 8: I beaconについて

5. Estimote 社の Beacon

随分前に発注した Beacon がやっと来たので、いろいろ調べてみました。

Page 9: I beaconについて

5. Estimote 社の Beacon

とはいうものの、パッケージには使い方などが一切入っておらず、電源の入れ方すら分かりません。

なので、サクッとさくっと割りました!

Page 10: I beaconについて

5. Estimote 社の Beacon

電池は工場出荷時から既にセットされていてすぐ使える状態でした。

OFF にしたり電池を交換するときは割って中身を取り出さないと駄目なようです。

・・・面倒くさいですね・・・。

ちなみに Beacon の情報を書き換えるツールは現在提供されていません (多分)。

Page 11: I beaconについて

5. Estimote 社の Beacon

Beacon の情報は Estimote 社の HP からサンプルアプリのプロジェクトが DL 出来るようになっているので、それを利用して確認します。

なお、自分のプロジェクトで Beacon を扱う場合は、 Estimote社が提供しているライブラリ(サンプルアプリのプロジェクトから取り出して利用)を組み込むことで利用可能になり、 Beaconの情報は ESTBeacon というクラスに格納されます。

と書きましたが、 Apple の CoreLocationFramework だけで取得できるか試してみたら問題なく動作したので、 Esimote 社のライブラリは特にいらない模様です。

Page 12: I beaconについて

6. Beacon を動かしてみた

アプリを起動すると周囲の Beacon を検知するアプリを作ってみました。

1. CoreLcoationFramework を追加する。

2.変数を定義@property (nonatomic, strong) CLLocationManager* locationManager;

@property (nonatomic, strong) NSUUID* proximityUUID;

@property (nonatomic, strong) CLBeaconRegion* beaconRegion;

NSString* beaconUUID = @"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";

※beaconUUID は事前に Estimote 社のサンプルプログラムを動かして取得

Page 13: I beaconについて

6. Beacon を動かしてみた

3. viewDidLoad で測定開始if ([CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]) {

if( _locationManager == nil ) {

_locationManager = [CLLocationManager new];

_locationManager.delegate = self;

}

_proximityUUID = [[NSUUID alloc] initWithUUIDString:beaconUUID];

_beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:_proximityUUID identifier:@"EstimoteSampleRegion"];

[_locationManager startMonitoringForRegion:_beaconRegion];

// 最初から範囲内にいるとイベントが走らないのでここで走らせておく。

[_locationManager startRangingBeaconsInRegion:_beaconRegion];

}

Page 14: I beaconについて

6. Beacon を動かしてみた

※コメントにもありますが "startMonitoringForRegion" を呼び出すと Beacon の監視を開始しますが、この時に対象 Beacon が既に近くにあると発見イベントが通知されないという残念な仕様になっているので、即 Beacon との距離測定を開始しています。

実際に使う際はしばらく距離測定対象が存在しなければ "stopRangingBeaconsInRegion" を呼び出す感じがいいのではないかと思います。

※Estimote の Beacon 全てを対象にしているので initWithProximityUUID に majorや minor を指定していません。

Page 15: I beaconについて

6. Beacon を動かしてみた

4. Beacon 発見 /ロストイベント- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region

※Beacon が見つかると "didRangeBeacons" が、 Beacon を全て見失うと "didExitRegion" が呼び出されます。

※"didRangeBeacons" の (NSArray *)beacons には、 Framework が近い Beaconから順番にセットしてくれているので、自前で距離計算をする必要はありません。

Page 16: I beaconについて

6. Beacon を動かしてみた

5. Beacon の情報に応じた処理for (CLBeacon* clBeacon in beacons) {

switch(Beacon.proximity) {

}

switch (clBeacon.major integerValue ) {

}

}

※Estimote の Beacon は3色全て major の値が異なるので、 major の値を元に3色を識別しています。

※major の値は事前に端末に3色それぞれを近接させて取得しました。

と、意外と簡単に扱うことができます。

Page 17: I beaconについて

7.動かした感想

非接触でいろいろ情報発信が出来るので NFC より便利!みたいな話になって盛り上がってましたが、 Passbook と同じ道を歩む、がっかり規格になるんじゃないかと思ってます。

がっかりになると思った大まかな理由は以下2つです。

1.アプリに組み込まないと動かない。

ユーザにアプリを落として貰うハードルがまず高いし、当然開発費がそれなりにかかってくるわけで、無印やユニクロみたいな既に店舗連動のアプリを持っているところでないと採用が進まないのではないかと思ってます。

Page 18: I beaconについて

7.動かした感想

2.認識の精度が悪い。

ひょっとしたら Estimote 社の現行のチップの性能なのかもしれませんが、これが結構問題だと思ってます。

端末に Beacon を近づける / 遠ざけるのいずれの場合にも認識に時間がかかる( 10 秒〜 15 秒)ので、まずリアルタイム処理で反応させるのは難しそう。

店の前を通ったら Push通知というイメージがありますが、店の前を通り過ぎてから Push通知 or Push通知がでないということになりそうな気がします。

更に動かしていないも関わらず端末と Beacon の距離が変動したり、見失ったりするので難儀だな、と。

端末の周りに Estimote の Beacon 3色を置いて放置したら、検知順番は変わるし、いきなり見失うしと結構大変でした。

Page 19: I beaconについて

7.動かした感想

そもそも iOS のシェアは全世界だと 13%切っているので、新しい規格を採用したところで普及するわけないじゃん!という根本的な問題を横に置いても、すごく残念でした。

※ あくまで iBeacon の話で、 BLE 自体はいいものだと思ってます。

Apple は iBeacon より、 AirDrop をもっと強化すれば良かったのではないかと思います。

Page 20: I beaconについて

Fin