Spec-Zone.ru › Qt 5.15

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

libdus-1 headers, version dbus-1.13.12

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

Spec-Zone.ru

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