通过蓝牙网关下发指令,过滤掉蓝牙设备高频率的波形数据

文章目录

    问题

    蓝牙设备默认会以每秒钟 350 次的频率向蓝牙网关发送实时波形数据(心电波形、血氧波形、呼吸波形),
    然后蓝牙网关再将这些数据转发到服务器。

    • 这些波形数据是没有记录价值的
    • 蓝牙设备数量不可控,在数量多时,对服务器产生巨大的并发请求压力。我在开发机上 WSL Ubuntu 里部署的 EMQX 偶尔会扛不住挂掉。。。原因不明。
    • 高频造成的数据黏包严重。例如蓝牙网关协议的数据包部分,能频繁看到多个蓝牙数据包拼接,且被截断的情况
    • 蓝牙设备虽然支持禁用波形数据输出,但是每次重启都恢复原配置

    过滤掉波形数据的方案

    服务器端每十秒向蓝牙网关下发一次禁用波形数据的控制指令。

    emqx 限速

    https://www.emqx.io/docs/zh/v4.1/advanced/rate-limit.html

    EMQX 有两个速率限制配置项能用上。默认是没有限制的:

    • publish_limit 是单个连接上接收 PUBLISH 报文的速率限制。100,10s 代表每个连接上允许收到的最大 PUBLISH 消息速率是每 10 秒 100 个。
    • rate_limit 是单个连接上接收 TCP数据包的速率限制。100KB,10s 代表每个连接上允许收到的最大 TCP 报文速率是每 10 秒 100KB。

    写命令与写请求的区别

    • Write Request (带 response 的写指令)
    • Write Command (不带 response 的写指令)

    写入命令类似于写请求,区别是写入命令没有响应。写入命令包含要写入的属性的句柄和要写入的数值。

    当无需响应时,可以使用写入命令。此外,因为该命令可以在任何时刻发送,即使刚发送了一条请求还未收到相应的响应,对命令的发送时延有较高的要求时,该请求也适合。

    调试方法

    • 用蓝牙网关 UDP 转发到自带的蓝牙调试工具上
    • 使用 Android 蓝牙调试工具获取能写入的特性,找到 handle 值。现有的 APP 都不太满足要求,或者使用不方便,我准备自己写个蓝牙调试工具。这里需要注意的是,建立连接时使用的 notify handle 值跟下发写入指令的特性 handle 值是不同的
    • “测试连接蓝牙设备通信”工具,可以显示发送的命令,可以用来对比自己拼接成的命令,格式是否正确

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式