| #!/usr/bin/python | |
| from __future__ import absolute_import, print_function, unicode_literals | |
| from optparse import OptionParser, make_option | |
| import os | |
| import sys | |
| import uuid | |
| import dbus | |
| import dbus.service | |
| import dbus.mainloop.glib | |
| try: | |
| from gi.repository import GObject | |
| except ImportError: | |
| import gobject as GObject | |
| class Profile(dbus.service.Object): | |
| fd = -1 | |
| @dbus.service.method("org.bluez.Profile1", | |
| in_signature="", out_signature="") | |
| def Release(self): | |
| print("Release") | |
| mainloop.quit() | |
| @dbus.service.method("org.bluez.Profile1", | |
| in_signature="", out_signature="") | |
| def Cancel(self): | |
| print("Cancel") | |
| @dbus.service.method("org.bluez.Profile1", | |
| in_signature="oha{sv}", out_signature="") | |
| def NewConnection(self, path, fd, properties): | |
| self.fd = fd.take() | |
| print("NewConnection(%s, %d)" % (path, self.fd)) | |
| for key in properties.keys(): | |
| if key == "Version" or key == "Features": | |
| print(" %s = 0x%04x" % (key, properties[key])) | |
| else: | |
| print(" %s = %s" % (key, properties[key])) | |
| @dbus.service.method("org.bluez.Profile1", | |
| in_signature="o", out_signature="") | |
| def RequestDisconnection(self, path): | |
| print("RequestDisconnection(%s)" % (path)) | |
| if (self.fd > 0): | |
| os.close(self.fd) | |
| self.fd = -1 | |
| if __name__ == '__main__': | |
| dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) | |
| bus = dbus.SystemBus() | |
| manager = dbus.Interface(bus.get_object("org.bluez", | |
| "/org/bluez"), "org.bluez.ProfileManager1") | |
| option_list = [ | |
| make_option("-u", "--uuid", action="store", | |
| type="string", dest="uuid", | |
| default=None), | |
| make_option("-p", "--path", action="store", | |
| type="string", dest="path", | |
| default="/foo/bar/profile"), | |
| make_option("-n", "--name", action="store", | |
| type="string", dest="name", | |
| default=None), | |
| make_option("-s", "--server", | |
| action="store_const", | |
| const="server", dest="role"), | |
| make_option("-c", "--client", | |
| action="store_const", | |
| const="client", dest="role"), | |
| make_option("-a", "--auto-connect", | |
| action="store_true", | |
| dest="auto_connect", default=False), | |
| make_option("-P", "--PSM", action="store", | |
| type="int", dest="psm", | |
| default=None), | |
| make_option("-C", "--channel", action="store", | |
| type="int", dest="channel", | |
| default=None), | |
| make_option("-r", "--record", action="store", | |
| type="string", dest="record", | |
| default=None), | |
| make_option("-S", "--service", action="store", | |
| type="string", dest="service", | |
| default=None), | |
| ] | |
| parser = OptionParser(option_list=option_list) | |
| (options, args) = parser.parse_args() | |
| profile = Profile(bus, options.path) | |
| mainloop = GObject.MainLoop() | |
| opts = { | |
| "AutoConnect" : options.auto_connect, | |
| } | |
| if (options.name): | |
| opts["Name"] = options.name | |
| if (options.role): | |
| opts["Role"] = options.role | |
| if (options.psm is not None): | |
| opts["PSM"] = dbus.UInt16(options.psm) | |
| if (options.channel is not None): | |
| opts["Channel"] = dbus.UInt16(options.channel) | |
| if (options.record): | |
| opts["ServiceRecord"] = options.record | |
| if (options.service): | |
| opts["Service"] = options.service | |
| if not options.uuid: | |
| options.uuid = str(uuid.uuid4()) | |
| manager.RegisterProfile(options.path, options.uuid, opts) | |
| mainloop.run() |