Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить

BT через JavaScript.

Пт авг 27, 2021 12:54:56

Есть желание сделать несложную программку для конфигурирования BlueTooth устройства. Нашел в интернете статью: https://habr.com/ru/post/339146/ и пытаюсь по мотивам сделать своё что-то. Сразу скажу, в Java, Script и вообще в ООП я ни бум-бум. Проблему еще вызывает то, что эта штука, похоже, на PC не работает. Но я пытаюсь...

Страничку я сделал на GitPages. Мммм, не знаю остальным оно доступно или нет...

Пока я пытаюсь, то что понимаю переделать под своё. Пока проблема следующая - в функции
Код:
// Подключение к определенному устройству, получение сервиса и характеристики
function connectDeviceAndCacheCharacteristic(device) {
  if (device.gatt.connected && characteristicCache) {
    return Promise.resolve(characteristicCache);
  }

  log('Connecting to GATT server...');

  return device.gatt.connect().
      then(server => {
        log('GATT server connected, getting service...');

        return server.getPrimaryService(c3766409-8778-63d8-3cbb-dcf0e0c36022);
      }).
      then(service => {
        log('Service found, getting characteristic...');

        return service.getCharacteristic(0xFFE1);
      }).
getPrimaryService - как записать 128 битный UUID? Пока я его написал так как выковырнул из программы. Не нужно ли его записать как-то иначе? Может привести к BigInt? Собственно, мне так же нужно будет ввести UUID характеристик. А вот еще проблема, что у меня характеристик две. Можно ли этими средствами сделать доступ разом к двум характеристикам?

p.s. Ага, так UUID писать нельзя - Uncaught Synax Error. А как?

p.p.s оказывается, надо просто писать в кавычках... Но второй вопрос, как быть с двумя характеристиками - всиле.

Re: BT через JavaScript.

Пт авг 27, 2021 23:21:46

Но второй вопрос, как быть с двумя характеристиками - всиле.

вроде в JS можно вернуть объект , в который задать две или сколько угодно характеристик, как свойства.
Если я верно понял вопрос.

Re: BT через JavaScript.

Сб авг 28, 2021 09:03:09

Ммм, возможно, возможно.... но я еще не понимаю, где оно возвращается. А пока очередная ошибка:
Код:
// Запрос выбора Bluetooth устройства
function requestBluetoothDevice() {
  log('Search bluetooth device...');

  return navigator.bluetooth.requestDevice('AcceptAllDevices').  // <-- ТУТ ОШИБКА
      then(device => {
        log('"' + device.name + '" bluetooth device selected');
        deviceCache = device;

        return deviceCache;
      });
}
 
В функции requestDevice может быть указан фильтр, а может быть указано acceptAllDevices, но я не понимаю, как это записать? Фильтр мне не нужен, так как фильтровать по UUID я, наверное, не буду, так как моё устройство в адвертисменте не передаёт список UUID сервисов.

Re: BT через JavaScript.

Пн авг 30, 2021 14:17:00

В функции requestDevice может быть указан фильтр, а может быть указано acceptAllDevices, но я не понимаю, как это записать? .

Справка говорит
acceptAllDevices: A boolean value indicating that the requesting script can accept all Bluetooth devices. The default is false.

Попробуйте передать true.

Re: BT через JavaScript.

Вт авг 31, 2021 08:00:47

С true чего-то не получается. Вообще ничего не получается. Проблема в том, что этот блютус, похоже, на PC не работает. Я по образцу из той странички, сделал так:
Код:
// Запрос выбора Bluetooth устройства
let options = {
  filters: [
    {name: 'Bargraph thermometer'},
  ]
};


// let options = true;

function requestBluetoothDevice() {
  log('Search bluetooth device...');

  return navigator.bluetooth.requestDevice(options).
      then(device => {
        log('"' + device.name + '" bluetooth device selected');
        deviceCache = device;
//        deviceCache.addEventListener('gattserverdisconnected',
//            handleDisconnection);

        return deviceCache;
      });
Так вот на PC это выдаёт ошибку "Uncaught TypeError: Cannot read property 'requestDevice' of undefined". Но на планшете - работает. Вывалило окошко и показало моё устройство. Когда let options с фильтром закомментировал и откомментировал let options = true - на планшете перестало, возможно, работать. в Log выдало TypeError: Failed to execute 'requestDevice' on 'Bluetooth': cannot convert to dictionary. Но на андроиде я не знаю как войти в консоль, да и не знаю, какая страница работает - только что исправленная или еще из кэша?

Re: BT через JavaScript.

Ср сен 01, 2021 22:34:19

Значит, на компьютере нет этого свойства у объекта navigator. Берите ноутбук например, или планшет.

let options = true

это массив , нельзя его поменять на булев тип. Мб там надо в массив значение добавить acceptAllDevices = true или как то так.

Re: BT через JavaScript.

Чт сен 02, 2021 18:00:08

Ok, до меня дошло...
Код:
// Запрос выбора Bluetooth устройства
let options = {
  acceptAllDevices: true
};

Буду потихоньку разбираться дальше, как прочитать нужные мне характеристики.

Re: BT через JavaScript.

Чт сен 02, 2021 19:04:02

Я JS знаю неплохо, но на уровне 2014 года; а так есть форум javascript.ru , где хорошие спецы. По отладке - ну наверное в курсе, в браузере F12 консоль, можно ставить брекпойнты и пошагово трейсить. Лучше в хроме , хотя ФФ тоже ничего, на любителя.

Re: BT через JavaScript.

Чт сен 02, 2021 19:12:00

Про F12 в курсе, но на ноутбуке (это его я зову "PC") этот блютус не работает. Хотя Хром у меня регулярно всякие апдейты ставит (значит актуальная версия). Может надо еще что доинсталлировать? А вот как на планшете нажать F12 - ума не приложу. Придется отлаживаться по записям в лог.

Ну хорошо, устройство я вижу, но дальше что-то не идёт. Проблема в этом коде:
Код:
// Подключение к определенному устройству, получение сервиса и характеристики
function connectDeviceAndCacheCharacteristic(device) {
  if (device.gatt.connected && characteristicCache) {
    return Promise.resolve(characteristicCache);
  }

  log('Connecting to GATT server...');

  return device.gatt.connect().
      then(server => {
        log('GATT server connected, getting service...');

        return server.getPrimaryService('c3766409-8778-63d8-3cbb-dcf0e0c36022');
      }).
      then(service => {
        log('Service found, getting characteristic...');

        return service.getCharacteristic('14996d8a-8669-0ed5-2d5e-a892bd1d6212');
      }).
      then(characteristic => {
        log('Characteristic Left found');
        characteristicCache = characteristic;
        return service.getCharacteristic('74c1bfe8-2221-c915-c9fc-dd941f10f215');
      }).
      then(characteristic => {
        log('Characteristic Right found');
        characteristicCache = characteristic;

        return characteristicRightCache;
      });
}
Вот что выдаёт лог:
Search bluetooth device...
"Bargraph thermometer" bluetooth device selected
Connecting to GATT server...
GATT server connected, getting service...
SecurityError: Origin is not allowed to access any service. Tip: Add the service UUID to 'optionalServices' in requestDevice() options. https://goo.gl/HxfxSQ

вот тут затык. при чем тут безопасность?

Пошел почитать по ссылке. Оно хочет, чтобы было в фильтре объявлено хотябы optionalServices. Но как только добавляю фильтр, так функция жалуется на acceptAllDevices - противоречие. Пока работает так:
Код:
// Запрос выбора Bluetooth устройства
let options = {
  filters: [
    {name: 'Bargraph thermometer'}
  ],
  optionalServices: ['c3766409-8778-63d8-3cbb-dcf0e0c36022']
}
Но зато уже даже одной характеристике cache записал...
Ответить