映画が大好きなmanaです。
iOS 7が発表されてから、巷ではiBeaconというものがはやっております。
iBeaconはBluetooth LE(Low Energy)の技術を使用して、「ビーコン」となる発信器を、近距離で検知できる機能になります。
その「ビーコン」をAndroidでBluetooth LEを使用して取得するまでを紹介していきます。
そもそもBluetooth LEとは?
Bleutooth 4.0規格で用意されたのがLEモードです。
4.0と1.0~3.0(クラシック規格)で互換性はありません。
Bluetoothを搭載した各製品に以下のロゴが授けられます。
iPhone4S、iPhone5、iPhone5Sなどは「Bluetooth Smart Ready」が使用されており、クラシックと4.0がデュアルで使えます。
Bluetooth LEの特徴
大きく2点あげられます。
・1点目 消費電力
消費電力が小さいということです。ピーク時で15mA、平均で1μA以下です。電池一つで数か月~1年以上もつ設計の元作られています。
・2点目 速さ
受信時間が短いということです。Bluetoothはランダムに周波数を変えてデータを送ります。クラシックは周波数チャネルが79に対してLEモードは3になったため、単純に接続時間が短くなりました。
利用シーン
利用シーンとして、ウェアラブル端末など体に身につける小型端末から発信する情報をスマートフォンで受けるなどが浮かびます。
使用している製品はbluetoothの公式ページに載っています。
http://www.bluetooth.com/Pages/Bluetooth-Smart-Devices.aspx
Androidで実際に取得する
いよいよ本編です。
・前提
Androidの近くにビーコンを置きます。
・実装
Androidは以下のように実装します。
1. Bluetoothを使用できるようにする
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
2. BluetoothManagerからBluetoothAdapterを取得します。
BluetoothManager mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); BluetoothAdapter mBluetoothAdapter = mBluetoothManager.getAdapter();
3. BluetoothAdapter.LeScanCallbackを実装する
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) { } }
取得できる値はdeviceにデバイス情報、rssiは電波強度、scanRecordにアドバタイジングパケットが入ってきます。アドバタイジングパケットとは、ビーコンから通知されるパケットデータと考えて下さい。この値を分解すればiBeaconのUUID、major、minorなどが取得できます。
4. BluetoothAdapterのstartLeScanを呼び出す
mBluetoothAdapter.startLeScan(mLeScanCallback);
これを呼び出すとLeScanCallback#onLeScanに電波を受けとったBLEの結果が返ってきます。
これはフォアグラウンドのアプリでもなくても動きます。
Googleの開発サイトにも実装の仕方があります。
・参考URL
http://developer.android.com/guide/topics/connectivity/bluetooth-le.html
・実際の値
scanRecordで送られてきたデータにはこのようなバイト配列になっていました。
0201061aff4c000215b9407f30f5f8466eaff92555
6b57fe6dca6e3039b60909657374696d6f74650e16
0a186ecadd0000e6b66eca393000000000000000
これらを解析すると以下のような結果になります。
・解析結果
まずADパケットの中身は、長さ、タイプ、データという構成になっていて、
タイプによってデータの中身が異なります。
受け取れたADパケットは4つのAD Structureで構成しています。
このうちの2つめがiBeaconの設定値が記載されています。
なぜ、iBeaconかわかるかというと、タイプとデータをみて判断します。以下は2つめの解析結果になります。
参考リンク:
※1. AD Type一蘭
https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile
※2. Bluetooth SIGが企業に発行した識別子
https://www.bluetooth.org/en-us/specification/assigned-numbers/company-identifiers
近くにあるビーコンはUUID=b9407f30-f5f8-466e-aff9-25556b57fe6d、major=51822、minor=12345というのがわかりますね。
もしAndroidでiBeaconの情報を取得したい場合は参考にして頂けると幸いです。
> 受信時間が短いということです。Bluetoothはランダムに周波数を変えてデータを送ります。クラシックは周波数チャネルが79に対してLEモードは3になったため、単純に接続時間が短くなりました。
このあたり色々ミスリードしてる気がしますよ。