python - Cómo desarrollar un cliente/servidor Avahi
(1)
Estoy tratando de desarrollar una solución cliente / servidor usando Python, el servidor debe transmitir la disponibilidad del servicio usando Avahi. Estoy usando el siguiente código para publicar el servicio:
import avahi
import dbus
__all__ = ["ZeroconfService"]
class ZeroconfService:
"""A simple class to publish a network service with zeroconf using
avahi.
"""
def __init__(self, name, port, stype="_http._tcp",
domain="", host="", text=""):
self.name = name
self.stype = stype
self.domain = domain
self.host = host
self.port = port
self.text = text
def publish(self):
bus = dbus.SystemBus()
server = dbus.Interface(
bus.get_object(
avahi.DBUS_NAME,
avahi.DBUS_PATH_SERVER),
avahi.DBUS_INTERFACE_SERVER)
g = dbus.Interface(
bus.get_object(avahi.DBUS_NAME,
server.EntryGroupNew()),
avahi.DBUS_INTERFACE_ENTRY_GROUP)
g.AddService(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC,dbus.UInt32(0),
self.name, self.stype, self.domain, self.host,
dbus.UInt16(self.port), self.text)
g.Commit()
self.group = g
def unpublish(self):
self.group.Reset()
def test():
service = ZeroconfService(name="TestService", port=3000)
service.publish()
raw_input("Press any key to unpublish the service ")
service.unpublish()
if __name__ == "__main__":
test()
En cuanto al cliente, estoy intentando buscar el servicio con:
# http://avahi.org/wiki/PythonBrowseExample
import dbus, gobject, avahi
from dbus import DBusException
from dbus.mainloop.glib import DBusGMainLoop
# Looks for iTunes shares
TYPE = "_http._tcp"
def service_resolved(*args):
print ''service resolved''
print ''name:'', args[2]
print ''address:'', args[7]
print ''port:'', args[8]
def print_error(*args):
print ''error_handler''
print args[0]
def myhandler(interface, protocol, name, stype, domain, flags):
print "Found service ''%s'' type ''%s'' domain ''%s'' " % (name, stype, domain)
if flags & avahi.LOOKUP_RESULT_LOCAL:
# local service, skip
pass
server.ResolveService(interface, protocol, name, stype,
domain, avahi.PROTO_UNSPEC, dbus.UInt32(0),
reply_handler=service_resolved, error_handler=print_error)
loop = DBusGMainLoop()
bus = dbus.SystemBus(mainloop=loop)
server = dbus.Interface( bus.get_object(avahi.DBUS_NAME, ''/''),
''org.freedesktop.Avahi.Server'')
sbrowser = dbus.Interface(bus.get_object(avahi.DBUS_NAME,
server.ServiceBrowserNew(avahi.IF_UNSPEC,
avahi.PROTO_UNSPEC, TYPE, ''local'', dbus.UInt32(0))),
avahi.DBUS_INTERFACE_SERVICE_BROWSER)
sbrowser.connect_to_signal("ItemNew", myhandler)
gobject.MainLoop().run()
Sin embargo, el cliente no está detectando cuando se inicia el servicio. ¿Alguna idea sobre lo que estoy haciendo mal?
He encontrado que el código funciona como se espera. Tenía reglas de firewall bloqueando la publicación relacionada con avahi.