neděle 11. října 2009

Ovládání aplikací přes D-BUS v Ubuntu - Aktualizováno 28.11.10

Poslední aktualizace 28.11.2010 - upřesnění


D-Bus je systém pro komunikaci mezi procesy v desktopovém prostředí a více se o něm dozvíte třeba na wiki, ale především zde. V Gnome i v KDE4 je dnes tento systém standard, využívá se pro systémovou komunikaci, ale své rozhraní pro D-Bus nabízí plno dalších alpikací, které je možno touto cestou ovládat, nebo z nich naopak získávat informace. Bash rozhodně není nejvhodnější pro práci s D-Bus, ale nějaké možnosti tu jsou. Jedná se především o programy dbus-send, který umí posílat požadavky a dbus-monitor, kterým lze sledovat signály, jež aplikace na D-Bus posílají. Dále je zajímavý program qdbus, který navíc umí jednoduše vypsat všechny dostupné služby na příslušné sběrnici a ovládat aplikace jednodušeji, než dbus-send. Pro qdbus je potřeba nainstalovat balík qt4-dev-tools, který obsahuje i grafickou nadstavbu qdbusviewer, tahle varianta ale do GNOME zatáhne poměrně dost MB z KDE ...


Aplikaci vybavené D-Bus rozhraním můžete posílat požadavky pomocí takzvaných metod. Při volání metody pomocí dbus-send, musíte uvést název služby, název objektu, rozhraní (interface), metodu a její parametry. Metodou introspect rozhraní org.freedesktop.DBus.Introspectable, kterou je každý objekt vybaven, se můžeme podívat co vlastně aplikace nabízí. Při volání metody se uvádí v příkazu dbus-send přepínač --type=method_call, pokud ale vypisujete výsledek přepínačem --print-reply, často lze tento přepínač i vynechat. Pro příklad vezmu opět Rhythmbox a uvedu varianty jak pro dbus-send, tak pro qdbus:

1. dbus-send --print-reply --dest=org.gnome.Rhythmbox /org/gnome/Rhythmbox org.freedesktop.DBus.Introspectable.Introspect

2. qdbus org.gnome.Rhythmbox

Výstup z dbus-send dostanete v XML formátu (komunikace D-Bus je založena na XML) a v tomto případě vidíte ve výpisu místo metod jen tzv. uzly (node). Rhythmbox má metody (a signály) rozdělené do několika skupin. Pokud budete chtít vědět, co nabízí třeba Player, doplníte název objektu:

1. dbus-send --print-reply --dest=org.gnome.Rhythmbox /org/gnome/Rhythmbox/Player org.freedesktop.DBus.Introspectable.Introspect

2. qdbus org.gnome.Rhythmbox /org/gnome/Rhythmbox/Player

Nyní již uvidíte seznam rozhraní, jejich metod a signálů, plus případných parametrů, pomocí kterých můžete ovládat přehrávání, hlasitost, nebo zjistit cestu k právě přehrávanému souboru, či zda Rhythmbox vůbec něco přehrává, atd. Názvy metod většinou na první pohled prozradí, co se od nich dá čekat, pokud má metoda nějaké parametry, jsou uvedeny jejich názvy, typy ("d" znamená double, "s" string, "u" uint32, "i" int32, "b" boolean, a další viz man dbus-send) a směr, tedy zda se jedná o metodu vstupní, či výstupní. Výstup qdbus je trochu méně podrobný.

Pokud chci například nastavit hlasitost Rhythmboxu na 50%, napíši do terminálu toto:
1. dbus-send --dest=org.gnome.Rhythmbox /org/gnome/Rhythmbox/Player org.gnome.Rhythmbox.Player.setVolume double:0.5

2. qdbus org.gnome.Rhythmbox /org/gnome/Rhythmbox/Player setVolume 0.5 

Nastavení přehrávání aktuální skladby na druhou minutu od začátku:
1. dbus-send --dest=org.gnome.Rhythmbox /org/gnome/Rhythmbox/Player org.gnome.Rhythmbox.Player.setElapsed uint32:120

2. qdbus org.gnome.Rhythmbox /org/gnome/Rhythmbox/Player setElapsed 120

Pro zjištění cesty k právě přehrávanému souboru, přidáme navíc parametr --print-reply, který zajistí, že se zjištěný údaj vypíše. Cesta k aktuálně přehrávané skladbě:
1. dbus-send --print-reply --dest=org.gnome.Rhythmbox /org/gnome/Rhythmbox/Player org.gnome.Rhythmbox.Player.getPlayingUri

2. qdbus org.gnome.Rhythmbox /org/gnome/Rhythmbox/Player getPlayingUri

Aplikace také posílají na D-Bus různé signály, které lze z terminálu číst programem dbus-monitor. Samotný program bez parametrů vypisuje do terminálu všechny signály pro konkrétní sezení, ale můžeme i specifikovat přesně o jaké signály konkrétní služby máme zájem. Následující příkaz bude vypisovat jen signály oznamující změnu přehrávané skladby v Rhythmboxu:

dbus-monitor "type='signal', sender='org.gnome.Rhythmbox', interface='org.gnome.Rhythmbox.Player', member='playingUriChanged'"

D-Bus se používá na dvou úrovních, jednak systémové, kterou zpřístupní přepínač  --system a uživatelské, která se spouší zvlášť pro každého uživatele. Ta je při použití dbus-send a dbus-monitor výchozí, jinak ji zajistí přepínač --session.

Ještě tu mám nějaké příklady:

Takto se dá zapnout screenserver:
1. dbus-send --type=method_call --dest=org.gnome.ScreenSaver / org.gnome.ScreenSaver.SetActive boolean:true

2. qdbus org.gnome.ScreenSaver / SetActive true


Uspání počítače  (sleep, suspend to RAM) požadavkem přímo na HAL. Číslo za int32: udává po jaké době ve vteřinách se má počítač uspat:
1. dbus-send  --system --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Suspend int32:2

2. qdbus --system org.freedesktop.Hal /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Suspend 2

Pokud objekt obsahuje více rozhraní, je potřeba i v případě použití qdbus, toto uvést před samotnou metodou.

Suspend přes službu PowerManagement:
1. dbus-send --dest=org.freedesktop.PowerManagement /org/freedesktop/PowerManagement org.freedesktop.PowerManagement.Suspend

2. qdbus org.freedesktop.PowerManagement /org/freedesktop/PowerManagement Suspend

Odkazy:
http://fpmurphy.blogspot.com/2009/02/dbus-scripting.html
http://fredreh.wordpress.com/2008/02/13/put-rhythmbox-om-the-d-bus/

Žádné komentáře:

Okomentovat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.