如何自定义 BlueZ?
Posted
技术标签:
【中文标题】如何自定义 BlueZ?【英文标题】:How to customize BlueZ? 【发布时间】:2019-10-15 06:58:51 【问题描述】:我将提出一个非常主观的问题,但这很重要,因为我希望从失败中恢复,以编程方式有效地使用 BlueZ。
基本上,我设想的是在微型计算机(例如:Raspberry pi 或 Intel Compute Stick)上运行的 IoT 边缘设备。然后该设备将运行 AlpineLinux OS 并与 Cloud 交互。
既然是物联网环境,蓝牙BLE对ISM频段的重要性就不用说了。因此,能够自定义和使用 BlueZ 至关重要。
我希望用 BlueZ BLE 做几件事,包括但不限于
广告
配对
特色 广播 安全传输数据等...由于我需要完全控制数据、数据处理和与云交互(Edge AI 或云上的数据科学),我正在研究使用 BlueZ 的三种方式:
-
对 BlueZ 方法进行 DBus API 调用。
修改 BlueZ 代码库并安装自定义 bin。
(以便可以注册回调处理程序和丰富的其他 bluez
方法可以被调用)
在使用 system() 调用的程序中使用命令行实用程序(如 hcitool/bluetoothctl)调用 BlueZ。
没有 1 是我失败的地方。构建和导出 DBus 对象,然后调用 BlueZ 方法需要付出巨大的努力。此外,无法保证您能够解决所有 BLE 问题。
No 2 看起来很有希望,我想充分探索根据我的需要修改 BlueZ 代码的可行性。
No 3 是最不受欢迎的选项,但我还是希望将其作为备用选项。
鉴于我的问题陈述,最可行的前进策略是什么?我大声问这个问题,以免我犯更多的错误并花费自己的时间和精力。
【问题讨论】:
【参考方案1】:您最好的策略是从第二种方法开始(您已经发现它很有希望),因为这是一种可行的解决方案,许多开发人员都采用这种方法来创建他们的 BlueZ 程序。这是我要做的:-
-
在某种流程图或状态机中编写系统的所有功能。这有助于您可视化整个系统以及为实现最终目标需要做什么。
尝试使用 bluetoothctl 和 btmgmt 手动执行上述所有功能。这包括广告、配对等。我建议不要使用 hcitool 和 hciconfig 等遗留命令,因为这些命令已被弃用并且具有非常不同的代码结构。
当偶然发现一些不是 bluetoothctl/btmgmt 中的默认设置或您想要调整功能时,请更新源代码以执行此操作。
最后,一旦您手动让系统执行您需要的功能(不一定是全部,它可以只是功能的子集),您就可以将整个过程自动化。这涉及修改 bluetoothctl/btmgmt 命令的源代码,以便一切都由事件驱动,而不是手动干预。
这是一个好处,但如果您可以使用 python 或其他一些脚本语言创建自动化测试,那么这将确保您的系统是健壮的,并且在添加新功能时不会破坏以前的功能。
到此过程结束时,您将对 bluetoothctl/btmgmt 和 D-BUS API 的内部有更好的了解,您可能能够将您的代码与原始 bluetoothctl/btmgmt 完全分离或创建程序从头开始。
你可能已经知道了,但是在修改工具的时候,这里是源代码的起点:-
bluetoothctl - client/main.c btmgmt - tools/btmgmt.c有关使用 bluetoothctl 命令和 btmgmt 的更多参考资料,请参阅以下链接:-
BlueZ D-Bus C or C++ Sample Bluetoothctl set passkey https://***.com/a/51876272/2215147 Bluez Programming Linux command line howto accept pairing for bluetooth device without pin https://***.com/a/52982329/2215147 Bluetooth Low Energy in C - using Bluez to create a GATT server我希望这会有所帮助。
【讨论】:
非常感谢您的回答。自从我发布这个问题以来,我已经取得了很大的进步。我认为 BlueZ DBus 非常不完整。例如,没有 DBus API 可用于配置 bluez 芯片以进行低能量扫描,所有重复数据均未经过滤。我必须通过在 hci.h 和 hci_lib.h 中使用套接字和方法来做到这一点,所有这些都是 hcitool 的一部分。在 bluetoothctl 或 btmgmt 中找不到替代品(我可能是错的)。 我还想补充一点,即使在 gdbus-codegen 的帮助下,在 C 中使用 DBus API 也很困难。绑定到套接字和使用设备描述符令人惊讶地直截了当,并开辟了丰富的功能。这就是我现在的立场。 我同意,DBus 不完整,还有很多功能缺失。是否有关于使用套接字而不是 DBus API 的良好文档,或者这是通过反复试验? 我的感觉是,Bluetooth SIG 和 BlueZ 都对他们的产品内部进行了保护。也许他们想利用它。所以答案是否定的,没有好的文档。我不得不通过艰苦的尝试和错误来弄清楚,结果证明好的旧套接字比 DBUS 更好、更简单(即使使用 gdbus-codegen!) BlueZ DBus API 的一个尴尬问题是它确实可以工作,但是所有调用都超时并且无法正常返回。以上是关于如何自定义 BlueZ?的主要内容,如果未能解决你的问题,请参考以下文章