#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 чтобы отслеживать ход этой работы.