Yanıtlar:
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()
DEV_ID
bağlantıdan önce biliyorsanız bu harika .. ama tüm bağlantı olaylarından haberdar olmak istiyorsanız?
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_xx
MAC 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 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:
Stream2ip ayrıca bağlantının kesilmesi durumunda çalışmakta olan çalma akışını Bluetooth ses cihazına yeniden bağlamaya çalışır.
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 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-feet
daha fazla kullanılabilir. Dbus nesnelerini izlemek için GUI aracıdır.
İş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.
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
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.
Ş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
Şimdi, komut dosyasını terminalin herhangi bir yerinden çalıştırabildiğinizden emin olun (arama yolunuzda olduğundan emin olun).
Çalıştır Startup Applications
ubuntu menüsünden. Komut dosyalarınızı başlangıca ekleyin.
Ş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.
"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-connect
benziyor: 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-script
yalnızca bağlantı başarıyla kurulduğunda çalıştırılır.