Bir Bluetooth cihazı bağlandığında komut dosyasını nasıl çalıştırabilirim?


16

Bluetooth kulaklığım bilgisayarıma bağlandığında müzik çalarımı (Clementine) başlatmak istiyorum. Müzikçaları başlatmak için bir komut dosyası çalıştırabilmem için Bluetooth aygıtının bağlandığını nasıl tespit edebilirim?

Yanıtlar:


12

Yoklama yaklaşımını beğenmedim, bu yüzden bluez ve DBus'u kazdım. Aşağıdaki betiği yazdım:

#!/usr/bin/python

import dbus
from dbus.mainloop.glib import DBusGMainLoop
import gobject

import subprocess

# ID of the device we care about
DEV_ID = '00_1D_54_AB_DC_72'

dbus_loop = DBusGMainLoop()
bus = dbus.SystemBus(mainloop=dbus_loop)

# Figure out the path to the headset
man = bus.get_object('org.bluez', '/')
iface = dbus.Interface(man, 'org.bluez.Manager')
adapterPath = iface.DefaultAdapter()

headset = bus.get_object('org.bluez', adapterPath + '/dev_' + DEV_ID)
    # ^^^ I'm not sure if that's kosher. But it works.

def cb(iface=None, mbr=None, path=None):

    if ("org.bluez.Headset" == iface and path.find(DEV_ID) > -1):
        print 'iface: %s' % iface
        print 'mbr: %s' % mbr
        print 'path: %s' % path
        print "\n"
        print "matched"

        if mbr == "Connected":
            subprocess.call(["clementine", "--play"])
            print 'conn'

        elif mbr == "Disconnected":
            subprocess.call(["clementine", "--stop"])
            print 'dconn'

headset.connect_to_signal("Connected", cb, interface_keyword='iface', member_keyword='mbr', path_keyword='path')
headset.connect_to_signal("Disconnected", cb, interface_keyword='iface', member_keyword='mbr', path_keyword='path')

loop = gobject.MainLoop()
loop.run()

Tabii ki Bluez ve PulseAudio yoklama DBus aracılığıyla çalışır. Kulaklığınız varsayılan adaptör olduğu sürece, çoğu durumda iyi çalışır. Bir şey duymak istiyorsanız, PulseAudio'yu kulaklığa da bağladığınızdan emin olun. Çözümünüzü paylaştığınız için teşekkür ederiz :)
Takkat

DEV_IDbağlantıdan önce biliyorsanız bu harika .. ama tüm bağlantı olaylarından haberdar olmak istiyorsanız?
pstanton

4

Başarıyla kurulmuş bir Bluetooth bağlantısını keşfetmek için şunu çalıştırabiliriz:

sdptool browse xx:xx:xx:xx:xx:xx

Bununla SDB bağlantısı verilen MAC adresine bağlantı için test edilecektir. Göz atma zaman aşımı gibi bir hata ile zaman alabilir

Failed to connect to SDP server on 00:0C:78:4F:B6:B5: Host is down

Senaryonuzun tam amacını bilmiyoruz, ancak büyük olasılıkla bir kulaklık bağlandığında Clementine üzerinden ses çalmak istiyorsunuz.

Sonra bir Bluetooth ses alıcısı olup olmadığını görebiliriz.

pacmd list-sinks | grep xx_xx_xx_xx_xx_xx

xx_xx_xx_xx_xx_xxMAC adresi nerede ( :ile değiştirilmesi gerekir _). Çıkış size bir Bluetooth ses alıcısı olup olmadığını veya yoksa hiçbir şey olmadığını söyleyecektir.

Sesi bu lavaboya nasıl geçireceğinizle ilgili bu cevaba bakınız .


Stream2ip

Stream2ip ile bir bağlantı kurulduktan sonra çalıştırılacak bir kabuk komutu veya komut dosyası tanımlayabiliriz. Bağlantı kurulduktan sonra desteklenen bir medya yürütücüyü otomatik olarak başlatma seçeneği de vardır:

resim açıklamasını buraya girin

Stream2ip ayrıca bağlantının kesilmesi durumunda çalışmakta olan çalma akışını Bluetooth ses cihazına yeniden bağlamaya çalışır.


Cevabınız için teşekkürler. sdptool browse <device-id>0 dönüş kodu alıp senaryomu başlatıncaya kadar anket yapmam gerektiğini söylüyorsun , değil mi? Yoklama olmadan yapmanın bir yolu var mı?
Erigami

Sdptool yavaş. Pulseaudio'ya giderdim. Bir döngüye ihtiyacınız var çünkü cihazınızın ne zaman orada olduğunu bilmiyoruz.
Takkat

2

@Erigami Cevabınız çok yardımcı oldu ama işe yaraması için bazı değişiklikler yapardım. Ubuntu 14.04 kullanıyorum.

#!/usr/bin/python

import dbus
from dbus.mainloop.glib import DBusGMainLoop
import gobject

import subprocess

# ID of the device we care about
DEV_ID = 'CC:C3:EA:A5:16:90'.replace(":", "_")

dbus_loop = DBusGMainLoop()
bus = dbus.SystemBus(mainloop=dbus_loop)

# Figure out the path to the headset
man = bus.get_object('org.bluez', '/')
iface = dbus.Interface(man, 'org.bluez.Manager')
adapterPath = iface.DefaultAdapter()

