Javascript 如何创建到Telit-BLE模块的终端I/O连接?

Javascript 如何创建到Telit-BLE模块的终端I/O连接?,javascript,bluetooth-lowenergy,progressive-web-apps,web-bluetooth,Javascript,Bluetooth Lowenergy,Progressive Web Apps,Web Bluetooth,我正在为android平板电脑编写一个渐进式web应用程序,它应该能够通过BLE连接读写带有嵌入式Telit BLE模块的设备 我能够打开一个可扩展的连接并发现服务和特性。我无法使用Telit的终端I/O(TIO)协议通过BLE建立连接 我的远程(服务器)设备是Falcom Fox3跟踪装置。建立连接时,可以从Fox3串行端口读取通知事件。这已经通过使用Telit的android终端应用程序连接到Fox3成功测试: 我已经编写了一个简短的函数,它应该通过BLE连接,建立TIO连接,并在侦听来自服

我正在为android平板电脑编写一个渐进式web应用程序,它应该能够通过BLE连接读写带有嵌入式Telit BLE模块的设备

我能够打开一个可扩展的连接并发现服务和特性。我无法使用Telit的终端I/O(TIO)协议通过BLE建立连接

我的远程(服务器)设备是Falcom Fox3跟踪装置。建立连接时,可以从Fox3串行端口读取通知事件。这已经通过使用Telit的android终端应用程序连接到Fox3成功测试:

我已经编写了一个简短的函数,它应该通过BLE连接,建立TIO连接,并在侦听来自服务器的传入数据之前请求UART信用

我的代码基于Smashing杂志的一个简单脚本:

启动TIO连接的过程如Telit的终端I/O配置文件客户端实现指南所示

终端I/O连接设置包括以下步骤:

  • 终端I/O客户端扫描蓝牙低能耗设备,以宣传终端I/O服务
  • 终端I/O客户端与检测到的终端I/O服务器建立蓝牙低能GATT连接
  • 终端I/O客户端在终端I/O服务器上执行服务发现
  • 对于检索到的终端I/O服务,终端I/O客户端执行特征发现
  • 终端I/O客户端订阅UART credits TX特性的指示(见7.4)
  • 终端I/O客户端订阅UART数据发送特性的通知(见7.2)
  • 终端I/O客户端向服务器传输初始UART信用(见7.5)
  • 一旦终端I/O客户端收到发送的UART信用的响应,终端I/O连接即被视为已建立,并应随时显示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();
}
“终端I/O客户端订阅UART credits TX特性的指示(参见7.4)。”

“终端I/O客户端将初始UART信用传输到服务器(参见7.5)。”


您可能需要等待
writeValue
startNotification

。。。
日志(“-请求积分
”); 等待tx_credits.writeValue(新的Uint8Array([255]); 日志(“-启动侦听器
”; tx_data.addEventListener('characteristicvaluechanged',e=>{log(e.value)}); 等待发送数据。开始通知();
这当然有帮助。问题实际上在于以正确的顺序完成所有正确的步骤——在我的设备注册连接之前,我需要添加一些额外的步骤。
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)
await tx_credits.addEventListener('characteristicvaluechanged', e => {log ("<br>tx_credits: " + e.value)});
await tx_credits.startNotifications();
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();
let rx_credit_level = await rx_credits.writeValue(new Uint8Array([255]))