import dbus, dbus.glib import gobject class BTModel(gobject.GObject): dbus_bluez_service = "org.bluez" dbus_bluez_path = "/org/bluez" dbus_bluez_manager_interface = dbus_bluez_service + ".Manager" dbus_bluez_adapter_interface = dbus_bluez_service + ".Adapter" dbus_btsdp_service = "com.nokia.btsdp" dbus_btsdp_request_path = "/com/nokia/btsdp/request" dbus_btsdp_request_interface = "com.nokia.btsdp.request" __gsignals__ = { 'device-found':(gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT)), 'discovery-started':(gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()), 'discovery-completed':(gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()), 'name-updated':(gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT)) } def __init__(self): gobject.GObject.__init__(self) self.bus = None self.bluez_manager = None self.bluez_adapter = None self.bluez_default_adapter = None self.config_parser = None self.btsdp_request = None self.scanning = False try: self.init_bluez_adapter() except TypeError, e: print "Error in init_bluez_adapter()" def init_bluez_adapter(self): dbus_bluez_named_service = None if self.bus is None: self.bus = dbus.SystemBus() if self.bluez_manager is None: dbus_obj = self.bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus', introspect=False) dbus_bluez_named_service = dbus_obj.GetNameOwner('org.bluez', dbus_interface='org.freedesktop.DBus') bluez_obj = self.bus.get_object(self.dbus_bluez_service, self.dbus_bluez_path, introspect=False) self.bluez_manager = dbus.Interface(bluez_obj, self.dbus_bluez_manager_interface) btsdp_obj = self.bus.get_object("com.nokia.btsdp", "/com/nokia/btsdp/request", introspect=False) btsdp_request = dbus.Interface(btsdp_obj, "com.nokia.btsdp.request") if self.bluez_default_adapter is None: self.bluez_default_adapter = self.bluez_manager.DefaultAdapter() self.bus.add_signal_receiver(handler_function=self.cb_discovery_started, signal_name='DiscoveryStarted', dbus_interface=self.dbus_bluez_adapter_interface, named_service=dbus_bluez_named_service, path=self.bluez_default_adapter) self.bus.add_signal_receiver(handler_function=self.cb_remote_device_found, signal_name='RemoteDeviceFound', dbus_interface=self.dbus_bluez_adapter_interface, named_service=dbus_bluez_named_service, path=self.bluez_default_adapter) self.bus.add_signal_receiver(handler_function=self.cb_remote_name_updated, signal_name='RemoteNameUpdated', dbus_interface=self.dbus_bluez_adapter_interface, named_service=dbus_bluez_named_service, path=self.bluez_default_adapter) self.bus.add_signal_receiver(handler_function=self.cb_discovery_completed, signal_name='DiscoveryCompleted', dbus_interface=self.dbus_bluez_adapter_interface, named_service=dbus_bluez_named_service, path=self.bluez_default_adapter) bluez_object = self.bus.get_object(self.dbus_bluez_service, self.bluez_default_adapter, introspect=False) self.bluez_adapter = dbus.Interface(bluez_object, self.dbus_bluez_adapter_interface) def scan_bt_devices(self): if not self.scanning: self.bluez_adapter.DiscoverDevices() def cancel_scan_bt_devices(self): if self.bluez_adapter is not None and self.scanning: self.bluez_adapter.CancelDiscovery() self.scanning = False def cb_remote_device_found(self, address, *args): self.emit('device-found', address, *args) def cb_discovery_started(self): self.scanning = True self.emit('discovery-started') def cb_discovery_completed(self): self.scanning = False self.emit('discovery-completed') def cb_remote_name_updated(self, address, name, *args): self.emit('name-updated', name, *args)