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

У Ubuntu есть политика не прослушивать какие-либо сетевые порты (не запуская каких-либо сетевых сервисов) по умолчанию. Это означает отсутствие почтового сервера. Итак, да, вам нужно установить его, если хотите.

13
задан 22 May 2012 в 03:17

45 ответов

Мне не понравился подход к опросу, поэтому я сделал рытье на 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()
10
ответ дан 25 May 2018 в 11:17
  • 1
    Конечно, Bluez и PulseAudio работают через опрос DBus. Пока ваша гарнитура является адаптером по умолчанию, в большинстве случаев это будет работать нормально. Убедитесь, что вы также подключили PulseAudio к гарнитуре, если хотите что-то услышать. Спасибо, что поделились своим решением :) – Takkat 22 May 2012 в 11:15
  • 2
    это здорово, если вы знаете DEV_ID перед подключением .. но что, если вы хотите получать уведомления обо всех событиях подключения? – pstanton 29 November 2017 в 08:31

Мне не понравился подход к опросу, поэтому я сделал рытье на 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()
10
ответ дан 25 July 2018 в 18:52

Мне не понравился подход к опросу, поэтому я сделал рытье на 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()
10
ответ дан 31 July 2018 в 10:43

Мне не понравился подход к опросу, поэтому я сделал рытье на 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()
10
ответ дан 2 August 2018 в 01:01

Мне не понравился подход к опросу, поэтому я сделал рытье на 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()
10
ответ дан 4 August 2018 в 16:32

Мне не понравился подход к опросу, поэтому я сделал рытье на 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()
10
ответ дан 6 August 2018 в 01:11

Мне не понравился подход к опросу, поэтому я сделал рытье на 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()
10
ответ дан 7 August 2018 в 18:37

Мне не понравился подход к опросу, поэтому я сделал рытье на 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()
10
ответ дан 10 August 2018 в 07:17

Мне не понравился подход к опросу, поэтому я сделал рытье на 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()
10
ответ дан 15 August 2018 в 19:18
  • 1
    Конечно, Bluez и PulseAudio работают через опрос DBus. Пока ваша гарнитура является адаптером по умолчанию, в большинстве случаев это будет работать нормально. Убедитесь, что вы также подключили PulseAudio к гарнитуре, если хотите что-то услышать. Спасибо, что поделились своим решением :) – Takkat 22 May 2012 в 11:15
  • 2
    это здорово, если вы знаете DEV_ID перед подключением .. но что, если вы хотите получать уведомления обо всех событиях подключения? – pstanton 29 November 2017 в 08:31

Чтобы обнаружить успешно установленное соединение 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 мы можем определить команду оболочки или скрипт для запуска после установления соединения. Также существует возможность автоматического запуска поддерживаемого медиаплеера после установления соединения:

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

4
ответ дан 25 May 2018 в 11:17
  • 1
    Спасибо за Ваш ответ. Вы предлагаете мне опросить с помощью sdptool browse <device-id>, пока я не получу код возврата 0, а затем начну с моего скрипта, верно? Есть ли способ сделать это без опроса? – Erigami 18 May 2012 в 01:23
  • 2
    Sdptool медленный. Я бы пошел на пульс. Вам нужен цикл, потому что мы не знаем, когда ваше устройство есть. – Takkat 18 May 2012 в 01:38

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

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

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

1
ответ дан 25 May 2018 в 11:17

@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
ответ дан 25 May 2018 в 11:17
  • 1
    Если вы хотите улучшить другой ответ, предложите отредактировать его и не создавайте новый ответ. – David Foerster 14 August 2016 в 17:53

Вы пишете «когда ваша гарнитура подключается к вашему компьютеру». Как это делается автоматически? Когда вы должны запускать его вручную, вы также можете сделать его сценарием, а затем запустить свой скрипт после установления соединения. Это то, что я сделал, чтобы установить устройство вывода по умолчанию на мой приемник 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 будет выполняться только при успешном установлении соединения.

0
ответ дан 25 May 2018 в 11:17

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

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

< hr>

Stream2ip

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

enter image description here [/g3]

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

4
ответ дан 25 July 2018 в 18:52

@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
ответ дан 25 July 2018 в 18:52

Вы пишете «когда ваша гарнитура подключается к вашему компьютеру». Как это делается автоматически? Когда вы должны запускать его вручную, вы также можете сделать его сценарием, а затем запустить свой скрипт после установления соединения. Это то, что я сделал, чтобы установить устройство вывода по умолчанию на мой приемник 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 будет запускаться только при успешном установлении соединения.

0
ответ дан 25 July 2018 в 18:52

