Description
Agents are applications responsible for requests passkey and address authorization
Basic Information
Note: This HOWTO use BlueZ 4.xx
The agent API is available in: utils/doc/agent-api.txt
Authorize
Called when needs authorize a connection/service request. Return void if authorized or rejected error
Python Code:
import dbus
import dbus.service
class Agent(dbus.service.Object)
@dbus.service.method(dbus_interface='org.bluez.Agent',
in_signature='os', out_signature='')
def Authorize(self, device, uuid):
print 'Authotize device %s? (y/n)' %device
auth = raw_input()
if auth == 'y' or auth == 'Y':
print 'Device %s Autorized' %device
return
raise dbus.DBusException("org.bluez.Error.Rejected: Device %s Not Autorized" %device)
Request Pass Key
Called when needs get the passkey for an authentication. The return value is actual passkey.
Python Code:
import dbus import dbus.service class Agent(dbus.service.Object) @dbus.service.method(dbus_interface='org.bluez.Agent', in_signature='o', out_signature='s') def RequestPasskey(self, device): print 'Enter Passkey fom %s: ' %device return raw_input()
Confirm Mode Change
Called if a mode change needs to be confirmed. Return void if authorized or rejected error
Python Code:
import dbus
import dbus.service
class Agent(dbus.service.Object)
@dbus.service.method(dbus_interface='org.bluez.Agent',
in_signature="s", out_signature="")
def ConfirmModeChange(self, mode):
print "Confirm Mode Change to %s? (y/n)" %mode
response = raw_input()
if response == 'y' or response == 'Y':
print '%s Mode Confirmed' %mode
return
raise dbus.DBusException("org.bluez.Error.Rejected: %s Mode Not Autorized" %mode)
Release
Called when the service daemon unregisters the agent.
Cancel
Called to indicate that the agent request failed before a reply was returned.
Python Example
#!/usr/bin/python
import gobject
import dbus
import dbus.service
import dbus.mainloop.glib
AGENT_PATH = '/agent_sample'
AGENT_INTERFACE = 'org.bluez.Agent'
DEVICE_INTERFACE = 'org.bluez.Device'
class ErrorReject(dbus.DBusException):
_dbus_error_name = "org.bluez.Error.Rejected"
class ErrorCancel(dbus.DBusException):
_dbus_error_name = "org.bluez.Error.Canceled"
class Agent(dbus.service.Object):
def __print_device(self, device):
obj = self.connection.get_object("org.bluez", device)
try:
dev_properties = obj.GetProperties(dbus_interface=DEVICE_INTERFACE)
except Exception, e:
return
properties = dev_properties.iteritems()
print device, " properties"
for key, value in properties:
print "%-10s= %s" %(key, value)
@dbus.service.method(dbus_interface=AGENT_INTERFACE,
in_signature="", out_signature="")
def Release(self):
mainloop.quit()
return
@dbus.service.method(dbus_interface=AGENT_INTERFACE,
in_signature="o", out_signature="s")
def RequestPasskey(self, device):
self.__print_device(device)
print 'Enter Passkey:'
return raw_input()
@dbus.service.method(dbus_interface=AGENT_INTERFACE,
in_signature='os', out_signature='')
def Authorize(self, device, uuid):
self.__print_device(device)
print 'Authotize? (y/n)'
auth = raw_input()
if auth == 'y' or auth == 'Y':
print 'Device %s Autorized' %device
return
raise ErrorReject("Device %s Not Autorized" %device)
@dbus.service.method(dbus_interface=AGENT_INTERFACE,
in_signature="s", out_signature="")
def ConfirmModeChange(self, mode):
print "Confirm Mode Change to %s? (y/n)" %mode
response = raw_input()
if response == 'y' or response == 'Y':
print '%s Mode Confirmed' %mode
return
raise ErrorReject("%s Mode Not Autorized" %mode)
@dbus.service.method(dbus_interface=AGENT_INTERFACE,
in_signature="", out_signature="")
def Cancel(self):
print "Cancel"
if __name__ == '__main__':
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SystemBus()
adapter = dbus.Interface(bus.get_object("org.bluez", "/hci0"),
"org.bluez.Adapter")
agent = Agent(bus, AGENT_PATH)
adapter.RegisterAgent(AGENT_PATH)
print "Agent registered"
mainloop = gobject.MainLoop()
mainloop.run()
