GeekFactory

int128.hatenablog.com

AndroidでBLEデバイスから通知を受け取る

AndroidでBLE(Bluetooth Low Energy)デバイスから通知を受け取る方法でハマったのでメモしておきます。

セントラルがペリフェラルから通知を受け取るには setCharacteristicNotification() でセントラル側の通知受信を有効にするだけでなく、 writeDescriptor()ペリフェラル側の通知送信を有効にする必要があります。

    enum class BLE_UUID(uuidString: String) {
        BUTTON_SERVICE("0000ffe0-0000-1000-8000-00805f9b34fb"),
        BUTTON_STATE("0000ffe1-0000-1000-8000-00805f9b34fb"),
        CLIENT_CHARACTERISTIC_CONFIG("00002902-0000-1000-8000-00805f9b34fb"),
        ;
        val uuid = UUID.fromString(uuidString)
    }

    // セントラル側の通知受信を有効にする
    val characteristic = bluetoothGatt.getService(BUTTON_SERVICE.uuid).getCharacteristic(BUTTON_STATE.uuid)
    bluetoothGatt.setCharacteristicNotification(characteristic, true)

    // ペリフェラル側の通知送信を有効にする
    val descriptor = characteristic.getDescriptor(CLIENT_CHARACTERISTIC_CONFIG.uuid)
    descriptor.value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE
    bluetoothGatt.writeDescriptor(descriptor)

    // BluetoothGattCallback#onCharacteristicWrite()でBluetoothGatt.GATT_SUCCESSを受け取ったら成功です

上記のコードで指定しているUUIDはiTAGというBLEタグのものです。980円で買える安物ですが、アプリを自作して遊ぶにはもってこいですね。