自动连接蓝牙设备

自动连接蓝牙设备

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

答案1

脉冲音频 >= 1.0

通过编辑/etc/pulse/default.pa我们可以加载 pulseaudio 模块模块连接开关一旦音频接收器被呈现给 pulseaudio 声音服务器,它就会自动连接到音频接收器。我们需要插入以下行

load-module module-switch-on-connect

pulseaudio 的早期版本

只要蓝牙设备存在,PulseAudio 就会识别它们。但是需要在音频设置中手动连接。有一个 GUI 允许一键连接到 BT 设备(流2ip)。

编辑:从 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 <MAC> <timeout>

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-自动连接.py. 使脚本可执行或从命令行运行它(推荐),然后cd /script/directory输入:

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

代替苹果通过蓝牙设备的 MAC 地址(例如 00:0C:78:4F:B6:B5)并设置所需的暂停(例如 10)在脚本查找设备时以秒为单位。然后,此脚本将监听给定的苹果每一个暂停几秒钟即可连接蓝牙设备并将其连接到 PulseAudio(如果存在)。脚本将一直运行,直到被终止或虚拟终端关闭。

有时 PulseAudio 似乎无法识别设备在切换后再次出现的情况。希望pulseaudio -k它能重新出现。

不是很花哨,没有 GUI,但至少在我的设置中它运行正常。

编辑有兴趣的可以看看:bt 自动连接带有方便设置的 GUI 的版本已发布。请在此处提交错误或建议。感谢您的测试。

答案2

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

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

#!/usr/bin/python

# based on monitor-bluetooth
# Changes by Domen Puncer <[email protected]>

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()

答案3

当谈到自动重新连接蓝牙设备时,我需要将该设备添加为受信任的设备:

bluetoothctl trust device_mac_address

要在 ubuntu 上获取设备 mac 地址,您需要连接蓝牙设备或至少使其可被发现。接下来,转到设置 > 蓝牙。单击蓝牙设备,应该会显示 mac 地址

相关内容