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 D-Bus доступен по коммерческим лицензиям от The Qt Company. Кроме того, он доступен по лицензиям свободного программного обеспечения. С Qt 5.4 эти лицензии свободного программного обеспечения — GNU Lesser General Public License, версия 3 или GNU General Public License, версия 2. Подробнее см. Qt Licensing.
Кроме того, Qt D-Bus в Qt 5.12.4 может содержать модули сторонних разработчиков по следующим разрешительным лицензиям:
Академическая лицензия свободного использования v2.1 или GNU General Public License v2.0 или более поздняя |
Дополнительные материалы для чтения
В следующих документах содержится информация о функциях интеграции Qt D-Bus и предоставляются подробности о механизмах отправки и получения информации о типе данных по шине:
- Использование адаптеров Qt D-Bus
- Система типов Qt D-Bus
- Компилятор XML Qt D-Bus (qdbusxml2cpp)
- Классы Qt D-Bus C++
- Примеры Qt D-Bus
- Просмотрщик D-Bus
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.12/qtdbus-index.html