Как создать терминальное соединение ввода-вывода с модулем Telit BLE? - PullRequest
0 голосов
/ 27 марта 2019

Я пишу прогрессивное веб-приложение для планшета Android, которое должно иметь возможность чтения и записи на устройство со встроенным модулем Telit BLE через соединение BLE.

Я могу открыть соединение BLE и узнать об услугах и характеристиках. Я не могу установить соединение через BLE с использованием протокола Telit Terminal I / O (TIO).

Мое удаленное (серверное) устройство является устройством отслеживания Falcom Fox3. Событие уведомления может быть прочитано с последовательного порта Fox3, когда соединение установлено. Это было успешно протестировано при подключении к Fox3 с помощью приложения терминала Telit для Android: https://play.google.com/store/apps/details?id=com.telit.tiosample

Я собрал короткую функцию, которая должна соединяться через BLE, устанавливать соединение TIO и запрашивать кредиты UART перед прослушиванием входящих данных с сервера.

Я основал свой код на простом скрипте из журнала Smashing Magazine: https://www.smashingmagazine.com/2019/02/introduction-to-webbluetooth/

Процесс инициализации соединения TIO описан в Руководстве по внедрению клиента профиля ввода / вывода терминала Telit.

Настройка подключения к терминалу ввода / вывода состоит из следующих шагов:

  • Клиент терминала ввода / вывода сканирует устройства Bluetooth с низким энергопотреблением, рекламируя услугу терминала ввода / вывода.
  • Клиент Terminal I / O устанавливает Bluetooth-соединение с низким энергопотреблением GATT с обнаруженным сервером Terminal I / O.
  • Клиент Terminal I / O выполняет обнаружение службы на сервере Terminal I / O.
  • Для найденной службы ввода-вывода терминала клиент ввода-вывода терминала выполняет обнаружение характеристик.
  • Клиент терминала ввода / вывода подписывается на признаки характеристики передачи кредитов UART (см. 7.4).
  • Клиент терминала ввода / вывода подписывается на уведомления о характеристике передачи данных UART (см. 7.2).
  • Клиент Terminal I / O передает начальные кредиты UART на сервер (см. 7.5).
  • Как только клиент терминала ввода / вывода получил ответ для переданных кредитов UART, соединение терминала ввода / вывода считается установленным, и в любое время следует ожидать показания для характеристики TX кредитов UART и уведомлений для характеристики данных UART. .

Порядок последовательности настройки соединения является обязательным.

Мой код выглядит следующим образом, где log - это функция, которая выводит на экран.

const SERVICE_UUID         = "0000fefb-0000-1000-8000-00805f9b34fb";
const UART_RX_UUID         = "00000001-0000-1000-8000-008025000000";
const UART_TX_UUID         = "00000002-0000-1000-8000-008025000000";
const UART_RX_CREDITS_UUID = "00000003-0000-1000-8000-008025000000";
const UART_TX_CREDITS_UUID = "00000004-0000-1000-8000-008025000000";

async function tio_connect() {
  let device = await navigator.bluetooth.requestDevice({
  filters: [{ namePrefix: 'FOX' }],
  optionalServices: [SERVICE_UUID]
  });
  log(" - Connecting<br>");
  let server = await device.gatt.connect();
  log(" - Getting Primary Service<br>");
  let service = await server.getPrimaryService(SERVICE_UUID);
  log(" - Subscribing to tx credits<br>");
  let tx_credits = await service.getCharacteristic(UART_TX_CREDITS_UUID);
  log(" - Subscribing to tx data<br>");    
  let tx_data = await service.getCharacteristic(UART_TX_UUID);
  log(" - Requesting credits<br>");   
  tx_credits.writeValue(new Uint8Array([255]));
  log(" - Starting listener<br>");   
  tx_data.addEventListener('characteristicvaluechanged', e => {log (e.value)});
  tx_data.startNotifications();
}

Это работает без ошибок и, кажется, устанавливает соединение Bluetooth на моем клиентском устройстве Android. Я ожидаю, что сервер ответит на соединение, вызовет событие и сообщит об этом. Событие такого подключения не происходит.

Я новичок в веб-Bluetooth и немного разбираюсь в JavaScript, поэтому не уверен, правильно ли я использую звонки - особенно для «подписки». Если бы кто-то мог уточнить, что подразумевается под подпиской в ​​этом контексте, это, несомненно, помогло бы мне понять.

Edit: Мне удалось установить соединение, когда я выяснил, как инструкции по подключению терминала I / O переводятся в JS.

Я выполнил эти шаги так: «Для полученной услуги терминала ввода / вывода клиент терминала ввода / вывода выполняет обнаружение характеристик».

let tx_credits = await service.getCharacteristic(UART_TX_CREDITS_UUID)
let tx_data = await service.getCharacteristic(UART_TX_UUID)
let rx_credits = await service.getCharacteristic(UART_RX_CREDITS_UUID)
let rx_data = await service.getCharacteristic(UART_RX_UUID)

«Клиент терминала ввода / вывода подписывается на признаки характеристики передачи кредитов UART (см. 7.4).»

await tx_credits.addEventListener('characteristicvaluechanged', e => {log ("<br>tx_credits: " + e.value)});
await tx_credits.startNotifications();

"Клиент терминала ввода / вывода подписывается на уведомления о характеристике передачи данных UART (см. 7.2)."

await tx_data.addEventListener('characteristicvaluechanged', e => {
  for (i=1;tx_data.value.getUint8(i);i++){
    log(String.fromCharCode(tx_data.value.getUint8(i)))
  }    
}
await tx_data.startNotifications();

«Клиент Terminal I / O передает начальные кредиты UART на сервер (см. 7.5).»

let rx_credit_level = await rx_credits.writeValue(new Uint8Array([255]))

1 Ответ

0 голосов
/ 28 марта 2019

Возможно, вы захотите дождаться writeValue и startNotifications.

...
log(" - Requesting credits<br>");   
await tx_credits.writeValue(new Uint8Array([255]));
log(" - Starting listener<br>");   
tx_data.addEventListener('characteristicvaluechanged', e => {log (e.value)});
await tx_data.startNotifications();
...