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

问题描述:

我正在为英特尔Edison写蓝牙驱动程序。 Board软件是最新版本,我正在开发使用基于Eclipse的IDE。 此爱迪生版本中的Bluez版本号是5.37。如何在C++中使用Bluez5 DBUS API来配对和连接新设备?

我设计它必须满足以下要求的系统:

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

最后一项是问题,因为我可以检测传感器设备,但我无法使用bluez5接口将它们配对。到目前为止,我已经尝试使用d-BUS接口,但它不工作,因为我不断收到以下错误信息:在界面中的“org.bluez.Manager”有特色“的”

法“FindAdapter”不存在

代码在这里介绍。请注意:

  • DBusConnection *连接 - > 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); 

任何想法?

+0

您可以使用一些更高级的API,例如Qt5现在有一个蓝牙模块(它也使用蓝色底层)。也许这可以更直接地使用。 – Venemo

为了给你一个anwser,Pair和Connect与device-api.txt关联。要调用这些方法,您可以发送DBUS消息(就像你在上面提供的代码所做的那样),或建立具有以下参数代理对象(文档中找到):

名称:“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。