Qt D-Bus
Введение
D-Bus — это механизм межпроцессного взаимодействия (IPC) и вызова удаленных процедур (RPC), первоначально разработанный для Linux для замены существующих и конкурирующих решений IPC единым протоколом. Он также был разработан для обеспечения связи между процессами системного уровня (такими как службы принтера и драйверов оборудования) и обычными пользовательскими процессами.
Он использует быстрый двоичный протокол обмена сообщениями, который подходит для внутримашинной связи благодаря низкой задержке и низким накладным расходам. Его спецификация в настоящее время определена проектом freedesktop.org, и доступна всем участникам.
Взаимодействие в целом происходит через центральное серверное приложение, называемое «шиной» (отсюда и название), но также возможна прямая связь между приложениями. При взаимодействии через шину приложения могут запросить список доступных других приложений и служб, а также активировать их по требованию.
Шины
Шины D-Bus используются для обеспечения связи «многие ко многим». Для этого перед подключением приложений к шине запускается центральный сервер: этот сервер отвечает за отслеживание подключенных приложений и правильное перенаправление сообщений от источника к получателю.
Кроме того, D-Bus определяет две хорошо известные шины, называемые системной шиной и сеансовой шиной. Эти шины отличаются тем, что у них определены семантика: некоторые службы определены для использования в одной или обеих этих шинах.
Например, приложение, желающее запросить список подключенных к компьютеру устройств, вероятно, будет взаимодействовать со службой, доступной на системной шине, в то время как служба, предоставляющая возможность открытия веб-браузера пользователя, вероятно, будет доступна на сеансовой шине.
На системной шине также можно ожидать ограничений на предоставляемые каждой приложением службы. Таким образом, можно с уверенностью предположить, что, если определенная служба присутствует, её предоставляет доверенное приложение.
Концепции
Сообщения
На низком уровне приложения общаются через D-Bus, отправляя друг другу сообщения. Сообщения используются для передачи вызовов удаленных процедур, а также ответов и ошибок, связанных с ними. При использовании через шину сообщения имеют пункт назначения, что означает, что они передаются только заинтересованным сторонам, избегая перегрузки из-за «наплыва» или широковещательной рассылки.
Однако особый вид сообщения, называемый «сообщением-сигналом» (концепция, основанная на механизме «Сигналы и слоты» Qt's Сигналы и слоты), не имеет заранее определенного пункта назначения. Поскольку его цель состоит в использовании в контексте «один ко многим», сообщения-сигналы разработаны для работы с механизмом «добровольной подписки».
Модуль Qt D-Bus полностью инкапсулирует низкоуровневую концепцию сообщений в более простое объектно-ориентированное решение, знакомое разработчикам Qt. В большинстве случаев разработчику не нужно беспокоиться об отправке или получении сообщений.
Имена служб
При взаимодействии через шину приложения получают то, что называется «именем службы»: это то, как приложение выбирает, чтобы быть известным другим приложениям на той же шине. Имена служб передаются демоном шины D-Bus и используются для перенаправления сообщений от одного приложения к другому. Аналогичной концепцией к именам служб являются IP-адреса и имена хостов: компьютер обычно имеет один IP-адрес и может иметь одно или несколько связанных с ним имён хостов, в соответствии со службами, которые он предоставляет сети.
С другой стороны, если шина не используется, имена служб также не используются. Если снова сравнить это с компьютерной сетью, это можно сравнить с одноранговой сетью: так как узел известен, нет необходимости использовать имена хостов для его поиска или его IP-адреса.
Формат имени службы D-Bus фактически очень похож на имя хоста: это последовательность букв и цифр, разделённых точками. Общепринятой практикой является даже наименование имени службы в соответствии с доменным именем организации, которая определила эту службу.
Например, служба D-Bus определена freedesktop.org и может быть найдена в шине под именем службы:
org.freedesktop.DBus
Пути объектов
Как и сетевые хосты, приложения предоставляют конкретные услуги другим приложениям, экспортируя объекты. Эти объекты организованы иерархически, подобно родительско-детским отношениям, которыми обладают классы, производные от QObject. Однако есть одно отличие: существует понятие «корневого объекта», который является конечным родителем всех объектов.
Если продолжить аналогию с веб-сервисами, пути объектов соответствуют части пути URL:
Как и они, пути объектов в D-Bus формируются подобно именам путей в файловой системе: это метки, разделенные слешами, каждая из которых состоит из букв, цифр и символа подчеркивания ("_"). Они всегда должны начинаться со слеша и не должны заканчиваться им.
Интерфейсы
Интерфейсы аналогичны абстрактным классам C++ и ключевому слову interface Java и объявляют «контракт», который устанавливается между вызывающей и вызываемой сторонами. То есть они устанавливают имена методов, сигналов и свойств, которые доступны, а также поведение, ожидаемое от каждой стороны при установлении связи.
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 доступен по коммерческим лицензиям от компании Qt. Кроме того, он доступен по лицензиям свободного программного обеспечения. Начиная с Qt 5.4, эти лицензии свободного программного обеспечения являются GNU Lesser General Public License, версия 3, или GNU General Public License, версия 2. Подробности см. в Qt Licensing.
Кроме того, модуль Qt D-Bus в Qt 5.11.2 может содержать модули сторонних разработчиков под следующими разрешительными лицензиями:
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)
- Классы 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/archives/qt-5.11/qtdbus-index.html