就目前而言,这是一个很好的解决方案:
How to use bluetoothctl like hcitool lescan to report repeated proximity beacons
不过,我想更进一步:我不想将信标检测结果打印到终端,而是将每个检测到的信标的MAC地址传输到一个命令,该命令将其发布到Mosquitto。这将有助于将信标添加到HomeAssistant中,例如,用于检测附在人的住宅密钥上的密钥fob。通过修改上面脚本的最后两行,我成功地实现了这个想法,但它只发布了第一个检测.那就别再说了。我想扫描是通过尝试运行mosquitto_pub命令而关闭或中止的。(与中断线程或子subshells有关??)
下面是脚本的最后一行,我的两个测试信标的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剪切-c 1-17 \将输出缩减到仅MAC地址,例如FF:GG:
最后一行将ON命令发布到一个以信标的MAC地址结尾的唯一状态主题,例如“monitor/FF:GG:”。
如果我删除最后一行,检测就会随着时间的推移添加到终端控制台中不断增长的列表中。但一旦我加上最后一行,它只工作一次,然后就死了。
如何使脚本响应每个检测,而不仅仅是第一个检测?为什么它只对第一次检测做出反应,然后挂起?
发布于 2021-03-09 14:44:31
BlueZ的命令行工具不是为此目的而设计的,这使得它们很难可靠地进行管道扫描。在我的经验中,过程要么死,要么挂,最后你的管道断了。
BlueZ的C API更稳定。为此,我用C语言编写了一个简单的命令行程序,您可以使用它来代替蓝牙C:
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脚本,并发现它是可靠的许多天。如果有帮助的话,可以随意使用。
https://stackoverflow.com/questions/66541990
复制相似问题