Reading time: 44 – 73 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"