Android 5.0 x iBeacon

IoTの要注目テクノロジーiBeacon

Android 5.0(Lollipop)におけるiBeaconについて

はじめまして!
研究開発チームの曽川(@egg_sogawa)です!

2015年、いよいよ本格的にサービスに実装されそうな「iBeacon」についてのお話です。

iBeaconって何?

iBeaconはAppleが仕様を決めたBLE(Bluetooth Low Energy)を利用したデータの発信方法です。
iOS7からサポートされたことで注目を集めた機能です。

なぜいまさらiBeaconに注目したか?

iOS7が登場して1年半、いまさらと思われるかもしれませんが、技術は発展すれどもそれを実際に利用するには時間がかかるものです。
1年半の間、各社iBeaconをコネコネする時間をもうけて、現在、iBeaconの注目度が上がってきております。
記憶にあたらしいところだと東京駅の屋内ナビゲーションにも利用されているようです。
JR東京駅でiBeaconを利用したナビゲーションシステムが12月18日にスタート(週アスPlus)

ですが、取り上げた理由はこれだけではありません。
Lolipop(Android5.0)でAndroidもiBeaconの発信・受信ができるようになったのです!

iBeaconとAndroid

iOS7からiBeaconがサポートされたため、iBeacon=「iOSの専用機能」と認識している方がいらっしゃるかもしれませんが、Androidでも可能です。
AndroidがiBeaconの受信を含むBLEの受信をサポートしたのはAndroidは4.3から、Advertise(発信)をサポートしたのはAndroid5.0(Lolipop)からです。
このLolipopをもってAndroidはBLEに対応しました。めでたい。

BLEのAPIレベルでの対応状況

OSバージョン 受信 発信
Android4.2以下
Android4.3
Android4.4
Android5.0以降

上の表はあくまでAPIレベルの対応状況です。
端末に内蔵されているBluetoothのモジュールが対応していなければ使用できません。
例えばAdvertiseに関しては、Nexus5はAdvertiseできませんが、Nexus9ならAdvertiseできるというような状態です。(2014年12月末時点)

AndroidでのBLEに関しては、公式での解説動画がありますのでこちらを参照してください。
Bluetooth Low Energy(Google Developers)

さて、気を取り直してAPIの解説をしていきたいのですが、BLEの扱い方は4.3と5.0で異なります。4.3で使われていたAPIは非推奨になりました。(Androidの公式ドキュメントはAndroid4.3でのBLEの解説をしているので混乱しないように気をつけてください:2014年12月時点)
そのため、今回は5.0に絞ってAPIの説明をしていきます。

android.bluetooth.leパッケージ

Android4.3では、android.bluetoothというパッケージのクラスを使ってBLEを使用していました。
一方、Android5.0以降はandroid.bluetooth.leパッケージというBLE専用のパッケージが用意されました。
BLEを個別に切り出しているということは、Androidにおいても主要の技術であるということを表していますね。

このパッケージ内の、BluetoothLeScannerが、受信を行うクラス、BluetoothLeAdvertiserが送信を行うクラスです。
このクラスがiBeaconを扱うための主役です。

BLE(iBeacon)の受信

コードのスニペットを用いて解説していきます。
BLE受信処理

  1. AndroidManifest.xmlにBluetoothのパーミッションを追加

    ※BLEが利用可能な端末限定でアプリを配信する場合は以下を追記します。

  2. BLEの受信開始までの一連の処理を以下に示します。(@Fragment内)

    5〜19行目辺りまでは、以下のチェックをしており、BLEの処理とは別です。

    • BluetoothAdapterの取得
    • Bluetoothをサポートしているか
    • Bluetoothがオンになっているか

    20行目以降を説明していきます。

  3. BluetoothLeScannerオブジェクトの取得

    このオブジェクトを使ってBLEの受信処理を行います。

  4. 受信開始の前にScanCallbackを定義

    このアプリではIBeaconScanCallbackというクラスでコールバックを定義しています。

  5. BLEの受信を開始

    いよいよBLEのスキャンを開始します。前項でインスタンス化したコールバックを引数に入れます。

  6. 必要がなくなれば停止

    このアプリでは、Fragmentの終了時にスキャンを停止しました。
    停止時にはScanCallbackのオブジェクトが必要になるので、フィールドなどに入れておきましょう。

Android 4.3のAPIよりもシンプルになった気がします。

BLE(iBeacon)のAdvertise(送信)

  1. AndroidManifest.xmlにBluetoothのパーミッションを追加

    受信と同じ手順ですね。

  2. BLEのAdvertise開始までの一連の処理を以下に示します。(@Fragment内)

  3. BluetoothLeAdvertiserオブジェクトの取得

    このオブジェクトを使ってAdvertiseを行います。Advertiseに非対応であればnullが返ってきます。

  4. Advertise開始の前にAdvertiseSettingsAdvertiseDataAdvertiseCallbackを定義

    AdvertiseSettings
     モード、タイムアウト時間などを設定します。

    AdvertiseData
     UUID、major、minorなどをバイト配列にて設定します
     ここがiBeaconのキモです。バイト列に関しては後ほど説明します。

    AdvertiseCallback
     BLEの開始に成功したか失敗したかを処理するコールバックです。
     今回は、IBeaconAdvertiseCallbackを定義しております。

  5. Advertiseを開始

    いよいよAdvertiseを開始します。前項で準備した3つのオブジェクトを引数に入れます。

  6. 必要がなくなれば停止

    これも受信と似ていますね。

iBeaconとバイトデータ

では、iBeaconのデータはどうなっており、どう処理するのでしょうか?
基本的に受信側は単にiBeaconの形式でブロードキャストされているバイトデータを受け取ります。
Bluetooth Classicのようにペアリングしないと何かできないというわけではありません。

そのデータは以下のように決まっています。

データ領域 格納されているバイト
iBeaconの固定バイト 6〜8
UUID 10〜25
Major 26〜27
Minor 28〜29
電波強度(距離を求めるのに使う2の補数) 30

6〜8バイト目は固定されており、AppleのコードとiBeaconのコードを表します。
これをもってiBeaconと認識します。
6: 0x4c
7: 0x00
8: 0x02
UUIDは、10〜25バイト目で端末の識別IDです。
Major/MinorはiBeaconの固有のデータを表す値です。
このMajorとMinor、および電波強度の値を上手く利用することで、どこの場所にいるか・どの地点に近いかなどをアプリ側で算出するなどできます。

まとめ

iBeaconは2015年いよいよ盛り上がってくるであろう技術です。
BLEの実装に関しては難しいものではありませんでしたが、Android4.3と5.0で使用方法に差分がある点と、端末により使用できる機能が違うところは注意したいところです。
今後は、電池消費や精度、フィールドテストをしての所感など、さらに一歩踏み込んだところをお伝えできればと思っています。

Tech Blog

(編集部)

株式会社リクルートライフスタイルのTech Blog編集部です。いま流行りのTechネタやちょっと使えるTipsなどをお届けしていきます。

NEXT