使用 gdbus 查找 D-Bus 唯一地址

Posted

技术标签:

【中文标题】使用 gdbus 查找 D-Bus 唯一地址【英文标题】:Find D-Bus unique address using gdbus 【发布时间】:2017-12-20 03:22:37 【问题描述】:

我正在尝试找出使用 Linux 上的 GDBus 库获取 D-Bus 系统总线中对象的唯一 D-Bus 地址的最佳方法。

以下是我正在使用的库的版本号:

# ls /usr/lib |grep -e dbus -e glib -e gio
libdbus-1.so
libdbus-1.so.3
libdbus-1.so.3.14.11
libdbus-glib-1.so
libdbus-glib-1.so.2
libdbus-glib-1.so.2.3.3
libgio-2.0.so
libgio-2.0.so.0
libgio-2.0.so.0.5000.3
libglib-2.0.so
libglib-2.0.so.0
libglib-2.0.so.0.5000.3

基本上,我想知道使用 gdbus 库位于系统总线上的对象 /org/bluez/hci0 的唯一名称/地址。有没有人有我将如何使用 C 库做到这一点的例子?

现在我可以使用命令了

# dbus-monitor --system

找出我需要的地址是:1.22。我几乎可以肯定有更好的方法来查找地址然后解析该命令的文本输出。

谢谢!

【问题讨论】:

为什么不使用服务的知名名称(如果您想跟踪当前唯一所有者,请使用 g_bus_watch_name() 获取它)。事实上,我认为没有理由找到“/org/bluez/hci0”,因为您应该使用 D-Bus ObjectManager API 来查找 bluez 导出的对象/接口 @jku 这是正确答案。如果我看这里git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/… 我可以看到众所周知的名称(服务名称)。由于这是我第一次使用 DBus,我没有意识到服务名称和众所周知的名称是一回事。在下方发表您的评论,我会将其标记为答案。 【参考方案1】:

为什么不使用服务的知名名称来查找它(如果您想跟踪当前的唯一所有者,请使用g_bus_watch_name() 来获取它)。

事实上,在 bluez 的情况下,我认为没有理由搜索“/org/bluez/hci0”,因为您应该使用 D-Bus ObjectManager API 来查找 bluez 的对象/接口服务出口。

【讨论】:

【参考方案2】:

在这里澄清一些概念:

D-Bus 地址:在您的想法中,D-Bus 中不存在“地址”之类的东西。有对象路径知名名称唯一名称。术语“地址”用于描述客户端用于连接到 dbus-daemon 的套接字路径,但这与您的要求无关。 唯一名称:与 :1.22 一样,它唯一标识与 dbus-daemon 的特定连接。通常,每个应用程序都有一个到守护程序的连接,因此这通常标识单个应用程序。 (但是,应用程序可以根据需要与总线建立多个连接;如果是这样,每个连接将具有不同的唯一地址)。 知名名称是服务与 dbus-daemon 连接的一致名称,用作其唯一名称的别名。例如,org.bluezorg.freedesktop.FileManager1 都是众所周知的名称。 对象地址:和/org/freedesktop/SomeService/blah一样,这实际上称为对象路径。对象路径仅在单个 D-Bus 连接的上下文中是唯一的,因此路径 /a/b/c 通常会引用 D-Bus 连接 :1.1:1.2 的不同对象。 (因此“我如何才能找到对象路径/a/b/c 的唯一名称?”的问题是不正确的,因为可能有许多唯一名称可以导出这样的对象。)

【讨论】:

以上是关于使用 gdbus 查找 D-Bus 唯一地址的主要内容,如果未能解决你的问题,请参考以下文章

使用 GDBus 通过 D-Bus 发送字节数组(类型为 `ay`)

GDBus

D-Bus:没有 ObjectManager 的导出对象

检查 D-Bus 对象是不是存在

如何确定使用哪个 D-Bus 绑定

gdbus 是 Bluez、glib 的一部分,还是两者都不是?