13 dic. 2011

Python y D-Bus

Esta pequeña entrada la tenia pendiente desde hace mucho tiempo, para los que quieran comenzar a ver lo que ofrece D-Bus.

Lo primero es crear un servicio dbus.


import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop

Estas tres primeras lineas lo que hacen es primero import dbus después importar los servicios que ofrece dbus y finalmente crear un glib loop que es básicamente un ciclo continuo para que busque eventos de Dbus.
class MyDBUSService(dbus.service.Object): def __init__(self): bus_name = dbus.service.BusName('org.primerdbus.serviciohola', bus=dbus.SessionBus()) dbus.service.Object.__init__(self, bus_name, '/org/primerdbus/serviciohola') @dbus.service.method('org.primerdbus.serviciohola') def hello(self): return "Hello,World!" @dbus.service.method('org.primerdbus.serviciohola') def shutdown(self): loop.quit() DBusGMainLoop(set_as_default=True) myservice = MyDBUSService() loop = GObject.MainLoop() loop.run()

Estas 3 primeras lineas suelen ser siempre las mismas para cualquier servicio que estemos pensando crear.
Voy a pegar el codigo del servicio y explicare las lineas.

Para crear un servicio lo primero es crear una clase en este caso la clase se llama MyDBUSService esta clase tiene 3 objetos. dbus service y object.

Lo primero sera crear el nombre del bus con el comando de la linea 3 el nombre que se le asigna para este caso es org.primerdbus.serviciohola.

Tenemos que inicializar ahora un objeto que en este caso es bastante evidente, vamos a inicializar el recién creado servicio llamado servicehola llamándolo desde org/primerdbus/serviciohola.

Este recién creado e inicializado servicio debe también debe ofrecer algo, porque esa es la esencia de un servicio ofrecer opciones o características que nos sean interesantes a este tipo de cosas que ofrecen los servicios los llamamos métodos.

En este caso particular de nuestra primera aproximación se van a crear dos métodos, uno que hace algo para nosotros y otro que cierra y termina el servicio y que es de alguna forma estándar y debe estar presente en todos los servicios que creemos de aquí en adelante.
Las lineas 13, 14 y 15 terminan y cierran el servicio y siempre las tenemos que poner en cualquiera que creemos.

13 @dbus.service.method('org.primerdbus.serviciohola'
14 def apagar(self): 
15 loop.quit()


Las lineas 9, 10 y 11 crean una definición que se llama hola y es propia (self) y lo único que hace es retornarle a self un texto que en este caso es Hola Mundo!. Si ya se que es un ejemplo muy tonto pero es básico para iniciarse.

9 @dbus.service.method('org.primerdbus.serviciohola'
10 def hola(self): 
11 return "Hola Mundo!"

Finalmente las ultimas lineas cierra el bucle y con esto hemos terminado de crear un servicio. Por cierto el bucle lo he creado con GObject pero lo pueden crear con Gtk. Creo que es mejor usar GObject porque da menos pataletas para los servicios.

Ahora la pregunta es como consumir un servicio. Para eso creamos algun nuevo archivo en python que se encargara de llamar al servicio y consumirlo.

1 import dbus  
2  
3 bus = dbus.SessionBus()  
4 serviciohola = bus.get_object('org.primerdbus.serviciohola',  
5 '/org/primerdbus/serviciohola')  
6 metodohola = serviciohola.get_dbus_method('hola',  
7 'org.primerdbus.serviciohola')  
8 print (hola())  
9 
10 metodoapagado = serviciohola.get_dbus_method('apagar',
11 'org.primerdbus.serviciohola')
12 
13 apagar()

La linea 4 llama al servicio usando el nombre y la ruta.

El comando get_dbus_method se encarga de buscar los métodos con los nombres que tenga dentro del servicio en este caso creamos dos métodos hola y el siempre y clásico apagar.

El método hola se ejecuta con la instrucción print (hola()) que como ya saben dentro de hola esta self que guardo Hola Mundo!.

El segundo metodo es apagar() que lo que hace es enviar el comando loop.quit() y termina el servicio.


Espero que esta primera entrada les ayude a entender un poco Dbus.

No hay comentarios:

Publicar un comentario en la entrada