Conexión automática de dispositivos Bluetooth

28

¿Hay alguna manera de configurar el Bluetooth en Ubuntu para que se conecte automáticamente a los dispositivos con los que está emparejado cuando está encendido? Además, ¿hay alguna manera de cambiar automáticamente la salida de sonido a un auricular Bluetooth en la conexión?

Casey Keller
fuente

Respuestas:

26

Pulseaudio> = 1.0

Al editar el /etc/pulse/default.papodemos cargar el módulo de módulo de pulseaudio -switch-on-connect para conectarse automáticamente a un receptor de audio tan pronto como se presente al servidor de sonido pulseaudio. Necesitamos insertar la siguiente línea

load-module module-switch-on-connect

Versiones anteriores de pulseaudio

Los dispositivos Bluetooth se reconocen en PulseAudio tan pronto como están presentes. Sin embargo, la conexión debe hacerse manualmente en la configuración de audio. Hay una GUI que permite la conexión de un clic a dispositivos BT ( stream2ip ).

Editar: desde la versión 0.2.5 stream2ip permite la conexión automática a dispositivos Bluetooth.

Editar: puede configurar su dispositivo bluez como dispositivo predeterminado (por ejemplo, usando pactl o en la configuración de configuración) con retroceso al audio interno si no hay un dispositivo bluetooth presente.

Editar: Aquí hay un script Python rápido y sucio para darle una idea de cómo hacer el trabajo:

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

Simplemente copie este script y guárdelo como bt-autoconnect.py . Haga que el script sea ejecutable o ejecútelo desde la línea de comandos (recomendado) cd /script/directoryy luego escriba:

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

Reemplace MAC por el MAC de su dispositivo Bluetooth (por ejemplo, 00: 0C: 78: 4F: B6: B5) y establezca un tiempo de espera deseado (por ejemplo, 10) en segundos cuando el script busca el dispositivo. Este script escuchará el MAC dado cada tiempo de espera de un dispositivo Bluetooth y lo conectará a PulseAudio si está presente. El script se ejecutará para siempre hasta que se elimine o se cierre el terminal virtual.

A veces, PulseAudio parece no darse cuenta de que el dispositivo está presente nuevamente después de haberlo apagado. Con algo de esperanza pulseaudio -khace que reaparezca.

No es lujoso, no tiene interfaz gráfica de usuario, pero al menos en mi configuración funcionó bien.

Edite para los interesados: se lanza bt-autoconnect con GUI para una configuración conveniente. Por favor, presente errores o sugerencias allí. Gracias por probar

Takkat
fuente
3
No necesita publicar un comentario para agregar información adicional. En su lugar, puede editarlo en su respuesta original y tenerlo todo en un solo lugar.
Gracias, la primera solución funcionó para mí en Ubuntu 14.04. Aunque tenga en cuenta que aún necesita ejecutar sudo service pulseaudio restarto reiniciar para que el cambio surta efecto.
Cerin
0

Desafortunadamente, solo he visto la respuesta de Takkat, parece ser la mejor manera que la mía.

Supongo que esto podría ser relevante para Pulseaudio <1.0. No utiliza sondeo, pero escucha eventos de Bluetooth en 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
fuente