Создание 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);
}
}