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



我正在为Android平板电脑编写一个渐进式Web应用程序,该应用程序应该能够通过BLE连接读取和写入具有嵌入式Telit BLE模块的设备。

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

我的远程(服务器)设备是Falcom Fox3跟踪器单元。 建立连接时,可以从 Fox3 串行端口读取通知事件。 通过使用Telit的Android终端应用程序连接到Fox3,这已经成功进行了测试: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的终端I/O配置文件客户端实施指南中所述。

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

  • 终端 I/O 客户端扫描通告终端 I/O 服务的低功耗蓝牙设备。
  • 终端 I/O 客户端与检测到的终端 I/O 服务器建立低功耗蓝牙 GATT 连接。
  • 终端 I/O 客户端在终端 I/O 服务器上执行服务发现。
  • 对于检索到的终端 I/O 服务,终端 I/O 客户端执行特征发现。
  • 终端 I/O 客户端订阅 UART 积分 TX 特征的指示(请参阅 7.4)。
  • 终端 I/O 客户端订阅 UART 数据 TX 特征的通知(请参阅 7.2)。
  • 终端 I/O 客户端将初始 UART 积分传输到服务器(请参阅 7.5)。
  • 一旦终端 I/O 客户端收到对传输的 UART 积分的响应,终端 I/O 连接就被视为已建立,并且应随时显示 UART 积分 TX 特征的指示和 UART 数据特性的通知。

连接设置顺序的顺序是必需的。

我的代码如下,其中日志是输出到屏幕的函数。

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();
}

这运行没有错误,并且似乎在我的客户端 android 设备上建立了蓝牙连接。 我希望服务器响应连接,触发事件并报告。 不会发生此类连接事件。

我是网络蓝牙的新手,对 JavaScript 有点生疏,所以不确定我是否使用了正确的调用 - 特别是对于"订阅"。 如果有人能澄清在这种情况下订阅涉及什么,这肯定会有助于我的理解。

编辑: 一旦我弄清楚终端 I/O 连接指令如何转换为 JS,我就能够运行连接。

我像这样执行了这些步骤: "对于检索到的终端 I/O 服务,终端 I/O 客户端执行特征发现。">

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)

"终端 I/O 客户端订阅了 UART 积分 TX 特征的指示(请参阅 7.4)。

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

"终端 I/O 客户端订阅 UART 数据 TX 特征的通知(请参阅 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();

"终端 I/O 客户端将初始 UART 积分传输到服务器(请参阅 7.5)。

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

您可能希望等待writeValuestartNotifications

...
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();

最新更新