Spec-Zone.ru › Qt

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 необходимо связаться с библиотекой модуля, либо непосредственно, либо через другие зависимости. Несколько инструментов сборки имеют специальную поддержку для этого, включая CMake и qmake.

Сборка с помощью CMake

Используйте команду find_package() для поиска необходимых компонентов модуля в пакете Qt6.

find_package(Qt6 COMPONENTS DBus REQUIRED)
target_link_libraries(mytarget PRIVATE Qt6::DBus)

См. также обзор Сборка с помощью CMake.

Сборка с помощью qmake

Чтобы настроить модуль для сборки с помощью qmake, добавьте модуль как значение переменной QT в файле .pro проекта:

QT += dbus

Эволюция модуля

Изменения в Qt D-Bus перечисляет важные изменения в API и функциональности модуля, которые были внесены для серии Qt 6.

Лицензии и авторские права

Модуль Qt D-Bus доступен по коммерческим лицензиям от The Qt Company. Кроме того, он доступен по лицензиям свободного программного обеспечения: GNU Lesser General Public License, версия 3 (http://www.gnu.org/licenses/lgpl-3.0.html) или GNU General Public License, версия 2 (http://www.gnu.org/licenses/gpl-2.0.html). См. Qt Licensing для получения дополнительной информации.

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

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

Academic Free License v2.1 или GNU General Public License v2.0 или более поздняя версия

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

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

  • Использование адаптеров Qt D-Bus
  • Система типов Qt D-Bus
  • Компилятор Qt D-Bus XML (qdbusxml2cpp)
  • Классы Qt D-Bus C++
  • Команды CMake в Qt6 DBus
  • Примеры Qt D-Bus
  • Просмотрщик D-Bus

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qtdbus-index.html

Spec-Zone.ru

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