Найти уникальный адрес 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
? "Неправильно сформирован, потому что может быть много уникальных имен, которые экспортируют такой объект.)