Bluetooth-Geräte automatisch verbinden

28

Gibt es eine Möglichkeit, das Bluetooth in Ubuntu so einzustellen, dass es sich automatisch mit Geräten verbindet, mit denen es gekoppelt ist, wenn es eingeschaltet wird? Gibt es eine Möglichkeit, die Audioausgabe automatisch auf ein Bluetooth-Headset umzustellen, wenn eine Verbindung hergestellt wird?

Casey Keller
quelle

Antworten:

26

Pulseaudio> = 1,0

Durch Bearbeiten der können /etc/pulse/default.pawir das pulseaudio-Modul Modul-Einschalten-Verbinden laden, um es automatisch mit einer Audio-Senke zu verbinden, sobald es dem pulseaudio-Soundserver präsentiert wird. Wir müssen die folgende Zeile einfügen

load-module module-switch-on-connect

Frühere Versionen von pulseaudio

Bluetooth-Geräte werden in PulseAudio erkannt, sobald sie vorhanden sind. Die Verbindung muss jedoch manuell in den Audioeinstellungen hergestellt werden. Es gibt eine GUI, die eine Ein-Klick-Verbindung zu BT-Geräten ( stream2ip ) ermöglicht.

Bearbeiten: Ab Version 0.2.5 ermöglicht stream2ip die automatische Verbindung zu Bluetooth-Geräten.

Bearbeiten: Sie können Ihr bluez-Gerät als Standardgerät einrichten (z. B. mithilfe von pactl oder in den Konfigurationseinstellungen) und dabei auf internes Audio zurückgreifen, wenn kein Bluetooth-Gerät vorhanden ist.

Bearbeiten: Hier ist ein schnelles und unsauberes Python-Skript, das Ihnen eine Vorstellung davon gibt, wie Sie den Job ausführen:

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

Kopieren Sie einfach dieses Skript und speichern Sie es als bt-autoconnect.py . Machen Sie das Skript ausführbar oder führen Sie es über die Befehlszeile aus (empfohlen) cd /script/directoryund geben Sie Folgendes ein:

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

Ersetzen Sie den MAC durch den MAC Ihres Bluetooth-Geräts (z. B. 00: 0C: 78: 4F: B6: B5) und stellen Sie eine gewünschte Zeitüberschreitung (z. B. 10) in Sekunden ein, wenn das Skript nach dem Gerät sucht. Dieses Skript hört dann alle Timeout- Sekunden nach einem Bluetooth-Gerät auf dem angegebenen MAC und verbindet es mit PulseAudio, falls vorhanden. Das Skript wird für immer ausgeführt, bis es beendet wird oder das virtuelle Terminal geschlossen wurde.

Manchmal scheint PulseAudio nicht zu bemerken, dass das Gerät nach dem Ausschalten wieder vorhanden ist. Mit etwas Hoffnung pulseaudio -ktaucht es wieder auf.

Keine Fantasie, keine GUI, aber zumindest in meinen Einstellungen hat es funktioniert.

Edit für Interessenten: bt-autoconnect mit GUI für komfortables Setup ist freigegeben. Bitte reichen Sie dort Fehler oder Vorschläge ein. Danke fürs Testen.

Takkat
quelle
3
Sie müssen keinen Kommentar hinterlassen, um zusätzliche Informationen hinzuzufügen. Sie können es stattdessen einfach in Ihre ursprüngliche Antwort ändern und alles an einem Ort haben.
Danke, die erste Lösung funktionierte für mich unter Ubuntu 14.04. Beachten Sie, dass Sie immer noch ausführen sudo service pulseaudio restartoder neu starten müssen , damit die Änderung wirksam wird.
Cerin
0

Leider habe ich erst jetzt die Antwort von Takkat gesehen, es scheint der bessere Weg zu sein als meiner.

Ich denke, dies könnte für Pulseaudio <1.0 immer noch relevant sein. Es wird kein Polling verwendet, sondern es werden Bluetooth-Ereignisse auf dem dbus abgehört:

#!/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
quelle