1 #!/usr/bin/python 2 3 import gobject 4 5 import sys 6 import dbus 7 import dbus.service 8 import dbus.mainloop.glib 9 10 class Rejected(dbus.DBusException): 11 _dbus_error_name = "org.bluez.Error.Rejected" 12 13 class Agent(dbus.service.Object): 14 exit_on_release = True 15 16 def set_exit_on_release(self, exit_on_release): 17 self.exit_on_release = exit_on_release 18 19 @dbus.service.method("org.bluez.Agent", 20 in_signature="", out_signature="") 21 def Release(self): 22 print "Release" 23 if self.exit_on_release: 24 mainloop.quit() 25 26 @dbus.service.method("org.bluez.Agent", 27 in_signature="os", out_signature="") 28 def Authorize(self, device, uuid): 29 print "Authorize (%s, %s)" % (device, uuid) 30 authorize = raw_input("Authorize connection (yes/no): ") 31 if (authorize == "yes"): 32 return 33 raise Rejected("Connection rejected by user") 34 35 @dbus.service.method("org.bluez.Agent", 36 in_signature="o", out_signature="s") 37 def RequestPinCode(self, device): 38 print "RequestPinCode (%s)" % (device) 39 return raw_input("Enter PIN Code: ") 40 41 @dbus.service.method("org.bluez.Agent", 42 in_signature="o", out_signature="u") 43 def RequestPasskey(self, device): 44 print "RequestPasskey (%s)" % (device) 45 passkey = raw_input("Enter passkey: ") 46 return dbus.UInt32(passkey) 47 48 @dbus.service.method("org.bluez.Agent", 49 in_signature="ou", out_signature="") 50 def DisplayPasskey(self, device, passkey): 51 print "DisplayPasskey (%s, %d)" % (device, passkey) 52 53 @dbus.service.method("org.bluez.Agent", 54 in_signature="ou", out_signature="") 55 def RequestConfirmation(self, device, passkey): 56 print "RequestConfirmation (%s, %d)" % (device, passkey) 57 confirm = raw_input("Confirm passkey (yes/no): ") 58 if (confirm == "yes"): 59 return 60 raise Rejected("Passkey doesn't match") 61 62 @dbus.service.method("org.bluez.Agent", 63 in_signature="s", out_signature="") 64 def ConfirmModeChange(self, mode): 65 print "ConfirmModeChange (%s)" % (mode) 66 67 @dbus.service.method("org.bluez.Agent", 68 in_signature="", out_signature="") 69 def Cancel(self): 70 print "Cancel" 71 72 def create_device_reply(device): 73 print "New device (%s)" % (device) 74 mainloop.quit() 75 76 def create_device_error(error): 77 print "Creating device failed: %s" % (error) 78 mainloop.quit() 79 80 if __name__ == '__main__': 81 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) 82 83 bus = dbus.SystemBus() 84 manager = dbus.Interface(bus.get_object("org.bluez", "/"), 85 "org.bluez.Manager") 86 87 if len(sys.argv) > 1: 88 path = manager.FindAdapter(sys.argv[1]) 89 else: 90 path = manager.DefaultAdapter() 91 92 adapter = dbus.Interface(bus.get_object("org.bluez", path), 93 "org.bluez.Adapter") 94 95 path = "/test/agent" 96 agent = Agent(bus, path) 97 98 mainloop = gobject.MainLoop() 99 100 if len(sys.argv) > 2: 101 if len(sys.argv) > 3: 102 device = adapter.FindDevice(sys.argv[2]) 103 adapter.RemoveDevice(device) 104 105 agent.set_exit_on_release(False) 106 adapter.CreatePairedDevice(sys.argv[2], path, "DisplayYesNo", 107 reply_handler=create_device_reply, 108 error_handler=create_device_error) 109 else: 110 adapter.RegisterAgent(path, "DisplayYesNo") 111 print "Agent registered" 112 113 mainloop.run() 114 115 #adapter.UnregisterAgent(path) 116 #print "Agent unregistered" 117