Відповіді:
Мені не сподобався підхід до опитування, тому я кілька копав по bluez та DBus. Я закінчив написати наступний сценарій:
#!/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
початку з'єднання .. але що робити, якщо ви хочете отримувати сповіщення про всі події з'єднання?
Для виявлення успішно встановленого з'єднання Bluetooth ми можемо запустити
sdptool browse xx:xx:xx:xx:xx:xx
При цьому з'єднання SDB буде перевірено на з'єднання із заданою MAC-адресою. Можливо, знадобиться чимало часу, поки час перегляду не з’явиться з помилкою
Failed to connect to SDP server on 00:0C:78:4F:B6:B5: Host is down
Ми не знаємо точного призначення вашого сценарію, але, швидше за все, ви хочете відтворювати аудіо через Clementine, коли гарнітура була підключена.
Тоді ми могли просто побачити, чи є звуковий радіо Bluetooth з
pacmd list-sinks | grep xx_xx_xx_xx_xx_xx
Де xx_xx_xx_xx_xx_xx
MAC-адреса (її :
потрібно замінити _
). Тоді на виході буде показано, чи є в наявності аудіомобіль Bluetooth або нічого, якщо ні.
Дивіться цю відповідь про те, як переключити звук на цю раковину.
За допомогою stream2ip ми можемо визначити команду оболонки або сценарій для запуску після встановлення з'єднання. Існує також можливість автоматичного запуску підтримуваного медіаплеєра після встановлення з'єднання:
Stream2ip також намагатиметься знову підключити поточний відтворюваний потік до аудіопристрою Bluetooth у випадку, якщо з'єднання було перервано.
sdptool browse <device-id>
мені провести опитування, поки я не отримаю 0 код повернення, а потім розпочати свій сценарій, правда? Чи є спосіб це зробити без опитування?
@Erigami Ваша відповідь дуже допомогла, але щоб я працював, я повинен зробити деякі зміни. Я використовую ubuntu 14.04.
#!/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()
Але якщо це не працює, використовуйте та контролюйте системний dbus.
dbus-monitor --system
d-feet
можна використовувати далі. Це інструмент GUI для перегляду об’єктів dbus.
Ось ще один приклад моніторингу всіх пристроїв Bluetooth. Для цього не потрібно вказувати конкретну MAC-адресу. Цей підхід робить налаштування xinput стійким навіть під час входу / виходу, призупинення / пробудження та підключення / відключення вашого пристрою Bluetooth.
У мене є компактна клавіатура Bluetooth Thinkpad, і я хочу запускати команду xinput кожного разу, коли клавіатура підключена, щоб регулювати швидкість траєкторії. Ось етапи.
Завантажте код з Bluetooth-ruunner Github . Кредити, надані тут, хто вперше написав це для Raspberry Pi. Змініть наступний розділ коду, щоб запустити ваші користувацькі команди.
subprocess.call(['xinput', 'set-prop',
'ThinkPad Compact Bluetooth Keyboard with TrackPoint',
'Device Accel Constant Deceleration', '0.6'])
У моєму випадку це рівнозначно дзвінку з терміналу.
$ xinput set-prop 'ThinkPad Compact Bluetooth Keyboard with TrackPoint' 'Device Accel Constant Deceleration' 0.6
Збережіть модифікацію. Спробуйте запустити сценарії до
$ python bluetooth-runner.py
Підключіть і від'єднайте пристрій Bluethooth. Ви повинні побачити відповідне повідомлення, надруковане на екрані.
Тепер зробіть свій файл виконуваним і скопіюйте його в один із каталогів $PATH
, скажімо ~/bin/
.
$ chmod +x bluetooth-runner.py
$ mkdir ~/bin # if you dont have it yet
$ cp bluetooth-runner.py ~/bin
Тепер переконайтеся, що ви можете запустити скрипт з будь-якої точки терміналу (переконайтеся, що він знаходиться у вашому шляху пошуку).
Розпалювати Startup Applications
з меню Ubuntu. Додайте свої сценарії до запуску.
Тепер є залишилося тільки одна проблема, в той час , коли ви входите, сценарії не може зловити найперший випадок Bluetooth. Це тому, що ваш Bluetooth-пристрій може бути підключений до ініціалізації сценарію у фоновому режимі.
Щоб вирішити це питання, додайте власну команду безпосередньо в Startup Applications
. У моєму випадку це наступна команда:
xinput set-prop 'ThinkPad Compact Bluetooth Keyboard with TrackPoint' 'Device Accel Constant Deceleration' 0.6
А тепер ви зможете насолоджуватися своїм пристроєм Bluetooth за допомогою Ubuntu.
Ви пишете "коли ваша гарнітура підключається до комп'ютера". Як це зробити, автоматично? Коли вам доведеться запустити його вручну, ви можете також зробити його сценарієм, а потім запустити сценарій після встановлення з'єднання. Це те, що я зробив, щоб встановити пристрій виводу за замовчуванням на мій Bluetooth-приймач (щоб я міг змінити гучність за допомогою апаратних клавіш):
bluetooth-connect && pactl set-default-sink bluez_sink.0C_A6_94_9A_37_4D
Де це bluetooth-connect
виглядає так: https://github.com/sblask/dotfiles/blob/c39d37ad67947b358b4a079cb41ae6f9e4a081d8/.bin/bluetooth-connect.symlink, припускається, що все було парним і готове підключитися. Ви знайдете MAC-адресу в blueman або запустивши, pacmd list-sinks | grep -e 'name:' -e 'index'
коли підключений Bluetooth-пристрій. Ви хочете бігти bluetooth-connect && your-script
. your-script
буде запущено лише після успішного встановлення з'єднання.