Android Bluetooth Low Energy (BLE) vol.6

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

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

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

…の続き。

前回、
プロパティについて学びました。

では、実際にデータを得てみます。


12.GATT通信実施

次に、
一般的な
・「デバイス情報」
・「バッテリー情報」
をGATT通信して得てみます。

BLE標準のサービスを利用しますね。

Service Name UUID
Device Information Service 0000180a-0000-1000-8000-00805f9b34fb
Battery Service 0000180f-0000-1000-8000-00805f9b34fb

製造者名を取得

「Device Information Service」のサービスを利用します。
サービスIDは上の表の通りで、
BluetoothGattService (0000180a-0000-1000-8000-00805f9b34fb)
を利用すればいいわけです。

そして、
製造者名を取得するには以下のキャラクタリスティックを利用すればOK!

Characteristic Name UUID
Manufacturer Name String 00002a29-0000-1000-8000-00805f9b34fb

こいつを「READ」ってな具合です。

※サービスディスカバリ時に、
デバイスが保持する「サービス」とその「キャラクタリスティック」は分かっていると思います。

バッテリー情報取得

続いてバッテリー情報を取得してみます。

Battery Service(0000180f-0000-1000-8000-00805f9b34fb)
を利用すればOKです。

利用するキャラクタリスティックのUUIDは
Battery Level「00002A19-0000-1000-8000-00805f9b34fb」

こちらは、
大体「READ」「NOTIFY」のプロパティを持っているでしょう。

「READ」の場合は単発で取得する。

final BluetoothGattService batteryService = gatt.getService("0000180f-0000-1000-8000-00805f9b34fb");
if (batteryService == null)
    return;

final BluetoothGattCharacteristic batteryLevelCharacteristic =
    batteryService.getCharacteristic("00002A19-0000-1000-8000-00805f9b34fb");
if (batteryLevelCharacteristic == null)
    return;

final int properties = batteryLevelCharacteristic.getProperties();
if ((properties & BluetoothGattCharacteristic.PROPERTY_READ) == 0)
    return;

gatt.readCharacteristic(characteristic);

↑「READ」コマンドはこんな感じ

で、
通知はこのように来ます↓

@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
    if (status == BluetoothGatt.GATT_SUCCESS) {
        if ("00002A19-0000-1000-8000-00805f9b34fb".equals(characteristic.getUuid()) {
            final int batteryValue = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0);
            // ↑バッテリー値
        }
    }
}

「NOTIFY」の場合、
デバイス依存になると思います。
例えば、
・充電完了したら通知する
・50%切ったら通知する
等。

また、
「NOTIFY」は「onCharacteristicRead」ではなく、
「onCharacteristicChanged」が呼び出されるのでお忘れなく。

ここまでくれば、
あとはデバイス固有の仕様を実装していくだけです!

vol.7へ続く

それでは。