Я чрезвычайно новичок в gjs и хочу взаимодействовать с dbus. Я хочу создать сервис и послушать его.
Небольшой пример или руководство будет полезным. Спасибо
Я читал, Gnome идет путем Сценария Java (GJS) для большой части, он - настольная и уменьшающая сумма C++ и Python. Таким образом, я нашел этот вопрос особенно интересным сегодня.
Вот Сценарий Java в качестве примера, и я буду пробовать его сам. В этом примере Вы будете учиться создавать клиент D-шины для соединения с сервисом, Вы будете учиться называть методы, соединяться с сигналами и получать свойства от сервиса. Пример использует D-автобусное-сообщение, которые управляют Подсветкой Клавиатуры:
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
// This the D-Bus interface as XML
const KbdBacklightInterface = '<node>\
<interface name="org.freedesktop.UPower.KbdBacklight"> \
<method name="SetBrightness"> \
<arg name="value" type="i" direction="in"/> \
</method> \
<method name="GetBrightness"> \
<arg name="value" type="i" direction="out"/> \
</method> \
<method name="GetMaxBrightness"> \
<arg name="value" type="i" direction="out"/> \
</method> \
<signal name="BrightnessChanged"> \
<arg type="i"/> \
</signal> \
</interface> \
</node>';
// Declare the proxy class based on the interface
const KbdBacklightProxy = Gio.DBusProxy.makeProxyWrapper(KbdBacklightInterface);
// Get the /org/freedesktop/UPower/KbdBacklight instance from the bus
let kbdProxy = new KbdBacklightProxy(
Gio.DBus.system,
"org.freedesktop.UPower",
"/org/freedesktop/UPower/KbdBacklight"
);
// You can use proxy.<method>Sync syntax to
// call the D-Bus method in a Sync way
print("The max brightness of your keyboard is " + kbdProxy.GetMaxBrightnessSync());
// Or you can use the syntax proxy.<method>Remote
// to call the method in an Async way
kbdProxy.GetBrightnessRemote(function(currentBrightness) {
print("The current keyboard brightness is " + currentBrightness);
});
// Connecting to a D-Bus signal
kbdProxy.connectSignal("BrightnessChanged", function(proxy) {
let newBrightness = proxy.GetBrightnessSync();
print("The keyboard brightness has been changed, new brightness is " + newBrightness);
});
// Also you can get properties value using this syntax
// let property = proxy.PropertyName;
// Or you can set a property value
// proxy.PropertyName = "new value";
let loop = new GLib.MainLoop(null, false);
loop.run();
Если не уже сделанный, установите gjs:
sudo apt update && sudo apt install gjs
Создайте каталог для своих Сценариев Java:
mkdir ~/javascript
Использовать gedit
создать демонстрационный сценарий выше и сохранить его:
gedit ~/javascript/dbusclient.js
Теперь выполнение это:
cd ~/javascript
gjs dbusclient.js
Ошибки WIP сообщили (я зафиксирую и возвращусь к этому Вопросы и ответы с результатами):
(gjs:10134): Gjs-WARNING **: JS ERROR: Gio.DBusError: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: No such interface 'org.freedesktop.UPower.KbdBacklight' on object at path /org/freedesktop/UPower/KbdBacklight
_proxyInvoker@resource:///org/gnome/gjs/modules/overrides/Gio.js:98
_makeProxyMethod/<@resource:///org/gnome/gjs/modules/overrides/Gio.js:124
@dbusclient.js:36
JS_EvaluateScript() failed
Хотя ноутбук имеет световые сигналы клавиатуры, и беспроводная клавиатура имеет 3 легких настройки, UPOWER Gnome не видят их как эти команды оболочки:
$ dbus-send --print-reply \
--system \
--dest=org.freedesktop.UPower \
/org/freedesktop/UPower \
org.freedesktop.UPower.EnumerateDevices
Возвратите это:
method return time=1564075040.686545 sender=:1.49 -> destination=:1.145 serial=4392 reply_serial=2
array [
object path "/org/freedesktop/UPower/devices/line_power_ACAD"
object path "/org/freedesktop/UPower/devices/battery_BAT1"
object path "/org/freedesktop/UPower/devices/ups_hiddev2"
object path "/org/freedesktop/UPower/devices/mouse_0003o046Do101Ax0017"
object path "/org/freedesktop/UPower/devices/keyboard_0003o046Do2010x0018"
]
Это могло быть удобным сценарием для изменения для контроля Аккумулятора для ноутбука, взимают процент все же.
(Чтобы быть продолженным...)