Соединитесь с bluetooth-устройством из командной строки

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

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

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

Чего я хочу избежать: Этот GUI для соединения с известным и соединенным bluetooth-устройством:

Connecting to Bluetooth headset using icon

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

Вопрос: Как я могу попытаться соединиться с определенным, известным и соединенным bluetooth-устройством из командной строки?

Дальнейший вопрос: Как я говорю, было ли соединение успешно или нет?

22
задан 13 April 2017 в 05:23

4 ответа

Демон 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> не привел к стабильному соединению с известным устройством в тестовой среде сюда, когда демон работал.


DBus

Для подключения разъединенной, но физически существующей и парной гарнитуры, мы можем использовать 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).


Pulseaudio

Если Вы знаете адрес MAC своего bluetooth-устройства, можно соединить его как выходной приемник для pulseaudio:

pacmd set-default-sink bluez_sink.xx_xx_xx_xx_xx_xx

Где xx_xx_xx_xx_xx_xx является MAC-адресом (замена ':' '_', чтобы pulseaudio распознал его).

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

10
ответ дан 23 November 2019 в 01:37

Я использую этот сценарий для подключения моего Аудиоустройства 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!

6
ответ дан 23 November 2019 в 01:37

Я использую i3 в качестве менеджера окон, таким образом, я не имею значок панели задач Bluetooth в наличии. По некоторым причинам кнопка проверки в настройках единицы не чувствительна и таким образом, мне нужен способ делать это время от времени, когда мои наушники не соединяются.

enter image description here

Это кажется этим 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.

2
ответ дан 23 November 2019 в 01:37

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

Сначала узнайте Адрес 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

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

1
ответ дан 23 November 2019 в 01:37

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

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