Spec-Zone.ru › Qt 5.6

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 &

Информация о сообщениях будет записана в консоль, из которой было запущено приложение.

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

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

  • Использование адаптеров 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.6/qtdbus-index.html

Spec-Zone.ru

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