Spec-Zone.ru › Qt 5.11

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

libdus-1 headers

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

Spec-Zone.ru

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