Automatyczne łączenie urządzeń Bluetooth

28

Czy istnieje sposób, aby ustawić Bluetooth w Ubuntu tak, aby łączył się automatycznie z urządzeniami, z którymi jest sparowany po włączeniu. Ponadto, czy istnieje sposób na automatyczną zmianę wyjścia dźwięku na zestaw słuchawkowy Bluetooth podczas połączenia?

Casey Keller
źródło

Odpowiedzi:

26

Pulseaudio> = 1,0

Poprzez edycję /etc/pulse/default.pamożemy załadować moduł pulseaudio moduł -włącz-włącz-połącz, aby automatycznie połączyć się z zlewem audio, jak tylko zostanie przedstawiony serwerowi dźwięku pulseaudio. Musimy wstawić następujący wiersz

load-module module-switch-on-connect

Poprzednie wersje pulseaudio

Urządzenia Bluetooth są rozpoznawane w PulseAudio, gdy tylko są obecne. Jednak połączenie należy wykonać ręcznie w ustawieniach audio. Istnieje interfejs GUI, który umożliwia połączenie jednym kliknięciem z urządzeniami BT ( stream2ip ).

Edycja: Od wersji 0.2.5 stream2ip umożliwia automatyczne łączenie z urządzeniami Bluetooth.

Edycja: możesz skonfigurować urządzenie bluez jako urządzenie domyślne (np. Używając pactl lub w ustawieniach konfiguracji) z możliwością powrotu do wewnętrznego dźwięku, jeśli nie ma urządzenia bluetooth.

Edycja: Oto szybki i brudny skrypt Pythona, który daje wyobrażenie o tym, jak wykonać zadanie:

#!/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()

Po prostu skopiuj ten skrypt i zapisz go jako bt-autoconnect.py . Ustaw skrypt jako wykonywalny lub uruchom go z wiersza poleceń (zalecane), cd /script/directorya następnie wpisz:

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

Zamień MAC na MAC urządzenia Bluetooth (np. 00: 0C: 78: 4F: B6: B5) i ustaw żądany limit czasu (np. 10) w sekundach, gdy skrypt wyszuka urządzenie. Ten skrypt będzie następnie nasłuchiwał podanego MAC za każdym razem, gdy limit czasu dla urządzenia Bluetooth, i łączy go z PulseAudio, jeśli jest obecny. Skrypt będzie działał wiecznie, dopóki nie zostanie zabity lub wirtualny terminal zostanie zamknięty.

Czasami PulseAudio wydaje się nie być świadomym obecności urządzenia po jego wyłączeniu. Z pewną nadziejąpulseaudio -k sprawia, że ​​pojawia się ponownie.

Nie jest to wyszukane, nie ma GUI, ale przynajmniej w moich ustawieniach działało dobrze.

Edycja dla zainteresowanych: wydanie bt-autoconnect z GUI dla wygodnej konfiguracji. Proszę zgłaszać tam błędy lub sugestie. Dziękujemy za testowanie.

Takkat
źródło
3
Nie musisz dodawać komentarza, aby dodać dodatkowe informacje. Zamiast tego możesz po prostu edytować go w swojej oryginalnej odpowiedzi i mieć wszystko w jednym miejscu.
Dzięki, pierwsze rozwiązanie działało dla mnie na Ubuntu 14.04. Pamiętaj, że nadal musisz uruchomić sudo service pulseaudio restartlub uruchomić ponownie, aby zmiana zaczęła obowiązywać.
Cerin,
0

Niestety, dopiero teraz widziałem odpowiedź Takkata: Wydaje się, że jest to lepsza droga niż moja.

Wydaje mi się, że może to być nadal istotne dla Pulseaudio <1.0. Nie używa odpytywania, ale nasłuchuje zdarzeń Bluetooth na 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()
domen
źródło