Pertanyaan Menghubungkan Perangkat Bluetooth secara Otomatis


Apakah ada cara untuk mengatur Bluetooth di Ubuntu untuk autoconnect ke perangkat yang dipasangkan ke ketika dihidupkan. Selanjutnya, adakah cara untuk secara otomatis mengubah output suara ke headset Bluetooth pada koneksi?


24
2017-10-20 04:20


asal




Jawaban:


Pulseaudio> = 1.0

Dengan mengedit /etc/pulse/default.pa kita dapat memuat modul pulseaudio modul-switch-on-connect untuk melakukan koneksi otomatis ke sink audio segera setelah disajikan ke server suara pulseaudio. Kita perlu memasukkan baris berikut

load-module module-switch-on-connect

Versi pulseaudio sebelumnya

Perangkat Bluetooth dikenali di PulseAudio begitu mereka hadir. Namun koneksi perlu dibuat secara manual dalam pengaturan audio. Ada GUI yang memungkinkan koneksi satu-klik ke perangkat BT (stream2ip).

Edit: Dari versi 0.2.5 stream2ip memungkinkan koneksi otomatis ke perangkat Bluetooth.

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

Edit: Berikut ini 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. Buat skrip dapat dieksekusi atau jalankan dari baris perintah (disarankan) oleh cd /script/directory lalu ketikkan:

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

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

Kadang-kadang PulseAudio tampaknya tidak menyadari perangkat yang hadir lagi setelah ditukar. Dengan harapan pulseaudio -k membuatnya muncul kembali.

Tidak suka, tidak ada GUI tetapi setidaknya dalam pengaturan saya itu bekerja o.k ..

Edit bagi yang tertarik: bt-autoconnect dengan GUI untuk pengaturan yang mudah dilepaskan. Silakan file bug atau saran di sana. Terima kasih telah melakukan pengujian.


24
2017-10-20 07:59



Anda tidak perlu mengirim komentar untuk menambahkan informasi tambahan. Anda dapat sebagai gantinya hanya mengeditnya ke jawaban asli Anda dan memiliki semuanya di satu tempat. - Chris Wilson
Terima kasih, solusi pertama bekerja untuk saya di Ubuntu 14.04. Meski perlu diperhatikan, Anda tetap harus berlari sudo service pulseaudio restart atau reboot untuk membuat perubahan berlaku. - Cerin


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

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

0
2018-03-21 08:08