如何在 C++ 中使用 Bluez5 DBUS API 来配对和连接新设备?
How can I use Bluez5 DBUS API in C++ to pair and connect new devices?
我正在为 Intel Edison 编写蓝牙驱动程序。 Board 软件是最新可用的,我正在使用基于 Eclipse 的 IDE 进行开发。
此 Edison 版本中的 Bluez 版本号为 5.37。
我正在设计一个必须满足以下要求的系统:
- 扫描附近的蓝牙设备。 [X]
- 根据名称和MAC 地址检测传感器设备。 [X]
- 自动配对和连接传感器设备。 []
最后一项是问题,因为我可以检测到传感器设备,但我无法使用 bluez5 接口将它们配对。到目前为止,我已尝试使用 D-BUS 接口,但它无法正常工作,因为我不断收到以下错误消息:
Method "FindAdapter" with signature "s" on interface "org.bluez.Manager" doesn't exist
此处提供代码。请注意:
- 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);
有什么想法吗?
为了给您一个答案,Pair 和 Connect 与 device-api.txt 相关联。要调用这些方法,您可以发送 dbus 消息(就像您在上面提供的代码中所做的那样)或使用以下参数(在文档中找到)构建一个 Proxy 对象:
姓名:"org.bluez"
界面"org.bluez.Device1"
路径:“/org/bluez/dev_AA_BB_CC_DD_EE”其中 AA_BB_CC_DD_EE 是您的设备 mac 地址。
如果选择构建代理对象,可以通过代理调用Pair或Connect等方法
你能解释一下你想在上面的代码中实现什么吗?我知道您想找到要使用的适配器(我看到了 "FindAdapter" 方法),但是您似乎已经知道您的适配器名称是 "hci0"。
最近一直在使用Bluez暴露的DBusAPI,对接口不熟悉"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.
我正在为 Intel Edison 编写蓝牙驱动程序。 Board 软件是最新可用的,我正在使用基于 Eclipse 的 IDE 进行开发。 此 Edison 版本中的 Bluez 版本号为 5.37。
我正在设计一个必须满足以下要求的系统:
- 扫描附近的蓝牙设备。 [X]
- 根据名称和MAC 地址检测传感器设备。 [X]
- 自动配对和连接传感器设备。 []
最后一项是问题,因为我可以检测到传感器设备,但我无法使用 bluez5 接口将它们配对。到目前为止,我已尝试使用 D-BUS 接口,但它无法正常工作,因为我不断收到以下错误消息:
Method "FindAdapter" with signature "s" on interface "org.bluez.Manager" doesn't exist
此处提供代码。请注意:
- 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);
有什么想法吗?
为了给您一个答案,Pair 和 Connect 与 device-api.txt 相关联。要调用这些方法,您可以发送 dbus 消息(就像您在上面提供的代码中所做的那样)或使用以下参数(在文档中找到)构建一个 Proxy 对象:
姓名:"org.bluez"
界面"org.bluez.Device1"
路径:“/org/bluez/dev_AA_BB_CC_DD_EE”其中 AA_BB_CC_DD_EE 是您的设备 mac 地址。
如果选择构建代理对象,可以通过代理调用Pair或Connect等方法
你能解释一下你想在上面的代码中实现什么吗?我知道您想找到要使用的适配器(我看到了 "FindAdapter" 方法),但是您似乎已经知道您的适配器名称是 "hci0"。
最近一直在使用Bluez暴露的DBusAPI,对接口不熟悉"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.