Підключіться до пристрою Bluetooth з командного рядка


22

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

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

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

Чого я хочу уникати: Цей графічний інтерфейс для підключення до відомого і парного пристрою Bluetooth:

Підключення до гарнітури Bluetooth за допомогою піктограми

Що я хочу замість цього: я хотів би змусити Bluetooth зробити саме те, що робить клацання на елемент підключення в графічному інтерфейсі, лише використовуючи командний рядок. Я хочу використовувати командний рядок, щоб я міг зробити єдиний ярлик клавіші для дії, і мені не потрібно переходити по GUI кожен раз, коли я хочу встановити з'єднання з пристроєм.

Питання: Як я можу спробувати підключитися до певного, відомого та парного пристрою Bluetooth з командного рядка?

Подальше запитання: як я можу дізнатись, чи було з'єднання вдалим чи ні?


Який інструмент для лотка це? це значок лотка менеджера Blueman? Чи повинен список програм аплікатора Blueman у списку парних пристроїв Bluetooth?
cipricus

Відповіді:


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, звичайно, доведеться адаптуватися належним чином. У наведеному вище прикладі буде підключено 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 розпізнав її).

Дивіться також цю відповідь для отримання більш детальної інформації.


Я точно знаю адресу, і я замінив xx на неї. Я Sink bluez_sink.xx_xx_xx_xx_xx_xx does not exist.випробував лише великі і малі літери.
Іларі Каясте

1
Так, імпульсний аудіомодуль-bluetooth є isntalle. Ні, нічого не відповідає btабо blueне вказано в pacmd list-sinks. (Він повідомляє лише про одну раковину.)
Іларі Каясте

2
Тож це не визнається. Це необхідна умова, щоб мати можливість з'єднатися командним рядком. Спробуйте перезапустити BT або спробуйте перезапустити pulsaudio. Я ще не дізнався, чому його іноді не виявляють.
Таккат

Так? Тож може бути в стані, що можна підключитися з GUI, але не від CLI?
Іларі Каясте

1
@ Таккат О, так, хороший момент. Моє ліжко! Я більше використовую гарнітуру для відкриття, тому вона не підключиться автоматично. Я редагував питання, щоб це відобразити. Вибачте, що привели вас до неправильного шляху.
Іларі Каясте

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

HTH!


це теж працювало для мене 16.04, дякую! інші, не забудьте передати onваріант сценарію!
MInner

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.2018.


1
Використовували свій сценарій на Ubuntu 18.10. Спасибі!
Бромбомб

1
Супер, це працювало для мене в Linux Mint 19 Cinnamon. Однак я використовував клас пристроїв 2360344замість 0x240404.
dom_watson

1
працює як такий у Mint Xfce 19.2. Я впевнений, що це працює в Xubuntu. - А як щодо сценарію для відключення Bluetooth?
шипр

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

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


Чи можете ви відредагувати свою відповідь, щоб додати, як отримати адресу пристрою, щоб відповідь була більш повною?
користувач3140225

1
@ user3140225 щойно зробив.
Йосип

Я отримую ~$ bluetoothctl Agent registered [UE BOOM 2]#. Потім disconnect "UE BOOM 2" Device UE BOOM 2 not available.
cipricus

@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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.