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 Лицензирование для получения дополнительной информации.
Кроме того, Qt D-Bus в Qt 5.13.0 может содержать модули сторонних разработчиков под следующими разрешительными лицензиями:
Академическая свобода лицензии 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.13/qtdbus-index.html