【发布时间】:2021-03-09 06:41:13
【问题描述】:
就目前而言,这是一个很好的解决方案:
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::::'。
如果我删除最后一行,则随着时间的推移,检测结果会在终端控制台中添加到不断增长的列表中。但是一旦我添加了最后一行,它只能工作一次,然后就死了。
如何使脚本响应每个检测,而不仅仅是第一个检测? 为什么它只响应第一次检测然后挂起?
【问题讨论】:
-
似乎
bluetoothctl从未设计为以这种方式工作,并且命令管道的深度使得调试和维护变得非常困难。蓝牙信标的扫描可以通过大多数语言的 BlueZ D-Bus API 进行访问。这是python example。还有各种语言的MQTT clients。