md
Premier pas avec Bluetooth sur un Raspberry Pi 3 - Raspbian (Stretch)
2017-12-04
Mise à jour : 2018-05-25
-- Flux audio 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.

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

 

Table des matières

  1. La base... encore
  2. Bluetooth sur Raspbian Stretch
  3. Connexion d'un dispositif Bluetooth
  4. Connexion d'un dispositif Bluetooth Devices avec code
  5. Utilisation d'un haut-parleur Bluetooth
  6. Contrôle du volume
  7. Utilisation de multiples haut-parleurs
  8. Caveat (ajout, 2018-05-12)

  1. La base... encore
  2. 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.

    Depuis de nouvelles images ont été crées dont la dernière en date est
    Raspbian Stretch Lite
    	Minimal image based on Debian Stretch
    	Version: April 2018
    	Release date: 2018-04-19
    	Kernel version: 4.14
    La page de téléchargement RASPBIAN à la Fondation Raspberry Pi contient toujours l'image la plus récente. J'ai parcouru toutes les étapes décrites ici avec chacune des versions de Stretch devenues disponible celle de novembre 2017, et il n'y avait pas de différences substantielles. L'association d'un haut-parleur Bluetooth a fonctionné comme décrit ci-dessous avec un Raspberry Pi 3 B. Un lecteur de la région Occitanie en France a confirmé la démarche demeure valable avec Stretch sur le tout dernier Raspberry Pi, la version 3 B+.

    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.

    2018-05-12

    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.

    michel@hp:~$ sudo touch /media/michel/boot/ssh michel@hp:~$ ls /media/michel/boot/ssh /media/michel/boot/ssh

    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.

    michel@hp:~$ ssh pi@192.168.0.138 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host is SHA256:ZI+DfebhaxZeK+yy1cHkCmKoup0eNPALps0q60VF/Lw. Please contact your system administrator. Add correct host key in /home/michel/.ssh/known_hosts to get rid of this message. Offending ECDSA key in /home/michel/.ssh/known_hosts:36 remove with: ssh-keygen -f "/home/michel/.ssh/known_hosts" -R "192.168.0.138" ECDSA host key for 192.168.0.138 has changed and you have requested strict checking. Host key verification failed. michel@hp:~$ ssh-keygen -f "/home/michel/.ssh/known_hosts" -R "192.168.0.138" # Host 192.168.0.138 found: line 36 /home/michel/.ssh/known_hosts updated. Original contents retained as /home/michel/.ssh/known_hosts.old michel@hp:~$ ssh pi@192.168.0.138 The authenticity of host '192.168.0.138 (192.168.0.138)' can't be established. ECDSA key fingerprint is SHA256:ZI+DfebhaxZeK+yy1cHkCmKoup0eNPALps0q60VF/Lw. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.0.138' (ECDSA) to the list of known hosts. pi@192.168.0.138's password: raspberry not echoed to screen Linux raspberrypi 4.9.59-v7+ #1047 SMP Sun Oct 29 12:19:23 GMT 2017 armv7l ... SSH is enabled and the default password for the 'pi' user has not been changed. This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

    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.

    pi@raspberrypi:~ $ sudo raspi-config
    1. Modifier le mot de pass (Change password for the current user) obligatoire
    2. 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)
    3. Boot Options - aucun changement
    4. 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é
    5. Interfacing Options
      • P2 Activer le serveur SSH (SSH - enabled) obligatoire
      • P5 Activer le bus I2C (I2C - enabled) pour utilisation éventuelle
    6. Overclock - aucun changement
    7. 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.

    Connection to 192.168.0.138 closed by remote host. Connection to 192.168.0.138 closed. michel@hp:~$ ssh pi@192.168.0.138 pi@192.168.0.138's password: Linux rpi3 4.9.59-v7+ #1047 SMP Sun Oct 29 12:19:23 GMT 2017 armv7l ... pi@rpi3:~ $ sudo apt-get update && sudo apt-get upgrade ... The following packages will be upgraded: curl libcurl3 libcurl3-gnutls raspi-config 4 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. Need to get 760 kB of archives. After this operation, 2,048 B of additional disk space will be used. Do you want to continue? [Y/n] y

  3. Bluetooth sur Rasbian stretch
  4. La documentation au sujet de Bluetooth sur la nouvelle image de Raspbian (stretch) à RaspberryPi.org souligne un changement de cap.

    Bluetooth audio [in Stretch]

    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.

    pi@rpi3:~ $ dmesg | grep -i blue [ 9.302588] Bluetooth: Core ver 2.22 [ 9.302670] Bluetooth: HCI device and connection manager initialized [ 9.302688] Bluetooth: HCI socket layer initialized [ 9.302700] Bluetooth: L2CAP socket layer initialized [ 9.302729] Bluetooth: SCO socket layer initialized [ 9.313265] Bluetooth: HCI UART driver ver 2.3 [ 9.313278] Bluetooth: HCI UART protocol H4 registered [ 9.313284] Bluetooth: HCI UART protocol Three-wire (H5) registered [ 9.313465] Bluetooth: HCI UART protocol Broadcom registered [ 9.542892] Bluetooth: BNEP (Ethernet Emulation) ver 1.3 [ 9.542902] Bluetooth: BNEP filters: protocol multicast [ 9.542920] Bluetooth: BNEP socket layer initialized

    Cela m'a rappelé que l'UART est connecté à la puce Bluetooth sur le Raspberry Pi 3.

    pi@rpi3:~ $ sudo systemctl status bluetooth* ● bluetooth.target - Bluetooth Loaded: loaded (/lib/systemd/system/bluetooth.target; static; vendor preset: enabled) Active: active since Mon 2017-12-04 14:50:56 AST; 45min ago Docs: man:systemd.special(7) Dec 04 14:50:56 rpi3 systemd[1]: Reached target Bluetooth. ● bluetooth.service - Bluetooth service Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2017-12-04 14:50:56 AST; 45min ago Docs: man:bluetoothd(8) Main PID: 457 (bluetoothd) Status: "Running" CGroup: /system.slice/bluetooth.service └─457 /usr/lib/bluetooth/bluetoothd Dec 04 14:50:56 rpi3 systemd[1]: Starting Bluetooth service... Dec 04 14:50:56 rpi3 bluetoothd[457]: Bluetooth daemon 5.43 Dec 04 14:50:56 rpi3 systemd[1]: Started Bluetooth service. Dec 04 14:50:56 rpi3 bluetoothd[457]: Starting SDP server Dec 04 14:50:56 rpi3 bluetoothd[457]: Bluetooth management interface 1.14 initialized Dec 04 14:50:56 rpi3 bluetoothd[457]: Failed to obtain handles for "Service Changed" characteristic Dec 04 14:50:56 rpi3 bluetoothd[457]: Sap driver initialization failed. Dec 04 14:50:56 rpi3 bluetoothd[457]: sap-server: Operation not permitted (1)

    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.

    pi@rpi3:~ $ sudo cp /lib/systemd/system/bluetooth.service /lib/systemd/system/bluetooth.service-org pi@rpi3:~ $ sudo sed -i 's|^ExecStart=/usr/lib/bluetooth/bluetoothd$|ExecStart=/usr/lib/bluetooth/bluetoothd --noplugin=sap|' /lib/systemd/system/bluetooth.service pi@rpi3:~

    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.

    pi@rpi3:~ $ sudo adduser pi bluetooth Adding user `pi' to group `bluetooth' ... Adding user pi to group bluetooth Done. pi@rpi3:~ $ sudo reboot Connection to 192.168.0.138 closed by remote host. Connection to 192.168.0.138 closed.

    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.

    pi@rpi3:~ $ bluetoothctl [NEW] Controller B8:27:EB:55:FC:57 rpi3 [default] [bluetooth]# agent on pas nécessaire! un agent est déjà en place Agent registered [bluetooth]# scan on Discovery started [CHG] Controller B8:27:EB:55:FC:57 Discovering: yes [NEW] Device 30:21:3E:31:C6:2B AUDIOPOD2 [bluetooth]# pair 30:21:3E:31:C6:2B Attempting to pair with 30:21:3E:31:C6:2B [CHG] Device 30:21:3E:31:C6:2B Connected: yes [CHG] Device 30:21:3E:31:C6:2B UUIDs: 00001108-0000-1000-8000-00805f9b34fb [CHG] Device 30:21:3E:31:C6:2B UUIDs: 0000110b-0000-1000-8000-00805f9b34fb [CHG] Device 30:21:3E:31:C6:2B UUIDs: 0000110c-0000-1000-8000-00805f9b34fb [CHG] Device 30:21:3E:31:C6:2B UUIDs: 0000110e-0000-1000-8000-00805f9b34fb [CHG] Device 30:21:3E:31:C6:2B UUIDs: 0000111e-0000-1000-8000-00805f9b34fb [CHG] Device 30:21:3E:31:C6:2B ServicesResolved: yes [CHG] Device 30:21:3E:31:C6:2B Paired: yes Pairing successful [CHG] Device 30:21:3E:31:C6:2B ServicesResolved: no [CHG] Device 30:21:3E:31:C6:2B Connected: no [bluetooth]# connect 30:21:3E:31:C6:2B Attempting to connect to 30:21:3E:31:C6:2B Failed to connect: org.bluez.Error.Failed [bluetooth]# exit or quit Agent unregistered [DEL] Controller B8:27:EB:55:FC:57 rpi3 [default] pi@rpi3:~ $

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

    pi@rpi3:~ $ sudo apt-cache policy bluealsa bluealsa: Installed: (none) Candidate: 0.6 (0.7) dans Stretch 2018-03-13 Version table: 0.6 500 500 http://archive.raspberrypi.org/debian stretch/main armhf Packages pi@rpi3:~ $ sudo apt-get install bluealsa ... Do you want to continue? [Y/n] y ... Setting up bluealsa (0.6) ... (0.7) dans Stretch 2018-03-13 évidemment Created symlink /etc/systemd/system/graphical.target.wants/bluealsa.service → /lib/systemd/system/bluealsa.service.

    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.

    pi@rpi3:~ $ bluetoothctl [NEW] Controller B8:27:EB:55:FC:57 rpi3 [default] [NEW] Device 30:21:3E:31:C6:2B AUDIOPOD2 [bluetooth]# paired-devices Device 30:21:3E:31:C6:2B AUDIOPOD2 [bluetooth]# connect 30:21:3E:31:C6:2B Attempting to connect to 30:21:3E:31:C6:2B [CHG] Device 30:21:3E:31:C6:2B Connected: yes Connection successful Enceinte: "ding dong" [CHG] Device 30:21:3E:31:C6:2B ServicesResolved: yes

    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.

  5. Connexion d'un dispositif Bluetooth
  6. 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.

    pi@rpi3:~ $ bluetoothctl [AUDIOPOD2]# trust 30:21:3E:31:C6:2B [CHG] Device 30:21:3E:31:C6:2B Trusted: yes Changing 30:21:3E:31:C6:2B trust succeeded [AUDIOPOD2]# quit

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

    pi@rpi3:~ $ busctl tree org.bluez └─/org └─/org/bluez └─/org/bluez/hci0 └─/org/bluez/hci0/dev_30_21_3E_31_C6_2B └─/org/bluez/hci0/dev_30_21_3E_31_C6_2B/fd0 j'ai fermé le haut-parleur pour quelques secondes pi@rpi3:~ $ busctl tree org.bluez └─/org └─/org/bluez └─/org/bluez/hci0 └─/org/bluez/hci0/dev_30_21_3E_31_C6_2B j'ai allumé le haut-parleur et après quelque seconde il a émit le son signalant une nouvelle connexion pi@rpi3:~ $ busctl tree org.bluez └─/org └─/org/bluez └─/org/bluez/hci0 └─/org/bluez/hci0/dev_30_21_3E_31_C6_2B └─/org/bluez/hci0/dev_30_21_3E_31_C6_2B/fd1

    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.

    pi@rpi3:~ $ busctl tree org.bluez └─/org └─/org/bluez └─/org/bluez/hci0 └─/org/bluez/hci0/dev_30_21_3E_31_C6_2B └─/org/bluez/hci0/dev_30_21_3E_31_C6_2B/fd0 pi@rpi3:~ $ sudo systemctl status bluet* ● bluetooth.service - Bluetooth service Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2017-12-04 18:07:55 AST; 3min 7s ago Docs: man:bluetoothd(8) Main PID: 441 (bluetoothd) Status: "Running" CGroup: /system.slice/bluetooth.service └─441 /usr/lib/bluetooth/bluetoothd --noplugin=sap Dec 04 18:07:54 rpi3 systemd[1]: Starting Bluetooth service... Dec 04 18:07:55 rpi3 bluetoothd[441]: Bluetooth daemon 5.43 Dec 04 18:07:55 rpi3 systemd[1]: Started Bluetooth service. Dec 04 18:07:55 rpi3 bluetoothd[441]: Starting SDP server Dec 04 18:07:55 rpi3 bluetoothd[441]: Excluding (cli) sap Dec 04 18:07:55 rpi3 bluetoothd[441]: Bluetooth management interface 1.14 initialized Dec 04 18:07:55 rpi3 bluetoothd[441]: Failed to obtain handles for "Service Changed" characteristic Dec 04 18:07:55 rpi3 bluetoothd[441]: Endpoint registered: sender=:1.4 path=/A2DP/SBC/Source/1 Dec 04 18:07:55 rpi3 bluetoothd[441]: Endpoint registered: sender=:1.4 path=/A2DP/SBC/Sink/1 Dec 04 18:10:35 rpi3 bluetoothd[441]: Endpoint registered: sender=:1.4 path=/A2DP/SBC/Source/2 ● bluetooth.target - Bluetooth Loaded: loaded (/lib/systemd/system/bluetooth.target; static; vendor preset: enabled) Active: active since Mon 2017-12-04 18:07:55 AST; 3min 7s ago Docs: man:systemd.special(7) Dec 04 18:07:55 rpi3 systemd[1]: Reached target Bluetooth.

    Si la connexion automatique n'est pas désirée, il faut cesser de "faire confiance" au dispositif.

    pi@rpi3:~ $ bluetoothctl [NEW] Controller B8:27:EB:55:FC:57 rpi3 [default] [NEW] Device 30:21:3E:31:C6:2B AUDIOPOD2 [AUDIOPOD2]# untrust 30:21:3E:31:C6:2B Changing 30:21:3E:31:C6:2B untrust succeeded [AUDIOPOD2]# quit [DEL] Controller B8:27:EB:55:FC:57 rpi3 [default] pi@rpi3:~ $

    Le haut-parleur est resté apparié, et l'on peut s'y connecter avec une seule commande.

    pi@rpi3:~ $ echo -e "connect 30:21:3E:31:C6:2B" | bluetoothctl [NEW] Controller B8:27:EB:55:FC:57 rpi3 [default] [NEW] Device 30:21:3E:31:C6:2B AUDIOPOD2 [bluetooth]# connect 30:21:3E:31:C6:2B Attempting to connect to 30:21:3E:31:C6:2B [DEL] Controller B8:27:EB:55:FC:57 rpi3 [default] [bluetooth]# (bluetoothctl:1006): GLib-CRITICAL **: Source ID 25 was not found when attempting to remove it pi@rpi3:~ $

    La déconnexion est tout aussi simple.

    pi@rpi3:~ $ echo -e "disconnect 30:21:3E:31:C6:2B" | bluetoothctl [NEW] Controller B8:27:EB:55:FC:57 rpi3 [default] [NEW] Device 30:21:3E:31:C6:2B AUDIOPOD2 [AUDIOPOD2]# disconnect 30:21:3E:31:C6:2B Attempting to disconnect from 330:21:3E:31:C6:2B [DEL] Controller B8:27:EB:55:FC:57 rpi3 [default] [AUDIOPOD2]# (bluetoothctl:1118): GLib-CRITICAL **: Source ID 26 was not found when attempting to remove it pi@rpi3:~ $

    Si des commandes plus silencieuses sont requises, envoyez la sortie et le fichier d'erreur standard à null.

    pi@rpi3:~ $ echo -e "connect 30:21:3E:31:C6:2B" | bluetoothctl > /dev/null 2>&1

    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.

  7. Connexion d'un dispositif Bluetooth avec code
  8. 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.

    pi@rpi3:~ $ bluetoothctl [bluetooth]# scan on Failed to start discovery: org.bluez.Error.InProgress No problem, that means scan was on [CHG] Device DC:2C:26:21:7B:F6 LegacyPairing: no [CHG] Device DC:2C:26:21:7B:F6 Name: Adesso Bluetooth 3.0 Keyboard [CHG] Device DC:2C:26:21:7B:F6 Alias: Adesso Bluetooth 3.0 Keyboard [bluetooth]# agent on Agent registered [bluetooth]# pair DC:2C:26:21:7B:F6 Attempting to pair with DC:2C:26:21:7B:F6 [CHG] Device DC:2C:26:21:7B:F6 Connected: yes [agent] PIN code: 114412 Entrer le code et appuyer sur la touche Entrée du clavier bluetooth. [CHG] Device DC:2C:26:21:7B:F6 Modalias: usb:v0A5Cp8502d011B [CHG] Device DC:2C:26:21:7B:F6 UUIDs: 00001000-0000-1000-8000-00805f9b34fb [CHG] Device DC:2C:26:21:7B:F6 UUIDs: 00001124-0000-1000-8000-00805f9b34fb [CHG] Device DC:2C:26:21:7B:F6 UUIDs: 00001200-0000-1000-8000-00805f9b34fb [CHG] Device DC:2C:26:21:7B:F6 ServicesResolved: yes [CHG] Device DC:2C:26:21:7B:F6 Paired: yes Pairing successful La DEL du clavier bluetooth arrêtera de clignoter [CHG] Device DC:2C:26:21:7B:F6 ServicesResolved: no [CHG] Device DC:2C:26:21:7B:F6 Connected: no [CHG] Device 30:21:17:4A:29:DC RSSI: -56 [bluetooth]#

    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.

    pi@rpi3:~ $ bluetoothctl [NEW] Controller B8:27:EB:55:FC:57 rpi3 [default] [NEW] Device DC:2C:26:21:7B:F6 Adesso Bluetooth 3.0 Keyboard [NEW] Device 30:21:3E:31:C6:2B AUDIOPOD2 [bluetooth]# remove DC:2C:26:21:7B:F6 [DEL] Device DC:2C:26:21:7B:F6 Adesso Bluetooth 3.0 Keyboard Device has been removed [bluetooth]# exit [DEL] Controller B8:27:EB:55:FC:57 rpi3 [default]

  9. Utilisation d'un haut-parleur Bluetooth
  10. 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é.

    pi@rpi3:~ $ aplay -D bluealsa:HCI=hci0,DEV=30:21:3E:31:C6:2B,PROFILE=a2dp sound-off-S16.wav Playing WAVE 'sound-off-S16.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo

    Succès! Il n'y a qu'un seul périphérique Bluetooth sur le Raspberry Pi 3, comme le montre la commande hciconfig.

    pi@rpi3:~ $ hciconfig -a hci0: Type: Primary Bus: UART BD Address: B8:27:EB:55:FC:57 ACL MTU: 1021:8 SCO MTU: 64:1 UP RUNNING RX bytes:39147 acl:289 sco:0 events:4003 errors:0 TX bytes:4556466 acl:7349 sco:0 commands:199 errors:0 Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87 Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 Link policy: RSWITCH SNIFF Link mode: SLAVE ACCEPT Name: 'rpi3' Class: 0x6c0000 Service Classes: Rendering, Capturing, Audio, Telephony Device Class: Miscellaneous, HCI Version: 4.1 (0x7) Revision: 0x145 LMP Version: 4.1 (0x7) Subversion: 0x2209 Manufacturer: Broadcom Corporation (15)

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

    pi@rpi3:~ $ aplay -D bluealsa:DEV=30:21:3E:31:C6:2B sound-off-S16.wav Playing WAVE 'sound-off-S16.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo

    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.

    pi@rpi3:~/somedir$ cd $home pi@rpi3:~ $ ls -a .asoundrc .asoundrc - si le fichier existe, autrement ls est muet pi@rpi3:~ $ mv .asoundrc _asoundrc.bak - inutile si .asoundrc n'existe pas pi@rpi3:~ $ nano .asoundrc
    pcm.!default { type plug slave.pcm { type bluealsa device "30:21:3E:31:C6:2B" profile "a2dp" } }

    Alors le seul paramètre nécessaire pour jouer un fichier de son est son nom.

    pi@rpi3:~ $ aplay sound-off-S16.wav Playing WAVE 'sound-off-S16.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo

    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.

    Steve Hawtin de White Turret Ltd a gentiment noté que j'avais omis le nom du fichier de configuration dans la version anglaise de ce texte. Il manquait aussi l'avertissement au sujet de la sauvegarde d'un fichier de configuration déjà en place. Mes remerciement envers ce lecteur attentif.
    2018-01-19

  11. Contrôle du volume
  12. La musique est jouée à plein volume, ce qui peut être fort 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.

    pi@rpi3:~ $ alsamixer -D bluealsa

    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.

    pi@rpi3:~ $ amixer -D bluealsa sset "AUDIOPOD2 - A2DP" 50% Simple mixer control 'AUDIOPOD2 - A2DP',0 Capabilities: pvolume pswitch Playback channels: Front Left - Front Right Limits: Playback 0 - 127 Mono: Front Left: Playback 64 [50%] [on] Front Right: Playback 64 [50%] [on]

    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.

    pi@rpi3:~ $ amixer -D bluealsa sset "AUDIOPOD2 - A2DP" 20%- Simple mixer control 'AUDIOPOD2 - A2DP',0 Capabilities: pvolume pswitch Playback channels: Front Left - Front Right Limits: Playback 0 - 127 Mono: Front Left: Playback 38 [30%] [on] Front Right: Playback 38 [30%] [on]
    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%).

  13. Utilation de multiples haut-parleurs
  14. 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 .

    pi@rpi3:~ $ bluetoothctl [NEW] Controller B8:27:EB:55:FC:57 rpi3 [default] [NEW] Device 30:21:3E:31:C6:2B AUDIOPOD2 [AUDIOPOD2]# agent on Agent registered [AUDIOPOD2]# default-agent Default agent request successful [AUDIOPOD2]# scan on Discovery started [CHG] Controller B8:27:EB:55:FC:57 Discovering: yes [NEW] Device 30:21:17:4A:29:DC AUDIOPOD2 [AUDIOPOD2]# devices Device 30:21:3E:31:C6:2B AUDIOPOD2 Device 30:21:17:4A:29:DC AUDIOPOD2 [AUDIOPOD2]# pair 30:21:17:4A:29:DC Attempting to pair with 30:21:17:4A:29:DC [CHG] Device 30:21:17:4A:29:DC Connected: yes [CHG] Device 30:21:17:4A:29:DC UUIDs: 00001108-0000-1000-8000-00805f9b34fb [CHG] Device 30:21:17:4A:29:DC UUIDs: 0000110b-0000-1000-8000-00805f9b34fb [CHG] Device 30:21:17:4A:29:DC UUIDs: 0000110c-0000-1000-8000-00805f9b34fb [CHG] Device 30:21:17:4A:29:DC UUIDs: 0000110e-0000-1000-8000-00805f9b34fb [CHG] Device 30:21:17:4A:29:DC UUIDs: 0000111e-0000-1000-8000-00805f9b34fb [CHG] Device 30:21:17:4A:29:DC ServicesResolved: yes [CHG] Device 30:21:17:4A:29:DC Paired: yes Pairing successful [CHG] Device 30:21:17:4A:29:DC ServicesResolved: no [CHG] Device 30:21:17:4A:29:DC Connected: no [AUDIOPOD2]# connect 30:21:17:4A:29:DC Attempting to connect to 30:21:17:4A:29:DC [CHG] Device 30:21:17:4A:29:DC Connected: yes Connection successful [CHG] Device 30:21:17:4A:29:DC ServicesResolved: yes [AUDIOPOD2]# scan off [CHG] Device 30:21:17:4A:29:DC RSSI is nil Discovery stopped [CHG] Controller B8:27:EB:55:FC:57 Discovering: no [AUDIOPOD2]# exit Agent unregistered [DEL] Controller B8:27:EB:55:FC:57 rpi3 [default]

    Le fichier de configuration .asoundrc doit être modifié.

    pcm.!default plug:jack pcm.!jack { type plug slave { pcm "hw:0,0" } } pcm.!pod1 { type plug slave.pcm { device "30:21:17:4A:29:DC" type bluealsa profile "a2dp" } } pcm.!pod2 { type plug slave.pcm { type bluealsa device "30:21:3E:31:C6:2B" profile "a2dp" } }

    Maintenant, un fichier son peut être entendu via la sortie analogique intégrée de 3,5 mm du RPi3.

    pi@rpi3:~ $ aplay -D jack sound-off-S16.wav ou pi@rpi3:~ $ aplay -D default sound-off-S16.wav ou, plus simplement pi@rpi3:~ $ aplay sound-off-S16.wav

    Pour l'entendre avec un haut-parleur Bluetooth déjà connecté, utiliser l'une des commandes.

    pi@rpi3:~ $ aplay -D pod1 sound-off-S16.wav ou pi@rpi3:~ $ aplay -D pod2 sound-off-S16.wav

    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.

    pi@rpi3:~ $ amixer -D bluealsa sset "AUDIOPOD2 #2 - A2DP" 30%

    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.

  15. Caveat
  16. Ajout: 2018-05-12

    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) :

    defaults.bluealsa.interface "hci0" defaults.bluealsa.device "30:21:3E:31:C6:2B" defaults.bluealsa.profile "a2dp"

    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.

-- Flux audio Bluetooth avec Raspbian Stretch sur Raspberry Pi 3->