2014年6月23日月曜日

AndroidでiBeacon(1)

Beaconを貸して頂いたので、これら何回かに分けてAndroidでiBeaconを触ってみる記事を書いてみようと思います

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のON/OFFなど操作を行う場合にはBLUETOOTH_ADMINの権限も必要となります BLUETOOTHの操作も行いたい場合は、以下の2つを設定してください
※あとで検証したら、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

0 コメント:

コメントを投稿