Фон: я использую свою гарнитуру Bluetooth в качестве аудиовыхода. Мне удалось получить его работающий длинным списком инструкций относительно документации сообщества BluetoothHeadset, и я автоматизировал процесс активации гарнитуры как аудиовыход по умолчанию в сценарий благодаря другому вопросу.
Однако, так как я использую гарнитуру Bluetooth и с моим телефоном и с компьютером (и гарнитура не поддерживает два входных соединения) для телефона, чтобы не "украсть" соединение, когда гарнитура включена, я вызываю гарнитуру в режим исследования при соединении с компьютером (телефон добирается для соединения с ним автоматически).
Таким образом даже при том, что гарнитура соединяется хорошо и была бы в "нормальном" автоподключении сценария, я должен всегда использовать небольшой значок Bluetooth в области уведомлений для фактического соединения с моим устройством (см. снимок экрана).
Чего я хочу избежать: Этот GUI для соединения с известным и соединенным bluetooth-устройством:
Что я хочу вместо этого: я хотел бы заставить Bluetooth сделать точно, что нажатие на объект подключения в GUI делает, только при помощи командной строки. Я хочу использовать командную строку, таким образом, я могу сделать единственный ярлык нажатия клавиши для действия, и would't должен переместиться по GUI каждый раз, когда я хочу установить соединение с устройством.
Вопрос: Как я могу попытаться соединиться с определенным, известным и соединенным bluetooth-устройством из командной строки?
Дальнейший вопрос: Как я говорю, было ли соединение успешно или нет?
В стандартной установке демон (bluetoothd) работает в фоновом режиме (выполненный из файла /etc/init.d/bluetooth
). Этот демон заботится на распознавании и соединении с известными bluetooth-устройствами и может быть cofigured с конфигурационными файлами в /etc/bluetooth
. Для autoconneting гарнитура следующая строка в audio.conf
должен быть не прокомментирован (удалить #
):
AutoConnect=true
Перезапускать тип демона sudo /etc/init.d/bluetooth restart
.
Комментарий: Используя инструмент командной строки sudo hcitool cc <MAC-Adress>
не привел к стабильному соединению с известным устройством в тестовой среде сюда, когда демон работал.
Для подключения разъединенной, но физически существующей и парной гарнитуры, мы можем использовать D-шину из сценария. Вот пример в Python:
#!/usr/bin/python
# Toggles headset connection
import dbus
from dbus.mainloop.glib import DBusGMainLoop
dbus_loop = DBusGMainLoop()
bus = dbus.SystemBus(mainloop=dbus_loop)
#Get dbus interface for headset
manager = bus.get_object('org.bluez', '/')
iface_m = dbus.Interface(manager, 'org.bluez.Manager')
adapterPath = iface_m.DefaultAdapter()
adapter = bus.get_object('org.bluez', adapterPath)
iface_a = dbus.Interface(adapter, 'org.bluez.Adapter')
devicePath = iface_a.ListDevices()[0] # assuming first device
device = bus.get_object('org.bluez', devicePath)
iface_h = dbus.Interface(device, 'org.bluez.Headset')
#Check state of connection
connected = iface_h.IsConnected()
print 'Toggling connection. Please wait'
# toggle connection
if not connected:
try:
iface_h.Connect()
print 'Connecting: ', devicePath
except:
print 'Device not found'
else:
iface_h.Disconnect()
print 'Disconnecting: ', devicePath
В случае, если у нас есть больше чем одно bluetooth-устройство, мы должны будем адаптироваться devicePath
соответственно, конечно. Пример выше соединит a Headset
. Измените интерфейс на другой протокол для любого другого сервиса (например. AudioSink
).
Если Вы знаете адрес MAC своего bluetooth-устройства, можно соединить его как выходной приемник для pulseaudio:
pacmd set-default-sink bluez_sink.xx_xx_xx_xx_xx_xx
Где xx_xx_xx_xx_xx_xx является MAC-адресом (замена ':' '_', чтобы pulseaudio распознал его).
См. также этот ответ для получения дополнительной информации.
Я использую этот сценарий для подключения моего Аудиоустройства Bluetooth. Если Ваша гарнитура уже соединяется, необходимо смочь подключить гарнитуру таким же образом с помощью org.bluez. Гарнитура. Подключение/Разъединение вместо org.bluez. Audiosink. Подключение/Разъединение.
#!/bin/bash
MAC_ADD="C8:84:47:10:11:CD"
MAC_ADD="dev_${MAC_ADD//:/_}"
BT_ADAPTER=`dbus-send --system --print-reply --dest=org.bluez / \
org.bluez.Manager.DefaultAdapter|awk '/object path/ {print $3}'`
BT_ADAPTER="${BT_ADAPTER//\"/}/$MAC_ADD"
echo "Connecting to $BT_ADAPTER..."
if [ "$1" == "on" ]; then
dbus-send --print-reply --system --dest=org.bluez $BT_ADAPTER org.bluez.AudioSink.Connect
elif [ "$1" == "off" ]; then
dbus-send --print-reply --system --dest=org.bluez $BT_ADAPTER org.bluez.AudioSink.Disconnect
fi
HTH!
Я использую i3 в качестве менеджера окон, таким образом, я не имею значок панели задач Bluetooth в наличии. По некоторым причинам кнопка проверки в настройках единицы не чувствительна и таким образом, мне нужен способ делать это время от времени, когда мои наушники не соединяются.
Это кажется этим bluez
изменил их dbus API. Использование ответа org.bluez.Manager
больше, кажется, не работает. Вместо этого рекомендуется использовать ObjectManager
.
Вот обновленный сценарий Python, который подключит первую не связанную гарнитуру Bluetooth, которую он находит (по-видимому, список включает все спаренные устройства?):
#!/usr/bin/env python
# Toggles headset connection
from __future__ import print_function
from __future__ import unicode_literals
import dbus
from dbus.mainloop.glib import DBusGMainLoop
def find_headset(bus):
manager = dbus.Interface(bus.get_object("org.bluez", "/"),
"org.freedesktop.DBus.ObjectManager")
objects = manager.GetManagedObjects()
for path, ifaces in objects.items():
if ("org.bluez.Device1" in ifaces and
"org.freedesktop.DBus.Properties" in ifaces):
iprops = dbus.Interface(
bus.get_object("org.bluez", path),
"org.freedesktop.DBus.Properties")
props = iprops.GetAll("org.bluez.Device1")
# Looking for a headset. Could also match on other properties like
# "Name". See bluez docs for whats available.
if props.get("Class") == 0x240404:
if props.get("Connected"):
print("Found headset {} ({}) but it is already connected"
.format(props.get("Name"), props.get("Address")))
continue
return path
dbus_loop = DBusGMainLoop()
bus = dbus.SystemBus(mainloop=dbus_loop)
hpath = find_headset(bus)
if hpath:
adapter = dbus.Interface(
bus.get_object("org.bluez", hpath), "org.bluez.Device1")
adapter.Connect()
этот пример, как другой пример на этом потоке, использует dbus
пакет Python. На ubuntu 16.04 I установил это через apt-get install python-dbus
.
Если Вы хотите соответствовать другим критериям, этот документ, кажется, показывает список свойств, которые могут быть запрошены по dbus.
Мне сохранили этот сценарий в ~/.local/bin/bt-connect-headset
который идет мой PATH
таким образом, я могу выполнить его от i3 средства запуска. Сделайте это исполняемым файлом (chmod +x bt-connect-headset
) если Вы планируете использовать его в качестве команды.
Этот сценарий был только протестирован на актуальной человечности 16.04 с 28.09.2018.
После попытки части вышеупомянутого (сценарии не работали на меня) я нашел следующее решение.
Сначала узнайте Адрес MAC устройства, с которым Вы хотите соединиться
bluetoothctl
это введет оболочку и перечислит все доступные устройства с адресом. ("выход", чтобы выйти из оболочки и возвратиться к подсказке)
Затем соединитесь с bluetooth-устройством XX:XX:XX:XX:XX:XX:
echo -e 'connect XX:XX:XX:XX:XX:XX' | bluetoothctl
разъединяться
echo -e 'disconnect XX:XX:XX:XX:XX:XX' | bluetoothctl
поиск в течение этого долгого времени - ничто, казалось, не работало, чувствовавшее настолько уменьшенный, когда я узнал. Другие мысли могли бы хотеть знать об этом, также.:))