print(adapterPath + '/dev_' + DEV_ID)
headset = bus.get_object('org.bluez', adapterPath + '/dev_' + DEV_ID)
# ^^^ I'm not sure if that's kosher. But it works.

def cb(*args, **kwargs):
    is_connected = args[-1]
    if isinstance(is_connected, dbus.Boolean) and is_connected:
        print("Connected")
    elif isinstance(is_connected, dbus.Boolean) and not is_connected:
        print("Disconnected")

headset.connect_to_signal("PropertyChanged", cb, interface_keyword='iface', member_keyword='mbr', path_keyword='path')

loop = gobject.MainLoop()
loop.run()

Yine de bu işe yaramazsa, sistem dbus'unu kullanın ve izleyin.

dbus-monitor --system

d-feetdaha fazla kullanılabilir. Dbus nesnelerini izlemek için GUI aracıdır.


1
Başka bir yanıtı iyileştirmek istiyorsanız, lütfen cevabınızı düzeltmenizi öneririz ve yeni bir yanıt oluşturmayın.
David Foerster

1

İşte tüm Bluetooth cihazlarını izlemek için başka bir örnek. Belirli bir MAC adresi belirtmesine gerek yoktur. Bu yaklaşım, giriş / çıkış, askıya alma / uyandırma ve bluetooth cihazınızı takarken / çıkarırken bile xinput ayarını kalıcı hale getirir.

Thinkpad kompakt Bluetooth Klavyem var ve izleme noktasının hızını ayarlamak için klavye her bağlandığında xinput komutu çalıştırmak istiyorum. İşte adımlar.

  1. Github bluetooth-ruunner'dan kod indirin . Buraya Raspberry Pi için ilk yazan krediler . Özel komutlarınızı çalıştırmak için kodun aşağıdaki bölümünü değiştirin .

    subprocess.call(['xinput', 'set-prop',
                     'ThinkPad Compact Bluetooth Keyboard with TrackPoint',
                     'Device Accel Constant Deceleration', '0.6'])

    Benim durumumda, bu terminalden çağrıya eşdeğerdir.

    $ xinput set-prop 'ThinkPad Compact Bluetooth Keyboard with TrackPoint' 'Device Accel Constant Deceleration' 0.6
  2. Değişikliği kaydedin. Komut dosyalarınızı şu şekilde çalıştırmayı deneyin:

    $ python bluetooth-runner.py

    Bluethooth cihazınızı bağlayın ve bağlantısını kesin. Ekranda ilgili mesajın yazdırıldığını görmelisiniz.

  3. Şimdi, dosyayı çalıştırılabilir yapıp Gözlerinde farklı dizinin birinde kopyalamak $PATH, demek ~/bin/.

    $ chmod +x bluetooth-runner.py
    $ mkdir ~/bin # if you dont have it yet
    $ cp bluetooth-runner.py ~/bin
  4. Şimdi, komut dosyasını terminalin herhangi bir yerinden çalıştırabildiğinizden emin olun (arama yolunuzda olduğundan emin olun).

  5. Çalıştır Startup Applicationsubuntu menüsünden. Komut dosyalarınızı başlangıca ekleyin.

    Başlangıç ​​uygulamaları ekle

  6. Şimdi, tek bir sorun kaldı, giriş yaptığınızda, komut dosyaları ilk bluetooth etkinliğini yakalamayabilir . Bunun nedeni, komut dosyanız arka planda başlatılmadan önce bluetooth cihazınızın bağlı olabilmesidir.

    Bunu çözmek için özel komutunuzu doğrudan içine ekleyin Startup Applications. Benim durumumda, şu komuttur:

     xinput set-prop 'ThinkPad Compact Bluetooth Keyboard with TrackPoint' 'Device Accel Constant Deceleration' 0.6

Ve şimdi Ubuntu ile Bluetooth cihazınızın keyfini çıkarabileceksiniz.


python betiği bluetooth bağlantılarını izlemedi.
Paulo Pedroso

0

"Kulaklığınız bilgisayarınıza bağlandığında" yazarsınız. Bunu otomatik olarak nasıl yapar? Elle tetiklemeniz gerektiğinde, bunu bir komut dosyası haline getirebilir ve bağlantı kurulduktan sonra komut dosyanızı çalıştırabilirsiniz. Bluetooth alıcıma varsayılan çıkış cihazını ayarlamak için yaptığım şey bu (donanım tuşlarıyla ses seviyesini değiştirebilirim):

bluetooth-connect && pactl set-default-sink bluez_sink.0C_A6_94_9A_37_4D

Nereye bluetooth-connectbenziyor: https://github.com/sblask/dotfiles/blob/c39d37ad67947b358b4a079cb41ae6f9e4a081d8/.bin/bluetooth-connect.symlink Her şeyin eşleştirildiğini ve bağlanmaya hazır olduğunu varsayar. MAC adresini blueman'da veya pacmd list-sinks | grep -e 'name:' -e 'index'bluetooth cihazı bağlandığında çalıştırarak bulabilirsiniz . Kaçmak istersiniz bluetooth-connect && your-script. your-scriptyalnızca bağlantı başarıyla kurulduğunda çalıştırılır.

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.