如何在 C++ 中使用 Bluez5 DBUS API 来配对和连接新设备?
Posted
技术标签:
【中文标题】如何在 C++ 中使用 Bluez5 DBUS API 来配对和连接新设备?【英文标题】:How can I use Bluez5 DBUS API in C++ to pair and connect new devices? 【发布时间】:2017-05-15 10:41:01 【问题描述】:我正在为 Intel Edison 编写蓝牙驱动程序。 Board 软件是最新可用的,我正在使用基于 Eclipse 的 IDE 进行开发。 此 edison 版本中的 Bluez 版本号为 5.37。
我正在设计一个必须满足以下要求的系统:
扫描附近的蓝牙设备。 [X] 根据名称和 MAC 地址检测传感器设备。 [X] 自动配对和连接传感器设备。 []最后一项是问题,因为我可以检测到传感器设备,但我无法使用 bluez5 接口将它们配对。到目前为止,我已尝试使用 D-BUS 接口,但它无法正常工作,因为我不断收到以下错误消息:
接口“org.bluez.Manager”上带有签名“s”的方法“FindAdapter”不存在
此处提供代码。请注意:
DBusConnection *conn -> DBUS_BUS_SYSTEM const char *适配器->“hci0”。代码:
DBusMessage *msg, *reply;
DBusError err;
const char *reply_path;
char *path;
msg = dbus_message_new_method_call("org.bluez", "/","org.bluez.Manager", "FindAdapter");
dbus_message_append_args(msg, DBUS_TYPE_STRING, &adapter,DBUS_TYPE_INVALID);
dbus_error_init(&err);
reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err);
dbus_message_unref(msg);
有什么想法吗?
【问题讨论】:
您可以使用一些更高级的 API,例如 Qt5 现在有一个蓝牙模块(它在引擎盖下也使用了 bluez)。也许这可以更直接地使用。 【参考方案1】:为了给您一个答案,Pair 和 Connect 与 device-api.txt 相关联。要调用这些方法,您可以发送 dbus 消息(就像您在上面的代码中所做的那样)或使用以下参数(在文档中找到)构建一个 Proxy 对象:
名称:“org.bluez”
接口“org.bluez.Device1”
path : "/org/bluez/dev_AA_BB_CC_DD_EE" 其中 AA_BB_CC_DD_EE 是您的设备 MAC 地址。
如果您选择构建代理对象,您可以通过代理调用 Pair 或 Connect 等方法。
您能解释一下您在上面的代码中要实现的目标吗?我知道您想找到要使用的适配器(我看到了“FindAdapter”方法),但是您似乎已经知道您的适配器名称是“hci0”。
最近一直在使用Bluez公开的DBus API,对“org.bluez.Manager”接口不熟悉。
在官方文档 (https://git.kernel.org/cgit/bluetooth/bluez.git/tree/doc) 中快速搜索后,我能够找到以下提交,它指定该接口在 2012 年被删除: https://git.kernel.org/cgit/bluetooth/bluez.git/commit/doc?id=86a7b07c22f3a595ba3c48092359287905bf0878
我还注意到您正在使用 DBus 低级 API,这是 freedesktop 自己建议的(请在此处阅读页面底部:https://dbus.freedesktop.org/doc/api/html/group__DBus.html),这是非常复杂的 API,可用于创建其他语言的绑定。如果可以,请切换到 GLib GDBus 以获得更简单的 API。
【讨论】:
以上是关于如何在 C++ 中使用 Bluez5 DBUS API 来配对和连接新设备?的主要内容,如果未能解决你的问题,请参考以下文章
使用 bluez 5.43 和 DBus 从 BLE 传感器读取广告数据包的正确方法是啥
BlueZ 5.4 DBus API ConnectProfile GATT 服务 UUID
如何使用 Bluez Profile1 DBus API 注册连接回调