我在Raspberry Pi上运行了一个使用bluez d-bus api的c++应用程序。它支持来自不同供应商的多种传感器,但是在大多数情况下,一旦我有了第一个传感器,添加新传感器就相当简单了。建立连接后,我并没有真正使用过奇的东西,只是“StartNotify”,“StopNotify”,“ReadValue”和“WriteValue”。无论如何,最近我在添加几个新传感器时遇到了问题。两者都使用较大的数据包大小,因此使用数据包嗅探器,我可以看到传感器正在协商较大的MTU。尽管出于任何原因,在协商之后,我都可以读取较大的值特征,但无法启用通知(或始终收到通知)。我尝试使用bluetoothctl使用不同的方法,发现使用“acquire-notify”似乎可以解决问题。我还注意到,新的“acquire”命令返回了MTU,因此可能与它有关。回到我已经支持的传感器,我还发现用“AcquireNotify”替换“StartNotify”似乎也可以使用。因此,我的底线是要对所有传感器使用“AcquireNotify”(使我的代码更整洁)还是只给我一个问题的新传感器。

不幸的是,我还没有在新的“获取”界面上找到任何深入的文档。对于没有太多烂摊子历史的人来说,根本不清楚使用它们和原始界面的影响。所以我的问题是双重的-

  • 是否有任何理由不使用“AcquireNotify”/“ReleaseNotify”作为
    所有传感器(甚至包括使用旧/较低MTU的旧传感器)?
  • 使用“AcquireNotify”时是否重要
    关于其他特性的“ReadValue”/“WriteValue”,或者我应该
    使用“AcquireRead”/“AcquireWrite”?

  • 非常感谢任何信息,谢谢!

    最佳答案

    AcquireNotify返回一个文件描述符,您可以对其进行轮询和读取,并且通知不会通过d-bus。使用StartNotify,您可以从d-bus读取通知值。如果您要在GATT通知中发送大量数据,则可以使用文件描述符(并且没有d-bus)获得更好的性能。

    AcquireNotify/AcquireWrite是相对较新的API,并且存在一些稳定性问题(由于SIGPIPE,蓝牙可能会终止)。在其存储库中有一些bluez 5.50补丁可以改善它。

    07-26 01:53