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()