def listen(): TYPE = "_piper._tcp" def store(devic): global device device=devic #print device def service_resolved(*args): global device print 'service resolved' print 'name:', args[2] #print IP, PORT print 'address:', args[7] print 'port:', args[8] device['IP'].append(str(args[7])) device['PORT'].append(int(args[8])) store(device) if ":" in device['IP'][-1] : del device['IP'][-1] del device['PORT'][-1] if len(device['IP'])==1: loop.quit() def print_error(*args): global device print 'error_handler' print args[0] def myhandler(interface, protocol, name, stype, domain, flags): global device 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) #print IP, PORT 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) loop=gobject.MainLoop() loop.run()
self.service = bus.get_object(MUNIN_BUS_NAME, '/' + MUNIN_BUS_NAME.replace('.', '/')) def connect_signal(self, signal_name, callback): self.service.connect_to_signal(signal_name, callback, dbus_interface=MUNIN_INTERFACE) def __call__(self, name, *args, **kwargs): method = self.service.get_dbus_method(name, MUNIN_BUS_NAME) if kwargs.get('async') is not None: # Make dbus python-dbus call this method async kwargs['reply_handler'] = kwargs.get('async') kwargs['error_handler'] = lambda *_: _ return method(*args, **kwargs) if __name__ == '__main__': loop = DBusGMainLoop(set_as_default=True) sess = SessionClient('test') def hellower(): print('... async call:', end='') sess('rebuild', 'full', async=lambda: print('client: finished')) print('... [DONE]') return True GLib.timeout_add(500, hellower) GLib.MainLoop().run() loop.run()
class SessionClient: def __init__(self, name): bus = dbus.SessionBus() self.service = bus.get_object(MUNIN_BUS_NAME, "/" + MUNIN_BUS_NAME.replace(".", "/")) def connect_signal(self, signal_name, callback): self.service.connect_to_signal(signal_name, callback, dbus_interface=MUNIN_INTERFACE) def __call__(self, name, *args, **kwargs): method = self.service.get_dbus_method(name, MUNIN_BUS_NAME) if kwargs.get("async") is not None: # Make dbus python-dbus call this method async kwargs["reply_handler"] = kwargs.get("async") kwargs["error_handler"] = lambda *_: _ return method(*args, **kwargs) if __name__ == "__main__": loop = DBusGMainLoop(set_as_default=True) sess = SessionClient("test") def hellower(): print("... async call:", end="") sess("rebuild", "full", async=lambda: print("client: finished")) print("... [DONE]") return True GLib.timeout_add(500, hellower) GLib.MainLoop().run() loop.run()
def listen(): TYPE = "_ssm._tcp" def store(devic): global device device=devic def service_resolved(*args): """ Resolves the services so found """ global device print 'service resolved' print 'name:', args[2] #print IP, PORT print 'address:', args[7] print 'port:', args[8] device['IP'].append(str(args[7])) device['PORT'].append(int(args[8])) store(device) #Below I have excluded IPv6 addresses from consideration. #Another thing is I have hardcoded that the Service listener should discover X number of devices and then the loop should quit,else the Loop will #keep running and my code after that will not work.There is a solution to this:Multithreading.I am not aware of how to do that in python,so I left it #like this. if ":" in device['IP'][-1] : del device['IP'][-1] del device['PORT'][-1] if len(device['IP'])==3: loop.quit() def print_error(*args): global device print 'error_handler' print args[0] def myhandler(interface, protocol, name, stype, domain, flags): global device 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) #print IP, PORT 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) loop=gobject.MainLoop() loop.run()