网络蓝牙从设备 GATT 获取存储的数据

web-bluetooth get stored data from device GATT

我的目标是获取设备中存储的数据。

就像测量温度或其他东西并将其存储到内存中的设备。我需要通过记录访问控制点 (RACP) 查询所有此数据设备。

  1. 实现它的第一个想法是

    • 获取特征

    • 开始通知

    • 向描述符写入代码

    • 通过eventListener获取所有数据

结果:启动通知时抛出错误 使用的示例:

https://googlechrome.github.io/samples/web-bluetooth/notifications-async-await.html https://bugs.chromium.org/p/chromium/issues/detail?id=664863

  1. 接下来的想法是不启动通知,因为特征是 指示,写入类型。 所以正在考虑添加侦听器并从设备文档写入描述符代码,其中指出:

OP Code: 1 – Report stored records

即使删除了 startNotifications 行也会抛出错误 所以我的代码示例是:

const mainService = 'my correct service uuid';
    const characteristicUUID1 = 'my correct char uuid';
    const characteristicUUID2 = 'my correct char uuid';
    const descriptorUUID = '00002902-0000-1000-8000-00805f9b34fb';
    let deviceCache = null;
    let serverCache = null;
    let serviceCache = null;
    let characteristicCacheA = null;
    let characteristicCacheB = null;
    let descriptorCache = null;

    try {
      deviceCache = await navigator.bluetooth.requestDevice({ filters: [{ name: 'my device' }] });

      console.log('Connecting to GATT Server...');
      serverCache = await deviceCache.gatt.connect();

      console.log('Getting Services...');
      serviceCache = await serverCache.getPrimaryService(mainService);

      console.log('Getting Characteristics A...');
      characteristicCacheA = await serviceCache.getCharacteristic(characteristicUUID1);

      console.log('Start Notifications A...');
      await characteristicCacheA.startNotifications();

      console.log('Getting Characteristics B...');
      characteristicCacheB = await serviceCache.getCharacteristic(characteristicUUID2);

      console.log('Start Notifications B...');
      await characteristicCacheB.startNotifications();

      console.log('Add event listener...');
      characteristicCacheA.addEventListener('characteristicvaluechanged', this.handleNotifications);

      console.log('Getting Descriptor...');
      descriptorCache = await characteristicCacheA.getDescriptor(descriptorUUID);

      console.log('Write value to descr...');
      await descriptorCache.writeValue(new Uint8Array([1]));


    } catch (error) {
      console.log(error.message, 'error');
    }

通知错误(具有实验性 chrome 功能不会引发错误):

error: GATT operation failed for unknown reason.

描述符错误是:

writeValue() called on blocklisted object marked exclude-writes.

另外,我的设备要求输入 PIN,但网络连接没有任何提示。所以也许它说写入描述符被阻止。

如何处理 pin 输入 - 无线索(一旦我在启用 chrome 实验性功能后收到输入 pin 的提示,不确定是否相关)。

我的逻辑正确吗? - 别这么想。

有什么建议吗?

到目前为止我调查了什么?

  1. https://googlechrome.github.io/samples/web-bluetooth/
  2. https://www.oreilly.com/library/view/getting-started-with/9781491900550/ch04.html
  3. https://webbluetoothcg.github.io/web-bluetooth/

编辑:阅读本文后 - https://medium.com/@devdevcharlie/experimenting-with-web-bluetooth-1f1176047ddd

我认为正确的逻辑应该是,写入你需要的命令特征命令(比如获取所有数据)。之后从设备文档中找到负责此数据的正确特征,并启动通知并添加 eventListener 并接收数据。

调用 writeValue() 失败,因为正在访问 CCCD on the blocklist。对 startNotifications() 的调用将根据需要写入描述符以启用通知。

我们需要调查此 "unknown reason" 是否 startNotifications() 失败。您使用什么操作系统?请按照 reporting Web Bluetooth bugs 的说明进行操作,并在 Chromium 项目的问题跟踪器中提交问题。

至于现在,chrome 无法在 windows 10 上与受保护的特性进行通信或遇到问题,在 macOS 上一切正常。如果有人在观看它,我已经在 chromium bug tracker 上发布了问题。 https://bugs.chromium.org/p/chromium/issues/detail?id=960258#c6