2009-10-07 6 views
5

Estoy tratando de escribir un programa que muestre datos que pueden ser servidos a través de una red con avahi. La documentación que he analizado parece indicar que tengo que registrar el servicio con dbus y luego conectarlo a avahi, pero la documentación para hacerlo es bastante escasa. ¿Alguien sabe de buena documentación para ello? He estado buscando en éstos:Creando un programa para ser emitido por avahi

python-dbus: http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html#exporting-objects

pitón-avahi: http://www.amk.ca/diary/2007/04/rough_notes_python_and_dbus.html

estoy muy familiarizado con la forma avahi funciona en absoluto, por lo que cualquier punteros sería útil .

Respuesta

0

Avahi es "solo" una implementación de cliente de ZeroConfig que básicamente es un protocolo de "DNS basado en multidifusión". Puede usar Avahi para publicar la disponibilidad de sus "datos" a través de puntos finales. Los datos reales deben recuperarse a través de otros medios, pero normalmente registraría un punto final que puede "invocarse" a través de un método de su agrado.

-3

Si su programa está escrito en Java, puede usar avahi4j que proporciona una API fácil de usar para registrar (y navegar) los servicios de Bonjour en su red local. http://avahi4j.googlecode.com

10

Me doy cuenta de que esta respuesta es bastante tarde, teniendo en cuenta que su pregunta fue hecha hace cuatro años. Sin embargo, podría ayudar a otros.

La siguiente anuncia un servicio utilizando avahi/dbus:

import avahi 
import dbus 
from time import sleep 


class ServiceAnnouncer: 
    def __init__(self, name, service, port, txt): 
     bus = dbus.SystemBus() 
     server = dbus.Interface(bus.get_object(avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER), avahi.DBUS_INTERFACE_SERVER) 
     group = dbus.Interface(bus.get_object(avahi.DBUS_NAME, server.EntryGroupNew()), 
           avahi.DBUS_INTERFACE_ENTRY_GROUP) 

     self._service_name = name 
     index = 1 
     while True: 
      try: 
       group.AddService(avahi.IF_UNSPEC, avahi.PROTO_INET, 0, self._service_name, service, '', '', port, avahi.string_array_to_txt_array(txt)) 
      except dbus.DBusException: # name collision -> rename 
       index += 1 
       self._service_name = '%s #%s' % (name, str(index)) 
      else: 
       break 

     group.Commit() 

    def get_service_name(self): 
     return self._service_name 


if __name__ == '__main__': 
    announcer = ServiceAnnouncer('Test Service', '_test._tcp', 12345, ['foo=bar', '42=true']) 
    print announcer.get_service_name() 

    sleep(42) 

Usando avahi-exploración para comprobar que es de hecho publicó:

[email protected]:~$ avahi-browse -a -v -t -r 
Server version: avahi 0.6.30; Host name: els-mifr-03.local 
E Ifce Prot Name           Type     Domain 
+ eth0 IPv4 Test Service         _test._tcp   local 
= eth0 IPv4 Test Service         _test._tcp   local 
    hostname = [els-mifr-03.local] 
    address = [10.9.0.153] 
    port = [12345] 
    txt = ["42=true" "foo=bar"] 
Cuestiones relacionadas