Использование WebBluetooth для доступа к нескольким сервисам и характеристикам

#node.js #web-bluetooth

#node.js #веб-bluetooth

Вопрос:

Я пытаюсь прочитать как характеристику шкалы веса, так и текущий уровень заряда батареи, который указан в службе батареи.

У меня есть следующее, которое работает для службы весовых весов и характеристики измерения веса, но я изо всех сил пытаюсь понять, как добавить к этому службу батареи (я не очень знаком с promises)

 function connectGATT() {
  if (bluetoothDeviceDetected.gatt.connected amp;amp; 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
  })
}
  

Ответ №1:

Чтобы получить доступ к службе батареи, вам нужно вызвать, server.getPrimaryService('battery_service') а затем вызвать getCharacteristic('battery_level') результирующий объект BluetoothGATTRemoteService. Смотрите полный пример здесь.

Проблема, которую вы определили, заключается в том, что в настоящее время, написанная с использованием Promises, server переменная больше не доступна в конце этой цепочки обещаний. Для этого есть несколько решений. Один из них заключается в использовании 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');
  

Источник

Или вы можете вывести server переменную на верхний уровень вашей функции и назначить ее в then() обратном вызове после вызова connect() , чтобы вы могли использовать ее из нескольких then() обратных вызовов.