bluetoothctl
avec echo
!
Depuis que j'ai écrit ce qui suit et le billet à propos de l'utilisation de Music On Console sur le Raspberry Pi avec un haut-parleur Bluetooth, j'ai acquis un peu plus de connaissances au sujet de Bluetooth. Au début, cela me permettait corriger ce billet, mais j'ai opté pour une seconde approche. Avant d'utiliser ce qui est proposé ici, il serait judicieux de lire Flux audio avec Bluetooth avec Raspbian Stretch sur Raspberry Pi 3.
Il n'y avait pas de cartes micro SD bon marché dans une grande surface spécialisée dans tout pour le bureau, mais il y avait une petite pile de haut-parleurs Bluetooth peu coûteux dans la corbeille de rabais. Je connais très peu les dispositifs Bluetooth à l'exception d'une brève utilisation d'un clavier bon marché que j'ai jeté lorsque la touche V a disparu assez rapidement. L'emballage des haut-parleurs parlait du "Corps en aluminium premium", d'une "Gamme sans fil jusqu'à 33 pieds" et de "Jusqu'à 3 heures de jeu". Laissons passer la traduction plutôt fantaisiste; ce qui était plus accrocheur était le "microphone intégré pour répondre à un appel". En le combinant à un Raspberry Pi 3 qui supporte Bluetooth, pourrais-je utiliser le haut-parleur comme un Dot de Amazon ou un Mini Home de Google ? Le prix abordable (10 $ CDN + 1,50 $ de frais de recyclage + 15% de taxe de vente) permet l'expérimentation.
Les tests avec une tablette Android ont confirmé que le haut-parleur pouvait diffuser de l'audio et que le microphone pouvait être utilisé, bien que la qualité soit nettement inférieure à celle de la tablette. Et il s'est avéré que le microphone ne pouvait être accessible qu'en utilisant une application trouvée sur Play Store.
L'appareil, nommé AUDIO POD, a été vendu sous la bannière XTREME SOUND, mais j'ai réalisé depuis qu'il existe de nombreuses variantes sur le thème vendues sous différentes étiquettes. Il s'avère également que pour le même prix j'aurais pu obtenir un modèle amélioré de plusieurs vendeurs chinois... eh bien.
Avant d'aller de l'avant avec le grand projet, j'ai dû apprendre les bases de l'utilisation de Bluetooth avec un Raspberry Pi 3. Voici une description de mes premiers pas dans ce monde pour moi inconnu.
Table des matières
- La base... encore
- Bluetooth sur Raspbian Stretch
- Connexion d'un dispositif Bluetooth
- Connexion d'un dispositif Bluetooth Devices avec code
- Utilisation d'un haut-parleur Bluetooth
- Contrôle du volume
- Utilisation de multiples haut-parleurs
- Caveat (ajout, 2018-05-12)
La base... encore
Cette première section concerne la mise en place de Raspbian (stretch) sur un Raspberry Pi 3 (RPi3 en abrégé) pour un fonctionnement sans tête (sans moniteur ni clavier) dès le départ. Elle peut probablement être ignorée par la plupart des utilisateurs du RPi3. Elle est un peu laconique et suppose que vous savez comment identifier l'adresse IP d'un ordinateur nouvellement connecté sur le réseau local. Ce qui suit devrait fonctionner avec n'importe quel modèle du Raspberry Pi.
La plus récente image de Rasbpian disponible à partir de la Fondation Raspberry Pi au moment d'écrire ce billet était
Raspbian Stretch Lite Minimal image based on Debian Stretch Version: November 2017 Release date: 2017-11-29 Kernel version: 4.9.
Raspbian Stretch Lite Minimal image based on Debian Stretch Version: April 2018 Release date: 2018-04-19 Kernel version: 4.14
Les anciennes versions de Rasbian Lite datant de novembre 2015 sont encore disponibles si, pour une raison quelconque, vous souhaitez installer l'une d'elle plutôt que la version la plus récente.
J'ai téléchargé cette image et l'ai gravée sur une carte SD de 8 Go en
utilisant Etcher selon les instructions de raspberrypi.org
.
Je suggère de décocher l'option Auto-unmount on success
dans les paramètres (Settings
) du programme. Si ce n'est pas
fait, il sera nécessaire de retirer et de réinsérer la carte SD dans le
lecteur de l'ordinateur bureau pour effectuer l'étape suivante.
Afin de configurer le RPi3 sans moniteur et clavier, j'ai créé un fichier
vide appelé ssh
dans la partition de démarrage de la carte.
Ensuite, j'ai démonté les deux partitions sur la carte SD, inséré cette dernière dans le lecteur de carte SD du RPi3, connecté un câble Ethernet et, enfin, j'ai sous tension le RPi3. Si tout se passe bien, les DEL rouge et verte clignoteront. Je pense que le RPi3 étend son système de fichiers, alors donnez-lui le temps d'effectuer cette tâche à faire qu'une seule fois. Attendez que la DEL verte ne clignote plus et que la rouge soit allumée systématiquement. Il est temps d'ouvrir une session SSH. Utilisez les moyens habituels pour trouver l'adresse IP du RPi3. Dans mon cas, c'était simple, parce que j'avais récemment connecté le RPi3 au réseau, donc son bail pour l'adresse IP était toujours en vigueur. Cependant, cela signifiait que la clé de sécurité devait être changée. Ce n'est pas grave, il suffit de suivre les instructions si cela arrive.
Nous y sommes! D'abord, j'ai utilisé l'utilitaire
raspi-config
pour changer la configuration en fonction de ma
situation. Les changements les plus importants pour le moment sont la
définition du mot de passe et l'activation du serveur SSH.
- Modifier le mot de pass (Change password for the current user) obligatoire
- Configurere le réseua (Configure network settings)
- N1 Nom de l'hôte (Hostname on the network) --> «rpi3»
- N2 Configuration Wi-Fiw (network name and password)
- Boot Options - aucun changement
- Localisation Options
- I1 Ajouter le français comme langue (Change Locale) «fr_CA» or «fr_FR» etc.
- I2 Ajuter le fuseau horaire (Change Timezone) - trouver une ville à proximité
- Interfacing Options
- P2 Activer le serveur SSH (SSH - enabled) obligatoire
- P5 Activer le bus I2C (I2C - enabled) pour utilisation éventuelle
- Overclock - aucun changement
- Advanced Options
- A3 Diminuer la mémoire affectée au GPU (Memory Split) - choisir minimum 16 MiO
J'ai redémarré comme demandé, puis j'ai mis à jour le système d'exploitation.
Bluetooth sur Raspbian Stretch
La documentation au sujet de Bluetooth sur la nouvelle image de Raspbian (stretch) à RaspberryPi.org souligne un changement de cap.
Dans Jessie, nous avons utilisé PulseAudio pour prendre en charge l'audio via Bluetooth, mais intégrer cela avec ALSA utilisée pour d'autres sources audio était maladroit. Pour Stretch, nous utilisons le paquet bluez-alsa pour faire fonctionner l'audio Bluetooth avec ALSA lui-même. PulseAudio n'est donc plus installé par défaut, et le plugin de volume sur la barre des tâches ne fera plus démarrer et arrêter PulseAudio. Du point de vue de l'utilisateur, tout devrait encore fonctionner exactement comme avant - le seul changement est que si vous souhaitez toujours utiliser PulseAudio pour une autre raison, vous devrez l'installer vous-même.
J'en conclus que les messages plus anciens sur Bluetooth et PulseAudio peuvent ne pas être très utiles. En regardant le journal de démarrage pour les entrées liées à Bluetooth, la situation semble bonne.
Cela m'a rappelé que l'UART est connecté à la puce Bluetooth sur le Raspberry Pi 3.
L'échec au niveau du serveur d'accès SIM (SAP) n'est pas très important
car permettre au RPi3 d'accéder à une carte SIM d'un téléphone compatible
Bluetooth est loin de m'intéresser à ce stade. Dans un long échange sur le
forum Rasbperry Pi, intitulé Raspbian Stretch Bluetooth is Broken, on présente un
moyen de se débarrasser du message d'erreur en arrêtant la tentative de
chargement du serveur SAP: suffit d'ajouter l'option
--noplugin=sap
lors du démarrage du service Bluetooth. Puisque
je suis paranoïaque, j'ai fait une sauvegarde du fichier
bluetooth.service
avant de le modifier.
Comme expliqué dans un échange, intitulé Bluetooth does not work with Raspbian Stretch and Raspberry
Pi 3, il y a aussi un problème de permissions. L'utilisateur (pi)
doit être membre du groupe bluetooth
pour avoir accès au
service via DBus
.
J'ai ensuite redémarré et, comme prévu, les deux erreurs liées à SAP ont
disparu. Cependant, l'échec Failed to obtain handles for "Service Changed"
characteristic
est toujours là. Par contre, il était possible d'opérer
l'appariement avec le haut-parleur Bluetooth. J'ai allumé le haut-parleur et
attendu jusqu'à ce que j'ai entendu "Bluetooth mode", puis j'ai lancé
l'utilitaire interactif bluetoothctl
.
C'est certainement une amélioration, mais la connexion a échoué.
Incidemment, l'agent
appelé est le module qui effectue
l'appariement avec le périphérique. Quant aux identificateurs universellement
uniques (UUIDs
), ils correspondent aux capacités du
haut-parleur. Plus sur cela dans un prochain billet.
Une lecture plus approfondie de l'échange sur le forum a donné une
autre partie de la solution. Il faut charger un autre
logiciel: le proxy blueALSA
. Ayant vérifié qu'il n'était pas
en place, je l'ai installé.
Le service sera chargé immédiatement, il n'est pas nécessaire de
redémarrer quoi que ce soit. Le haut-parleur s'avérant encore apparié,
il a suffit de réessayer d'établir la
connexion avec bluetoothctl
.
Le haut-parleur a fait un son pour indiquer qu'il était connecté. C'est un progrès. Notez qu'il n'était pas nécessaire d'enregistrer un agent puisque le haut-parleur avait déjà été jumelé. Il est temps de passer au problème du rebranchement du dispositif Bluetooth sans passer par cette procédure d'appariement.
Connexion d'un dispositif Bluetooth
Heureusement, il n'est pas nécessaire de passer par la procédure interactive décrite ci-dessus pour connecter un périphérique Bluetooth. Si en plus d'être apparié un périphérique est «approuvé» par un contrôleur, tel que le Raspberry Pi 3, la connexion est établie automatiquement lorsque le périphérique est proche d'un contrôleur qui lui fait confiance.
Autant que je sache, un appareil tel qu'un haut-parleur peut être connecté à un seul contrôleur à la fois. C'était quelque chose à retenir quand j'ai connecté les haut-parleurs Bluetooth à la fois avec mon ordinateur de bureau et au RPi3 à proximité. Il fallait s'assurer de désactiver le service Bluetooth de l'ordinateur de bureau lors de la connexion du haut-parleur au RPi3.
Faire confiance à un appareil déjà apparié est une procédure simple.
Pour tester, j'ai redémarré le RPi3 et éteint le haut-parleur en même temps. Une fois que le Raspberry Pi a terminé sa routine de démarrage, j'ai allumé le haut-parleur pour entendre avec plaisir le son indiquant l'établissement de la connexion après quelques secondes.
Pour le simple plaisir de m'en servir, j'ai utilisé l'outil
d'introspection D-Bus busctl
pour surveiller l'état du
haut-parleur quand je l'ai éteint puis rallumé.
Il semble qu'il soit nécessaire de redémarrer le haut-parleur après un redémarrage du RPi3. Voici ce que nous avons après avoir redémarré RPi3 puis l'enceinte.
Si la connexion automatique n'est pas désirée, il faut cesser de "faire confiance" au dispositif.
Le haut-parleur est resté apparié, et l'on peut s'y connecter avec une seule commande.
La déconnexion est tout aussi simple.
Si des commandes plus silencieuses sont requises, envoyez la sortie et le
fichier d'erreur standard à null
.
Alors il faut s'en remettre au son pour savoir si la connexion a été réalisée ou terminée.
Enfin, pour "dissocier" un périphérique, c'est-à-dire supprimer son
adresse MAC de la base de données du contrôleur, utilisez la commande
remove <mac_dispositif>
de bluetoothctl
(bien sûr <mac_dispositif> est remplacé par l'adresse MAC du dispositif
telle que 30: 21: 3E: 31: C6: 2B). Si vous souhaitez connecter
l'appareil à l'avenir, il faudra le jumeler à nouveau.
Connexion d'un dispositif Bluetooth avec code
La plupart des claviers Bluetooth et peut-être d'autres dispositifs Bluetooth ont une procédure d'appariement légèrement plus compliquée. Il y a une étape supplémentaire, un échange de code PIN.
Pour l'essayer, j'ai emprunté le clavier Adesso que ma conjointe utilise parfois avec son IPad. J'ai allumé le clavier, puis appuyé sur le bouton d'appairage Bluetooth. Sur ce clavier particulier, il est centré au-dessus des touches et marqué du symbole <«.»>. Une DEL Bluetooth commence alors à clignoter, signalant le début de la phase de découverte. Il est temps d'apparier et de se connecter au clavier.
Le code PIN change à chaque couplage. Il n'y a pas de moyen simple de tester la connexion du clavier sans brancher un moniteur au RPi. Je suis trop paresseux pour le faire, mais j'ai confiance que le clavier fonctionne.
Si le Raspberry Pi se retrouve dans le salon et si le clavier ne fonctionne pas avec l'IPad parce qu'il est connecté au RPi, il y aura deux conséquences. D'abord, il faudra beaucoup de temps pour comprendre ce qui se passe. Deuxièmement, il y aura des comptes à rendre à celle qui ne pourrait plus se servir de son appareil. Il me semblait préférable de retirer le clavier de la liste des appareils appariés après ce test.
Utilisation d'un haut-parleur Bluetooth
Maintenant il est temps d'essayer de faire sortir un son du haut-parleur.
Heureusement, une discussion récente sur le forum Raspberry intitulée Bluetooth audio on stretch indique la marche à suivre. À ce
stade, le RPi3 doit contenir un fichier WAV
(signé 16 ou 32
bits et codé PCM). J'ai utilisé Audacity
pour exporter une pièce de musique MP3
vers les formats 16 et
32 bits. Et le haut-parleur Bluetooth doit être connecté.
Succès! Il n'y a qu'un seul périphérique Bluetooth sur le Raspberry
Pi 3, comme le montre la commande hciconfig
.
La commande peut donc être simplifiée en n'indiquant pas quel
périphérique Bluetooth utiliser. De même, le profil a2dp
semble
être la valeur par défaut et n'a pas besoin d'être spécifié.
Au lieu d'identifier le périphérique de lecture en détail dans la
commande aplay
, un fichier de configuration .asoundrc
peut être créé et enregistré dans le dossier /home/pi
. Si un
tel fichier existait, il serait préférable de le conserver.
Si un fichier de configuration .asoundrc
valable existait
auparavant, il serait préférable de le combiner avec le
nouveau. Il y a un exemple d'un fichier de configuration avec trois
périphériques de sortie ci-dessous à la section 7.
Contrôle du volume
La musique est jouée à plein volume, ce qui peut être trop selon mes critères, mais serait simplement un murmure pour les autres. Il est possible de contrôler le volume alors que la musique joue, en utilisant AlsaMixer dans une seconde console.
Appuyez sur F3 pour voir les appareils de
lecture. Utilisez les touches de curseur gauche et droite pour sélectionner
le dispositif AUDIOPOD2 - A2DP
. Ensuite, utilisez
les touches de curseur haut et bas pour régler le volume de la
sortie pendant que la lecture du fichier WAV
est lancée
comme expliqué dans la section précédente.
Autrement le volume peut être réglé avant de jouer de la musique à partir
de la ligne de commande avec l'utilitaire amixer
.
Ajoutez un "+" ou "-" pour augmenter ou diminuer le volume. Par exemple pour régler le volume à 30% du volume maximum alors qu'il est déjà à 50%, demandez une diminution de 20% comme suit.
Donc 20%- ne veut pas dire une réduction de 20% du volume actuel parce qu'alors le volume aurait été égal à 40% du volume maximum (20% de 50% est 10% et 50% - 10% donne 40%).
Utilation de multiples haut-parleurs
J'ai utilisé l'utilitaire raspi-config
pour activer la
sortie analogique via la prise de 3,5 mm. J'ai ensuite connecté une paire
d'enceintes d'ordinateur alimentées au RPi3. Et pendant ce temps, j'ai ajouté
un deuxième haut-parleur Bluetooth ce qui est aussi facile à réaliser avec
bluetoothctl
que l'ajout de la première .
Le fichier de configuration .asoundrc
doit être modifié.
Maintenant, un fichier son peut être entendu via la sortie analogique intégrée de 3,5 mm du RPi3.
Pour l'entendre avec un haut-parleur Bluetooth déjà connecté, utiliser l'une des commandes.
Il reste possible de régler le volume. Dans alsamixer
les deux haut-parleurs seront visibles. Sur la ligne de commande, les noms des
enceintes sont maintenant différents.
Mais qu'en est-il de jouer le même fichier sonore à travers deux
enceintes simultanément? J'ai essayé sans succès de suivre les conseils
Eliot Eshelman. J'obtiens toujours des erreurs
xrun
qui signifient des dépassements ou des
sous-dépassements de tampon.
Pour m'amuser, j'ai essayé de jouer des fichiers WAV
simultanément à partir de différents terminaux. Il n'y a aucun problème à
faire fonctionner l'audio analogique et l'un des haut-parleurs Bluettooth
en même temps. Mais des deux haut-parleurs Bluetooth ne fonctionnent pas bien
simultanément; il y a beaucoup de ratés.
Caveat
Lorsque j'ai essayé d'exécuter le lecteur de média audio Music On Console (MOC) sur le Raspberry Pi à l'aide de
haut-parleurs Bluetooth, j'ai rencontré des difficultés. Il s'avère que le
coupable était le fichier de configuration .asoundrc
.
La solution que j'ai trouvée consistait à utiliser un fichier de configuration minimaliste (voir Music on Console, ALSA, and Bluetooth on Raspbian Stretch) :
Alors, aplay
, alsamixer
et amixer
fonctionnent avec le haut-parleur Bluetooth si l'option
-D bluealsa
est incluse dans la ligne de commande. Si aucun
périphérique n'est spécifié, le son est transmis à la prise de 3,5 mm
(ou au connecteur HDMI).
Cette "solution" ne sera pas très utile si différentes enceintes Bluetooth
sont connectées à des moments différents. Pour ceux qui se trouvent dans
cette situation, je suggère de regarder le script de
memeplex
présenté à la fin de la question Unable to find
definition 'defaults.bluealsa.interface' qu'il avait lui-même soulevée
sur le site github bluez-alsa.
Ma lecture du script est qu'il crée un nouveau fichier de configuration
.asoundrc
en cours d'exécution, en obtenant la valeur de
bluealsa.device
(l'adresse MAC du haut-parleur Bluetooth) de
bluetoothctl
.