Beaconを貸して頂いたので、これら何回かに分けてAndroidでiBeaconを触ってみる記事を書いてみようと思います
iBeaconについては、いろいろと情報があると思いますので説明は省きます
iBeaconって何?という方は、まずGoogleなどで検索してみてください
BLEに対応したAndroid 4.3以上の端末
Beacon(今回はBeacon USBを利用)
最初にBeaconの設定をしておきます
設定する情報は、Proximity UUID(以降、UUIDと略),Major, Minorとありますが、どの情報を使って検出したいBeaconを判別するかによりますので、1台だけならUUIDだけでも良いかもしれませんし、1台でもMajorまで設定しておいても良いかもしれません
今回は、UUID,Major,Minorを全て設定しておきます
※今回利用するBeaconUSBに専用のアプリがまだ無いので、HPに記載されている設定マニュアルにあるとおり「BLE Utility」というアプリを使って設定します。このアプリはiOS用なのでAndroid端末しかない場合は、別途BLがで利用できる設定アプリを探してください
BluetoothはONになっていることとする(ONにしたり、利用可否のチェックは省く)
コードは、Androidの公式情報を基にして書いていきます
http://developer.android.com/guide/topics/connectivity/bluetooth-le.html
BLUETOOTHを利用するための権限を設定します。
アプリの中でBluetoothのON/OFFなど操作を行う場合にはBLUETOOTH_ADMINの権限も必要となります
BLUETOOTHの操作も行いたい場合は、以下の2つを設定してください
※あとで検証したら、BLUETOOTH_ADMINを指定しないと端末が検出できないことが判りました。BLUETOOTH_ADMINは必須のようです
BLEに対応した端末だけにインストールを許可したい場合には、以下のuses-featureを設定してください
検出は、BluetoothAdapterのstartLeScanで実行されます
検出が終了するとstartLeScanの引数で指定したコールバックのメソッドが呼び出されます
BLEの検出は何度も繰り返し行われるため、ハードウェア的に問題となるため1秒たったらスキャンを停止する(stopLeScan)ようになっています
※コールバック用のメソッドは後述
BLEの検出が終わるとstartLeScanで指定したコールバックのメソッドが呼び出されますので、その中で検出結果を解析します
今回はデバイスの名前とアドレスをログに出力してみます
アプリが停止しているときは、スキャンを停止するようにしましょう
今回はここまで。
次回は、結果からUUIDなどの情報を取得して、本当に情報を取得したい機器の詳細情報を見てみたいと思います
※もう少し詳しくコードを知りたい方は、Android SDKの中にあるsamplesに参考となるコードがありますので、そちらを参照ください
samples/android-18/legacy/BluetoothLeGatt/src/com/example/bluetooth/le
iBeaconについては、いろいろと情報があると思いますので説明は省きます
iBeaconって何?という方は、まずGoogleなどで検索してみてください
必要なもの
BLEに対応したAndroid 4.3以上の端末
Beacon(今回はBeacon USBを利用)
Beaconの設定
最初にBeaconの設定をしておきます
設定する情報は、Proximity UUID(以降、UUIDと略),Major, Minorとありますが、どの情報を使って検出したいBeaconを判別するかによりますので、1台だけならUUIDだけでも良いかもしれませんし、1台でもMajorまで設定しておいても良いかもしれません
今回は、UUID,Major,Minorを全て設定しておきます
※今回利用するBeaconUSBに専用のアプリがまだ無いので、HPに記載されている設定マニュアルにあるとおり「BLE Utility」というアプリを使って設定します。このアプリはiOS用なのでAndroid端末しかない場合は、別途BLがで利用できる設定アプリを探してください
Androidアプリを作る
前提条件
BluetoothはONになっていることとする(ONにしたり、利用可否のチェックは省く)
参照
コードは、Androidの公式情報を基にして書いていきます
http://developer.android.com/guide/topics/connectivity/bluetooth-le.html
Permission
BLUETOOTHを利用するための権限を設定します。
<uses-permission android:name="android.permission.BLUETOOTH"/>
※あとで検証したら、BLUETOOTH_ADMINを指定しないと端末が検出できないことが判りました。BLUETOOTH_ADMINは必須のようです
<uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
BLEに対応した端末だけにインストールを許可したい場合には、以下のuses-featureを設定してください
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
BluetoothAdapterを取得する
BluetoothAdapterはBluetoothManagerから取得しますprivate BluetoothAdapter mBluetoothAdapter; public class MainActivity extends Activity { private BluetoothAdapter mBluetoothAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); mBluetoothAdapter = bluetoothManager.getAdapter(); } }
BLE端末を検出する
BLEを検出する処理を追加します検出は、BluetoothAdapterのstartLeScanで実行されます
検出が終了するとstartLeScanの引数で指定したコールバックのメソッドが呼び出されます
BLEの検出は何度も繰り返し行われるため、ハードウェア的に問題となるため1秒たったらスキャンを停止する(stopLeScan)ようになっています
※コールバック用のメソッドは後述
@Override protected void onResume() { super.onResume(); scanLeDevice(true); } private void scanLeDevice(final boolean enable) { if (enable) { mHandler.postDelayed(new Runnable() { @Override public void run() { mScanning = false; mBluetoothAdapter.stopLeScan(mLeScanCallback); } }, SCAN_PERIOD); mScanning = true; mBluetoothAdapter.startLeScan(mLeScanCallback); } else { mScanning = false; mBluetoothAdapter.stopLeScan(mLeScanCallback); } }
BLEの検出結果を処理する
BLEの検出が終わるとstartLeScanで指定したコールバックのメソッドが呼び出されますので、その中で検出結果を解析します
今回はデバイスの名前とアドレスをログに出力してみます
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { Log.d("BeaconSample", "name::" + device.getName()); Log.d("BeaconSample", "address::" + device.getAddress()); Log.d("BeaconSample", "------------------------------"); } };
スキャンの停止
アプリが停止しているときは、スキャンを停止するようにしましょう
@Override protected void onPause() { super.onPause(); scanLeDevice(false); }
今回はここまで。
次回は、結果からUUIDなどの情報を取得して、本当に情報を取得したい機器の詳細情報を見てみたいと思います
※もう少し詳しくコードを知りたい方は、Android SDKの中にあるsamplesに参考となるコードがありますので、そちらを参照ください
samples/android-18/legacy/BluetoothLeGatt/src/com/example/bluetooth/le
AndroidでiBeacon(1)