Найти уникальный адрес D-Bus с помощью gdbus

Я пытаюсь найти наилучший способ получения уникального адреса D-Bus объекта в системной шине D-Bus с помощью библиотеки GDBus в Linux.

Вот номера версий библиотек, которые я использую:

# 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, Я почти уверен, что есть лучший способ найти адрес, чем анализ текста этой команды.

Спасибо!

2 ответа

Решение

Почему бы не использовать известное имя службы, чтобы найти его (и если вы хотите отслеживать текущего уникального владельца, используйте g_bus_watch_name() чтобы получить это).

На самом деле, в случае с bluez я не думаю, что когда-либо есть причина искать "/org/bluez/hci0", так как вы должны использовать D-Bus ObjectManager API для поиска объектов / интерфейсов, которые экспортирует сервис bluez.

Чтобы уточнить некоторые понятия здесь:

  • Адрес D-Bus. В D-Bus нет такого понятия, как "адрес", как вы думаете. Есть пути к объектам, известные имена и уникальные имена. Термин "адрес" используется для описания пути к сокету, который клиенты используют для подключения к демону dbus, но это не связано с тем, что вы спрашиваете.
  • Уникальное имя: лайк :1.22 это однозначно идентифицирует конкретное соединение с демоном dbus. Как правило, каждое приложение имеет одно соединение с демоном, поэтому оно обычно идентифицирует одно приложение. (Тем не менее, приложения могут иметь более одного подключения к шине, если они хотят; в этом случае каждое подключение будет иметь уникальный уникальный адрес). Хорошо известное имя - это непротиворечивое имя для подключения службы к демону dbus, которое используется в качестве псевдонима для его уникального имени. Например, org.bluez или же org.freedesktop.FileManager1 оба известные имена.
  • Адрес объекта: Нравится /org/freedesktop/SomeService/blah, это на самом деле называется путь объекта. Пути к объектам уникальны только в контексте одного соединения D-Bus, поэтому путь /a/b/c будет обычно ссылаться на разные объекты для соединений D-Bus :1.1 а также :1.2, (Отсюда возникает вопрос: "Как мне найти уникальное имя пути объекта? /a/b/c? "Неправильно сформирован, потому что может быть много уникальных имен, которые экспортируют такой объект.)
Другие вопросы по тегам