Connessione automatica dei dispositivi Bluetooth


28

C'è un modo per impostare il Bluetooth in Ubuntu per connettersi automaticamente ai dispositivi a cui è associato quando è acceso. Inoltre, c'è un modo per cambiare automaticamente l'uscita audio in un auricolare Bluetooth al momento della connessione?

Risposte:


26

Pulseaudio> = 1.0

Modificando il file /etc/pulse/default.papossiamo caricare il modulo pulseaudio module -switch-on-connect per connettersi automaticamente ad un sink audio non appena viene presentato al server audio pulseaudio. Dobbiamo inserire la seguente riga

load-module module-switch-on-connect

Versioni precedenti di pulseaudio

I dispositivi Bluetooth vengono riconosciuti in PulseAudio non appena sono presenti. Tuttavia, la connessione deve essere effettuata manualmente nelle impostazioni audio. C'è una GUI che consente la connessione con un clic ai dispositivi BT ( stream2ip ).

Modifica: dalla versione 0.2.5 stream2ip consente la connessione automatica ai dispositivi Bluetooth.

Modifica: puoi configurare il tuo dispositivo bluez come dispositivo predefinito (ad esempio utilizzando pactl o nelle impostazioni di configurazione) con il fallback all'audio interno se non è presente alcun dispositivo Bluetooth.

Modifica: ecco uno script Python veloce e sporco per darti un'idea su come fare il lavoro:

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

Basta copiare questo script e salvarlo come bt-autoconnect.py . Rendi eseguibile lo script o eseguilo dalla riga di comando (consigliato) cd /script/directorye quindi digita:

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

Sostituisci MAC con il MAC del tuo dispositivo Bluetooth (es. 00: 0C: 78: 4F: B6: B5) e imposta un timeout desiderato (es. 10) in secondi quando lo script cerca il dispositivo. Questo script ascolterà quindi il MAC specificato ogni secondo di timeout per un dispositivo Bluetooth e lo collegherà a PulseAudio se presente. Lo script verrà eseguito per sempre fino a quando non viene ucciso o il terminale virtuale è stato chiuso.

A volte PulseAudio sembra non essere a conoscenza del fatto che il dispositivo sia nuovamente presente dopo che è stato spento. Con un po 'di speranza lo pulseaudio -kfa riapparire.

Non elegante, nessuna GUI ma almeno nelle mie impostazioni ha funzionato bene.

Modifica per gli interessati: viene rilasciato bt-autoconnect con GUI per una comoda configurazione. Si prega di presentare bug o suggerimenti lì. Grazie per il test.


3
Non è necessario pubblicare un commento per aggiungere ulteriori informazioni. Puoi invece modificarlo nella tua risposta originale e avere tutto in un unico posto.

Grazie, la prima soluzione ha funzionato per me su Ubuntu 14.04. Tuttavia, è necessario eseguire sudo service pulseaudio restarto riavviare per rendere effettive le modifiche.
Cerin,

0

Sfortunatamente, ho visto solo ora la risposta di Takkat, sembra essere il modo migliore del mio.

Immagino che questo potrebbe essere ancora rilevante per Pulseaudio <1.0. Non utilizza il polling, ma ascolta gli eventi Bluetooth su 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()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.