Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Example with QtDBus. Using a custom type object via dbus

Notifications You must be signed in to change notification settings

neMoePalto/using_dbus

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

10 Commits

Repository files navigation

Пример работы через шину Dbus

Организация взаимодействия разных частей ПО (бизнес-процессов, модулей, монитора) с использованием шины DBus.

Тестовый пример No 1

В рамках данного примера реализовано взаимодействие двух процессов через шину DBus. Взаимодействие осуществляется с использованием библиотеки Qt. Взаимодействие "точка-точка" через шину Dbus в терминологии Qt предполагает следующее разделение ролей:

  • "адаптор" соединяется с шиной и регистрирует уникальное имя сервиса (пример: org.rumba.Sum) и объект (объект по своей структуре похож на путь в файловой системе). Уникальное имя сервиса не может быть повторно зарегистрировано другим приложением (оно "захватывается" также, как tcp-порт, например);
  • "интерфейс" соединяется с шиной и регистрирует аналогичный объект (путь). При конструировании объекта типа "интерфейс" ему передается, в числе прочего, имя сервиса. Таким образом, интерфейс может "писать сообщения" в адрес адаптора.

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

С технической точки зрения, взаимодействие двух приложений в Qt организовано следующим образом:

  1. Создается общий xml-файл, в котором описываются соответствующие методы и сигналы.

  2. В .pro-файлы проектов добавляются директивы DBUS_ADAPTORS и DBUS_INTERFACES. Данные директивы необходимы для осуществления автогенерации вспомогательных классов MyRegNameInterface и MyRegNameAdaptor из xml-файла. Наличие единого xml-файла позволяет изменять интерфейс взаимодействия между приложениями в одном месте. Это, конечно, не отменяет необходимости вносить правки в код клиентских классов, но упрощает общий процесс изменения интерфейса.

  3. Для интерфейса:

  • создаем клиентский класс, в котором создаем объект класса MyRegNameInterface;
  • соединяемся с шиной DBus с помощью статического метода QDBusConnection::connectToBus();
  • теперь можно вызывать методы объекта класса MyRegNameInterface и связывать клиентские слоты с сигналами класса MyRegNameInterface.
  1. Для адаптора:
  • создаем клиентский класс, в котором объявляем и определяем те же сигналы и слоты, которые содержатся в классе MyRegNameAdaptor;
  • создаем объект класса MyRegNameAdaptor (в его конструктор передаем указатель на пользовательский класс). Таким образом происходит "связывание" сигналов и слотов клиентского класса с соответсвующими сигналами и слотами класса MyRegNameAdaptor;
  • теперь можно ожидать "удаленных вызовов" слотов и отправлять сигналы.

Запуск пользовательской шины DBus
В ОС Linux, как правило, запущены две шины DBus: системная и сессионная.
Приложения, разработанные в рамках данного примера, взаимодействуют между собой через пользовательскую шину. Данная шина будет настроена на прослушивание удаленных подключений, что позволит разнести приложения по разным хостам.
Порядок запуска пользовательской шины DBus в ОС Astra Linux 1.6:

  1. Скопировать файл /usr/share/dbus-1/session.conf в любую директорию;
  2. Исправить скопированный файл следующим образом:
    перед строкой
<listen>unix:tmpdir=/tmp</listen>

добавить строку

<listen>tcp:host=localhost,bind=*,port=ПОРТ,family=ipv4</listen>

, далее добавить строки

<auth>ANONYMOUS</auth>
<allow_anonymous/>
  1. Запустить демона 'dbus-daemon` с помощью следующей команды:
dbus-daemon --fork --config-file=/путь/до/session.conf

About

Example with QtDBus. Using a custom type object via dbus

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

AltStyle によって変換されたページ (->オリジナル) /