Tự động kết nối thiết bị Bluetooth


28

Có cách nào để đặt Bluetooth trong Ubuntu tự động kết nối với các thiết bị mà nó được ghép nối khi được bật không. Hơn nữa, có cách nào để tự động thay đổi đầu ra âm thanh thành tai nghe Bluetooth khi kết nối không?

Câu trả lời:


26

Pulseaudio> = 1.0

Bằng cách chỉnh sửa, /etc/pulse/default.pachúng ta có thể tải mô-đun pulseaudio -công tắc-bật-kết nối để tự động kết nối với bồn âm thanh ngay khi được trình bày cho máy chủ âm thanh pulseaudio. Chúng ta cần chèn dòng sau

load-module module-switch-on-connect

Các phiên bản trước của pulseaudio

Các thiết bị Bluetooth được nhận dạng trong PulseAudio ngay khi có mặt. Tuy nhiên, kết nối cần phải được thực hiện thủ công trong cài đặt âm thanh. Có một GUI cho phép kết nối bằng một cú nhấp chuột với các thiết bị BT ( stream2ip ).

Chỉnh sửa: Từ phiên bản 0.2.5 stream2ip cho phép tự động kết nối với các thiết bị Bluetooth.

Chỉnh sửa: bạn có thể thiết lập thiết bị bluez của mình làm thiết bị mặc định (ví dụ: bằng cách sử dụng pactl hoặc trong cài đặt cấu hình) với dự phòng cho âm thanh bên trong nếu không có thiết bị bluetooth.

Chỉnh sửa: Đây là một kịch bản Python nhanh và bẩn để cung cấp cho bạn ý tưởng về cách thực hiện công việc:

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

Chỉ cần sao chép tập lệnh này và lưu nó dưới dạng bt-autoconnect.py . Làm cho tập lệnh thực thi hoặc chạy nó từ dòng lệnh (được khuyến nghị) bằng cách cd /script/directorysau đó gõ:

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

Thay thế MAC bằng MAC của thiết bị Bluetooth của bạn (ví dụ 00: 0C: 78: 4F: B6: B5) và đặt thời gian chờ mong muốn (ví dụ 10) trong vài giây khi tập lệnh tìm thiết bị. Tập lệnh này sau đó sẽ nghe MAC đã cho mỗi giây chờ cho một thiết bị Bluetooth và kết nối nó với PulseAudio nếu có. Kịch bản sẽ chạy mãi cho đến khi nó bị giết hoặc thiết bị đầu cuối ảo bị đóng.

Đôi khi PulseAudio dường như không nhận thức được thiết bị có mặt một lần nữa sau khi nó bị tắt. Với một số hy vọng pulseaudio -klàm cho nó xuất hiện trở lại.

Không cầu kỳ, không có GUI nhưng ít nhất trong cài đặt của tôi, nó hoạt động tốt.

Chỉnh sửa cho những người quan tâm: bt-autocconnectect với GUI để thiết lập thuận tiện được phát hành. Vui lòng gửi lỗi hoặc đề xuất ở đó. Cảm ơn bạn đã thử nghiệm.


3
Bạn không cần phải đăng bình luận để thêm thông tin. Thay vào đó, bạn có thể chỉnh sửa nó thành câu trả lời ban đầu và có tất cả ở một nơi.

Cảm ơn, giải pháp đầu tiên đã làm việc với tôi trên Ubuntu 14.04. Mặc dù lưu ý, bạn vẫn cần chạy sudo service pulseaudio restarthoặc khởi động lại để thay đổi có hiệu lực.
Cerin

0

Thật không may, bây giờ tôi chỉ thấy câu trả lời từ Takkat, Nó dường như là cách tốt hơn so với của tôi.

Tôi đoán điều này có thể vẫn phù hợp với Pulseaudio <1.0. Nó không sử dụng bỏ phiếu, nhưng lắng nghe các sự kiện Bluetooth trên 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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.