Запись символьного значения с помощью Web bluetooth API

#bluetooth-lowenergy #web-bluetooth

#bluetooth-низкое энергопотребление #web-bluetooth

Вопрос:

Мне нужно записать зашифрованное значение в характеристику устройства BLE с помощью Web Bluetooth API. Я могу зарегистрировать службу и характеристику. Но я не могу записать значение.

Мы имеем в виду скрипт на Python, который может успешно выполнять запись в характеристику. Записанные данные шифруются, а затем преобразуются в массив байтов и записываются в характеристику.

Мы пытаемся записать то же значение с помощью javascript в характеристику, но получаем NotSupportedError.

Может кто-нибудь, пожалуйста, помочь мне найти решение?

Код:

      navigator.bluetooth
      .requestDevice({
        filters: [{ name: deviceName }],
        optionalServices: [GATT_SERVICE], 
      })
      .then((device) => {
        // Step 2: Connect to it
        console.log("device:", device);
        return device.gatt.connect();
      })
      .then((server) => {
        // Step 3: Get the Service
        console.log("server: ", server);
        return server.getPrimaryService(GATT_SERVICE);
      })
      .then((service) => {
        // Step 4: get the Characteristic
        console.log("service: ", service);
        
        return service.getCharacteristic(GATT_CHARACTERISTIC);
      })
      .then((characteristic) => {
       // data contains the value to be written to the BLE device
        writeBuffer(data, 0);

        function writeBuffer(data, start) {
          writeOut(data, start);
        }

        function writeOut(data, start) {
          if (start >= data.length) return;

          characteristic
            .writeValue(
              new TextEncoder().encode(data.substring(start, start   20))
            )
            .then(() => {
              writeOut(data, start   20);
            });
        }
     })
      .catch((error) => {
        console.log(error);
      });

  

Поскольку длина составляет более 512 байт, я беру подстроку и пытаюсь записать значение.

Ответ №1:

Функция writeValue() устарела в пользу более конкретных функций writeValueWithResponse() и writeValueWithoutResponse(). Попробуйте использовать любой из них и посмотрите, работает ли это для вас.

Для получения более подробной информации об этих двух API вы можете ознакомиться с записью об этом в ChromeStatus.

Комментарии:

1. Привет, я попробовал оба указанных вами метода и получил следующую ошибку: ОШИБКА Error: Uncaught (в обещании): NotSupportedError: операция GATT завершилась неудачно по неизвестной причине. В чем может быть причина?

2. Я пытаюсь записать значение для различных характеристик, перебирая характеристики определенной службы. Я также добавил задержку в 100 мс между записями. Тем не менее, он выдает NotSupportedError. Я использую браузер Chrome в Windows 10. Можете ли вы, пожалуйста, предложить?

3. В таком случае, я не уверен, в чем может быть ошибка. Я не вижу ничего такого, что выделялось бы в вашем примере кода, что могло бы иметь место. Я думаю, что сейчас вам лучше всего было бы отправить отчет об ошибке для Chrome по адресу crbug.com с помощью этого примера кода.

4. Я получаю ошибку DOMException при попытке записать данные на устройство. Я использую метод writeValueWithoutResponse, и он работал хорошо. Внезапно он начал выдавать ошибку DOMException. Что может быть причиной этого? Можете ли вы, пожалуйста, предложить?

Ответ №2:

Если вы вручную подключите свой компьютер к устройству Bluetooth перед подключением через веб-страницу, это сработает?

Если вы используете Chrome (или браузер на основе Chromium), то это, скорее всего, связано с тем, что Chrome не выполняет автоматическое сопряжение во всех операционных системах. Для чтения/ записи зашифрованных характеристик устройство Bluetooth должно быть подключено к компьютеру. macOS и Android будут подключаться при необходимости, но Windows / Linux / ChromeOS этого не делают. Мы надеемся, что это скоро будет исправлено. Вы можете следоватьhttps://crbug.com/960258 чтобы отслеживать ход этой работы.