如何在C++中使用Bluez5 DBUS API进行新设备的配对和连接?

15

我正在为Intel Edison编写蓝牙驱动程序。板子软件是最新的可用版本,并且我正在使用基于Eclipse的IDE进行开发。这个Edison版本中的Bluez版本号为5.37。

我正在设计一个系统,需要满足以下要求:

  • 扫描附近的蓝牙设备。[X]
  • 通过名称和MAC地址检测传感器设备。[X]
  • 自动配对和连接传感器设备。[]

最后一项是问题,因为虽然我可以检测到传感器设备,但我无法使用bluez5接口将它们配对。到目前为止,我尝试使用D-BUS接口,但由于我不断收到以下错误消息,所以它不起作用:

在“org.bluez.Manager”接口上具有签名“s”的方法“FindAdapter”不存在

代码如下。请注意:

  • DBusConnection *conn -> DBUS_BUS_SYSTEM
  • const char *adapter -> "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)。也许这样会更加简单易用。 - Venemo
1个回答

3
为了回答您的问题,Pair和Connect与device-api.txt相关联。要调用这些方法,您可以发送dbus消息(就像上面所示的代码中所做的那样),或者使用以下参数(在文档中找到)构建代理对象:

名称:“org.bluez”

接口:“org.bluez.Device1”

路径:“/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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接