Pregunta

Estoy tratando de escribir un programa que da salida a los datos que puede ser servido por una red con avahi. La documentación que he mirado parece decir que tengo que registrar el servicio con dbus y luego conectarlo a avahi, pero la documentación de hacer esto es bastante escaso. ¿Alguien sabe de una buena documentación para ello? He estado buscando en éstos:

python-dbus: http://dbus.freedesktop.org/doc/dbus -python / doc / tutorial.html #-exportación objetos

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

¿Fue útil?

Solución

Avahi es "sólo" una aplicación de cliente de ZeroConfig que básicamente se basa un "Multicast DNS" protocolo. Puede utilizar Avahi publicar la disponibilidad de sus "datos" a través de los puntos finales. Los datos reales deben ser recuperados a través de otros medios, pero que normalmente registrar un punto final que se puede "invocar" a través de un método de su gusto.

Otros consejos

Me doy cuenta de que esta respuesta es bastante tarde, teniendo en cuenta que su pregunta se hizo hace cuatro años. Sin embargo, podría ayudar a los demás.

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)

El uso de avahi-exploración para verificar que efectivamente se publicó:

micke@els-mifr-03:~$ 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"]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top