Автоматичне підключення пристроїв Bluetooth


28

Чи є спосіб встановити Bluetooth в Ubuntu для автоматичного підключення до пристроїв, до яких він підключений при його включенні. Крім того, чи є спосіб автоматично змінити вихідний звук на гарнітуру Bluetooth?

Відповіді:


26

Pulseaudio> = 1,0

Редагуючи, /etc/pulse/default.paми можемо завантажити модуль імпульсного модуля-увімкнути-підключити до автоматичного підключення до звукової раковини, як тільки він буде представлений на сервер імпульсного звуку. Нам потрібно вставити наступний рядок

load-module module-switch-on-connect

Попередні версії pulseaudio

Bluetooth-пристрої розпізнаються в PulseAudio, як тільки вони є. Однак підключення потрібно робити вручну в налаштуваннях звуку. Існує графічний інтерфейс, який дозволяє підключення одним клацанням до пристроїв BT ( stream2ip ).

Редагувати: З версії 0.2.5 stream2ip дозволяє автоматично підключатися до пристроїв Bluetooth.

Редагувати: ви можете налаштувати свій пристрій bluez як пристрій за замовчуванням (наприклад, за допомогою pactl або в налаштуваннях конфігурації) із зворотним доступом до внутрішнього звуку, якщо немає пристрою Bluetooth.

Редагувати: Ось швидкий і брудний сценарій Python, щоб дати вам уявлення про те, як зробити роботу:

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

Просто скопіюйте цей скрипт і збережіть його як bt-autoconnect.py . Зробіть сценарій виконуваним або запустіть його з командного рядка (рекомендується), cd /script/directoryа потім введіть:

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

Замініть MAC на MAC свого пристрою Bluetooth (наприклад, 00: 0C: 78: 4F: B6: B5) і встановіть потрібний час очікування (наприклад, 10) у секундах, коли сценарій шукає пристрій. Цей скрипт буде прослуховувати даний MAC кожен тайм-аут секунди для пристрою Bluetooth і підключатиме його до PulseAudio, якщо він присутній. Сценарій буде працювати вічно, поки його не вбивають або не закриють віртуальний термінал.

Іноді PulseAudio, здається, не знає про присутність пристрою після його вимкнення. З деякою надією pulseaudio -kзмушує її знову з’являтися.

Не фантазії, немає графічного інтерфейсу, але принаймні в моїх налаштуваннях він працював нормально.

Редагування для тих, хто цікавиться: випускається bt-autoconnect з GUI для зручного налаштування. Будь ласка, подайте туди помилки чи пропозиції. Дякую за тестування


3
Вам не потрібно публікувати коментар, щоб додати додаткову інформацію. Ви можете замість цього просто відредагувати його в оригінальній відповіді та мати все в одному місці.

Дякую, перше рішення працювало для мене на Ubuntu 14.04. Хоча зауважте, вам потрібно запустити sudo service pulseaudio restartабо перезавантажити, щоб зміни вступили в силу.
Серін

0

На жаль, я тільки зараз бачив відповідь від Такката, здається, це кращий спосіб, ніж мій.

Я думаю, це все ще може бути актуальним для Pulseaudio <1.0. Він не використовує опитування, але слухає події Bluetooth на 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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.