Connessione al dispositivo Bluetooth dalla riga di comando


22

Sfondo: sto usando le mie cuffie bluetooth come uscita audio. Sono riuscito a farlo funzionare con il lungo elenco di istruzioni sulla documentazione della comunità BluetoothHeadset e ho automatizzato il processo di attivazione dell'auricolare come uscita audio predefinita in uno script, grazie a un'altra domanda .

Tuttavia, poiché utilizzo l'auricolare bluetooth sia con il mio telefono che con il computer (e l'auricolare non supporta due connessioni di ingresso) in modo che il telefono non "rubi" la connessione quando il portatile è acceso, forzo l'auricolare in un modalità di rilevamento durante la connessione al computer (il telefono si connette automaticamente ad esso).

Quindi, anche se l'auricolare è accoppiato correttamente e si connetterà automaticamente in uno scenario "normale", devo sempre utilizzare la piccola icona bluetooth nell'area di notifica per connettermi effettivamente al mio dispositivo (vedi screenshot).

Cosa voglio evitare: questa GUI per la connessione a un dispositivo Bluetooth noto e associato :

Connessione alle cuffie Bluetooth tramite icona

Quello che voglio invece: vorrei che il bluetooth facesse esattamente quello che fa il clic sull'elemento di connessione nella GUI, solo usando la riga di comando. Voglio usare la riga di comando in modo da poter creare una scorciatoia da tastiera per l'azione, e non avrei bisogno di navigare nella GUI ogni volta che voglio stabilire una connessione al dispositivo.

La domanda: come posso tentare di connettermi a un dispositivo bluetooth specifico, noto e associato dalla riga di comando?

Ulteriore domanda: come faccio a sapere se la connessione è andata a buon fine o no?


Che strumento vassoio è quello? è l'icona della barra delle applicazioni di Blueman Manager? L'applet Blueman Manager dovrebbe elencare i dispositivi bluetooth associati?
cipricus

Risposte:


10

Demone Bluetooth

Nell'installazione predefinita un daemon ( bluetoothd ) viene eseguito in background (eseguito dal file /etc/init.d/bluetooth). Questo demone si occupa di riconoscere e connettersi a dispositivi bluetooth noti e può essere configurato con file di configurazione in /etc/bluetooth. Per il collegamento automatico di un auricolare, la seguente riga in audio.confdeve essere decommentata (rimuovi #):

AutoConnect=true

Per riavviare il tipo di demone sudo /etc/init.d/bluetooth restart.

Nota: l' uso dello strumento da riga di comando sudo hcitool cc <MAC-Adress>non ha portato a una connessione stabile a un dispositivo noto nell'ambiente di test qui quando il daemon era in esecuzione.


DBus

Per connettere un auricolare disconnesso ma fisicamente presente e associato possiamo usare D-Bus da uno script. Ecco un esempio in 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

Nel caso in cui abbiamo più di un dispositivo Bluetooth, dovremo adattare in modo devicePathappropriato, ovviamente. L'esempio sopra collegherà a Headset. Cambia l'interfaccia con un protocollo diverso per qualsiasi altro servizio (es AudioSink.).


pulseaudio

Se conosci l'indirizzo MAC del tuo dispositivo Bluetooth puoi collegarlo come sink di uscita per pulseaudio:

pacmd set-default-sink bluez_sink.xx_xx_xx_xx_xx_xx

Dove xx_xx_xx_xx_xx_xx è l'indirizzo MAC (sostituire ":" con "_" affinché pulseaudio lo riconosca).

Vedi anche questa risposta per maggiori dettagli.


Conosco l'indirizzo e ho sostituito xx con esso. Mi viene solo Sink bluez_sink.xx_xx_xx_xx_xx_xx does not exist.provato sia in maiuscolo che in minuscolo.
Ilari Kajaste il

1
Sì, pulseaudio-module-bluetooth isntalle. No, niente corrispondente bto blueelencato in pacmd list-sinks. (Segnala solo 1 lavandino disponibile.)
Ilari Kajaste il

2
Quindi non è riconosciuto. Questo è un prerequisito per poter connettersi dalla riga di comando. Prova a riavviare BT o prova a riavviare pulsaudio. Non ho ancora scoperto perché a volte non viene rilevato.
Takkat,

Eh? Quindi può essere in uno stato che è possibile connettersi dalla GUI, ma non dalla CLI?
Ilari Kajaste il

1
@Takkat Oh, sì, buon punto. Colpa mia! Sto usando di più le cuffie in scoperta, quindi non si collegherà automaticamente. Ho modificato la domanda per riflettere questo. Ci scusiamo per averti condotto su un percorso sbagliato.
Ilari Kajaste,

6

Uso questo script per collegare il mio dispositivo audio Bluetooth. Se l'auricolare è già associato, dovresti essere in grado di connetterlo allo stesso modo usando org.bluez.Headset.Connect / Disconnect al posto di 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!


