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

Find D-Bus unique address using 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 的唯一性 name/address。有没有人有我如何使用 C 库执行此操作的示例?

现在我可以使用命令

# dbus-monitor --system

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

谢谢!

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

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

在这里澄清一些概念:

  • 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?”是错误格式的,因为可能有许多唯一名称导出这样的对象。)