Please be patient as I am new to bug reporting and examining the workings of the system, Hardware:- Dell Latttitude D610, Mem- 2Gb, Processor- Intel Pentium (R)M 1.86 Ghz, Graphics- Galium 04 on ATI RV370, 32 Bit Bug, Unable to effect bluetooth connection. Able to prior to upgrade to 13.10. As standard Bluetooth indicator not working on top bar, open "as standard bluetooth" via settings or dash okay, Can pair with external speaker for example but cannot connect, slider in Bluetooth GUI will not slide to give connect staus. Tried Blueman Device Manager 1.23, can also find and pair but unable to connect to device. As installed config shown below just incase there is an error ./ect/bluetooth/audio.conf # Configuration file for the audio service # This section contains options which are not specific to any # particular interface [General] # Switch to master role for incoming connections (defaults to true) #Master=true # If we want to disable support for specific services # Defaults to supporting all implemented services #Disable=Gateway,Source,Socket # SCO routing. Either PCM or HCI (in which case audio is routed to/from ALSA) # Defaults to HCI #SCORouting=PCM # Automatically connect both A2DP and HFP/HSP profiles for incoming # connections. Some headsets that support both profiles will only connect the # other one automatically so the default setting of true is usually a good # idea. #AutoConnect=true # Headset interface specific options (i.e. options which affect how the audio # service interacts with remote headset devices) [Headset] # Set to true to support HFP, false means only HSP is supported # Defaults to true HFP=true # Maximum number of connected HSP/HFP devices per adapter. Defaults to 1 MaxConnected=1 # Set to true to enable use of fast connectable mode (faster page scanning) # for HFP when incoming call starts. Default settings are restored after # call is answered or rejected. Page scan interval is much shorter and page # scan type changed to interlaced. Such allows faster connection initiated # by a headset. FastConnectable=false # Just an example of potential config options for the other interfaces #[A2DP] #SBCSources=1 #MPEG12Sources=0 A system crash report generated an error in /usr/bin/blueman-assistant file copy below #! /usr/bin/python # Copyright (C) 2008 Valmantas Paliksa # Copyright (C) 2008 Tadas Dailyda # # Licensed under the GNU General Public License Version 3 # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # PAGE_INTRO = 0 PAGE_DEVLIST = 1 PAGE_PASSKEY = 2 PAGE_PAIRING = 3 PAGE_CONNECT = 4 PAGE_CONNECTING = 5 PAGE_FINISH = 6 pages = {} import os import sys import gtk import random import dbus.glib from optparse import OptionParser #support running uninstalled _dirname = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) if os.path.exists(os.path.join(_dirname,"ChangeLog")): sys.path.insert(0, _dirname) from blueman.Functions import * from blueman.gui.DeviceSelectorWidget import DeviceSelectorWidget from blueman.bluez.Agent import Agent, AgentMethod from blueman.bluez.Manager import Manager from blueman.main.FakeDevice import FakeDevice from blueman.main.Device import Device from blueman.main.AppletService import AppletService from blueman.Sdp import * class Assistant(Agent): def __init__(self): Agent.__init__(self, "/") setup_icon_path() usage = "Usage: %prog [options]" parser = OptionParser(usage) parser.add_option("-d", "--device", dest="device", action="store", help=_("Start configuration assistant for this device"), metavar="ADDRESS") (options, args) = parser.parse_args() check_bluetooth_status(_("Bluetooth needs to be turned on for the Bluetooth assistant to work"), lambda: exit()) self.options = options self.Device = None self.Adapter = None self.PairType = 0 self.Passkey = "" self.Service = None self.Builder = gtk.Builder() self.Builder.set_translation_domain("blueman") self.Builder.add_from_file(UI_PATH +"/assistant.ui") self.assistant = self.Builder.get_object("assistant") self.assistant.set_title(_("Bluetooth Assistant")) self.applet = AppletService() self.assistant.connect("prepare", self.on_prepare) self.assistant.connect("close", self.on_close) self.assistant.connect("cancel", self.on_close) pages[PAGE_INTRO] = self.Builder.get_object("l_page0") self.assistant.set_page_header_image(pages[PAGE_INTRO], get_icon("blueman", 32)) self.assistant.set_page_complete(pages[PAGE_INTRO], True) pages[PAGE_DEVLIST] = self.Builder.get_object("a_page1") self.assistant.set_page_header_image(pages[PAGE_DEVLIST], get_icon("blueman", 32)) pages[PAGE_PASSKEY] = self.Builder.get_object("a_page2") self.assistant.set_page_header_image(pages[PAGE_PASSKEY], get_icon("gtk-dialog-authentication", 32)) pages[PAGE_PAIRING] = self.Builder.get_object("l_page3") self.assistant.set_page_header_image(pages[PAGE_PAIRING], get_icon("gtk-dialog-authentication", 32)) pages[PAGE_CONNECT] = self.Builder.get_object("a_page4") self.assistant.set_page_header_image(pages[PAGE_CONNECT], get_icon("gtk-connect", 32)) pages[PAGE_CONNECTING] = self.Builder.get_object("l_page5") self.assistant.set_page_header_image(pages[PAGE_CONNECTING], get_icon("gtk-connect", 32)) pages[PAGE_FINISH] = self.Builder.get_object("l_page6") self.assistant.set_page_header_image(pages[PAGE_FINISH], get_icon("gtk-yes", 32)) self.svc_vbox = self.Builder.get_object("svcs") self.cust_passkey = self.Builder.get_object("e_myp") self.cust_passkey.props.sensitive = False self.cust_passkey.connect("changed", self.on_passkey_changed) self.Builder.get_object("r_dontp").connect("toggled", self.on_pairing_method_changed, 2) self.Builder.get_object("r_myp").connect("toggled", self.on_pairing_method_changed, 1) self.Builder.get_object("r_randp").connect("toggled", self.on_pairing_method_changed, 0) self.dev_widget = DeviceSelectorWidget() self.dev_widget.List.connect("device-selected", self.on_device_selected) self.dev_widget.List.connect("row-activated", self.on_row_activated) self.assistant.set_forward_page_func(self.next_page_fn, None) pages[PAGE_DEVLIST].add(self.dev_widget) self.dev_widget.show() if not self.dev_widget.List.IsValidAdapter(): d = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, ) d.props.text = _("No adapters found") d.props.icon_name = "blueman" d.props.title = "Blueman Assistant" d.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CANCEL) d.run() exit(1) self.assistant.show() if options.device != None: m = Manager("gobject") try: adapter = m.GetAdapter() except: print "Error: No Adapters present" exit(1) try: d = adapter.FindDevice(options.device) self.Device = Device(d) self.Adapter = adapter if self.Device.Paired: self.assistant.set_current_page(PAGE_CONNECT) else: self.assistant.set_current_page(PAGE_PASSKEY) except: info = {} info["Address"] = options.device info["Name"] = info["Address"].replace(":", "-") info["Alias"] = info["Name"] info["Fake"] = True self.Device = FakeDevice(info) self.Adapter = adapter self.assistant.set_current_page(PAGE_PASSKEY) else: self.dev_widget.List.DiscoverDevices() gtk.main() def on_row_activated(self, treeview, path, view_column, *args): self.assistant.set_current_page(self.next_page_fn(self.assistant.get_current_page(), None)) def next_page_fn(self, page, data): if page == PAGE_INTRO: return PAGE_DEVLIST elif page == PAGE_DEVLIST: if self.Device: if self.Device.Fake or not self.Device.Paired: return PAGE_PASSKEY else: return PAGE_CONNECT else: return PAGE_PASSKEY elif page == PAGE_PASSKEY: if not self.Device.Fake and not self.Device.Paired and self.PairType == 2: return PAGE_CONNECT #self.assistant.set_page_complete(pages[PAGE_PASSKEY], True) return PAGE_PAIRING elif page == PAGE_PAIRING: if len(self.Device.Services) == 0: return PAGE_FINISH return PAGE_CONNECT elif page == PAGE_CONNECT: if self.Service and self.Service[0]: return PAGE_CONNECTING else: return PAGE_FINISH elif page == PAGE_CONNECTING: return PAGE_FINISH elif page == PAGE_FINISH: return PAGE_FINISH+1 return page def check_custom_passkey(self): return len(self.cust_passkey.props.text) != 0 def on_passkey_changed(self, e): if self.PairType == 1: if self.check_custom_passkey(): self.Passkey = e.props.text self.assistant.set_page_complete(pages[PAGE_PASSKEY], True) else: self.assistant.set_page_complete(pages[PAGE_PASSKEY], False) def on_pairing_method_changed(self, radio_button, type): if radio_button.props.active: if type == 0: self.cust_passkey.props.sensitive = False self.assistant.set_page_complete(pages[PAGE_PASSKEY], True) elif type == 1: self.cust_passkey.props.sensitive = True if not self.check_custom_passkey(): self.assistant.set_page_complete(pages[PAGE_PASSKEY], False) else: self.cust_passkey.props.sensitive = False self.assistant.set_page_complete(pages[PAGE_PASSKEY], True) self.PairType = type def on_device_selected(self, list, device, iter): if not device: self.assistant.set_page_complete(pages[PAGE_DEVLIST], False) self.Device = None self.Adapter = list.Adapter else: self.assistant.set_page_complete(pages[PAGE_DEVLIST], True) self.Device = device self.Adapter = list.Adapter @AgentMethod def RequestPinCode(self, device): dprint("Agent.RequestPinCode") return self.Passkey @AgentMethod def RequestPasskey(self, device): dprint("Agent.RequestPasskey") return self.Passkey def on_close(self, assistant): gtk.main_quit() def on_service_toggled(self, rb, sv_name, *args): if rb.props.active: self.Service = (sv_name, args) self.assistant.set_page_complete(pages[PAGE_CONNECT], True) def on_prepare(self, assistant, page): num = assistant.get_current_page() if num == PAGE_PASSKEY: self.assistant.set_page_complete(pages[PAGE_PASSKEY], True) elif num == PAGE_PAIRING: if self.Device.Fake and self.PairType == 2: pages[PAGE_PAIRING].set_markup(_("Adding Device...")) self.assistant.set_page_title(pages[PAGE_PAIRING], _("Adding")) else: if self.PairType == 0: self.Passkey = "%04d" % random.randint(0, 9999) pages[PAGE_PAIRING].set_markup(_("Pairing in progress...\n\nEnter passkey %s on the device.") % self.Passkey) def ok(dev): self.Device = Device(dev) def refresh_cb(*args): self.assistant.set_current_page(PAGE_CONNECT) self.applet.RefreshServices(self.Device.GetObjectPath(), reply_handler=refresh_cb, error_handler=refresh_cb) def err(err): print err pages[PAGE_FINISH].set_markup(_("Failed to add device")) self.assistant.set_page_header_image(pages[PAGE_FINISH], get_icon("gtk-no", 32)) self.assistant.set_current_page(PAGE_FINISH) if self.PairType != 2: self.Adapter.CreatePairedDevice(self.Device.Address, self.GetObjectPath(), "", reply_handler=ok, error_handler=err) else: self.Adapter.CreateDevice(self.Device.Address, reply_handler=ok, error_handler=err) elif num == PAGE_CONNECT: self.svc_vbox.foreach(lambda x, y: self.svc_vbox.remove(x), None) print self.Device.Services uuids = self.Device.UUIDs rbs = [] def get_first_item(): try: return rbs[0] except: return None for name, service in self.Device.Services.iteritems(): if name == "serial": for uuid in uuids: uuid16 = uuid128_to_uuid16(uuid) if uuid16 == DIALUP_NET_SVCLASS_ID: rbs.append(gtk.RadioButton(get_first_item(), uuid16_to_name(uuid16))) rbs[-1].connect("toggled", self.on_service_toggled, name, uuid) self.svc_vbox.pack_start(rbs[-1], False) if uuid16 == SERIAL_PORT_SVCLASS_ID: rbs.append(gtk.RadioButton(get_first_item(), uuid16_to_name(uuid16))) rbs[-1].connect("toggled", self.on_service_toggled, name, uuid) self.svc_vbox.pack_start(rbs[-1], False) elif name == "input": rbs.append(gtk.RadioButton(get_first_item(), _("Input Service"))) rbs[-1].connect("toggled", self.on_service_toggled, name) self.svc_vbox.pack_start(rbs[-1], False) elif name == "network": for uuid in uuids: uuid16 = uuid128_to_uuid16(uuid) if uuid16 == GN_SVCLASS_ID: rbs.append(gtk.RadioButton(get_first_item(), _("Group Network"))) rbs[-1].connect("toggled", self.on_service_toggled, name, uuid) self.svc_vbox.pack_start(rbs[-1], False) if uuid16 == NAP_SVCLASS_ID: rbs.append(gtk.RadioButton(get_first_item(), _("Network Access Point"))) rbs[-1].connect("toggled", self.on_service_toggled, name, uuid) self.svc_vbox.pack_start(rbs[-1], False) elif name == "audiosink": rbs.append(gtk.RadioButton(get_first_item(), _("A2DP Sink (Send Audio)"))) rbs[-1].connect("toggled", self.on_service_toggled, name) self.svc_vbox.pack_start(rbs[-1], False) elif name == "audiosource": rbs.append(gtk.RadioButton(get_first_item(), _("A2DP Source (Receive Audio)"))) rbs[-1].connect("toggled", self.on_service_toggled, name) self.svc_vbox.pack_start(rbs[-1], False) elif name == "headset": rbs.append(gtk.RadioButton(get_first_item(), _("Headset Service"))) rbs[-1].connect("toggled", self.on_service_toggled, name) self.svc_vbox.pack_start(rbs[-1], False) rbs.append(gtk.RadioButton(get_first_item(), _("Don't connect"))) rbs[-1].connect("toggled", self.on_service_toggled, None) self.svc_vbox.pack_start(rbs[-1], False, False, 8) self.svc_vbox.show_all() rbs[0].emit("toggled") if len(self.svc_vbox.get_children()) == 1: self.assistant.set_current_page(self.next_page_fn(self.assistant.get_current_page(), None)) elif num == PAGE_CONNECTING: print "connect" svc = self.Device.Services[self.Service[0]] def success(*args): pages[PAGE_FINISH].set_markup(_("Device added and connected successfuly")) self.assistant.set_page_complete(pages[PAGE_CONNECTING], True) self.assistant.set_page_header_image(pages[PAGE_FINISH], get_icon("gtk-yes", 32)) self.assistant.set_current_page(PAGE_FINISH) def fail(*args): pages[PAGE_FINISH].set_markup(_("Device added successfuly, but failed to connect")) self.assistant.set_page_complete(pages[PAGE_CONNECTING], True) self.assistant.set_page_header_image(pages[PAGE_FINISH], get_icon("gtk-dialog-warning", 32)) self.assistant.set_current_page(PAGE_FINISH) if self.Service[0] == "network": uuid = self.Service[1][0] self.applet.ServiceProxy(svc.GetInterfaceName(), svc.GetObjectPath(), "Connect", [uuid], reply_handler=success, error_handler=fail) elif self.Service[0] == "serial": uuid = self.Service[1][0] self.applet.RfcommConnect(self.Device.GetObjectPath(), uuid, reply_handler=success, error_handler=fail) else: self.applet.ServiceProxy(svc.GetInterfaceName(), svc.GetObjectPath(), "Connect", [], reply_handler=success, error_handler=fail) Assistant()