Android Bluetooth Low Energy (BLE) vol.3

こんにちは、あじゅ~くです。

さて、
本日からBLE特集です。
※2017/03/22 時点の記事

BLEの記事はこちら
vol.1
vol.2
vol.4
vol.5
vol.6

…の続き。

前回でデバイスを
検索する準備が整っているかと思います。

さっそく、いってみましょう。


4.デバイススキャン開始

まずは、
接続する対象のデバイスを見つけなければなりません。

実は、
一度スキャン(接続)したデバイスは
スキャンせずに接続する方法もあるのですが、
それは後程。※ただし、デバイスによる

利用するのはこちら。

・@TargetApi(Build.VERSION_CODES.LOLLIPOP)

※Android 5.0以上用
・ScanCallback インターフェース
・BluetoothLeScanner.startScan メソッド

※Android 4.4用
・BluetoothAdapter.LeScanCallback インターフェース
・BluetoothAdapter.startLeScan メソッド

「TargetApi」については、このメソッドは、
Android 5.0(Lollipop)(API21)以降でないと使えませんよ!
の定義。

そして、
スキャン方法なんですが、
上記Androidバージョンにより2パターン用意します。

■Android 5.0 以上の場合■

BluetoothLeScanner.startScanメソッドに
ScanCallback インターフェースを設定して開始します。

発見されたデバイスは、
ScanCallback.onScanResultにて通知されます。

@Override
public void onScanResult(int callbackType, ScanResult result) {
    // (result.getDevice(), result.getRssi(), result.getScanRecord().getBytes());
}

■Android 5.0 より前の場合■

BluetoothAdapter.startLeScanメソッドに
BluetoothAdapter.LeScanCallback インターフェースを設定して開始します。

発見されたデバイスは、
BluetoothAdapter.LeScanCallback.onLeScanにて通知されます。

@Override
public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) {
}

あらっ!?
通知されるパラメータ違うじゃない…( ;∀;)

と、思われるかもしれませんが、
上記の通り、
「ScanResultクラス」から
同じデータ取れますのでご安心を。
これでラップしやすいと思います。

発見されたデバイスは
リストビューなんかで表示するのがおすすめ。
色々使いまわしが効きます。


5.対象デバイス発見

お目当てのデバイスは、
通知パラメータの「BluetoothDevice」で判別しましょう。

場合によっては、
利用したいサービスのディスカバリまでしないとダメなんですが、
特殊なのでない限り、
デバイス名とBluetoothアドレスで判別可能なはずです。

・BluetoothDevice.getName
・BluetoothDevice.getAddress

※重要※
「BluetoothDevice」クラスは重要です。
デバイスへの接続で利用します。

もし、このオブジェクトを保持しておかない場合は、
※例えば、リストビューに名前とアドレスしかもっていない等
再度スキャンして指定のアドレスを探す。
又は、
「BluetoothDevice」クラスをシリアライズしておいて、
再ロードするなんてやり方が必要になります。


6.デバイススキャン停止

お目当てのデバイスが見つかった場合は、
即座にスキャンを停止します。
バッテリードレインしちゃいますよ。

※Android 5.0以上用
・BluetoothLeScanner.stopScan

※Android 4.4用
・BluetoothAdapter.stopLeScan

こちらも停止方法が違うので注意です。

…vol.4へ続く

それでは。

azjuke

投稿者: azjuke

神奈川県横浜市在住 何かよくわからないブログに変身中! 色々な話題振りまいていきますよ。