【问题标题】:How to customize BlueZ?如何自定义 BlueZ?
【发布时间】:2019-10-15 06:58:51
【问题描述】:

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

基本上,我设想的是在微型计算机(例如:Raspberry pi 或 Intel Compute Stick)上运行的 IoT 边缘设备。然后该设备将运行 AlpineLinux OS 并与 Cloud 交互。

既然是物联网环境,蓝牙BLE对ISM频段的重要性就不用说了。因此,能够自定义和使用 BlueZ 至关重要。

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

  1. 广告

  2. 配对

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

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

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

没有 1 是我失败的地方。构建和导出 DBus 对象,然后调用 BlueZ 方法需要付出巨大的努力。此外,无法保证您能够解决所有 BLE 问题。

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

No 3 是最不受欢迎的选项,但我还是希望将其作为备用选项。

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

【问题讨论】:

    标签: bluetooth-lowenergy bluez


    【解决方案1】:

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

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

    到此过程结束时,您将对 bluetoothctl/btmgmt 和 D-BUS API 的内部有更好的了解,您可能能够将您的代码与原始 bluetoothctl/btmgmt 完全分离或创建程序从头开始。

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

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

    我希望这会有所帮助。

    【讨论】:

    • 非常感谢您的回答。自从我发布这个问题以来,我已经取得了很大的进步。我认为 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 的一个尴尬问题是它确实可以工作,但是所有调用都超时并且无法正常返回。
    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 2023-02-11
    • 2019-05-02
    • 2014-04-16
    • 2013-11-20
    • 1970-01-01
    • 2012-03-02
    • 2018-10-21
    相关资源
    最近更新 更多