Документация
ОС Аврора 5.0.1

Создание D-Bus-клиента

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

В ОС Аврора представлены несколько системных программ, предоставляющих D-Bus-сервисы. Их список периодически расширяется, к их документации можно обратиться в разделе Справочная документация.

Добавить D-Bus-клиент в приложение можно как средствами Qt/C++, так и через QML-плагин.

Также приложение может содержать и D-Bus-сервис.

D-Bus-клиент средствами C++

Qt D-Bus — стандартный механизм Qt, предоставляющий С++ классы для взаимодействия с D-Bus.

Класс QDBusInterface позволяет создать D-Bus-клиент.

Его конструктору нужно передать четыре аргумента:

  • service — содержит название сервиса.
  • path — содержит путь к интерфейсу.
  • interface — содержит название интерфейса.
  • connection — шина, на которой зарегистрирован сервис — системная или сессионная.

Эти четыре параметра позволяют организовать подключение к сервису и его конкретному интерфейсу. Шину указывать не обязательно, по умолчанию она будет сессионной.

Пример подключения к сервису ru.omp.deviceinfo, который позволяет получать информацию об устройстве:

QDBusInterface deviceinfoFeatures(
    "ru.omp.deviceinfo",
    "/ru/omp/deviceinfo/Features",
    "ru.omp.deviceinfo.Features"
);

У сервиса могут быть методы, свойства и сигналы, определённые в интерфейсе.

Клиент может использовать методы call и callWithArgumentList для вызова метода из интерфейса, к которому он подключился. call вызывает метод интерфейса с одним или более аргументами: method — название вызываемого метода, arg1, arg2, ..., arg8 — аргументы, передаваемые в вызываемый метод. Число аргументов может быть от 0 до 8. callWithArgumentList вызывает метод интерфейса с аргументами: method — название вызываемого метода, args — список аргументов, передаваемых в вызываемый метод. Число аргументов здесь не ограничено. Примеры вызова методов:

QDBusReply<QString> osVersion = deviceinfoFeatures.call("getOsVersion");
if (osVersion.isValid())
    qDebug() << osVersion.value();
QDBusReply<QString> deviceModel = deviceinfoFeatures.call("getDeviceModel");
if (deviceModel.isValid())
    qDebug() << deviceModel.value();

Доступ к свойствам осуществляется с помощью функций property() и setProperty(). Сигналы подключаются с помощью функции connect().

D-Bus-клиент средствами QML

QML-плагин D-Bus позволяет взаимодействовать с D-Bus напрямую из QML кода.

Компонент QDBusInterface позволяет создать D-Bus-клиент. Он имеет свойства:

  • bus — шина, на которой зарегистрирован сервис — системная или сессионная.
  • iface — содержит название интерфейса.
  • path — содержит путь к интерфейсу.
  • service — содержит название сервиса.

Эти четыре параметра позволяют организовать подключение к сервису и его конкретному интерфейсу. Шину указывать не обязательно, по умолчанию она будет сессионной.

Пример подключения к сервису ru.omprussia.SystemLogs, который позволяет получать информацию о событиях безопасности на устройстве:

DBusInterface {
    id: profileInfo
    service: "ru.omprussia.SystemLogs"
    path: "/ru/omprussia/SystemLogs"
    iface: "ru.omprussia.SystemLogs"
}

У сервиса могут быть методы, свойства и сигналы, определённые в интерфейсе.

Клиент может использовать методы call и typedCall для вызова метода из интерфейса, к которому он подключился. call вызывает метод интерфейса с двумя аргументами: method — название вызываемого метода, arguments — массив аргументов, передаваемых в вызываемый метод. Для функции без аргументов вторым параметром передается undefined. typedCall вызывает метод интерфейса с объектом в качестве аргумента. Он принимает аргументы method — название вызываемого метода, arguments — объект, передаваемый в вызываемый метод, callback — функция, выполняемая при успешном вызове, errorCallback — функция, выполняемая при неудавшемся вызове.

У ru.omprussia.SystemLogs имеется функция getLastEventId, которая возвращает идентификатор последнего события в логе. Пример вызова метода:

profileInfo.typedCall("getLastEventId", [], function (result) {
    console.log(result);
});

Значение свойства можно получать и изменять с помощью методов getProperty и setProperty соответственно.

Пример получения свойства ApiVersion у системного сервиса ru.omprussia.SystemLogs:

var apiVersion = profileInfo.getProperty("ApiVersion")
console.log(apiVersion)

Чтобы подписаться на сигналы от сервиса, следует свойству signalsEnabled указать значение true, и определить в клиенте функцию, название которой точно соответствует названию сигнала.

Пример подключения к сигналу newEvent у ru.omprussia.SystemLogs:

DBusInterface {
    id: profileInfo
    service: "ru.omprussia.SystemLogs"
    path: "/ru/omprussia/SystemLogs"
    iface: "ru.omprussia.SystemLogs"
    signalsEnabled: true
    function newEvent(event) {
        console.log(event);
     }
}

Мы используем cookies для персонализации сайта и его более удобного использования. Вы можете запретить cookies в настройках браузера.

Пожалуйста ознакомьтесь с политикой использования cookies.