问题
蓝牙设备默认会以每秒钟 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 聊聊, 查看更多联系方式