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.15.1 может содержать модули третьих сторон под следующими разрешительными лицензиями:
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/qt-5.15/qtdbus-index.html