Reading time: 2 – 2 minutes
Feia massa temps que no jugava amb DBUS i les he passat una mica negres aquesta tarda intentant recordar com funcionava tot plegat. La qüestió de base és molt senzilla, com que el codi parla per si mateix. Simplement adjuntaré els dos codis.
Receptor de senyals DBUS, rep la senyal amb format ‘string’ i la mostra:
#!/usr/bin/env python #--encoding: UTF-8-- """ entra en un loop esperant senyals emeses a: dbus_interface = cat.oriolrius.prova object_path = "/cat/oriolrius/prova/senyal" amb nom de senyal: 'estat' quan es rep la senyal la mostrem """ import gobject import dbus import dbus.mainloop.glib def mostra(m): print m dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SessionBus() bus.add_signal_receiver( mostra, path="/cat/oriolrius/prova/senyal", dbus_interface="cat.oriolrius.prova", signal_name = "estat" ) loop = gobject.MainLoop() loop.run()
Emisor de senyals DBUS, envia una senyal de tipus ‘string’ amb el contingut ‘hola’:
#!/usr/bin/env python #--encoding: UTF-8-- """ Emet una senyal a dbus, al bus 'session' amb destí: dbus_interface = cat.oriolrius.prova object_path = "/cat/oriolrius/prova/senyal" amb nom de senyal: 'estat' """ import gobject import dbus from dbus.service import signal,Object import dbus.mainloop.glib class EmetSenyal(Object): def __init__(self, conn, object_path='/'): Object.__init__(self, conn, object_path) @signal('cat.oriolrius.prova') def estat(self,m): global loop print("senyal emesa: %s" % m) gobject.timeout_add(2000, loop.quit) dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) loop = gobject.MainLoop() bus = dbus.SessionBus() o = EmetSenyal(bus,object_path='/cat/oriolrius/prova/senyal') o.estat('hola') loop.run()
Usant el ‘dbus-monitor’ es pot veure la traça del missatge:
signal sender=:1.634 -> dest=(null destination) serial=2 path=/cat/oriolrius/prova/senyal; interface=cat.oriolrius.prova; member=estat string "hola"