Spec-Zone.ru › Qt 5.9

Qt D-Bus

Введение

D-Bus — это механизм межпроцессного взаимодействия (IPC) и вызова удаленных процедур (RPC), первоначально разработанный для Linux, чтобы заменить существующие и конкурирующие решения IPC единым протоколом. Он также был разработан для обеспечения связи между процессами системного уровня (такими как службы принтеров и драйверов оборудования) и обычными пользовательскими процессами.

Он использует быстрый двоичный протокол обмена сообщениями, который подходит для внутримашинной связи благодаря низкой задержке и низким накладным расходам. Его спецификация в настоящее время определена проектом freedesktop.org, и доступна всем заинтересованным сторонам.

Взаимодействие в целом происходит через центральную серверную программу, называемую «шиной» (отсюда и название), но также возможна прямая связь между приложениями. При взаимодействии через шину приложения могут запросить список других доступных приложений и служб, а также активировать одну по требованию.

Шины

Шины D-Bus используются, когда требуется взаимодействие «многие ко многим». Для этого перед подключением приложений к шине запускается центральный сервер: этот сервер отвечает за отслеживание подключенных приложений и правильное маршрутизирование сообщений от источника к получателю.

Кроме того, D-Bus определяет две хорошо известные шины — системную шину и сессионную шину. Эти шины особенные тем, что у них есть хорошо определённая семантика: некоторые службы определены как находящиеся на одной или обеих этих шинах.

Например, приложение, желающее получить список подключённых к компьютеру устройств аппаратного обеспечения, вероятно, будет взаимодействовать со службой, доступной по системной шине, в то время как служба, предоставляющая возможность открытия веб-браузера пользователя, вероятно, будет находиться на сессионной шине.

На системной шине также можно ожидать ограничений на то, какие службы каждое приложение разрешено предлагать. Таким образом, можно быть уверенными в том, что, если определённая служба присутствует, она предлагается доверенным приложением.

Концепции

Сообщения

На низком уровне приложения взаимодействуют по D-Bus, отправляя друг другу сообщения. Сообщения используются для передачи вызовов удалённых процедур, а также ответов и ошибок, связанных с ними. При использовании через шину сообщения имеют место назначения, что означает, что они маршрутизируются только к заинтересованным сторонам, предотвращая перегрузки из-за «атаки» или широковещательной рассылки.

Однако специальный тип сообщения, называемый «сообщением-сигналом» (концепция, основанная на механизме «Сигналы и слоты» Qt), не имеет предварительно определённого места назначения. Поскольку его назначение заключается в использовании в контексте «один ко многим», сообщения-сигналы разработаны для работы по механизму «выбор по принципу opt-in».

Модуль 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 доступен под коммерческими лицензиями от компании Qt. Кроме того, он доступен под лицензиями свободного программного обеспечения. Начиная с Qt 5.4, эти лицензии свободного программного обеспечения — GNU Lesser General Public License, версия 3 или GNU General Public License, версия 2. Подробнее см. Qt Licensing.

Дополнительные материалы для чтения

Следующие документы содержат информацию о функциях интеграции 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.9/qtdbus-index.html

Spec-Zone.ru

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