Spec-Zone.ru › Qt 5.14

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

libdus-1 headers, версия dbus-1.12.12

Академическая лицензия свободного использования v2.1 или GNU General Public License v2.0 или более поздней версии

Дополнительная литература

Следующие документы содержат информацию о функциях интеграции Qt D-Bus и предоставляют подробности о механизмах отправки и получения информации о типах по шине:

  • Использование адаптеров Qt D-Bus
  • Система типов Qt D-Bus
  • Компилятор XML Qt D-Bus (qdbusxml2cpp)
  • Классы C++ Qt D-Bus
  • Примеры 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.14/qtdbus-index.html

Spec-Zone.ru

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