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 ...
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
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
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
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
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
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
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
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
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
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.