«Ошибка ГАТТ: не сопряжена».с веб-Bluetooth, когда устройство показывает, как подключен - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь подключиться к двухрежимному 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 Отвечая на уведомления и указания для деталей получения уведомления.

  1. Если this.uuid заблокирован для чтения, отклоните обещание с помощью SecurityError и отмените эти шаги.
  2. Если this.service.device.gatt.connected имеет значение false, отклонить обещание с помощью NetworkError и прервать эти шаги.
  3. Позвольте характеристике быть этим. [[Представленный Характер]].
  4. Если характеристика равна нулю, вернуть обещание, отклоненное с ошибкой InvalidStateError, и прервать выполнение этих шагов.
  5. Если ни один из битов Notify или Indicate не установлен в свойствах характеристики, отклоните обещание с NotSupportedError и прервите эти шаги.
  6. Если активный контекст контекста уведомления характеристики содержит navigator.bluetooth, разрешите обещание с помощью этого и прервите эти шаги.
  7. Если агент UA в настоящее время использует систему Bluetooth, он МОЖЕТ отклонить обещание с помощью NetworkError и отменить эти шаги. ВОПРОС 9: Реализации могут быть в состоянии избежать этой ошибки NetworkError, но пока сайты должны сериализовать использование этого API и / или дать пользователю способ повторить неудачные операции. https://github.com/WebBluetoothCG/web-bluetooth/issues/188

  8. Если признак имеет дескриптор конфигурации признака клиента, используйте любую из процедур дескрипторов признака для убедитесь, что один из битов уведомления или индикации в Дескриптор конфигурации характеристики клиента установить, сопоставляя ограничения в свойствах характеристики. UA ДОЛЖНЫ избегать установки обоих битов и ДОЛЖНЫ дедуплицировать изменение значения события, если установлены оба бита. Обрабатывать ошибки, как описано в §5.7 Ошибка обработки. Примечание: некоторые устройства имеют характеристики, свойства которых включите бит Notify or Indicate, но у которого нет клиента Характеристика Дескриптор конфигурации. Эти нестандартные характеристики, как правило, для отправки уведомлений или указаний безусловно, поэтому эта спецификация позволяет приложениям просто подписывайтесь на их сообщения.

  9. Если предыдущий шаг вернул ошибку, отклоните обещание с этой ошибкой и отмените эти шаги.

  10. Добавить navigator.bluetooth в набор активных контекстов уведомлений характеристики.
  11. Разрешите обещание с этим. После включения уведомлений результирующие события изменения значения не будут доставляться до текущая контрольная точка микрозадачи. Это позволяет разработчику настроить обработчики в обработчике .then результата обещают.

Edit: Я использую Chrome версии 74, Windows 10.0.17134

1 Ответ

0 голосов
/ 23 мая 2019

Я нашел решение для своего устройства, надеюсь, оно подойдет и вам. Как выясняется, устройство должно быть сопряжено с ОС Windows до для установления соединения через веб-Bluetooth. Таким образом, даже несмотря на то, что веб-Bluetooth «подключался» и отображал все свойства GATT - устройство было фактически отключено, когда оно получало команду startNotifications() (поскольку оно не сопряжено через ОС). Кроме того, (в моем случае, но это, вероятно, зависит от устройства) мой «код доступа по умолчанию» был 000000 (нужно было ровно 6 нулей). Обязательно дважды проверьте это при сопряжении с ОС Windows.

Редактировать: Такое поведение (необходимость сопряжения устройства с ОС перед установкой соединения через Интернет Bluetooth) является ошибкой, обнаруженной в macOS в дополнение к Windows. См. Chrome-bug для получения дополнительной информации.

...