Qt D-Bus
Введение
D-Bus — это механизм межпроцессного взаимодействия (IPC) и вызова удаленных процедур (RPC), первоначально разработанный для Linux, призванный заменить существующие и конкурирующие решения IPC единым протоколом. Он также разработан для обеспечения связи между системными процессами (такими как службы принтеров и драйверов устройств) и обычными пользовательскими процессами.
Он использует быстрый двоичный протокол обмена сообщениями, подходящий для внутримашинной связи благодаря низкой задержке и низкой нагрузке. Его спецификация в настоящее время определяется проектом freedesktop.org, и доступна всем заинтересованным сторонам.
Связь в целом происходит через центральное серверное приложение, называемое «шиной» (отсюда и название), но также возможна прямая связь между приложениями. При общении через шину приложения могут запрашивать информацию о других доступных приложениях и службах, а также активировать их по требованию.
Шины
Шины D-Bus используются, когда требуется многоточечная коммуникация. Для этого перед подключением каких-либо приложений к шине запускается центральный сервер: этот сервер отвечает за отслеживание подключенных приложений и правильное маршрутизирование сообщений от источника к получателю.
Кроме того, D-Bus определяет две хорошо известные шины: системную шину и сеансовую шину. Эти шины особенны тем, что у них чётко определены семантика: некоторые службы определены как находящиеся на одной или обеих этих шинах.
Например, приложение, желающее запросить список подключённых к компьютеру устройств, вероятно, будет взаимодействовать со службой, доступной на системной шине, в то время как служба, предоставляющая возможность открытия веб-браузера пользователя, скорее всего, будет находиться на сеансовой шине.
На системной шине также можно ожидать ограничений на то, какие службы каждое приложение разрешено предлагать. Поэтому можно быть уверенным, что, если определённая служба присутствует, она предлагается надёжным приложением.
Концепции
Сообщения
На низком уровне приложения общаются через D-Bus, отправляя друг другу сообщения. Сообщения используются для передачи вызовов удаленных процедур, а также ответов и ошибок, связанных с ними. При использовании через шину сообщения имеют пункт назначения, что означает, что они маршрутизируются только к заинтересованным сторонам, предотвращая перегрузку из-за «схлопывания» или широковещательной рассылки.
Однако специальный тип сообщения, называемый «сигнальным сообщением» (концепция, основанная на механизме «сигналы и слоты» Qt), не имеет предварительно определённого пункта назначения. Поскольку его цель — использование в контексте «один-ко-многим», сигнальные сообщения разработаны для работы с механизмом «добровольного участия».
Модуль Qt D-Bus полностью инкапсулирует низкоуровневую концепцию сообщений в более простое объектно-ориентированное подходом, знакомом разработчикам Qt. В большинстве случаев разработчику не нужно беспокоиться об отправке или получении сообщений.
Имена служб
При общении через шину приложения получают так называемое «имя службы»: это то, как приложение выбирает быть известным другим приложениям на той же шине. Имена служб обрабатываются демоном шины D-Bus и используются для маршрутизации сообщений от одного приложения к другому. Аналогичной концепцией именам служб являются IP-адреса и имена хостов: компьютер обычно имеет один IP-адрес и может иметь одно или несколько имён хостов, связанных с ним, в зависимости от предоставляемых им сетевых услуг.
С другой стороны, если шина не используется, имена служб также не используются. Если сравнить это с компьютерной сетью, это будет эквивалентно одноранговой сети: так как узел известен, нет необходимости использовать имена хостов для его поиска или IP-адреса.
Формат имени службы D-Bus фактически очень похож на имя хоста: это последовательность букв и цифр, разделённых точками. Распространённой практикой является даже именование имени службы в соответствии с доменным именем организации, определившей эту службу.
Например, служба D-Bus определяется freedesktop.org и может быть найдена в шине под именем службы:
org.freedesktop.DBus
Пути к объектам
Как и сетевые хосты, приложения предоставляют конкретные службы другим приложениям, экспортируя объекты. Эти объекты организованы иерархически, подобно отношениям родитель-потомок, которые имеют классы, полученные от QObject. Однако есть различие: существует понятие «корневого объекта», являющегося конечным родителем всех объектов.
Если продолжить аналогию с веб-сервисами, пути к объектам эквивалентны части пути URL:
Как и они, пути к объектам в D-Bus образуются, напоминая имена путей в файловой системе: это метки, разделённые слешами, каждая из которых состоит из букв, цифр и символа нижнего подчёркивания ("_"). Они всегда должны начинаться со слеша и не должны заканчиваться им.
Интерфейсы
Интерфейсы похожи на абстрактные классы в C++ и ключевое слово Java interface, и объявляют «контракт», который устанавливается между вызывающей и вызываемой сторонами. То есть, они устанавливают имена методов, сигналов и свойств, которые доступны, а также поведение, ожидаемое от обеих сторон при установлении связи.
Qt использует очень похожий механизм в своей системе плагинов: базовые классы в C++ связываются с уникальным идентификатором с помощью макроса Q_DECLARE_INTERFACE().
Имена интерфейсов D-Bus, фактически, называются аналогичным образом, что предполагается системой плагинов Qt: идентификатор, обычно создаваемый из доменного имени сущности, которая определила этот интерфейс.
Справочник
Для облегчения запоминания форматов именования и их назначения можно использовать следующую таблицу:
| Концепция D-Bus | Аналогия | Формат имени |
|---|---|---|
| Имя службы | Имена сетевых хостов | Разделённые точкой ("похоже на имя хоста") |
| Путь к объекту | Компонент пути URL | Разделённые слешами ("похоже на путь") |
| Интерфейс | Идентификатор плагина | Разделённые точкой |
Отладка
При разработке приложений, использующих D-Bus, иногда полезно иметь возможность просматривать информацию о сообщениях, которые отправляются и принимаются через шину каждым приложением.
Эта функция может быть включена на основе каждого приложения путём установки переменной среды QDBUS_DEBUG перед запуском каждого приложения. Например, мы можем включить отладку только для автомобиля в примере Управляемого по D-Bus автомобиля, запустив контроллер и автомобиль следующим образом:
examples/dbus/remotecontrolledcar/controller/controller & QDBUS_DEBUG=1 examples/dbus/remotecontrolledcar/car/car &
Информация о сообщениях будет записана в консоль, из которой было запущено приложение.
Использование модуля
Использование модуля Qt требует ссылки на библиотеку модуля, либо напрямую, либо через другие зависимости. Несколько инструментов сборки имеют специальную поддержку для этого, включая CMake и qmake.
Сборка с помощью CMake
Используйте команду find_package() для поиска необходимых компонентов модуля в пакете Qt6:
find_package(Qt6 COMPONENTS DBus REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::DBus)
См. также обзор Сборка с помощью CMake.
Сборка с помощью qmake
Для настройки модуля для сборки с помощью qmake добавьте модуль как значение переменной QT в файле .pro проекта:
Эволюция модуля
Изменения в Qt D-Bus перечисляет важные изменения в API и функциональности модуля, которые были внесены для серии Qt 6.
Лицензии и авторские права
Модуль Qt D-Bus доступен по коммерческим лицензиям от The Qt Company. Кроме того, он доступен по лицензиям свободного программного обеспечения: GNU Lesser General Public License, версия 3 или GNU General Public License, версия 2. Подробнее см. Лицензирование Qt.
Кроме того, Qt D-Bus в Qt 6.1.0 может содержать модули сторонних разработчиков по следующим разрешительным лицензиям:
Academic Free License v2.1 или GNU General Public License v2.0 или более поздней версии |
Дополнительные материалы
В следующих документах содержится информация о функциях интеграции Qt с D-Bus и подробности о механизмах отправки и получения информации о типах через шину:
- Использование адаптеров Qt D-Bus
- Система типов Qt D-Bus
- Компилятор XML Qt D-Bus (qdbusxml2cpp)
- Классы C++ модуля Qt D-Bus
- Примеры Qt D-Bus
- Просмотрщик D-Bus
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qtdbus-index.html