Menghubungkan Perangkat Bluetooth secara otomatis

28

Apakah ada cara untuk mengatur Bluetooth di Ubuntu untuk autoconnect ke perangkat yang dipasangkan ketika dihidupkan. Selain itu, apakah ada cara untuk secara otomatis mengubah output suara ke headset Bluetooth saat koneksi?

Casey Keller
sumber

Jawaban:

26

Pulseaudio> = 1.0

Dengan mengedit, /etc/pulse/default.pakita dapat memuat modul-modul-switch-on-connect modul pulseaudio ke audio sink segera setelah disajikan ke server suara pulseaudio. Kita perlu memasukkan baris berikut

load-module module-switch-on-connect

Versi sebelumnya dari pulseaudio

Perangkat Bluetooth dikenali di PulseAudio segera setelah hadir. Namun koneksi harus dibuat secara manual dalam pengaturan audio. Ada GUI yang memungkinkan koneksi sekali klik ke perangkat BT ( stream2ip ).

Sunting: Dari versi 0.2.5 stream2ip memungkinkan penyambungan otomatis ke perangkat Bluetooth.

Sunting: Anda dapat mengatur perangkat bluez Anda sebagai perangkat default (misalnya dengan menggunakan pactl atau dalam pengaturan konfigurasi) dengan mundur ke audio internal jika tidak ada perangkat bluetooth.

Sunting: Ini adalah skrip Python cepat dan kotor untuk memberi Anda ide tentang cara melakukan pekerjaan:

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

Cukup salin skrip ini dan simpan sebagai bt-autoconnect.py . Jadikan skrip tersebut dapat dieksekusi atau jalankan dari baris perintah (disarankan) dengan cd /script/directorylalu ketik:

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

Ganti MAC dengan MAC perangkat Bluetooth Anda (mis. 00: 0C: 78: 4F: B6: B5) dan atur batas waktu yang diinginkan (mis. 10) dalam hitungan detik ketika skrip mencari perangkat tersebut. Script ini kemudian akan mendengarkan MAC yang diberikan setiap detik waktu habis untuk perangkat Bluetooth dan menghubungkannya ke PulseAudio jika ada. Script akan berjalan selamanya sampai terbunuh atau terminal virtual ditutup.

Kadang-kadang PulseAudio tampaknya tidak menyadari perangkat yang hadir lagi setelah perangkat mati. Dengan beberapa harapan pulseaudio -kmembuatnya muncul kembali.

Tidak suka, tidak ada GUI tapi setidaknya dalam pengaturan saya itu berfungsi ok

Edit untuk mereka yang tertarik: bt-autoconnect dengan GUI untuk pengaturan yang nyaman dirilis. Silakan ajukan bug atau saran di sana. Terima kasih telah menguji.

Takkat
sumber
3
Anda tidak perlu memposting komentar untuk menambahkan informasi tambahan. Alih-alih, Anda hanya dapat mengeditnya di jawaban asli dan menyimpan semuanya di satu tempat.
Terima kasih, solusi pertama bekerja untuk saya di Ubuntu 14.04. Meskipun perlu diperhatikan, Anda masih perlu menjalankan sudo service pulseaudio restartatau mem-boot ulang untuk melakukan perubahan.
Cerin
0

Sayangnya, saya baru sekarang melihat jawaban dari Takkat, Sepertinya ini cara yang lebih baik daripada saya.

Saya kira ini mungkin masih relevan untuk Pulseaudio <1.0. Itu tidak menggunakan polling, tetapi mendengarkan acara Bluetooth di 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
sumber