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 += dbus
Эволюция модуля
Изменения в Qt D-Bus перечисляет важные изменения в API и функциональности модуля, которые были внесены для серии Qt 6.
Лицензии и авторские права
Модуль Qt D-Bus доступен по коммерческим лицензиям от The Qt Company. Кроме того, он доступен по лицензиям свободного программного обеспечения: GNU Lesser General Public License, версия 3 (http://www.gnu.org/licenses/lgpl-3.0.html) или GNU General Public License, версия 2 (http://www.gnu.org/licenses/gpl-2.0.html). См. Qt Licensing для получения дополнительной информации.
Кроме того, Qt D-Bus в Qt 6.2.2 может содержать модули сторонних разработчиков под следующими лицензиями с открытым кодом:
Academic Free License v2.1 или GNU General Public License v2.0 или более поздняя версия |
Дополнительная литература
В следующих документах содержится информация об интеграции Qt с D-Bus и подробные сведения о механизмах отправки и получения информации о типе через шину:
- Использование адаптеров Qt D-Bus
- Система типов Qt D-Bus
- Компилятор Qt D-Bus XML (qdbusxml2cpp)
- Классы Qt D-Bus C++
- Команды CMake в Qt6 DBus
- Примеры 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.2/qtdbus-index.html