使用 WebBluetooth 访问多个服务和特性

Using WebBluetooth to access multiple services and characteristics

我正在尝试读取体重秤特性以及电池服务中的当前电池电量。

我有以下适用于体重秤服务和体重测量特性的服务,但我正在努力了解如何向其添加电池服务(我对承诺不是很熟悉)

function connectGATT() {
  if (bluetoothDeviceDetected.gatt.connected && gattCharacteristic) {
    return Promise.resolve()
  }

  return bluetoothDeviceDetected.gatt.connect()
  .then(server => {
    console.log('Getting GATT Service...')
    return server.getPrimaryService(wsService)
    console.log(wsService)
  })
  .then(service => {
    console.log('Getting GATT Characteristic...')
    return service.getCharacteristic(wsCharacteristic)
    console.log(wsCharacteristic)
  })
  .then(characteristic => {
    gattCharacteristic = characteristic
    gattCharacteristic.addEventListener('characteristicvaluechanged',
        handleNotifications)
    document.querySelector('#start').disabled = false
    document.querySelector('#stop').disabled = true
  })
}

要访问电池服务,您需要调用 server.getPrimaryService('battery_service'),然后对生成的 BluetoothGATTRemoteService 对象调用 getCharacteristic('battery_level')。请参阅完整示例 here

正如您所确定的那样,挑战是当前使用 Promises 编写的 server 变量在此 Promise 链的末尾不再可用。有几个解决方案。一种是这样使用async/await,

console.log('Connecting to GATT Server...');
const server = await device.gatt.connect();

console.log('Getting Battery Service...');
const service = await server.getPrimaryService('battery_service');

console.log('Getting Battery Level Characteristic...');
const characteristic = await service.getCharacteristic('battery_level');

Source

或者您可以将 server 变量带入函数的 top-level 并在调用 connect() 后在 then() 回调中分配它,这样您就可以使用它来自多个 then() 回调。