Як запустити сценарій, коли підключиться пристрій Bluetooth?


16

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

Відповіді:


12

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

Звичайно, Bluez і PulseAudio працюють через опитування DBus. Поки ваша гарнітура є адаптером за замовчуванням, вона працюватиме нормально у більшості випадків. Переконайтесь, що ви також підключите PulseAudio до гарнітури, якщо хочете щось почути. Дякуємо, що поділилися своїм рішенням :)
Таккат

це чудово, якщо ви знаєте до DEV_IDпочатку з'єднання .. але що робити, якщо ви хочете отримувати сповіщення про всі події з'єднання?
pstanton

4

Для виявлення успішно встановленого з'єднання 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_xxMAC-адреса (її :потрібно замінити _). Тоді на виході буде показано, чи є в наявності аудіомобіль Bluetooth або нічого, якщо ні.

Дивіться цю відповідь про те, як переключити звук на цю раковину.


Stream2ip

За допомогою stream2ip ми можемо визначити команду оболонки або сценарій для запуску після встановлення з'єднання. Існує також можливість автоматичного запуску підтримуваного медіаплеєра після встановлення з'єднання:

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

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


Дякую за вашу відповідь. Ви пропонуєте sdptool browse <device-id>мені провести опитування, поки я не отримаю 0 код повернення, а потім розпочати свій сценарій, правда? Чи є спосіб це зробити без опитування?
Ерігамі

Sdptool повільний. Я б пішов на pulseaudio. Вам потрібна петля, оскільки ми не знаємо, коли ваш пристрій є.
Таккат

2

@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.


1
Якщо ви хочете покращити іншу відповідь, запропонуйте її змінити, а не створювати нову відповідь.
Девід Фоерстер

1

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

У мене є компактна клавіатура Bluetooth Thinkpad, і я хочу запускати команду xinput кожного разу, коли клавіатура підключена, щоб регулювати швидкість траєкторії. Ось етапи.

  1. Завантажте код з 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
  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.


сценарій python не контролював з'єднання Bluetooth.
Пауло Педросо

0

Ви пишете "коли ваша гарнітура підключається до комп'ютера". Як це зробити, автоматично? Коли вам доведеться запустити його вручну, ви можете також зробити його сценарієм, а потім запустити сценарій після встановлення з'єднання. Це те, що я зробив, щоб встановити пристрій виводу за замовчуванням на мій 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буде запущено лише після успішного встановлення з'єднання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.