如何自定义 BlueZ?

How to customize BlueZ?

我会问一个非常主观的问题,但它很重要,因为我希望从失败中恢复过来,以编程方式有效地使用 BlueZ。

基本上,我设想的是 运行 微型计算机(例如:Raspberry pi 或英特尔计算棒)上的物联网边缘设备。然后设备将 运行 AlpineLinux OS 并与 Cloud 交互。

既然是IoT环境,Bluetooth BLE over ISM band的重要性就不用说了。因此,能够自定义和使用 BlueZ 非常重要。

我想用 BlueZ BLE 做几件事,包括但不限于

  1. 广告

  2. 正在配对

  3. 特征
  4. 广播 安全传输数据等...

由于我需要完全控制数据、数据处理和与云(边缘 AI 或云端数据科学)的交互,我正在研究三种使用 BlueZ 的方法:

  1. 使 DBus API 调用 BlueZ 方法。
  2. 修改 BlueZ 代码库并安装自定义 bin。 (以便可以注册回调处理程序和其他 bluez 的财富 可以调用方法)
  3. 在使用 system() 调用的程序中使用 hcitool/bluetoothctl 等命令行实用程序调用 BlueZ。

No 1 是我失败的地方。构造和导出 DBus 对象然后调用 BlueZ 方法需要大量工作。此外,不能保证您能够解决所有 BLE 问题。

No 2 看起来很有前途,我想充分探索根据我的需要修改 BlueZ 代码的可行性。

没有 3 是最不理想的选项,但我还是想将它作为后备选项。

根据我的问题陈述,最可行的前进策略是什么?我大声问这个问题,以免我犯更多的错误,浪费自己的时间和精力。

您最好的策略是从第二种方式开始(您已经发现它很有前途),因为这是一个可行的解决方案,许多开发人员都采用这种方法来创建他们的 BlueZ 程序。这是我会做的:-

  1. 在某种流程图或状态机中编写系统的所有功能。这有助于您可视化整个系统以及需要做什么才能达到您的最终目标。
  2. 尝试使用 bluetoothctl 和 btmgmt 手动执行上述所有功能。这包括广告、配对等。我建议避免使用 hcitool 和 hciconfig 等遗留命令,因为它们已被弃用并且具有非常不同的代码结构。
  3. 当偶然发现某些非 bluetoothctl/btmgmt 中的默认设置或您想调整功能时,请更新源代码以进行调整。
  4. 最后,一旦您手动让系统执行您需要的功能(不一定是全部,它可以只是功能的一个子集),您就可以转向自动化整个过程。这涉及修改 bluetoothctl/btmgmt 命令的源代码,这样就无需手动干预,一切都将是 event-driven.
  5. 这是一个额外的好处,但是如果您可以使用 python 或其他一些脚本语言创建自动化测试,那么这将确保您的系统健壮并且在添加新功能时不会破坏以前的功能.

在此过程结束时,您将更好地理解 bluetoothctl/btmgmt 和 D-BUS API 的内部结构,您可能能够将您的代码与原始 bluetoothctl/btmgmt 或从头开始创建程序。

您可能已经知道这一点,但是在修改工具时,这是源代码的起点:-

有关使用 bluetoothctl 命令和 btmgmt 的更多参考资料,请参阅以下链接:-

  • BlueZ D-Bus C or C++ Sample
  • Linux command line howto accept pairing for bluetooth device without pin

希望对您有所帮助。