Как запустить скрипт при подключении устройства Bluetooth?

Я хотел бы начать свой музыкальный плеер (Clementine), когда моя Bluetooth-гарнитура подключается к моему компьютеру. Как определить подключение Bluetooth-устройства, чтобы запустить скрипт для запуска проигрывателя?

Мне не понравился подход к опросу, поэтому я немного поработал на 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() 

Чтобы обнаружить успешно установленное соединение 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-приемник Bluetooth с

 pacmd list-sinks | grep xx_xx_xx_xx_xx_xx 

Где xx_xx_xx_xx_xx_xx – это MAC-адрес (необходимо заменить на _ ). Затем на выходе вы узнаете, есть ли доступ к аудиовходу Bluetooth или нет, если нет.

См. Этот ответ о том, как переключать звук на этот приемник.


Stream2ip

С stream2ip мы можем определить команду оболочки или скрипт для запуска после установления соединения. Также существует возможность автоматического запуска поддерживаемого медиаплеера после установления соединения:

введите описание изображения здесь

Stream2ip также попытается повторно подключить текущий текущий поток воспроизведения к аудиоустройству Bluetooth в случае, если соединение было прервано.

Вот еще один пример для мониторинга всех устройств Bluetooth. Он не должен указывать конкретный MAC-адрес. Такой подход делает настройку xinput стойкой даже при входе / выходе, приостановке / пробуждении и подключении / отключении вашего устройства Bluetooth.

У меня есть компактная Bluetooth-клавиатура Thinkpad, и я хочу запустить команду xinput всякий раз, когда клавиатура подключена для настройки скорости отслеживания. Вот шаги.

  1. Загрузите код от Github bluetooth-ruunner . Кредиты, предоставленные здесь, кто первым написал это для Малины Пи. Измените следующий раздел кода, чтобы запустить свои собственные comamnds.

     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 
  2. Сохраните изменения. Попробуйте запустить скрипты

     $ python bluetooth-runner.py 

    Подключите и отключите устройство Bluethooth. Вы должны увидеть соответствующее сообщение, напечатанное на экране.

  3. Теперь сделайте свой файл исполняемым и скопируйте его в один из каталогов в вашей $PATH , скажем ~/bin/ .

     $ chmod +x bluetooth-runner.py $ mkdir ~/bin # if you dont have it yet $ cp bluetooth-runner.py ~/bin 
  4. Теперь убедитесь, что вы можете запустить скрипт из любого места терминала (убедитесь, что он находится в вашем пути поиска).

  5. Startup Applications из меню ubuntu. Добавьте свои сценарии к запуску.

    Добавить приложения для запуска

  6. Теперь остается только одна проблема, когда вы входите в систему, сценарии могут не поймать самое первое событие bluetooth. Это связано с тем, что ваше устройство bluetooth может быть подключено до того, как ваш сценарий будет инициализирован в фоновом режиме.

    Чтобы решить эту проблему, добавьте свою собственную команду непосредственно в Startup Applications . В моем случае это следующая команда:

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

И теперь вы сможете наслаждаться своим устройством Bluetooth с помощью Ubuntu.

@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 (так что я могу изменить громкость с помощью аппаратных клавиш):

 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' pacmd list-sinks | grep -e 'name:' -e 'index' когда подключено Bluetooth-устройство. Вам нужно запустить bluetooth-connect && your-script . your-script будет запущен только при успешном установлении соединения.