questo ha funzionato anche per me 16.04, grazie! altri, non dimenticare di passare l' onopzione allo script!
Martedì

2

Uso i3 come gestore delle finestre, quindi non ho l'icona bluetooth nella barra delle applicazioni disponibile. Per qualche ragione il pulsante di controllo nelle impostazioni di unità non è sensibile e quindi ho bisogno di un modo per farlo di tanto in tanto quando le mie cuffie non si collegano.

inserisci qui la descrizione dell'immagine

Sembra che bluezabbia cambiato la loro API dbus . La risposta che utilizza org.bluez.Managernon sembra più funzionare. Invece, si consiglia di utilizzare ObjectManager.

Ecco uno script Python aggiornato che collegherà la prima cuffia bluetooth non connessa che trova (presumibilmente l'elenco comprende tutti i dispositivi associati?):

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

questo esempio, come l'altro esempio su questo thread, usa il dbuspacchetto python. Su Ubuntu 16.04 ho installato questo tramite apt-get install python-dbus.

Se si desidera soddisfare altri criteri, questo documento sembra mostrare un elenco di proprietà che possono essere interrogate su dbus.

Ho salvato questo script nel ~/.local/bin/bt-connect-headsetmio, PATHcosì posso eseguirlo dal launcher i3. Renderlo eseguibile ( chmod +x bt-connect-headset) se si prevede di usarlo come comando.

Questo script è stato testato solo su Ubuntu 16.04 aggiornato al 28/09/2018.


1
Hai usato il tuo script su Ubuntu 18.10. Grazie!
Brombomb,

1
Super, questo ha funzionato per me in Linux Mint 19 Cinnamon. Tuttavia, ho usato una classe di dispositivi 2360344anziché 0x240404.
dom_watson,

1
funziona come tale in Mint Xfce 19.2. Sono sicuro che funziona in Xubuntu. - Che dire di uno script per disconnettere il bluetooth?
cipricus

1
@cipricus È corretto ed è già menzionato nella risposta. C'è un link nella risposta su come abbinare altri criteri se hai bisogno di qualcosa di più avanzato (come abbinare un dispositivo con un nome particolare). Tale collegamento include anche un elenco di metodi disponibili su questa interfaccia. Per disconnettermi, suppongo sia usare il Disconnect()metodo. Non l'ho provato, ma probabilmente è una scommessa sicura;).
Cheshirekow,

Mi sbagliavo. Ho pensato che non andasse mai oltre il primo nell'elenco dei dispositivi associati, ma lo fa. Potrei anche aver perso il fatto che dici first unconnected bluetooth headset : userà sempre l' auricolare (se alimentato) prima di altri dispositivi come gli altoparlanti bluetooth (indipendentemente dalla posizione nell'elenco)? Questo è quello che succede nel mio caso. - Inoltre, per disconnettermi non posso farlo semplicemente cambiando l'ultima riga in adapter.Disconnect().)
cipricus

1

Dopo aver provato alcuni dei precedenti (gli script non hanno funzionato per me) ho trovato la seguente soluzione.

Per prima cosa scopri l'indirizzo MAC del dispositivo a cui vuoi connetterti

bluetoothctl

questo entrerà in una shell ed elencherà tutti i dispositivi disponibili con indirizzo. ("esci" per uscire dalla shell e tornare al prompt)

Quindi connettersi a XX: XX: XX: XX: XX: XX dispositivo bluetooth:

echo -e 'connect XX:XX:XX:XX:XX:XX' | bluetoothctl

per disconnettersi

echo -e 'disconnect XX:XX:XX:XX:XX:XX' | bluetoothctl

sto cercando questo da un po 'di tempo - nulla sembrava funzionare, mi sono sentito così sollevato quando l'ho scoperto. Pensato che anche altri potrebbero volerlo sapere. :))


Potresti modificare la tua risposta per aggiungere come ottenere l'indirizzo del dispositivo, in modo che la risposta sia più completa?
user3140225

1
@ user3140225 ha appena fatto.
Giuseppe,

Ho capito ~$ bluetoothctl Agent registered [UE BOOM 2]#. Poi disconnect "UE BOOM 2" Device UE BOOM 2 not available.
cipricus

@cipricus @ user3140225 Potresti pubblicare l'output di bluetoothctl? Devi inserire i comandi con l'indirizzo MAC del dispositivo, che è la combinazione di valori esadecimali nel formato XX: XX: XX: XX: XX: XX, dove X è una lettera o un numero.
Joseph,

Vedo il MAC come detto qui . Quindi, provando echo -e 'connect CC:AF:78:AF:59:03' | bluetoothctlottengo:Agent registered [bluetooth]# connect CC:AF:78:AF:59:03 Device CC:AF:78:AF:59:03 not available
cipricus
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.