From 774b09b2d6d461560feebb9dd3cc6cf9b0696061 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Thu, 21 Feb 2013 17:07:46 +0100 Subject: [PATCH] meta-digi-del: fix bluetooth-python applications https://jira.digi.com/browse/DEL-224 #resolve https://jira.digi.com/browse/DEL-276 #resolve Signed-off-by: Javier Viguera --- .../bluez/bluez4_4.101.bbappend | 12 ++ .../bluez/files/simple-agent | 130 ++++++++++++++++++ .../del-examples/del-examples-hdp.bb | 2 +- 3 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 meta-digi-del/recipes-connectivity/bluez/bluez4_4.101.bbappend create mode 100755 meta-digi-del/recipes-connectivity/bluez/files/simple-agent diff --git a/meta-digi-del/recipes-connectivity/bluez/bluez4_4.101.bbappend b/meta-digi-del/recipes-connectivity/bluez/bluez4_4.101.bbappend new file mode 100644 index 000000000..fd3c1e337 --- /dev/null +++ b/meta-digi-del/recipes-connectivity/bluez/bluez4_4.101.bbappend @@ -0,0 +1,12 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/files:" +PR_append = "+${DISTRO}.r0" + +# Use 'simple-agent' from bluez-4.98 to avoid a dependence in +# gobject-introspection +SRC_URI += "file://simple-agent" + +EXTRA_OECONF_append_del = " --enable-health" + +do_install_append() { + install -m 0755 ${WORKDIR}/simple-agent ${D}${bindir} +} diff --git a/meta-digi-del/recipes-connectivity/bluez/files/simple-agent b/meta-digi-del/recipes-connectivity/bluez/files/simple-agent new file mode 100755 index 000000000..8d658601f --- /dev/null +++ b/meta-digi-del/recipes-connectivity/bluez/files/simple-agent @@ -0,0 +1,130 @@ +#!/usr/bin/python + +import gobject + +import sys +import dbus +import dbus.service +import dbus.mainloop.glib +from optparse import OptionParser + +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("org.bluez.Agent", + in_signature="", out_signature="") + def Release(self): + print "Release" + if self.exit_on_release: + mainloop.quit() + + @dbus.service.method("org.bluez.Agent", + in_signature="os", out_signature="") + def Authorize(self, device, uuid): + print "Authorize (%s, %s)" % (device, uuid) + authorize = raw_input("Authorize connection (yes/no): ") + if (authorize == "yes"): + return + raise Rejected("Connection rejected by user") + + @dbus.service.method("org.bluez.Agent", + in_signature="o", out_signature="s") + def RequestPinCode(self, device): + print "RequestPinCode (%s)" % (device) + return raw_input("Enter PIN Code: ") + + @dbus.service.method("org.bluez.Agent", + in_signature="o", out_signature="u") + def RequestPasskey(self, device): + print "RequestPasskey (%s)" % (device) + passkey = raw_input("Enter passkey: ") + return dbus.UInt32(passkey) + + @dbus.service.method("org.bluez.Agent", + in_signature="ou", out_signature="") + def DisplayPasskey(self, device, passkey): + print "DisplayPasskey (%s, %d)" % (device, passkey) + + @dbus.service.method("org.bluez.Agent", + in_signature="ou", out_signature="") + def RequestConfirmation(self, device, passkey): + print "RequestConfirmation (%s, %d)" % (device, passkey) + confirm = raw_input("Confirm passkey (yes/no): ") + if (confirm == "yes"): + return + raise Rejected("Passkey doesn't match") + + @dbus.service.method("org.bluez.Agent", + in_signature="s", out_signature="") + def ConfirmModeChange(self, mode): + print "ConfirmModeChange (%s)" % (mode) + authorize = raw_input("Authorize mode change (yes/no): ") + if (authorize == "yes"): + return + raise Rejected("Mode change by user") + + @dbus.service.method("org.bluez.Agent", + in_signature="", out_signature="") + def Cancel(self): + print "Cancel" + +def create_device_reply(device): + print "New device (%s)" % (device) + mainloop.quit() + +def create_device_error(error): + print "Creating device failed: %s" % (error) + mainloop.quit() + +if __name__ == '__main__': + dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) + + bus = dbus.SystemBus() + manager = dbus.Interface(bus.get_object("org.bluez", "/"), + "org.bluez.Manager") + + capability = "DisplayYesNo" + + parser = OptionParser() + parser.add_option("-c", "--capability", action="store", + type="string", dest="capability") + (options, args) = parser.parse_args() + if options.capability: + capability = options.capability + + if len(args) > 0: + path = manager.FindAdapter(args[0]) + else: + path = manager.DefaultAdapter() + + adapter = dbus.Interface(bus.get_object("org.bluez", path), + "org.bluez.Adapter") + + path = "/test/agent" + agent = Agent(bus, path) + + mainloop = gobject.MainLoop() + + if len(args) > 1: + if len(args) > 2: + device = adapter.FindDevice(args[1]) + adapter.RemoveDevice(device) + + agent.set_exit_on_release(False) + adapter.CreatePairedDevice(args[1], path, capability, + reply_handler=create_device_reply, + error_handler=create_device_error) + else: + adapter.RegisterAgent(path, capability) + print "Agent registered" + + mainloop.run() + + #adapter.UnregisterAgent(path) + #print "Agent unregistered" diff --git a/meta-digi-del/recipes-digi/del-examples/del-examples-hdp.bb b/meta-digi-del/recipes-digi/del-examples/del-examples-hdp.bb index 6fec7075b..4a63e5ad7 100644 --- a/meta-digi-del/recipes-digi/del-examples/del-examples-hdp.bb +++ b/meta-digi-del/recipes-digi/del-examples/del-examples-hdp.bb @@ -14,6 +14,6 @@ do_install() { install -m 0755 hdp-test.py ${D}${bindir} } -RDEPENDS_${PN} = "python" +RDEPENDS_${PN} = "python python-argparse python-crypt python-dbus python-pygobject" PACKAGE_ARCH = "${MACHINE_ARCH}"