La creación de un programa que se transmitió por avahi
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.
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"]