微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 bluetoothctl 使用 MQTT 实时报告重复的邻近信标

如何解决如何使用 bluetoothctl 使用 MQTT 实时报告重复的邻近信标

就目前而言,这是一个很好的解决方案:

How to use bluetoothctl like hcitool lescan to report repeated proximity beacons

不过,我想更进一步:我不想将信标检测结果打印到终端,而是将每个检测到的信标的 MAC 地址通过管道传输到一个命令,该命令将其发布到 Mosquitto 代理。这对于将信标添加到 HomeAssistant 将非常有用,例如,用于检测连接到个人房屋钥匙的密钥卡的存在。我设法通过修改上面脚本的最后两行来使这个想法起作用,但它只发布第一个检测......然后没有更多。我猜想以某种方式通过尝试运行 mosquitto_pub 命令来关闭或中止扫描。 (与中断线程或子shell有关????)

这是脚本的最后几行,其中我的两个测试信标的 MAC 地址被混淆了。 您可以在上面的链接中查看我修改过的完整脚本。

) | sed --unbuffered --quiet --expression 's/^.*Device //p' \
| grep --line-buffered -E 'FF:FF::::|FF:GG::::' \
| stdbuf -oL cut -c 1-17 \
| { read topic; mosquitto_pub -d -u username -P password -m ON -t monitor/$topic; }

注意: | stdbuf -oL cut -c 1-17 \ 将输出修剪为仅 MAC 地址 - 例如FF:GG::::

最后一行将 ON 命令发布到以信标 MAC 地址结尾的唯一状态主题,例如'监视器/FF:GG::::'。

如果我删除最后一行,随着时间的推移,检测将添加到终端控制台中,列表中会不断增加。但是一旦我添加最后一行,它就只能工作一次,然后就死了。

如何使脚本响应每个检测,而不仅仅是第一个? 为什么它只响应第一次检测然后挂起?

解决方法

BlueZ 的命令行工具不是为此目的而设计的,因此它们很难可靠地管道扫描结果。根据我的经验,进程会死掉或挂起,最终会导致管道破裂。

BlueZ 的 C API 更加稳定。我用 C 编写了一个简单的命令行程序,您可以使用它来代替 bluetoothctl:

https://gist.github.com/davidgyoung/0a18028b4338ff6cb201fba274502662

那个程序必须用 cc scanner.c -lbluetooth -o scanner 编译,之后你可以只用 scanner 启动扫描器。程序的输出将是这样的:

B8:27:EB:1F:93:4D -68 02 01 06 11 06 82 75 25 D9 37 9D D7 8F 5F 4A F4 20 00 00 75 30
71:5C:23:9D:BC:7F -68 02 01 1A 02 0A 0C 0B FF 4C 00 10 06 03 1A 3B D4 B2 EB
B8:27:EB:1F:93:4D -68 02 01 06 11 06 82 75 25 D9 37 9D D7 8F 5F 4A F4 20 00 00 75 30
4A:53:7F:64:71:EC -91 03 03 9F FE 17 16 9F FE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
69:0D:FF:7B:75:65 -73 02 01 1A 02 0A 0C 0A FF 4C 00 10 05 03 1C 27 BB 63
61:39:71:E9:1D:C9 -93 02 01 1A 02 0A 18 0A FF 4C 00 10 05 01 18 3B 24 12
B8:27:EB:1F:93:4D -68 02 01 06 11 06 82 75 25 D9 37 9D D7 8F 5F 4A F4 20 00 00 75 30

上面的每一行显示了检测到的蓝牙设备的 MAC 地址,然后是信号强度 RSSI,然后是广告的十六进制字节。

我使用这个程序通过管道传输到其他 shell 脚本,并且在很多天里发现它是可靠的。如果有帮助,请随意使用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。