使用 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');
或者您可以将 server
变量带入函数的 top-level 并在调用 connect()
后在 then()
回调中分配它,这样您就可以使用它来自多个 then()
回调。
我正在尝试读取体重秤特性以及电池服务中的当前电池电量。
我有以下适用于体重秤服务和体重测量特性的服务,但我正在努力了解如何向其添加电池服务(我对承诺不是很熟悉)
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');
或者您可以将 server
变量带入函数的 top-level 并在调用 connect()
后在 then()
回调中分配它,这样您就可以使用它来自多个 then()
回调。