Вот еще один пример для мониторинга всех устройств 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. Добавьте свои сценарии к запуску. Add startup applications [/g2]
  6. Теперь остается только одна проблема, когда вы входите в систему, сценарии могут не поймать самое первое событие bluetooth. Это связано с тем, что ваше устройство bluetooth может быть подключено до того, как ваш сценарий будет инициализирован в фоновом режиме. Чтобы решить эту проблему, добавьте свою пользовательскую команду непосредственно в Startup Applications. В моем случае это следующая команда:
     xinput set-prop 'ThinkPad Compact Bluetooth Keyboard with TrackPoint' 'Device Accel Constant Deceleration' 0.6
    

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

1
ответ дан 25 July 2018 в 18:52

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

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

< hr>

Stream2ip

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

enter image description here [/g3]

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

4
ответ дан 31 July 2018 в 10:43

@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
ответ дан 31 July 2018 в 10:43

Вы пишете «когда ваша гарнитура подключается к вашему компьютеру». Как это делается автоматически? Когда вы должны запускать его вручную, вы также можете сделать его сценарием, а затем запустить свой скрипт после установления соединения. Это то, что я сделал, чтобы установить устройство вывода по умолчанию на мой приемник 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 будет запускаться только при успешном установлении соединения.

0
ответ дан 31 July 2018 в 10:43

Вот еще один пример для мониторинга всех устройств 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. Добавьте свои сценарии к запуску. Add startup applications [/g2]
  6. Теперь остается только одна проблема, когда вы входите в систему, сценарии могут не поймать самое первое событие bluetooth. Это связано с тем, что ваше устройство bluetooth может быть подключено до того, как ваш сценарий будет инициализирован в фоновом режиме. Чтобы решить эту проблему, добавьте свою пользовательскую команду непосредственно в Startup Applications. В моем случае это следующая команда:
     xinput set-prop 'ThinkPad Compact Bluetooth Keyboard with TrackPoint' 'Device Accel Constant Deceleration' 0.6
    

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

1
ответ дан 31 July 2018 в 10:43

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

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

< hr>

Stream2ip

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

enter image description here [/g3]

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

4
ответ дан 2 August 2018 в 01:01

@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
ответ дан 2 August 2018 в 01:01

Вы пишете «когда ваша гарнитура подключается к вашему компьютеру». Как это делается автоматически? Когда вы должны запускать его вручную, вы также можете сделать его сценарием, а затем запустить свой скрипт после установления соединения. Это то, что я сделал, чтобы установить устройство вывода по умолчанию на мой приемник 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 будет запускаться только при успешном установлении соединения.

0
ответ дан 2 August 2018 в 01:01

Вот еще один пример для мониторинга всех устройств 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. Добавьте свои сценарии к запуску. Add startup applications [/g2]
  6. Теперь остается только одна проблема, когда вы входите в систему, сценарии могут не поймать самое первое событие bluetooth. Это связано с тем, что ваше устройство bluetooth может быть подключено до того, как ваш сценарий будет инициализирован в фоновом режиме. Чтобы решить эту проблему, добавьте свою пользовательскую команду непосредственно в Startup Applications. В моем случае это следующая команда:
     xinput set-prop 'ThinkPad Compact Bluetooth Keyboard with TrackPoint' 'Device Accel Constant Deceleration' 0.6
    

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

1
ответ дан 2 August 2018 в 01:01

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

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

< hr>

Stream2ip

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

enter image description here [/g3]

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

4
ответ дан 4 August 2018 в 16:32

@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
ответ дан 4 August 2018 в 16:32

Вы пишете «когда ваша гарнитура подключается к вашему компьютеру». Как это делается автоматически? Когда вы должны запускать его вручную, вы также можете сделать его сценарием, а затем запустить свой скрипт после установления соединения. Это то, что я сделал, чтобы установить устройство вывода по умолчанию на мой приемник 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 будет запускаться только при успешном установлении соединения.

0
ответ дан 4 August 2018 в 16:32

Вот еще один пример для мониторинга всех устройств 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. Добавьте свои сценарии к запуску. Add startup applications [/g2]
  6. Теперь остается только одна проблема, когда вы входите в систему, сценарии могут не поймать самое первое событие bluetooth. Это связано с тем, что ваше устройство bluetooth может быть подключено до того, как ваш сценарий будет инициализирован в фоновом режиме. Чтобы решить эту проблему, добавьте свою пользовательскую команду непосредственно в Startup Applications. В моем случае это следующая команда:
     xinput set-prop 'ThinkPad Compact Bluetooth Keyboard with TrackPoint' 'Device Accel Constant Deceleration' 0.6
    

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

1
ответ дан 4 August 2018 в 16:32

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

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

< hr>

Stream2ip

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

enter image description here [/g3]

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

4
ответ дан 6 August 2018 в 01:11

Другие вопросы по тегам:

Похожие вопросы: