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

时间:2017-07-14 23:26:30

标签: c linux dbus bluez gdbus

我试图找到使用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。我几乎可以肯定,找到地址然后解析该命令的文本输出会有更好的方法。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

澄清一些概念:

  • 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的唯一名称?”这一问题是不正确的,因为可能有许多唯一的名称可以导出这样的对象。)