Подключиться к устройству Bluetooth из командной строки

22

Фон: я использую мою гарнитуру Bluetooth в качестве аудио выхода. Мне удалось заставить его работать с помощью длинного списка инструкций в документации сообщества BluetoothHeadset , и я автоматизировал процесс активации гарнитуры в качестве аудиовыхода по умолчанию в сценарий, благодаря другому вопросу .

Однако, поскольку я использую гарнитуру Bluetooth с телефоном и компьютером (а гарнитура не поддерживает два входных соединения), чтобы телефон не «крал» соединение при включенной трубке, я заставляю гарнитуру режим обнаружения при подключении к компьютеру (телефон подключается к нему автоматически).

Поэтому, несмотря на то, что гарнитура подключена нормально и при автоматическом подключении по «обычному» сценарию, мне всегда нужно использовать маленький значок Bluetooth в области уведомлений, чтобы фактически подключиться к моему устройству (см. Скриншот).

Чего я хочу избежать: этот графический интерфейс для подключения к известному и сопряженному устройству Bluetooth:

Подключение к гарнитуре Bluetooth с помощью значка

Что я хочу вместо этого: я бы хотел, чтобы блютуз делал именно то, что щелкает элемент подключения в графическом интерфейсе, только с помощью командной строки. Я хочу использовать командную строку, чтобы сделать одно нажатие клавиши для действия, и не нужно было бы перемещаться по GUI каждый раз, когда я хочу установить соединение с устройством.

Вопрос: как я могу попытаться подключиться к определенному, известному и сопряженному устройству Bluetooth из командной строки?

Следующий вопрос: как узнать, было ли соединение успешным или нет?

Илари Каясте
источник
Что это за инструмент для подносов? это значок в трее Blueman Manager? Должен ли Blueman Manager в трее апплетов выводить список сопряженных устройств Bluetooth?
Сиприкус

Ответы:

10

Bluetooth-демон

