Я пытаюсь подключиться к двухрежимному Bluetooth-устройству Microchip «RN4678» с моего компьютера с Windows 10, используя BLE с веб-интерфейсом Bluetooth. Я могу найти устройство -> услугу -> характеристику, которая мне нужна, но я продолжаю получать сообщение «Ошибка ГАТТ: не сопряжено». при попытке запуска уведомлений по признаку.
Мой опыт работы с JavaScript минимален, поэтому я подумал, что, возможно, ошибочно связывал свои обещания, однако при распечатке информации об устройстве непосредственно перед попыткой добавления характеристики значение «connected» отображается как true.
Я также убедился, что устройство, сервис и характеристики работают так, как задумано, с помощью приложения «nRF Connect» на моем устройстве Android.
Вот мой код:
let targetService = '49535343-fe7d-4ae5-8fa9-9fafd205e455';
let txCharacteristicId = '49535343-1e4d-4bd9-ba61-23c647249616';
let rxCharacteristicId = '49535343-8841-43f4-a8d4-ecbe34729bb3';
function onButtonClick(event) {
// Find bluetooth device
console.log('Requesting Bluetooth Device...');
navigator.bluetooth.requestDevice({
acceptAllDevices: true,
optionalServices: [targetService]
})
// Connect to device
.then(device => device.gatt.connect())
// Get the server we want
.then(server => {
console.log('Getting UART transparent service...');
return server.getPrimaryService(targetService);
})
// Handle the characteristics we need
.then(service => {
return service.getCharacteristic(txCharacteristicId)
})
.then(characteristic => {
console.dir(characteristic.service.device);
return characteristic.startNotifications();
})
.then(characteristic => {
characteristic.addEventListener('characteristicvaluechanged',
handleTx);
})
.catch(error => {
console.log(error);
console.log(error.code);
console.log(error.message);
console.log(error.name);
});
}
function handleTx(event) {
console.log(event.target.value);
}
А вот консольные сообщения, которые я получаю:
index.html:18 Requesting Bluetooth Device...
index.html:27 Getting UART transparent service...
index.html:35 BluetoothDevice
gatt: BluetoothRemoteGATTServer
connected: true
device: BluetoothDevice {id: "p+lJYscejR+Xl4eX+VbNkA==", name: "Dual-SPP", gatt: BluetoothRemoteGATTServer, ongattserverdisconnected: null}
__proto__: BluetoothRemoteGATTServer
id: "p+lJYscejR+Xl4eX+VbNkA=="
name: "Dual-SPP"
ongattserverdisconnected: null
__proto__: BluetoothDevice
index.html:44 DOMException
index.html:45 19
index.html:46 GATT Error: Not paired.
index.html:47 NetworkError
Ниже приведена документация для функции запуска web-уведомлений через Bluetooth (https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattcharacteristic-startnotifications):
).
Метод startNotifications () при вызове ДОЛЖЕН возвращать новый
обещайте обещание и выполните следующие шаги параллельно. См. §5.6.4
Отвечая на уведомления и указания для деталей получения
уведомления.
- Если this.uuid заблокирован для чтения, отклоните обещание с помощью SecurityError и отмените эти шаги.
- Если this.service.device.gatt.connected имеет значение false, отклонить обещание с помощью NetworkError и прервать эти шаги.
- Позвольте характеристике быть этим. [[Представленный Характер]].
- Если характеристика равна нулю, вернуть обещание, отклоненное с ошибкой InvalidStateError, и прервать выполнение этих шагов.
- Если ни один из битов Notify или Indicate не установлен в свойствах характеристики, отклоните обещание с NotSupportedError
и прервите эти шаги.
- Если активный контекст контекста уведомления характеристики содержит navigator.bluetooth, разрешите обещание с помощью этого и прервите эти шаги.
Если агент UA в настоящее время использует систему Bluetooth, он МОЖЕТ отклонить обещание с помощью NetworkError и отменить эти шаги. ВОПРОС 9:
Реализации могут быть в состоянии избежать этой ошибки NetworkError, но пока
сайты должны сериализовать использование этого API и / или дать пользователю
способ повторить неудачные операции.
https://github.com/WebBluetoothCG/web-bluetooth/issues/188
Если признак имеет дескриптор конфигурации признака клиента, используйте любую из процедур дескрипторов признака для
убедитесь, что один из битов уведомления или индикации в
Дескриптор конфигурации характеристики клиента
установить, сопоставляя ограничения в свойствах характеристики. UA
ДОЛЖНЫ избегать установки обоих битов и ДОЛЖНЫ дедуплицировать изменение значения
события, если установлены оба бита. Обрабатывать ошибки, как описано в §5.7 Ошибка
обработки. Примечание: некоторые устройства имеют характеристики, свойства которых
включите бит Notify or Indicate, но у которого нет клиента
Характеристика Дескриптор конфигурации. Эти нестандартные
характеристики, как правило, для отправки уведомлений или указаний
безусловно, поэтому эта спецификация позволяет приложениям просто
подписывайтесь на их сообщения.
Если предыдущий шаг вернул ошибку, отклоните обещание с этой ошибкой и отмените эти шаги.
- Добавить navigator.bluetooth в набор активных контекстов уведомлений характеристики.
- Разрешите обещание с этим. После включения уведомлений результирующие события изменения значения не будут доставляться до
текущая контрольная точка микрозадачи. Это позволяет разработчику настроить
обработчики в обработчике .then результата обещают.
Edit:
Я использую Chrome версии 74, Windows 10.0.17134