Arrière-plan: J'utilise mon casque Bluetooth comme sortie audio. J'ai réussi à le faire fonctionner par la longue liste d'instructions sur documentation de la communauté BluetoothHeadset , et j'ai automatisé le processus d'activation du casque en tant que sortie audio par défaut dans un script, grâce à ne autre question .
Cependant, étant donné que j'utilise le casque Bluetooth avec mon téléphone et mon ordinateur (et que le casque ne prend pas en charge deux connexions d'entrée) afin que le téléphone ne "vole pas" la connexion lorsque le combiné est allumé, je force le casque dans une mode découverte lors de la connexion à l'ordinateur (le téléphone peut s'y connecter automatiquement).
Ainsi, même si le casque est apparié correctement et que, dans un scénario "normal", vous vous connectez automatiquement, je dois toujours utiliser la petite icône Bluetooth dans la zone de notification pour vous connecter à mon appareil (voir capture d'écran).
Ce que je veux éviter: Cette interface graphique permettant de se connecter à un périphérique Bluetooth connu et couplé :
Ce que je veux à la place: Je voudrais que le bluetooth fasse exactement ce que fait le clic sur l'élément de connexion dans l'interface graphique, uniquement en utilisant la ligne de commande. Je souhaite utiliser la ligne de commande afin de pouvoir créer un raccourci clavier pour l'action, sans avoir à naviguer dans l'interface utilisateur chaque fois que je souhaite établir une connexion avec le périphérique.
La question: Comment puis-je essayer de me connecter à un périphérique Bluetooth spécifique, connu et couplé à partir de la ligne de commande?
Question supplémentaire: Comment savoir si la connexion a réussi ou non?
Dans l'installation par défaut, un démon ( bluetoothd ) s'exécute en arrière-plan (à partir du fichier /etc/init.d/bluetooth
). Ce démon prend en charge la reconnaissance et la connexion à des périphériques Bluetooth connus et peut être configuré avec des fichiers de configuration dans /etc/bluetooth
. Pour la connexion automatique d'un casque, la ligne suivante dans audio.conf
devrait être décommentée (supprimer #
):
AutoConnect=true
Pour redémarrer le démon, tapez Sudo /etc/init.d/bluetooth restart
.
Remarque: L'utilisation de l'outil de ligne de commande Sudo hcitool cc <MAC-Adress>
n'a pas permis d'établir une connexion stable avec un périphérique connu de l'environnement de test lorsque le démon était en cours d'exécution.
Pour connecter un casque déconnecté mais physiquement présent et apparié, nous pouvons utiliser D-Bus à partir d'un script. Voici un exemple en 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
Au cas où nous aurions plus d'un périphérique Bluetooth, nous devrons bien sûr adapter le devicePath
name__. L'exemple ci-dessus connectera un Headset
name__. Modifiez l'interface avec un protocole différent pour tout autre service (par exemple AudioSink
name__).
Si vous connaissez l'adresse MAC de votre périphérique Bluetooth, vous pouvez le connecter en tant que récepteur de sortie pour pulseaudio en:
pacmd set-default-sink bluez_sink.xx_xx_xx_xx_xx_xx
Où xx_xx_xx_xx_xx_xx est l'adresse MAC (remplacez ':' par '_' pour que pulseaudio la reconnaisse).
Voir aussi cette réponse pour plus de détails.
J'utilise ce script pour connecter mon périphérique audio Bluetooth. Si votre casque est déjà apparié, vous devriez pouvoir le connecter de la même manière en utilisant org.bluez.Headset.Connect/Disconnect à la place de org.bluez.Audiosink.Connect/Déconnecter.
#!/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!
J'utilise i en tant que gestionnaire de fenêtres, je n'ai donc pas l'icône de la barre d'état Bluetooth disponible. Pour une raison quelconque, le bouton de contrôle dans les paramètres d'unité n'est pas sensible et j'ai donc besoin d'un moyen de le faire de temps en temps lorsque mes écouteurs ne se connectent pas.
Il semble que bluez
a a changé son API dbus . La réponse utilisant org.bluez.Manager
ne semble plus fonctionner. Au lieu de cela, il est recommandé d'utiliser ObjectManager
.
Voici un script mis à jour python qui connectera le premier casque Bluetooth non connecté qu’il trouve (la liste inclut probablement tous les appareils couplés?):
#!/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()
cet exemple, à l'instar de l'autre exemple de ce fil, utilise le package dbus
python. Sur Ubuntu 16.04, j'ai installé ceci avec apt-get install python-dbus
.
Si vous souhaitez faire correspondre d'autres critères, ce document apparaît pour afficher une liste des propriétés pouvant être interrogées via dbus.
J'ai ce script enregistré dans ~/.local/bin/bt-connect-headset
qui se trouve sur mon PATH
afin que je puisse l'exécuter à partir du lanceur i3. Rendez-le exécutable (chmod +x bt-connect-headset
) si vous envisagez de l’utiliser en tant que commande.
Ce script n'a été testé que sur un ubuntu 16.04 à jour du 28/09/2018.