我有一个在使用 bluez d-bus api 的 Raspberry Pi 上运行的 C++ 应用程序。它支持来自不同供应商的多个传感器,但在大多数情况下,一旦我得到第一个传感器,添加新传感器就变得相当简单。连接后,我并没有真正使用任何太奇特的东西,只是“StartNotify”、“StopNotify”、“ReadValue”和“WriteValue”。无论如何,最近我在添加几个新传感器时遇到了问题。两者都使用更大的数据包大小,因此使用数据包嗅探器我可以看到传感器协商更大的 MTU。无论出于何种原因,在协商之后我都可以读取更大的值特征,但无法启用(或无论如何接收)通知。尝试使用 bluetoothctl 的不同方法我发现使用“acquire-notify”似乎可以解决问题。我还注意到新的“获取”命令返回 MTU,所以这可能与它有关。回到我已经支持的传感器,我还发现用“AcquireNotify”替换“StartNotify”似乎也适用于它们。所以我的困境是是对所有传感器使用“AcquireNotify”(使我的代码更清晰)还是只是给我带来问题的新传感器。
不幸的是,我还没有真正找到关于新的“获取”接口的任何深入文档。对于没有很多 bluez 历史的人来说,完全不清楚使用它们与原始界面的后果是什么。所以我的问题是双重的 -
非常感谢任何信息,谢谢!
我在 Raspberry Pi(Buster 和 Stretch)上运行 bluez 5.50。我有一个 ble 传感器设备,只有在按下传感器设备上的按钮时才会公布数据。所以广告是异步的,中间没有周期性的广告(并且所有数据包都是唯一的,没有重复)。我遇到了 Bluez 的问题,尽管一旦收到数据包,Bluez 似乎在接下来的大约 11 秒内不会报告来自设备的任何其他数据包(偶尔间隔会更短)。这是使用 bluetoothctl 行命令工具以及我自己的 c++ 应用程序(基于 bluez client/main.c 示例)。在这两种情况下,在开始扫描之前,我都会清除扫描过滤器,将传输设置为 le,并将重复数据报告设置为打开。反过来,运行 hcitool scan 时,我看到了来自传感器的所有数据包(它甚至似乎报告了在不同广告频道上广播的所有 3 个副本)。所以我的问题是,有没有办法通过 dbus api 获取那些丢失的广告,可能是某个地方的一些额外设置?如果没有,hci api 可以从 C++ 使用吗,它应该能解决问题吗?任何帮助表示赞赏,谢谢!
根据亚历克斯的问题进行编辑 -
您是否尝试过下载最新的 bluez (5.53) https://git.kernel.org/pub/scm/bluetooth/bluez.git?
还没有,只是想检查一下这是否可能是事先已知的。
您使用的是 hcitool scan 还是 sudo hcitool lescan?如果您正在运行 hcitool scan,则您正在选择蓝牙经典(不是低能量数据包)。hcitool 是一个不推荐使用的工具。我发现 sudo hcitool lescan 仅适用于 BLE 4.x 控制器。该功能在 5.x 控制器上失败。
hcitool lescan(在 root 下),是的,硬件是 Pi Zero/W 和 P3 所以 BLE 4.x 控制器(我假设)
您是否尝试过运行 sudo btmon 以查看扫描期间的所有 HCI 通信?
我有但不记得我看到了什么,除了它与其他任何东西都没有矛盾,即丢失数据包 …