尝试连续列出 Raspberry Pi 上范围内的所有蓝牙设备。我不需要监控任何流量,只需列出设备即可。我希望我可以从广告数据包(帧?)中获取该信息。
我在 Ubuntu 18.04 上做了一些实验,并且能够在 Wireshark 中看到这些数据包,但直到我让系统主动扫描蓝牙设备。有没有办法只是被动地接收这些广告,或者让系统不断扫描?我希望能够从 shell 脚本触发它。
理想情况下,我有一个 shell 脚本使用适当的过滤器运行 tshark 并获取输出,包括任何宣传其存在的设备。如果有某种原因不起作用,我愿意编写一个自定义程序来执行此操作。
我不太清楚为什么系统在扫描设备之前没有从蓝牙接收任何内容,以及是否有办法从脚本进入此模式。从那里我想问题是 tshark 是否可以做我需要的事情,或者它是否必须是一个程序。
到目前为止,我发现的所有蓝牙指令都会让我使用 GUI 来开始扫描。我还没有看到任何东西告诉我如何更直接地控制它。
答案1
嗯,这就是我想出的似乎有效的方法:
bluetoothctl scan on
sudo tshark -i bluetooth1 -Y "bthci_evt.le_meta_subevent == 0x2" -T fields -e bthci_evt.bd_addr -e bthci_evt.rssi
这给了我 MAC 地址和信号强度。然而我发现,当在 pi 上使用内置蓝牙时,它会在一段时间后停止工作。我可以重新启动该服务并让它再次运行一段时间,但每次它都会很快退出。
然而,如果使用便宜的 USB 蓝牙适配器,它似乎就可以永远运行。这就是为什么我在 bluetooth1 而不是 bluetooth0 上嗅探。时间会证明这是否是一个好的永久解决方案,但到目前为止它似乎有效。
答案2
我试过毛茸茸的我在 Raspberry Pi 4B 上找到了解决方案,但听了一下bluetooth0
并没有出现可靠性问题,因此内置蓝牙模块对我来说工作得很好,我不需要外部 USB 蓝牙模块。
但是,根据他们的答案中指定的过滤器,我无法获取所有蓝牙设备的列表,并且仅显示 BLE 设备。
使用此命令,您可以获得所有(BLE 和非 BLE)设备的列表,并显示其 MAC 地址、RSSI 和名称。
sudo tshark -i bluetooth0 -Y "(bthci_evt.code == 0x2f) || (bthci_evt.le_meta_subevent == 0x2 && btcommon.eir_ad.entry.device_name != '')" -T fields -e bthci_evt.bd_addr -e bthci_evt.rssi -e btcommon.eir_ad.entry.device_name
输出如下所示:
d1:6e:XX:XX:XX:XX -65 Mi Smart Band 4
8c:5a:XX:XX:XX:XX -43 Mi Soundbar
c5:9d:XX:XX:XX:XX -69 ENDURE
d1:6e:XX:XX:XX:XX -61 Mi Smart Band 4
8c:5a:XX:XX:XX:XX -47 Mi Soundbar
添加-e btcommon.cod.class_of_device -e btcommon.cod.minor_device_class
到命令末尾以显示非 BLE 设备的附加信息。
其他资源: