블루투스 장치 자동 연결


28

Ubuntu의 블루투스가 켜져있을 때 페어링 된 장치에 자동 연결되도록 설정하는 방법이 있습니까? 또한 연결시 사운드 출력을 Bluetooth 헤드셋으로 자동 변경하는 방법이 있습니까?

답변:


26

펄스 오디오> = 1.0

편집하여 /etc/pulse/default.pa펄스 오디오 모듈 모듈-스위치-온- 커넥트를로드하여 오디오 오디오가 펄스 오디오 사운드 서버에 제공되는 즉시 오디오 싱크에 자동 연결 합니다. 다음 줄을 삽입해야합니다

load-module module-switch-on-connect

pulseaudio의 이전 버전

Bluetooth 장치는 PulseAudio에서 인식되는 즉시 인식됩니다. 그러나 오디오 설정에서 수동으로 연결해야합니다. BT 장치 ( stream2ip )에 한 번의 클릭으로 연결할 수있는 GUI가 있습니다 .

편집 : 버전 0.2.5부터 stream2ip는 블루투스 장치에 자동 연결을 허용합니다.

편집 : 블루투스 장치가없는 경우 내부 오디오로 폴백하여 bluez 장치를 기본 장치 (예 : pactl 또는 구성 설정)로 설정할 수 있습니다.

편집 : 다음은 작업을 수행하는 방법에 대한 아이디어를 제공하는 빠르고 더러운 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을 (: 0C : 78 : 4 층 : B6 : 예 B5 00)가 블루투스 기기의 MAC 의해 소망 설정된 제한 시간을 초 단위로 (예를 들어, 10) 장치의 경우 스크립트 보인다. 그런 다음이 스크립트는 Bluetooth 장치에 대해 지정된 시간 ( 초) 마다 지정된 MAC 을 수신하고 존재하는 경우 PulseAudio에 연결합니다. 스크립트는 종료되거나 가상 터미널이 닫힐 때까지 영원히 실행됩니다.

때때로 PulseAudio는 장치가 꺼진 후 다시 존재하는 장치를 인식하지 못하는 것 같습니다. 희망 pulseaudio -k이 있으면 다시 나타납니다.

화려하지는 않지만 GUI는 없지만 적어도 내 설정에서는 정상적으로 작동했습니다.

관심있는 사용자를위한 편집 : 편리한 설정을위한 GUI를 사용한 bt-autoconnect 가 릴리스되었습니다. 거기에 버그 나 제안을 제출하십시오. 테스트 해 주셔서 감사합니다.


3
추가 정보를 추가하기 위해 의견을 게시 할 필요는 없습니다. 대신 원래 답변으로 편집하여 한 곳에서 모두 사용할 수 있습니다.

감사합니다. 첫 번째 솔루션은 Ubuntu 14.04에서 저에게 효과적이었습니다. 그럼에도 불구 sudo service pulseaudio restart하고 변경 사항을 적용 하려면 여전히 실행 하거나 재부팅해야합니다.
Cerin

0

불행히도, 나는 지금 Takkat의 대답을 보았습니다.

이것이 여전히 Pulseaudio <1.0과 관련이 있다고 생각합니다. 폴링을 사용하지 않지만 dbus에서 Bluetooth 이벤트를 수신합니다.

#!/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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.