Linux bluez的le扫描速率取决于哪些因素?如何提高?

Linux bluez的le扫描速率取决于哪些因素?如何提高?,linux,bluetooth,bluetooth-lowenergy,bluez,Linux,Bluetooth,Bluetooth Lowenergy,Bluez,我想写一个脚本,当蓝牙低能量设备达到某个RSSI阈值时,立即打开与该设备的连接。首先,我使用bluepy用Python编写了一个脚本,但对响应速度感到失望。所以我认为这可能是库的问题,所以我用NodeJS重新编写了它,但结果是一样的。所以我挖得更深 该脚本在我的MacBookPro和Raspberry Pi 4上进行了测试。在Macbook上,ble设备的速度似乎略快于Raspi,但并不多 我发现,在Linux上,所有蓝牙通信都在bluez上运行,例如可以通过hcitool和bluetoothc

我想写一个脚本,当蓝牙低能量设备达到某个RSSI阈值时,立即打开与该设备的连接。首先,我使用bluepy用Python编写了一个脚本,但对响应速度感到失望。所以我认为这可能是库的问题,所以我用NodeJS重新编写了它,但结果是一样的。所以我挖得更深

该脚本在我的MacBookPro和Raspberry Pi 4上进行了测试。在Macbook上,ble设备的速度似乎略快于Raspi,但并不多

我发现,在Linux上,所有蓝牙通信都在bluez上运行,例如可以通过hcitool和bluetoothctl来控制bluez。所以我用它们来看看RSSI的更新速度有多快。而且在那里,响应速度还不够快。因此,Linux似乎没有足够快地处理来自ble设备的广告包

这些设备每100毫秒发布一次广告(也尝试了50毫秒,没有区别),但我看到大约每1秒只有一次RSSI更新。而且:感觉包裹像是连串而来。比如在4秒钟内有两个,然后一秒钟内什么都没有,然后另一个在4秒钟内爆炸

所以我的问题是:数据速率取决于哪些因素,数据输入的速度有多快?如何提高数据速率

是否有更好的ble芯片,我可以使用,或任何设置,我可以发挥左右

顺便说一句:为了确保没有丢失数据包的问题,ble设备总是非常接近Macbook/Raspi

下面是一个使用bluetoothctl的示例:

# sudo bluetoothctl
# agent on
# scan on

BlueZ命令行工具的设计目的不是为您提供扫描数据包的实时输出。您最好使用BlueZ C API。这是我用C编写的一个简单的命令行程序,它将为您提供BlueZ检测到的每个BLE广告包的原始输出。对于10Hz的广告商,我通常每秒看到8-9个数据包(你从来没有收到过100%)

我把编译C代码的说明放在文件的顶部。一旦这样做,您就可以这样使用它:

$ ./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

输出从MAC开始,然后是RSSI,然后是播发的十六进制字节。

BlueZ命令行工具的设计目的不是为您提供扫描数据包的实时输出。您最好使用BlueZ C API。这是我用C编写的一个简单的命令行程序,它将为您提供BlueZ检测到的每个BLE广告包的原始输出。对于10Hz的广告商,我通常每秒看到8-9个数据包(你从来没有收到过100%)

我把编译C代码的说明放在文件的顶部。一旦这样做,您就可以这样使用它:

$ ./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

输出从MAC开始,然后是RSSI,然后是播发的十六进制字节。

这将有助于共享执行扫描的代码。否则很难说问题出在哪里……当然。基本上,它不是代码,只是Linux命令:#sudo bluetoothctl#agent on#scan onIt将有助于共享执行扫描的代码。否则很难说问题出在哪里……当然。基本上,它不是代码,只是Linux命令:#sudo bluetoothctl#agent on#scan on tanks david!你的剧本帮我找到了一些答案,我一直在寻找。我了解到,在Linux中,蓝牙广告是在内核中解释的,我的程序正在使用用户空间中的数据。有几种方法可以在这些层之间进行通信,有些更有效,有些则不然。我还了解到,性能取决于扫描间隔和扫描窗口,扫描窗口可以根据外围设备的广告间隔进行调整。最后一个问题:是否有一个performant Python库来访问广告包?BlueZ具有现成的C绑定和Linux命令行实用程序。您可能可以使用C来绑定到Python(尽管我不知道怎么做)。我不知道有任何预先存在的到BlueZ的Python绑定。我找到了一个关于如何在Python中使用dbus编程BlueZ的好教程:谢谢david!你的剧本帮我找到了一些答案,我一直在寻找。我了解到,在Linux中,蓝牙广告是在内核中解释的,我的程序正在使用用户空间中的数据。有几种方法可以在这些层之间进行通信,有些更有效,有些则不然。我还了解到,性能取决于扫描间隔和扫描窗口,扫描窗口可以根据外围设备的广告间隔进行调整。最后一个问题:是否有一个performant Python库来访问广告包?BlueZ具有现成的C绑定和Linux命令行实用程序。您可能可以使用C对Python进行绑定(尽管我不知道怎么做)。我不知道有任何预先存在的Python对BlueZ的绑定。我找到了一个关于如何在Python中使用dbus编程BlueZ的好教程: