#!/usr/bin/python3 import syslog import sys import dbus import dbus.service import dbus.mainloop.glib from gi.repository import GLib AGENT_INTERFACE = "org.bluez.Agent1" AGENT_PATH = "/test/agent" class Rejected(dbus.DBusException): _dbus_error_name = "org.bluez.Error.Rejected" class Agent(dbus.service.Object): exit_on_release = True def set_exit_on_release(self, exit_on_release): self.exit_on_release = exit_on_release @dbus.service.method(AGENT_INTERFACE, in_signature="", out_signature="") def Release(self): syslog.syslog("Release") if self.exit_on_release: mainloop.quit() @dbus.service.method(AGENT_INTERFACE, in_signature="os", out_signature="") def AuthorizeService(self, device, uuid): syslog.syslog("AuthorizeService ({0:s}, {1:s})".format(device, uuid)) if uuid == "0000110d-0000-1000-8000-00805f9b34fb": syslog.syslog("Authorized A2DP Service") return syslog.syslog("Rejecting non-A2DP Service") raise Rejected("Connection rejected") @dbus.service.method(AGENT_INTERFACE, in_signature="o", out_signature="s") def RequestPinCode(self, device): syslog.syslog("RequestPinCode ({0:s})".format(device)) return "0000" @dbus.service.method(AGENT_INTERFACE, in_signature="o", out_signature="u") def RequestPasskey(self, device): syslog.syslog("RequestPasskey ({0:s})".format(device)) return dbus.UInt32("password") @dbus.service.method(AGENT_INTERFACE, in_signature="ouq", out_signature="") def DisplayPasskey(self, device, passkey, entered): syslog.syslog("DisplayPasskey ({0:s}, {1:06d} entered {2:d})".format(device, passkey, entered)) @dbus.service.method(AGENT_INTERFACE, in_signature="os", out_signature="") def DisplayPinCode(self, device, pincode): syslog.syslog("DisplayPinCode ({0:s}, {1:s})".format(device, pincode)) @dbus.service.method(AGENT_INTERFACE, in_signature="ou", out_signature="") def RequestConfirmation(self, device, passkey): syslog.syslog("RequestConfirmation ({0:s}, {1:06d})".format(device, passkey)) return @dbus.service.method(AGENT_INTERFACE, in_signature="o", out_signature="") def RequestAuthorization(self, device): syslog.syslog("RequestAuthorization ({0:s})".format(device)) raise Rejected("Pairing rejected") @dbus.service.method(AGENT_INTERFACE, in_signature="", out_signature="") def Cancel(self): syslog.syslog("Cancel") if __name__ == '__main__': dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SystemBus() agent = Agent(bus, AGENT_PATH) obj = bus.get_object("org.bluez", "/org/bluez"); manager = dbus.Interface(obj, "org.bluez.AgentManager1") manager.RegisterAgent(AGENT_PATH, "NoInputNoOutput") syslog.openlog(ident="a2dp-agent",logoption=syslog.LOG_PID, facility=syslog.LOG_USER) syslog.syslog('A2DP Agent Registered') manager.RequestDefaultAgent(AGENT_PATH) mainloop = GLib.MainLoop() mainloop.run()