クライアント構成特性記述子 (CCCD)。
UUID - 「00002902-0000-1000-8000-00805f9b34fb」/「gatt.client_characteristic_configuration」。
Android の Java コードで CCCD を設定するには、次のようにします。
public static final byte[] ENABLE_NOTIFICATION_VALUE = {0x01, 0x00};
BluetoothGattDescriptor descriptor = characteristic.getDescriptor("00002902-0000-1000-8000-00805f9b34fb");
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
mBluetoothGatt.writeDescriptor(descriptor);
Web Bluetooth API を使用する場合、JavaScript コードで同様の構成を実行するにはどうすればよいですか?
JavaScript での私のバージョン:
.then(descriptors => {
let queue = Promise.resolve();
descriptors.forEach(descriptor => {
switch (descriptor.uuid) {
case BluetoothUUID.getDescriptor('gatt.client_characteristic_configuration'):
queue = queue.then(_ => descriptor.readValue()).then(value => {
descriptorCache = descriptor;
});
...
var data = new Uint8Array([0x01, 0x00]);
descriptorCache.writeValue(data);
//descriptorCache.writeValue(new TextEncoder().encode(data));
セキュリティエラーで失敗します:-(
キャッチされない (約束された) DOMException: writeValue() が、除外書き込みとマークされたブロックリストに登録されたオブジェクトで呼び出されました。 https://webbluetoothcg.github.io/web-bluetooth/#attacks-on-devices
セキュリティの必要性は理解しています。しかし、結局のところ、多くのデバイスでは CCCD の事前設定が必要です。