При установке по умолчанию демон ( bluetoothd ) запускается в фоновом режиме (запускается из файла /etc/init.d/bluetooth). Этот демон заботится о распознавании и подключении к известным устройствам Bluetooth и может быть сконфигурирован с помощью файлов конфигурации в /etc/bluetooth. Для автоматического подключения гарнитуры следующая строка audio.confдолжна быть закомментирована (удалить #):

AutoConnect=true

Чтобы перезапустить тип демона sudo /etc/init.d/bluetooth restart.

Примечание. Использование инструмента командной строки sudo hcitool cc <MAC-Adress>не привело к стабильному подключению к известному устройству в тестовой среде здесь, когда демон работал.


DBus

Чтобы подключить отключенную, но физически присутствующую и сопряженную гарнитуру, мы можем использовать D-Bus из сценария. Вот пример в 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, конечно, придется соответствующим образом адаптировать . Пример выше соединит Headset. Измените интерфейс на другой протокол для любой другой службы (например AudioSink).


Pulseaudio

Если вам известен MAC-адрес вашего устройства Bluetooth, вы можете подключить его в качестве выходного приемника для pulseaudio следующим образом:

pacmd set-default-sink bluez_sink.xx_xx_xx_xx_xx_xx

Где xx_xx_xx_xx_xx_xx - это MAC-адрес (замените «:» на «_», чтобы pulseaudio мог его распознать).

Смотрите также этот ответ для более подробной информации.

Takkat
источник
Я знаю адрес, и я заменил хх на него. Я Sink bluez_sink.xx_xx_xx_xx_xx_xx does not exist.пробую только в верхнем и нижнем регистре.
Илари Каясте
1
Да, pulseaudio-module-bluetooth - это isntalle. Нет, ничего не соответствует btили blueуказано в pacmd list-sinks. (Сообщается только о 1
потоке
2
Так что это не признается. Это обязательное условие для возможности подключения с помощью командной строки. Попробуйте перезапустить BT или попробуйте перезапустить pulsaudio. Я еще не выяснил, почему это иногда не обнаруживается.
Таккат
А? Таким образом, это может быть в состоянии, что можно подключиться из GUI, но не из CLI?
Илари Каясте
1
@ Таккат О, да, хорошая мысль. Виноват! Я больше использую гарнитуру в Discovery, поэтому она не будет автоматически подключаться. Я отредактировал вопрос, чтобы отразить это. Извините, что вывели вас на неверный путь.
Илари Каясте
6

Я использую этот скрипт для подключения моего аудиоустройства Bluetooth. Если ваша гарнитура уже сопряжена, вы должны иметь возможность подключить гарнитуру таким же образом, используя org.bluez.Headset.Connect / Disconnect вместо org.bluez.Audiosink.Connect / Disconnect .

#!/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

НТН!

doublerebel
источник
это сработало и для меня 16.04, спасибо! другие, не забудьте передать onопцию сценарию!
Мин
2

Я использую 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 я установил это через apt-get install python-dbus.

Если вы хотите соответствовать другим критериям, этот документ отображает список свойств, которые могут быть запрошены через dbus.

У меня сохранен этот скрипт, ~/.local/bin/bt-connect-headsetкоторый находится на моем, PATHчтобы я мог выполнить его из программы запуска i3. Сделайте его исполняемым ( chmod +x bt-connect-headset), если вы планируете использовать его в качестве команды.

Этот сценарий был протестирован только на последней версии Ubuntu 16.04 от 28.09.2008.

cheshirekow
источник
1
Использовал ваш скрипт на Ubuntu 18.10. Благодарность!
Бромбомб
1
Супер, у меня это работало в Linux Mint 19 Cinnamon. Тем не менее, я использовал класс устройства 2360344вместо 0x240404.
dom_watson
1
работает как таковой в Mint Xfce 19.2. Я уверен, что это работает в Xubuntu. - А как насчет скрипта для отключения блютуса?
Сиприкус
1
@cipricus Это правильно и уже упоминается в ответе. В ответе есть ссылка о том, как соответствовать другим критериям, если вам нужно что-то более продвинутое (например, сопоставление устройства с определенным именем). Эта ссылка также включает в себя список методов, доступных в этом интерфейсе. Чтобы отключиться, я думаю, использовать Disconnect()метод. Я не пробовал, но это, вероятно, безопасная ставка;).
Чеширеков
Я был неправ. Я думал, что это никогда не выходит за рамки первого в списке сопряженных устройств, но это так. Возможно, я также пропустил тот факт, что вы говорите first unconnected bluetooth headset : всегда ли он будет использовать гарнитуру (если она включена) перед другим устройством, таким как колонки Bluetooth (независимо от положения в списке)? Вот что происходит в моем случае. - Кроме того, чтобы отключиться, я не могу сделать это, просто изменив последнюю строку на adapter.Disconnect().)
cipricus
1

Попробовав некоторые из вышеперечисленных (сценарии не работают для меня), я нашел следующее решение.

Сначала выясните 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

искал это довольно долго - казалось, ничего не получалось, я почувствовал такое облегчение, когда узнал. Думаю, что другие тоже захотят узнать об этом. :))

Джозеф
источник
Не могли бы вы отредактировать свой ответ, чтобы добавить, как получить адрес устройства, чтобы ответ был более полным?
user3140225
1
@ user3140225 только что сделал.
Иосиф
Я получаю ~$ bluetoothctl Agent registered [UE BOOM 2]#. Тогда disconnect "UE BOOM 2" Device UE BOOM 2 not available.
Сиприкус
@cipricus @ user3140225 Не могли бы вы опубликовать вывод bluetoothctl? Вам необходимо ввести команды с MAC-адресом устройства - комбинацией значений HEX в формате XX: XX: XX: XX: XX: XX, где X - это буква или цифра.
Иосиф
Я могу видеть MAC, как сказано здесь . Затем, пытаясь echo -e 'connect CC:AF:78:AF:59:03' | bluetoothctlполучить:Agent registered [bluetooth]# connect CC:AF:78:AF:59:03 Device CC:AF:78:AF:59:03 not available
Cipricus