Spec-Zone.ru › Qt 5.12

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 может содержать модули сторонних разработчиков по следующим разрешительным лицензиям:

libdus-1 заголовки, версия 1.12

Академическая лицензия свободного использования 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API