自动连接蓝牙设备

有没有办法将Ubuntu中的蓝牙设置为自动连接到打开时配对的设备。 此外,有没有办法在连接时自动将声音输出更改为蓝牙耳机?

Pulseaudio> = 1.0

通过编辑/etc/pulse/default.pa我们可以将pulseaudio模块模块 – 开启 – 连接加载到自动连接到音频接收器,一旦它出现在pulseaudio声音服务器上。 我们需要插入以下行

 load-module module-switch-on-connect 

早期版本的pulseaudio

一旦存在,就会在PulseAudio中识别蓝牙设备。 但是,需要在音频设置中手动进行连接。 有一个GUI允许一键连接到BT设备( stream2ip )。

编辑:从版本0.2.5 stream2ip允许自动连接到蓝牙设备。

编辑:如果没有蓝牙设备,您可以将bluez设备设置为默认设备(例如,通过使用pactl或在配置设置中),并回退到内部音频。

编辑:这是一个快速而肮脏的Python脚本,可以让您了解如何完成工作:

 #!/usr/bin/env python #-*- coding: utf-8 -*- # # bt-autoconnect # Autoconnects Bluetooth Devices to PulseAudio # (c) Takkat Nebuk # Licence: GPLv3 # usage: # bt-autoconnect   import subprocess import time import sys import string cli_options = sys.argv def main(): MAC = cli_options[1] timeout = cli_options[2] PMAC = string.replace(MAC,':','_') # PA don't know ':', needs '_' pa_args = ['pacmd set-default-sink bluez_sink.' + PMAC] bt_args = ['sdptool browse ' + MAC] err = False while err == False: if subprocess.call(bt_args, shell=True) == 0: err = subprocess.call(pa_args, shell=True) time.sleep(int(timeout)) exit() if __name__ == "__main__": main() 

只需复制此脚本并将其另存为bt-autoconnect.py即可 。 使脚本可执行或通过cd /script/directory从命令行(推荐)运行它,然后键入:

 python bt-autoconnect.py [MAC] [timeout] 

MAC替换为蓝牙设备的MAC(例如00:0C:78:4F:B6:B5),并在脚本查找设备时以秒为单位设置所需的超时 (例如10)。 然后,此脚本将在蓝牙设备的每个超时秒内侦听给定的MAC ,并将其连接到PulseAudio(如果存在)。 该脚本将永久运行,直到它被杀死或虚拟终端关闭。

有时PulseAudio似乎没有意识到设备在切换后再次出现。 有一些希望, pulseaudio -k让它再次出现。

不花哨,没有GUI,但至少在我的设置中它工作正常。

编辑感兴趣的人:发布带有GUI的bt-autoconnect以方便设置。 请在那里提交错误或建议。 谢谢你的测试。

不幸的是,我现在才看到Takkat的答案,这似乎比我的更好。

我想这可能仍然与Pulseaudio <1.0相关。 它不使用轮询,但会监听dbus上的蓝牙事件:

 #!/usr/bin/python # based on monitor-bluetooth # Changes by Domen Puncer  import gobject import dbus import dbus.mainloop.glib import os # we want this event: {AudioSource.PropertyChanged} [/org/bluez/16797/hci0/dev_00_24_7E_51_F7_52] State = playing # and when that happens: pactl load-module module-loopback source=bluez_source.00_24_7E_51_F7_52 sink=alsa_output.pci-0000_00_1b.0.analog-stereo def property_changed(name, value, path, interface): iface = interface[interface.rfind(".") + 1:] val = str(value) print "{%s.PropertyChanged} [%s] %s = %s" % (iface, path, name, val) if iface == "AudioSource" and name == "State" and val == "playing": bt_addr = "_".join(path.split('/')[-1].split('_')[1:]) cmd = "pactl load-module module-loopback source=bluez_source.%s sink=alsa_output.pci-0000_00_1b.0.analog-stereo" % bt_addr os.system(cmd) def object_signal(value, path, interface, member): iface = interface[interface.rfind(".") + 1:] val = str(value) print "{%s.%s} [%s] Path = %s" % (iface, member, path, val) if __name__ == '__main__': dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SystemBus() bus.add_signal_receiver(property_changed, bus_name="org.bluez", signal_name = "PropertyChanged", path_keyword="path", interface_keyword="interface") mainloop = gobject.MainLoop() mainloop.run()