蓝牙:使用 Bluez 检测事件

Posted

技术标签:

【中文标题】蓝牙:使用 Bluez 检测事件【英文标题】:Bluetooth: Detect Event Using Bluez 【发布时间】:2012-07-06 08:27:45 【问题描述】: 我们正在尝试检测 C/C++ 中的事件。 我们在 Linux 上使用 Bluez 作为我们的蓝牙库。 我们的目标是在触发该事件时运行外部脚本。 具体来说,我们有一个摩托罗拉 H730 耳机,上面有一个按钮,我们正在寻找检测该按钮的按下。 我们已配对蓝牙设备 (hcitool),并且可以连接到它 (bluez-test-audio),但有兴趣将该方法迁移到 C/C++。

连接设备并按下按钮时hcidump的输出为:

HCI 嗅探器 - 蓝牙数据包分析器 2.2 版 设备:hci0 snap_len:1028 过滤器:0xffffffff

HCI 事件:模式更改 (0x14) plen 6 状态 0x00 句柄 21 模式 0x00 间隔 0 模式:主动 ACL 数据:句柄 21 标志 0x02 dlen 17 L2CAP(d): cid 0x0041 len 13 [psm 0] L2CAP(d): cid 0x0047 len 10 [psm 0] L2CAP(d): cid 0x0047 len 18 [psm 0] L2CAP(d): cid 0x0047 len 18 [psm 0] HCI 事件:已完成数据包数 (0x13) plen 5 处理 21 个数据包 1 ACL 数据:句柄 21 标志 0x02 dlen 18 L2CAP(d): cid 0x0041 len 14 [psm 0] L2CAP(d): cid 0x0047 len 10 [psm 0] HCI 事件:已完成数据包数 (0x13) plen 5 处理 21 个数据包 1 HCI 事件:已完成数据包数 (0x13) plen 5 处理 21 个数据包 1 HCI 事件:已完成数据包数 (0x13) plen 5 处理 21 个数据包 1 HCI 事件:模式更改 (0x14) plen 6 状态 0x00 句柄 21 模式 0x02 间隔 2048 模式:嗅探

我们查找了蓝牙文档,但没有取得多大成功。 我们如何使用 Bluez 在 C/C++ 中检测蓝牙事件?

【问题讨论】:

成功了吗? 【参考方案1】:

我去年做了类似的事情。我选择的方法是使用libdbus-c++ 生成 c++ 代理对象/类,以通过 dbus 与 bluez 进行通信。

确定耳机实现的蓝牙接口。我使用d-feet 并在连接设备时对其进行了探索。您可以在此处手动控制和读取耳机的状态,这对于调试非常有用。 生成、查找或创建所需接口的 dbus xml 描述。我通过将 api 规范从 bluez api documentation 转换为 xml 手动完成了这项工作,但我相信您也可以通过 dbus 自省来创建它们。 使用dbusxx-xml2cpp生成代理对象 确定按下按钮时调用的回调 根据需要将代理对象集成到您的代码中

您需要将您的代码链接到 libdbus-c++ 并将其安装在目标上。

您可以使用生成的代理对象来访问耳机的全部功能,它可能比按下按钮更有用!

【讨论】:

【参考方案2】:

收集的hcidump 是设备主机和控制器之间的日志。事件是控制器发送到设备主机的事件,命令是发送到设备主机的请求/响应。

Bluez 编程指南:http://people.csail.mit.edu/albert/bluez-intro/

【讨论】:

以上是关于蓝牙:使用 Bluez 检测事件的主要内容,如果未能解决你的问题,请参考以下文章

Linux 下蓝牙bluez分析及使用

使用 DBus 和 Bluez 将数据写入蓝牙设备

(Bluez) 如何获取蓝牙耳机按键输入?

Linux 上 C blueZ 中的蓝牙配对

[BlueZ] 2使用bluetoothctl搜索连接配对读写使能notify蓝牙低功耗设备

蓝牙:如何使用 Bluez 创建一个套接字以连接到具有特定 UUID 的服务?