У Ubuntu есть политика не прослушивать какие-либо сетевые порты (не запуская каких-либо сетевых сервисов) по умолчанию. Это означает отсутствие почтового сервера. Итак, да, вам нужно установить его, если хотите.
Мне не понравился подход к опросу, поэтому я сделал рытье на 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 и 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 и 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 и 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 и 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 и 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 и 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 и 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 и 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
перед подключением .. но что, если вы хотите получать уведомления обо всех событиях подключения?
– 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 также попытается повторно подключить текущий текущий поток воспроизведения к аудиоустройству Bluetooth в случае соединение было прервано.
Вот еще один пример для мониторинга всех устройств 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.
@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' при подключении Bluetooth-устройства. Вам нужно запустить bluetooth-connect && your-script. your-script будет выполняться только при успешном установлении соединения.
Чтобы обнаружить успешно установленное соединение 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 мы можем определить команду оболочки или скрипт для запуска после установления соединения. Также существует возможность автоматического запуска поддерживаемого медиаплеера после установления соединения:
[/g3]
Stream2ip также попытается повторно подключить текущий текущий поток воспроизведения на аудиоустройство Bluetooth, если соединение было прервано.
@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'
при подключении Bluetooth-устройства. Вам нужно запустить bluetooth-connect && your-script
. your-script
будет запускаться только при успешном установлении соединения.
Вот еще один пример для мониторинга всех устройств Bluetooth. Он не должен указывать конкретный MAC-адрес. Этот подход делает настройку xinput стойкой даже при входе / выходе, приостановке / пробуждении и подключении / отключении вашего устройства Bluetooth.
У меня есть компактная клавиатура Bluetooth Thinkpad, и я хочу запускать команду xinput всякий раз клавиатура подключена для регулировки скорости дорожки. Вот шаги.
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. Добавьте свои сценарии к запуску. [/g2] Startup Applications
. В моем случае это следующая команда: xinput set-prop 'ThinkPad Compact Bluetooth Keyboard with TrackPoint' 'Device Accel Constant Deceleration' 0.6
И теперь вы сможете наслаждаться своим устройством Bluetooth с помощью Ubuntu.
Чтобы обнаружить успешно установленное соединение 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 мы можем определить команду оболочки или скрипт для запуска после установления соединения. Также существует возможность автоматического запуска поддерживаемого медиаплеера после установления соединения:
[/g3]
Stream2ip также попытается повторно подключить текущий текущий поток воспроизведения на аудиоустройство Bluetooth, если соединение было прервано.
@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'
при подключении Bluetooth-устройства. Вам нужно запустить bluetooth-connect && your-script
. your-script
будет запускаться только при успешном установлении соединения.
Вот еще один пример для мониторинга всех устройств Bluetooth. Он не должен указывать конкретный MAC-адрес. Этот подход делает настройку xinput стойкой даже при входе / выходе, приостановке / пробуждении и подключении / отключении вашего устройства Bluetooth.
У меня есть компактная клавиатура Bluetooth Thinkpad, и я хочу запускать команду xinput всякий раз клавиатура подключена для регулировки скорости дорожки. Вот шаги.
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. Добавьте свои сценарии к запуску. [/g2] Startup Applications
. В моем случае это следующая команда: xinput set-prop 'ThinkPad Compact Bluetooth Keyboard with TrackPoint' 'Device Accel Constant Deceleration' 0.6
И теперь вы сможете наслаждаться своим устройством Bluetooth с помощью Ubuntu.
Чтобы обнаружить успешно установленное соединение 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 мы можем определить команду оболочки или скрипт для запуска после установления соединения. Также существует возможность автоматического запуска поддерживаемого медиаплеера после установления соединения:
[/g3]
Stream2ip также попытается повторно подключить текущий текущий поток воспроизведения на аудиоустройство Bluetooth, если соединение было прервано.
@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'
при подключении Bluetooth-устройства. Вам нужно запустить bluetooth-connect && your-script
. your-script
будет запускаться только при успешном установлении соединения.
Вот еще один пример для мониторинга всех устройств Bluetooth. Он не должен указывать конкретный MAC-адрес. Этот подход делает настройку xinput стойкой даже при входе / выходе, приостановке / пробуждении и подключении / отключении вашего устройства Bluetooth.
У меня есть компактная клавиатура Bluetooth Thinkpad, и я хочу запускать команду xinput всякий раз клавиатура подключена для регулировки скорости дорожки. Вот шаги.
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. Добавьте свои сценарии к запуску. [/g2] Startup Applications
. В моем случае это следующая команда: xinput set-prop 'ThinkPad Compact Bluetooth Keyboard with TrackPoint' 'Device Accel Constant Deceleration' 0.6
И теперь вы сможете наслаждаться своим устройством Bluetooth с помощью Ubuntu.
Чтобы обнаружить успешно установленное соединение 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 мы можем определить команду оболочки или скрипт для запуска после установления соединения. Также существует возможность автоматического запуска поддерживаемого медиаплеера после установления соединения:
[/g3]
Stream2ip также попытается повторно подключить текущий текущий поток воспроизведения на аудиоустройство Bluetooth, если соединение было прервано.
@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'
при подключении Bluetooth-устройства. Вам нужно запустить bluetooth-connect && your-script
. your-script
будет запускаться только при успешном установлении соединения.
Вот еще один пример для мониторинга всех устройств Bluetooth. Он не должен указывать конкретный MAC-адрес. Этот подход делает настройку xinput стойкой даже при входе / выходе, приостановке / пробуждении и подключении / отключении вашего устройства Bluetooth.
У меня есть компактная клавиатура Bluetooth Thinkpad, и я хочу запускать команду xinput всякий раз клавиатура подключена для регулировки скорости дорожки. Вот шаги.
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. Добавьте свои сценарии к запуску. [/g2] Startup Applications
. В моем случае это следующая команда: xinput set-prop 'ThinkPad Compact Bluetooth Keyboard with TrackPoint' 'Device Accel Constant Deceleration' 0.6
И теперь вы сможете наслаждаться своим устройством Bluetooth с помощью Ubuntu.
Чтобы обнаружить успешно установленное соединение 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 мы можем определить команду оболочки или скрипт для запуска после установления соединения. Также существует возможность автоматического запуска поддерживаемого медиаплеера после установления соединения:
[/g3]
Stream2ip также попытается повторно подключить текущий текущий поток воспроизведения на аудиоустройство Bluetooth, если соединение было прервано.