Bluetooth Cihazlarını Otomatik Bağlama


28

Bluetooth'u Ubuntu'da, açıldığında eşlendiği cihazlara otomatik olarak bağlanacak şekilde ayarlamanın bir yolu var mı? Ayrıca, bağlantı sırasında ses çıkışını otomatik olarak Bluetooth kulaklığa değiştirmenin bir yolu var mı?

Yanıtlar:


26

Pulseaudio> = 1.0

Düzenleyerek, pulseaudio ses sunucusuna sunulduktan hemen sonra bir ses lavabosuna otomatik olarak bağlanacak/etc/pulse/default.pa olan pulseaudio modül modülü-on- connect'ı yükleyebiliriz . Aşağıdaki satırı eklememiz gerekiyor

load-module module-switch-on-connect

Pulseaudio'nun önceki sürümleri

Bluetooth cihazları PulseAudio'da bulundukları anda tanınır. Bununla birlikte, ses ayarlarında bağlantının manuel olarak yapılması gerekir. BT cihazlarına tek tıklatma bağlantısı sağlayan bir GUI var ( stream2ip ).

Düzenleme: 0.2.5 sürümünden stream2ip, Bluetooth cihazlarına otomatik olarak bağlanmayı sağlar.

Düzenleme: bluez cihazınızı varsayılan cihaz olarak ayarlayabilirsiniz (örneğin, pactl kullanarak veya config ayarlarında), bluetooth cihazı yoksa, dahili sese dönüş.

Düzenleme: İşte size işin nasıl yapılacağı hakkında fikir vermek için hızlı ve kirli bir Python betiği:

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

Sadece bu betiği kopyalayın ve bt-autoconnect.py olarak kaydedin . Komut dosyasını çalıştırılabilir duruma getirin veya komut satırından çalıştırın (önerilen) cd /script/directoryyazıp şunu yazın:

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

Değiştir MAC (: 0C: 78: 4F: B6: örneğin 00 B5) Bluetooth cihazınızın MAC tarafından ve arzu edilen bir set zaman aşımı saniye içinde (örneğin 10) zaman cihaz için komut görünüyor. Bu komut dosyası daha sonra verilen dinleyecek MAC her zaman aşımı bir Bluetooth cihazı saniye ve eğer varsa PulseAudio'dan onu bağlar. Senaryo öldürülünceye veya sanal terminal kapanana kadar sonsuza dek yayınlanacak.

Bazen PulseAudio, kapatıldıktan sonra cihazın tekrar mevcut olduğunun farkında olmayabilir. Biraz umutla pulseaudio -kyeniden ortaya çıkmasına neden olur.

Fantezi değil, GUI yok ama en azından benim ayarlarıma göre çalıştı.

İlgilenenler için düzenleme : rahat kurulum için GUI ile bt-autoconnect piyasaya sürüldü Lütfen burada hata veya önerilerinizi dosyalayın. Test ettiğin için teşekkürler.


3
Ek bilgi eklemek için yorum göndermenize gerek yok. Bunun yerine sadece orijinal cevabınızı düzenleyebilir ve hepsini tek bir yerde bulabilirsiniz.

Teşekkürler, ilk çözüm benim için Ubuntu 14.04'te çalıştı. Yine de sudo service pulseaudio restart, değişikliğin geçerli olması için hala koşmanız veya yeniden başlatmanız gerekir .
Cerin

0

Maalesef Takkat'ın cevabını henüz şimdi gördüm, Benimkinden daha iyi bir yol gibi görünüyor.

Sanırım bu hala Pulseaudio <1.0 ile alakalı olabilir. Yoklama kullanmaz, ancak dbus'taki Bluetooth olaylarını dinler:

#!/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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.