Автоматическое подключение устройств Bluetooth

28

Есть ли способ настроить Bluetooth в Ubuntu для автоматического подключения к устройствам, к которым он подключен, когда он включен. Кроме того, есть ли способ автоматически переключать вывод звука на гарнитуру Bluetooth при подключении?

Кейси Келлер
источник

Ответы:

26

Pulseaudio> = 1,0

При редактировании /etc/pulse/default.paмы можем загрузить PulseAudio модуль модуль включения-подключения к AUTOCONNECT к звуковому раковине , как только он будет представлен PulseAudio звукового сервера. Нам нужно вставить следующую строку

load-module module-switch-on-connect

Предыдущие версии pulseaudio

Устройства Bluetooth распознаются в PulseAudio, как только они появляются. Однако подключение необходимо выполнить вручную в настройках звука. Существует графический интерфейс, который позволяет одним щелчком мыши подключаться к устройствам BT ( stream2ip ).

Изменить: Начиная с версии 0.2.5 stream2ip позволяет автоматически подключаться к устройствам Bluetooth.

Редактировать: вы можете настроить ваше устройство bluez как устройство по умолчанию (например, с помощью pactl или в настройках конфигурации) с откатом к внутреннему аудио, если устройство Bluetooth отсутствует.

Изменить: Вот быстрый и грязный скрипт 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-autoconnect.py . Сделайте скрипт исполняемым или запустите его из командной строки (рекомендуется), cd /script/directoryа затем введите:

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

Замените MAC на MAC вашего устройства Bluetooth (например, 00: 0C: 78: 4F: B6: B5) и установите желаемое время ожидания (например, 10) в секундах, когда скрипт ищет устройство. Этот сценарий будет слушать данные MAC каждый тайм - аут секунды для устройства Bluetooth и соединяет его с PulseAudio , если присутствуют. Сценарий будет работать вечно, пока он не будет убит или виртуальный терминал не будет закрыт.

Иногда PulseAudio, кажется, не знает о том, что устройство снова присутствует после его выключения. С некоторой надеждой pulseaudio -kзаставляет это появиться снова.

Не модно, нет графического интерфейса, но, по крайней мере, в моих настройках он работал нормально.

Редактировать для тех, кто заинтересован: выпущен bt-autoconnect с графическим интерфейсом для удобной настройки. Пожалуйста, отправляйте туда сообщения об ошибках или предложения. Спасибо за тестирование.

Takkat
источник
3
Вам не нужно оставлять комментарии, чтобы добавить дополнительную информацию. Вместо этого вы можете просто отредактировать его в свой первоначальный ответ и хранить все в одном месте.
Спасибо, первое решение сработало для меня на Ubuntu 14.04. Хотя обратите внимание, вам все равно нужно запустить sudo service pulseaudio restartили перезагрузить компьютер, чтобы изменения вступили в силу.
Cerin
0

К сожалению, я только сейчас увидел ответ от Такката: «Кажется, это лучший способ, чем мой».

Я думаю, это все еще может быть актуально для Pulseaudio <1.0. Он не использует опрос, но прослушивает события Bluetooth на dbus:

#!/usr/bin/python

# based on monitor-bluetooth
# Changes by Domen Puncer <domen@cba.si>

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()
Domen
источник