1

我试图找出使用 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

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

现在我可以使用命令

# dbus-monitor --system

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

谢谢!

4

2 回答 2

1

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

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

于 2017-07-15T17:42:43.283 回答
0

为了澄清这里的一些概念:

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