เชื่อมต่ออุปกรณ์บลูทู ธ โดยอัตโนมัติ


28

มีวิธีการตั้งค่าบลูทู ธ ในอูบุนตูให้เชื่อมต่ออัตโนมัติกับอุปกรณ์ที่จับคู่ไว้เมื่อเปิดใช้งานหรือไม่ นอกจากนี้ยังมีวิธีการเปลี่ยนสัญญาณเสียงเป็นชุดหูฟังบลูทู ธ โดยอัตโนมัติเมื่อทำการเชื่อมต่อหรือไม่?

คำตอบ:


26

Pulseaudio> = 1.0

ด้วยการแก้ไข/etc/pulse/default.paเราสามารถโหลดโมดูล pulseaudio module -switch-on-connectเพื่อเชื่อมต่ออัตโนมัติกับอ่างเสียงทันทีที่นำเสนอไปยังเซิร์ฟเวอร์เสียง pulseaudio เราจำเป็นต้องแทรกบรรทัดต่อไปนี้

load-module module-switch-on-connect

Pulseaudio เวอร์ชั่นก่อนหน้า

อุปกรณ์ Bluetooth ได้รับการยอมรับใน PulseAudio ทันทีที่มีอุปกรณ์ อย่างไรก็ตามการเชื่อมต่อจะต้องทำด้วยตนเองในการตั้งค่าเสียง มี GUI ที่อนุญาตให้เชื่อมต่อกับอุปกรณ์ BT ได้ในคลิกเดียว ( stream2ip )

แก้ไข:จากเวอร์ชัน 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ด้วย MAC ของอุปกรณ์ Bluetooth ของคุณ (เช่น 00: 0C: 78: 4F: B6: B5) และตั้งค่าการหมดเวลาที่ต้องการ(เช่น 10) ในไม่กี่วินาทีเมื่อสคริปต์ค้นหาอุปกรณ์ สคริปต์นี้จะรับฟังMAC ที่ระบุทุกครั้งที่หมดเวลาสำหรับอุปกรณ์บลูทู ธ และเชื่อมต่อกับ PulseAudio หากมี สคริปต์จะทำงานตลอดไปจนกว่าจะถูกฆ่าหรือปิดเทอร์มินัลเสมือน

บางครั้ง PulseAudio ดูเหมือนจะไม่ได้ตระหนักถึงอุปกรณ์ที่มีอยู่อีกครั้งหลังจากที่มันถูกปิด ด้วยความหวังpulseaudio -kทำให้มันปรากฏขึ้นอีกครั้ง

ไม่แฟนซีไม่ใช่ GUI แต่อย่างน้อยในการตั้งค่าของฉันมันก็โอเค

แก้ไขสำหรับผู้ที่สนใจ: bt-autoconnectด้วย GUI สำหรับการตั้งค่าที่สะดวกถูกปล่อยออกมา กรุณายื่นข้อบกพร่องหรือข้อเสนอแนะที่นั่น ขอบคุณสำหรับการทดสอบ


3
คุณไม่จำเป็นต้องโพสต์ความคิดเห็นเพื่อเพิ่มข้อมูลเพิ่มเติม คุณสามารถแก้ไขมันเป็นคำตอบเดิมและนำมารวมไว้ในที่เดียว

ขอบคุณวิธีแก้ปัญหาแรกใช้ได้สำหรับฉันบน Ubuntu 14.04 แม้ว่าโน้ตคุณจะยังคงต้องรันsudo service pulseaudio restartหรือรีบูตเพื่อให้การเปลี่ยนแปลงมีผล
Cerin

0

น่าเสียดายที่ตอนนี้ฉันเห็นคำตอบจาก Takkat ดูเหมือนว่าจะเป็นวิธีที่ดีกว่าของฉัน

ฉันเดาว่านี่อาจยังเกี่ยวข้องกับ 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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.