BT через JavaScript.

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

BT через JavaScript.

Сообщение uldemir »

Есть желание сделать несложную программку для конфигурирования 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 оказывается, надо просто писать в кавычках... Но второй вопрос, как быть с двумя характеристиками - всиле.
zer0cat
Родился
Сообщения: 6
Зарегистрирован: Вс ноя 18, 2018 09:44:41

Re: BT через JavaScript.

Сообщение zer0cat »

[uquote="uldemir",url="/forum/viewtopic.php?p=4082177#p4082177"]Но второй вопрос, как быть с двумя характеристиками - всиле.[/uquote]
вроде в JS можно вернуть объект , в который задать две или сколько угодно характеристик, как свойства.
Если я верно понял вопрос.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: BT через JavaScript.

Сообщение uldemir »

Ммм, возможно, возможно.... но я еще не понимаю, где оно возвращается. А пока очередная ошибка:

Код: Выделить всё

// Запрос выбора 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 сервисов.
zer0cat
Родился
Сообщения: 6
Зарегистрирован: Вс ноя 18, 2018 09:44:41

Re: BT через JavaScript.

Сообщение zer0cat »

[uquote="uldemir",url="/forum/viewtopic.php?p=4082528#p4082528"]В функции requestDevice может быть указан фильтр, а может быть указано acceptAllDevices, но я не понимаю, как это записать? .[/uquote]
Справка говорит
acceptAllDevices: A boolean value indicating that the requesting script can accept all Bluetooth devices. The default is false.

Попробуйте передать true.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: BT через JavaScript.

Сообщение uldemir »

С 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. Но на андроиде я не знаю как войти в консоль, да и не знаю, какая страница работает - только что исправленная или еще из кэша?
zer0cat
Родился
Сообщения: 6
Зарегистрирован: Вс ноя 18, 2018 09:44:41

Re: BT через JavaScript.

Сообщение zer0cat »

Значит, на компьютере нет этого свойства у объекта navigator. Берите ноутбук например, или планшет.
let options = true
это массив , нельзя его поменять на булев тип. Мб там надо в массив значение добавить acceptAllDevices = true или как то так.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: BT через JavaScript.

Сообщение uldemir »

Ok, до меня дошло...

Код: Выделить всё

// Запрос выбора Bluetooth устройства
let options = {
  acceptAllDevices: true
};
Буду потихоньку разбираться дальше, как прочитать нужные мне характеристики.
zer0cat
Родился
Сообщения: 6
Зарегистрирован: Вс ноя 18, 2018 09:44:41

Re: BT через JavaScript.

Сообщение zer0cat »

Я JS знаю неплохо, но на уровне 2014 года; а так есть форум javascript.ru , где хорошие спецы. По отладке - ну наверное в курсе, в браузере F12 консоль, можно ставить брекпойнты и пошагово трейсить. Лучше в хроме , хотя ФФ тоже ничего, на любителя.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7357
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: BT через JavaScript.

Сообщение uldemir »

Про 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 записал...
Ответить

Вернуться в «Интеграция с ПК»