md
Flux audio Bluetooth avec Raspbian Stretch sur Raspberry Pi 3
2018-06-25
Mise à jour: 2021-11-04
<-Premier pas avec Bluetooth sur un Raspberry Pi 3 - Raspbian (Stretch) A Note on BlueAlsa 0.9 with BlueZ 5.43 on Rasbian Stretch->
<-Music on Console, ALSA, and Bluetooth on Raspbian Stretch)
Il serait préférable de lire le billet le plus récent sur ce sujet: Bluetooth et BlueALSA avec Raspberry Pi OS Lite (novembre 2021). C'est la version 5.50 de BlueZ qui est installée depuis Raspbian Buster.
2021-11-02

Depuis la sortie de l'édition de novembre 2018 du système d'exploitation, ce billet est dépassé. Consultez une note sur BlueAlsa 0.9 avec BlueZ 5.43 sur Rasbian Stretch (en anglais seulement: A Note on BlueAlsa 0.9 with BlueZ 5.43 on Rasbian Stretch) qui montre qu'il n'est pas nécessaire de mettre à jour BlueZ après tout. Revenez ici si vous voulez plus de détails sur l'utilisation de bluetoothctl et BlueAlsa avec les utilitaires ALSA. Si vous insistez pour mettre à jour BlueZ, consultez la note de suivi Une note sur BlueAlsa 0.9 avec BlueZ 5.49 et 5.50 sur Rasbian Stretch (en anglais seulement: A Note on BlueAlsa 0.9 with BlueZ 5.49 and 5.50 on Rasbian Stretch).
2019-01-29

En appui à la proposition qu'il y a plus d'un chemin qui mène à Rome, voici une seconde prise au sujet de la connexion Bluetooh de périphériques audio (haut-parleurs, enceintes, casque d'écoute...) à un Raspberry Pi 3 fonctionnant sous Raspbian Stretch (basé sur Debian 9). Auparavant, j'ai recensé quelques astuces qui contournent des bogues dans la pile Bluetooth fournie avec Raspbian Stretch. L'approche ici sera un peu plus radicale en mettant à jour BlueZ (la pile officielle du protocole Bluetooth Linux) vers la version la plus récente. À mon avis, il s'agit d'une meilleure solution même si c'est un peu plus compliqué. Ce billet va un peu plus loin en montrant comment le Raspberry Pi 3 peut être une cible Bluetooth. En d'autres mots le Raspberry Pi 3 devient un haut-parleur Bluetooth diffusant un flux audio émanant d'un autre périphérique Bluetooth.

Table des matières

  1. Installation de Raspian Stretch
  2. Mise à jour de BlueZ
  3. Connexion de périphériques audio Bluetooth
  4. Transmettre un flux audio aux périphériques audio Bluetooth
  5. Contrôler le volume de lecture d'un haut-parleur Bluetooth
  6. Recevoir un flux audio de dispositifs audio Bluetooth
  7. Et encore ?

  1. Installation de Raspian Stretch
  2. Cette première section concerne la mise en marche de Raspbian (Stretch Lite ) sur un Raspberry Pi 3 B (RPi3 en abrégé) pour fonctionner sans tête (sans clavier ni moniteur). Elle peut probablement être ignorée par la plupart des utilisateurs du RPi3. C'est plutôt laconique et suppose qu'on sache localiser un ordinateur nouvellement connecté sur le réseau local. Tandis que l'installation de Stretch devrait fonctionner sur n'importe quel modèle du Raspberry Pi, un adaptateur USB-Bluetooth sera nécessaire avec des versions plus anciennes. Wi-Fi et Bluetooth sont à bord du Raspberry Pi qu'à partir de la version 3 et la version W du Raspberry Pi Zero.

    Au moment de la rédaction de ce billet, l'image la plus récente de Rasbian disponible auprès de la Raspberry Foundation 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 et dans la plupart des circonstances, c'est ce qui devrait être installé. Les anciennes versions de Rasbian Lite datant de novembre 2015 sont disponibles ici s'il est nécessaire d'installer une plus vieille version.

    J'ai téléchargé la dernière 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 qu'avant de faire cela vous décochez l'option pour démonter la carte après la gravure (Auto-unmount on success) dans les paramètres du programme (Settings). Si ce n'est pas fait, il sera nécessaire de retirer et de réinsérer la carte SD dans le lecteur de carte SD de bureau pour effectuer l'étape suivante.

    Afin de configurer le RPi3 sans moniteur et clavier, il faut ajouter un fichier vide appelé ssh dans la partition de démarrage de la carte nommée boot. in the card's boot partition.

    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 mis le RPi3 sous tension. Si tout se passe bien, les DEL rouge et verte clignotent. Je pense que le RPi3 étend son système de fichiers, alors il faut lui accorder le temps d'effectuer cette tâche qui n'est à faire qu'une seule fois. Quand la DEL verte ne clignote plus et que la DEL rouge reste allumée, 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 d'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.1.134 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ 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.1.134 The authenticity of host '192.168.1.134 (192.168.1.134)' 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.1.134' (ECDSA) to the list of known hosts. pi@192.168.0.138's password: raspberry not echoed to screen Linux raspberrypi 4.14.34-v7+ #1110 SMP Mon Apr 16 15:18:51 BST 2018 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.

    Au lieu d'utiliser passwd, j'ai lancé raspi-config pour changer le mot de passe et compléter le reste de la configuration en fonction de ma situation. Le programme de configuration requiert des privilèges (autorisation ou tout autre terme signifiant la même chose) de superutilisateur. Il faut utiliser le préfixe sudo.

    pi@raspberrypi:~ $ sudo raspi-config

    Voici les changements que j'ai apportés à la configuration.

    1. Changer le mot de passe pour l'utilisateur actuel - obligatoire
    2. Configurer les paramètres réseau - rien
    3. Options de démarrage - rien
    4. Options de localisation
      • I2 Change Timezone - changer le fuseau horaire, ici c'est America/Moncton
    5. Options d'interfaçage
      • P2 SSH - activé obligatoire
      • P4 SPI - activé
      • P5 I2C - activé
    6. Overclock - rien
    7. Options avancées
      • A3 Memory Split - minimum 16 Mo pour le GPU

    En quittant raspi-config, je n'ai pas choisi de redémarrer. Au lieu de cela, j'ai suivi les instructions sur le Raspberry Pi StackExchange, pour configurer des adresses statiques selon la méthode dhcpcd (bhcpcd method). J'ai d'abord sauvegardé le fichier de configuration dchcpc, puis je l'ai modifié.

    pi@rpi3:~ $ sudo cp /etc/dhcpcd.conf /etc/dhcpcd.conf.bak pi@rpi3:~ $ sudo nano /etc/dhcpcd.conf
    ... # Example static IP configuration: #interface eth0 #static ip_address=192.168.0.10/24 #static ip6_address=fd51:42f8:caae:d92e::ff/64 #static routers=192.168.0.1 #static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1 interface eth0 static ip_address=192.168.1.34/24 static routers=192.168.1.1 static domain_name_servers=192.168.1.1 ...

    Je n'ai pas activé l'interface WiFi avec raspi-config et par conséquent, je n'ai pas ajouté une adresse IP statique pour le WiFi dans le fichier de configuration dhcpcd. Utiliser une connexion WiFi tout en streaming audio Bluetooth sur le Raspberry Pi n'est pas vraiment possible. Faire les deux en même temps submerge le seul IC responsable des deux liens sans fil (voir la dernière section à ce sujet).

    La configuration de base étant terminée, j'ai redémarré, puis après un court moment j'ai ouvert une nouvelle session SSH avec le RPi3.

    pi@raspberrypi:~ $ sudo reboot Connection to 192.168.1.134 closed by remote host. Connection to 192.168.1.134 closed. michel@hp:~$ ssh pi@192.168.1.34 pi@192.168.1.34's password: the new one of course! Linux raspberrypi 4.14.34-v7+ #1110 SMP Mon Apr 16 15:18:51 BST 2018 armv7l ...

  3. Mise à jour de BlueZ
  4. La première chose à faire avant d'ajouter ou de modifier le système consiste à mettre ce dernier à jour et à le mettre à niveau.

    pi@rpi3:~ $ sudo apt-get update && sudo apt-get upgrade ... The following packages will be upgraded: bluez-firmware wget 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. Need to get 892 kB of archives. After this operation, 7,168 B of additional disk space will be used. Do you want to continue? [Y/n] y ...

    Il y a plus d'une façon de déterminer la version du paquet BlueZ installée après la mise à niveau. Nous pouvons interroger l'utilitaire bluetoothctl ou nous pouvons obtenir l'état du service Bluetooth qui fournit beaucoup plus d'informations que le numéro de version.

    pi@raspberrypi:~ $ sudo bluetoothctl -v 5.43 pi@raspberrypi:~ $ sudo systemctl status blue* ● bluetooth.target - Bluetooth Loaded: loaded (/lib/systemd/system/bluetooth.target; static; vendor preset: Active: active since Sun 2018-05-13 13:17:51 ADT; 1h 17min ago Docs: man:systemd.special(7) May 13 13:17:51 raspberrypi systemd[1]: Reached target Bluetooth. ● bluetooth.service - Bluetooth service Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset Active: active (running) since Sun 2018-05-13 13:17:51 ADT; 1h 17min ago Docs: man:bluetoothd(8) Main PID: 446 (bluetoothd) Status: "Running" CGroup: /system.slice/bluetooth.service └─446 /usr/lib/bluetooth/bluetoothd May 13 13:17:51 raspberrypi systemd[1]: Starting Bluetooth service... May 13 13:17:51 raspberrypi bluetoothd[446]: Bluetooth daemon 5.43 May 13 13:17:51 raspberrypi systemd[1]: Started Bluetooth service. May 13 13:17:51 raspberrypi bluetoothd[446]: Starting SDP server May 13 13:17:51 raspberrypi bluetoothd[446]: Bluetooth management interface 1.14 initialized May 13 13:17:51 raspberrypi bluetoothd[446]: Failed to obtain handles for "Service Changed" characteristic May 13 13:17:51 raspberrypi bluetoothd[446]: Sap driver initialization failed. May 13 13:17:51 raspberrypi bluetoothd[446]: sap-server: Operation not permitted (1)

    La version 5.43 est installée. Malheureusement les problèmes avec le service mentionnés dans mon premier billet sur le sujet (Premier pas avec Bluetooth sur un Raspberry Pi 3 - Raspbian (Stretch) sont toujours présents. La plus récente version de BlueZ est disponible à partir de ses pages d'accueil et de téléchargement. La dernière version 5.49 date du 11 mars 2018. La mise à niveau vers cette nouvelle version supprime toutes les erreurs signalées ci-dessus.

    La première étape consiste à obtenir les paquets nécessaires.

    pi@raspberrypi:~ $ sudo apt install libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev ... The following NEW packages will be installed: icu-devtools libdbus-1-dev libglib2.0-bin libglib2.0-dev libical-dev libical2 libicu-dev libpcre16-3 libpcre3-dev libpcre32-3 libpcrecpp0v5 libreadline-dev libtinfo-dev libudev-dev 0 upgraded, 14 newly installed, 0 to remove and 0 not upgraded. Need to get 22.3 MB of archives. After this operation, 88.1 MB of additional disk space will be used. Do you want to continue? [Y/n] y

    En plus des 5 paquets demandés, 9 autres ont été installés. Les prochaines étapes consistent à télécharger l'archive et extraire son contenu.

    pi@raspberrypi:~ $ wget http://www.kernel.org/pub/linux/bluetooth/bluez-5.49.tar.xz ... 2018-05-13 15:00:58 (272 KB/s) - ‘bluez-5.49.tar.xz’ saved [1744860/1744860] pi@raspberrypi:~ $ tar -xf bluez-5.49.tar.xz pi@raspberrypi:~ $ cd bluez-5.49/

    Il est temps de compiler et d'installer la pile Bluez. Cela prend un peu de temps sur un Raspberry Pi 3, en particulier la partie make.

    pi@raspberrypi:~/bluez-5.49 $ ./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc --localstatedir=/var --enable-experimental ... pi@raspberrypi:~/bluez-5.49 $ make -j4 ... pi@raspberrypi:~/bluez-5.49 $ sudo make install

    Pour que l'utilisateur (pi) ait l'autorisation d'invoquer bluetoothctl, il doit être ajouté au groupe bluetooth et le fichier de configuration Bluetooth Dbus qui a été remplacé pendant l'installation de BlueZ doit être restauré. Essentiellement, cela signifie ajouter une politique pour le groupe bluetooth.

    pi@raspberrypi:~/bluez-5.49 $ sudo adduser pi bluetooth pi@raspberrypi:~ $ sudo cp /etc/dbus-1/system.d/bluetooth.conf /etc/dbus-1/system.d/bluetooth.conf.bak pi@raspberrypi:~ $ sudo nano /etc/dbus-1/system.d/bluetooth.conf
    ... <policy user="root"> <allow own="org.bluez"/> <allow send_destination="org.bluez"/> <allow send_interface="org.bluez.Agent1"/> <allow send_interface="org.bluez.MediaEndpoint1"/> <allow send_interface="org.bluez.MediaPlayer1"/> <allow send_interface="org.bluez.Profile1"/> <allow send_interface="org.bluez.AlertAgent1"/> <allow send_interface="org.bluez.ThermometerWatcher1"/> <allow send_interface="org.bluez.HeartRateWatcher1"/> <allow send_interface="org.bluez.CyclingSpeedWatcher1"/> <allow send_interface="org.bluez.GattCharacteristic1"/> <allow send_interface="org.bluez.GattDescriptor1"/> <allow send_interface="org.bluez.LEAdvertisement1"/> <allow send_interface="org.freedesktop.DBus.ObjectManager"/> <allow send_interface="org.freedesktop.DBus.Properties"/> </policy> <!-- allow users of bluetooth group to communicate --> <policy group="bluetooth"> <allow send_destination="org.bluez"/> </policy> <policy at_console="true"> <allow send_destination="org.bluez"/> </policy>

    Les phrases de couleur rouge en caractères gras étaient les éléments du fichier original qu'il faut ajouter dans la configuration. Il est nécessaire de redémarrer pour mettre à jour le tout. Puis reconnectez-vous et vérifiez que la dernière version de la pile Bluetooth a été installée et examine l'état du service Bluetooth.

    pi@raspberrypi:~ $ sudo reboot Connection to 192.168.1.34 closed by remote host. Connection to 192.168.1.34 closed. wait a while and then michel@hp:~$ ssh pi@192.168.1.34 pi@192.168.1.34's password: new_password Linux raspberrypi 4.14.34-v7+ #1110 SMP Mon Apr 16 15:18:51 BST 2018 armv7l ... pi@raspberrypi:~ $ bluetoothctl -v bluetoothctl: 5.49 pi@raspberrypi:~ $ sudo systemctl status blueto* ● bluetooth.target - Bluetooth Loaded: loaded (/lib/systemd/system/bluetooth.target; static; vendor preset: enabled) Active: active since Sun 2018-05-13 21:49:01 ADT; 49s ago Docs: man:systemd.special(7) May 13 21:49:01 raspberrypi systemd[1]: Reached target Bluetooth. ● bluetooth.service - Bluetooth service Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2018-05-13 21:49:01 ADT; 49s ago Docs: man:bluetoothd(8) Main PID: 432 (bluetoothd) Status: "Running" CGroup: /system.slice/bluetooth.service └─432 /usr/libexec/bluetooth/bluetoothd May 13 21:49:01 raspberrypi systemd[1]: Starting Bluetooth service... May 13 21:49:01 raspberrypi bluetoothd[432]: Bluetooth daemon 5.49 May 13 21:49:01 raspberrypi systemd[1]: Started Bluetooth service. May 13 21:49:01 raspberrypi bluetoothd[432]: Starting SDP server May 13 21:49:01 raspberrypi bluetoothd[432]: Bluetooth management interface 1.14 initialized

    Parfait! Tout semble être correct, il n'y a plus de messages d'échec. Toutefois, il y a encore une pièce manquante, bluez-alsa, le pont entre l'audio Bluetooth et ALSA, le pilote du son sur Linux. Heureusement, il est facilement ajouté.

    pi@raspberrypi:~ $ sudo apt install bluealsa ... The following NEW packages will be installed: bluealsa libbluetooth3 libsbc1 0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. Need to get 170 kB of archives. After this operation, 504 kB of additional disk space will be used. Do you want to continue? [Y/n] y

    Ceci lance le service immédiatement et il devrait être possible d'établir une connexion avec une enceinte Bluetooth sans redémarrer le Raspberry Pi 3.

    Deux textes m'ont donné presque toute l'information nécessaire pour en arrivé ici.

    Updating BlueZ on Raspberry Pi (5.43 to 5.48)
    de max sur SCRIBLES, 2018-02-14.
    How to connect to Bluetooth LE devices without being root
    de Douglas6 sur le forum Raspberry Pi, 2013-03-16.

  5. Connexion de périphériques audio Bluetooth
  6. Connecter des haut-parleurs Bluetooth au Raspberry Pi est relativement simple surtout si la puce Bluetooth est déjà en marche.

    pi@raspberrypi:~ $ bluetoothctl Agent registered [bluetooth]# scan on Discovery started [CHG] Controller B8:27:EB:B2:91:B5 Discovering: yes ... [NEW] Device 30:21:3E:31:C6:2B AUDIOPOD2b [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 [CHG] Device 30:21:3E:31:C6:2B Connected: yes Connection successful [CHG] Device 30:21:3E:31:C6:2B ServicesResolved: yes "ding dong" du haut-parleur signalant la connexion

    Si Bluetooth n'est pas en marche, activer la découverte ne fonctionnera pas. C'est nécessaire de mettre en marche la puce avant de continuer comme indiqué ci-dessus.

    pi@raspberrypi:~ $ bluetoothctl Agent registered [bluetooth]# scan on Failed to start discovery: org.bluez.Error.NotReady [bluetooth]# power on [CHG] Controller B8:27:EB:B2:91:B5 Class: 0x006c0000 Changing power on succeeded [CHG] Controller B8:27:EB:B2:91:B5 Powered: yes [bluetooth]# scan on Discovery started [CHG] Controller B8:27:EB:B2:91:B5 Discovering: yes ...

    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, une fois qu'il a été apparié. Si l'on commande au contrôleur, tel le Raspberry Pi 3, de « faire confiance » à un périphérique déjà apparié, la connexion est rétablie automatiquement lorsque le périphérique est approché de ce contrôleur. Faire confiance à un appareil déjà associé est une procédure simple.

    [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]# info 30:21:3E:31:C6:2B Device 30:21:3E:31:C6:2B (public) Name: AUDIOPOD2 Alias: AUDIOPOD2 Class: 0x00240408 Icon: audio-card Paired: yes Trusted: yes Blocked: no Connected: yes LegacyPairing: no UUID: Headset (00001108-0000-1000-8000-00805f9b34fb) UUID: Audio Sink (0000110b-0000-1000-8000-00805f9b34fb) UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb) UUID: A/V Remote Control (0000110e-0000-1000-8000-00805f9b34fb) UUID: Handsfree (0000111e-0000-1000-8000-00805f9b34fb) RSSI: -55 [AUDIOPOD2]# quit or exit pi@raspberrypi:~ $

    Quand tous les périphériques Bluetooth ont été appariés, il est probablement préférable d'arrêter la découverte. Apparemment, celle-ci peut interférer avec certaines opérations. Encore une fois, ce n'est pas difficile.

    pi@raspberrypi:~ $ bluetoothctl Agent registered [bluetooth]# scan off Discovery stopped

    Si, au lieu d'afficher Discovery stopped, l'utilitaire affiche quelque chose comme Failed to stop discovery: org.bluez.Error.Failed, il ne faut pas s'inquiéter; la découverte était déjà désactivée. Notons qu'il n'est pas nécessaire d'activer la découverte pour que se réalise la connexion automatique d'un périphérique Bluetooth pour autant que le contrôleur lui fait déjà confiance. La découverte il est seulement utilisé pour découvrir l'adresse MAC des nouveaux périphériques Bluetooth afin de les apparier, ce qui signifie les ajouter à la base de données du contrôleur des périphériques connus.

    J'ai utilisé l'outil d'introspection D-Bus busctl pour surveiller l'état du haut-parleur Bluetooth.

    pi@raspberrypi:~ $ 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 ├─/org/bluez/hci0/dev_5C_21_CB_1C_D3_56 └─/org/bluez/hci0/dev_B8_78_2E_44_D5_DE

    L'appareil Bluetooth connecté est facilement identifié; c'est le seul qui possède un descripteur fd0. Les deux autres périphériques répertoriés, qui ne sont pas connectés, sont probablement mon ordinateur de bureau et un autre Raspberry Pi 3 qui se trouvaient à proximité.

    D'après le statut du servicee Bluetooth, il y aurait deux problèmes.

    pi@raspberrypi:~ $ sudo systemctl status bluetooth.service ● bluetooth.service - Bluetooth service Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2018-05-13 21:49:01 ADT; 42min ago Docs: man:bluetoothd(8) Main PID: 432 (bluetoothd) Status: "Running" CGroup: /system.slice/bluetooth.service └─432 /usr/libexec/bluetooth/bluetoothd May 13 21:49:01 raspberrypi systemd[1]: Starting Bluetooth service... May 13 21:49:01 raspberrypi bluetoothd[432]: Bluetooth daemon 5.49 May 13 21:49:01 raspberrypi systemd[1]: Started Bluetooth service. May 13 21:49:01 raspberrypi bluetoothd[432]: Starting SDP server May 13 21:49:01 raspberrypi bluetoothd[432]: Bluetooth management interface 1.14 initialized May 13 21:54:18 raspberrypi bluetoothd[432]: a2dp-sink profile connect failed for 30:21:3E:31:C6:2B: Protocol not available May 13 21:59:07 raspberrypi bluetoothd[432]: Endpoint registered: sender=:1.11 path=/A2DP/SBC/Source/1 May 13 21:59:07 raspberrypi bluetoothd[432]: Endpoint registered: sender=:1.11 path=/A2DP/SBC/Sink/1 May 13 22:13:25 raspberrypi bluetoothd[432]: Endpoint registered: sender=:1.11 path=/A2DP/SBC/Source/2 May 13 22:13:26 raspberrypi bluetoothd[432]: Unable to get io data for Headset Voice gateway: getpeername: Transport endpoint is not connected (107)

    Je n'ai pas encore étudié la raison pour ces messages, mais ils ne semblent pas significatifs.

    Autant que je sache, un appareil tel qu'un haut-parleur ne peut être connecté qu'à un seul contrôleur à la fois. Il faut en tenir compte. J'avais connecté et décrété fiable un haut-parleur Bluetooth avec mon ordinateur de bureau. Je devais déconnecter le haut-parleur de ce dernier et m'assurer que l'ordinateur bureau ne lui faisait plus confiance pour que le contrôleur RPi3 puisse se connecter au même haut-parleur encore à proximité de l'ordinateur de bureau. C'est facile à faire. Voici comment faire sur le RPi3, mais c'est exactement la même chose avec Ubuntu sur l'ordinateur bureau.

    pi@raspberrypi:~ $ bluetoothctl [AUDIOPOD2]# untrust 30:21:3E:31:C6:2B [CHG] Device 30:21:3E:31:C6:2B Trusted: no Changing 30:21:3E:31:C6:2B untrust succeeded [AUDIOPOD2]# disconnect 30:21:3E:31:C6:2B Attempting to disconnect from 30:21:3E:31:C6:2B [CHG] Device 30:21:3E:31:C6:2B ServicesResolved: no Successful disconnected [CHG] Device 30:21:3E:31:C6:2B Connected: no "trrong trring" from the speaker signalling it was disconnected: [bluetooth]# quit pi@raspberrypi:~ $

    Tant que l'enceinte reste appariée, et il est possible de se connecter ou de se déconnecter à elle avec une seule commande canalisée vers bluetoothctl avec un tube Linux (pipe). Cela pourrait être utile dans les scripts bash.

    pi@raspberrypi:~ $ echo -e "connect 30:21:3E:31:C6:2B" | bluetoothctl Agent registered [bluetooth]# connect 30:21:3E:31:C6:2B Attempting to connect to 30:21:3E:31:C6:2B pi@raspberrypi:~ $ echo -e "disconnect 30:21:3E:31:C6:2B" | bluetoothctl Agent registered [AUDIOPOD2]# disconnect 30:21:3E:31:C6:2B Attempting to disconnect from 30:21:3E:31:C6:2B

    Le haut-parleur signale par un son la connexion est établie ou brisée confirmant ainsi le succès de l'opération. La sortie de l'utilitaire de contrôle est plus propre que dans la version précédente, mais elle peut être entièrement supprimée en l'envoyant à l'unité null comme dans la commande suivante.

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

    Enfin, pour « dissocier » un périphérique, c'est-à-dire supprimer son adresse MAC de la base de données des périphériques connus, utilisez la commande remove <mac_du_périphérique> dans bluetoothctl. Évidemment, l'adresse MAC du périphérique (quelque chose comme 30:21:3E:31:C6:2B) doit être spécifiée. Pour connecter le périphérique à l'avenir, il devra être apparié à nouveau.

  7. Transmettre un flux audio aux périphériques audio Bluetooth
  8. Maintenant il est temps d'essayer de faire sortir un son du haut-parleur. Pour ce faire, il faut un fichier WAV (codé PCM de 16 ou 32 bits signés) sur le RPi3. J'ai utilisé Audacity pour exporter un morceau de musique MP3 vers les formats 16 et 32 ​​bits et les ai enregistrés dans un répertoire nommé sound. Juste pour m'assurer que le fichier était correct, je l'ai joué en utilisant des haut-parleurs connectés à la prise 3,5 mm du Raspberry Pi.

    pi@raspberrypi:~ $ cd sound pi@raspberrypi:~/sound $ aplay test16.wav Playing WAVE 'test16.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo

    Si vous voyez ce résultat sur le terminal comme si tout fonctionnait alors qu'aucun son n'est entendu, regardez la section suivante sur le contrôle du niveau sonore. Rappelons que ceci est fait sur une nouvelle installation de Raspbian. Il n'y a donc pas de fichier de configuration ALSA, .asoundrc, en place.

    Connectez un haut-parleur Bluetooth comme expliqué ci-dessus. En suivant les instructions de configuration et d'utilisation sur le site bluez-alsa, Configuration & Usage, la commande suivante enverra le flux audio au haut-parleur Bluetooth.

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

    Bien sûr, il faut remplacer 30:21:3E:31:C6:2B par la bonne adresse MAC du haut-parleur Bluetooth.

    Il n'y a qu'un dispositif Bluetooth sur le Raspberry Pi 3 comme le confirme la commande hciconfig.

    pi@raspberrypi:~ $ hciconfig -a hci0: Type: Primary Bus: UART BD Address: B8:27:EB:B2:91:B5 ACL MTU: 1021:8 SCO MTU: 64:1 UP RUNNING PSCAN RX bytes:23037554 acl:53965 sco:0 events:1104 errors:0 TX bytes:15376 acl:217 sco:0 commands:527 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: 'raspberrypi' Class: 0x6c0000 Service Classes: Rendering, Capturing, Audio, Telephony Device Class: Miscellaneous, HCI Version: 4.1 (0x7) Revision: 0x168 LMP Version: 4.1 (0x7) Subversion: 0x2209 Manufacturer: Broadcom Corporation (15)

    Il est donc possible de simplifier un peu la commande en n'incluant pas le dispositif Bluetooth à utiliser. De façon un peu semblable, le profil a2dp est utilisé par défaut et il n'est donc pas nécessaire de le spécifier.

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

    On se doute qu'il est possible de spécifier le périphérique de lecture dans le fichier de configuration .asoundrc. Cependant, j'ai été un peu surpris par la syntaxe que je n'avais pas vue auparavant et qui ne correspond pas à ce que je faisais auparavant.

    pi@raspberrypi:~/sound $ nano ~/.asoundrc
    defaults.bluealsa.interface "hci0" defaults.bluealsa.device "30:21:3E:31:C6:2B" defaults.bluealsa.profile "a2dp" defaults.bluealsa.delay 10000

    C'est ce qu'on recommande sur la page bluez-alsa page et il s'avère que cette approche minimaliste rend bien plus facile l'utilisation du lecteur Music On Console (MOC) pour jouer les flux audio avec la carte de son du Raspberry Pi aussi bien qu'avec un haut-parleur Bluetooth. Avec ce fichier en place, la commande pour jouer le fichier WAV avec le haut-parleur Bluetooth est bien plus simple.

    pi@raspberrypi:~/sound $ aplay -D bluealsa test16.wav Playing WAVE 'test16.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo

  9. Contrôler le volume de lecture d'un haut-parleur Bluetooth
  10. Le contrôle du volume de lecture lors de l'utilisation du service ALSA est souvent très important. En effet, on pourrait supposer qu'une installation ne fonctionne pas du tout parce que rien n'est entendu alors que le seul problème est que la sortie sonore a été complètement éteinte ou le volume de sortie est beaucoup trop faible.

    Il y a deux utilitaires ALSA qui peuvent être utilisés pour contrôler le volume, amixer qui est un utilitaire de ligne de commande traditionnel et alsamixer qui a une interface utilisateur graphique en mode texte plus conviviale. Avec ce dernier, le volume est réglé en utilisant les touches du curseur gauche et droite pour choisir le contrôle, puis les touches du curseur haut et bas pour régler le niveau sonore. L'un ou l'autre utilitaire peut être utilisé dans un deuxième terminal lorsque le son est joué avec aplay dans le premier terminal. Je recommande d'utiliser alsamixer initialement; amixer est préférable pour une utilisation dans les scripts.

    Lancez l'alsamixer en spécifiant le périphérique bluealsa. Vous pouvez démarrer l'utilitaire sans le paramètre -D mais lorsque vous appuyez sur la touche F6 pour sélectionner une carte son, bluealsa ne sera pas listé. Cependant, vous pouvez utiliser l'option entrer le nom du périphérique... (enter device name..., puis entrer manuellement bluealsa. Il est plus facile de le faire sur la ligne de commande. L'image ci-dessous est recyclée d'un billet précédent, dans le contexte actuel, elle dirait pi@raspberrypi:~ sur la barre de légende de la fenêtre.

    pi@raspeberrypi:~/sound $ alsamixer -D bluealsa

    Appuyez sur F3 pour voir les dispositifs de lecture. Utilisez les touches de curseur gauche et droite pour sélectionner le périphérique AUDIOPOD2 - A2DP (évidemment le nom dépend du matériel utilisé). Utilisez ensuite les touches du curseur haut et bas pour régler le volume de la sortie. Comme je l'ai dit, cela est mieux fait en jouant un fichier son dans un autre terminal afin d'entendre le niveau sonore. Comme indiqué sur l'écran, fermez l'application en appuyant sur la touche Echap.

    Le volume peut aussi être défini avec l'utilitaire de ligne de commande.

    pi@raspeberrypi:~/sound $ 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 total alors qu'il est déjà à 50%, demandez une diminution de 20% comme suit.

    pi@raspeberrypi:~/sound $ 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]
    Ainsi, 20%- n'est pas une réduction de 20% du volume actuel car cela aurait porté le volume à 40% du maximum (20% de 50% est de 10% et 50% - 10% donnent 40%.

  11. Recevoir un flux audio de dispositifs audio Bluetooth
  12. La situation peut être inversée et le Raspberry Pi peut être utilisé comme haut-parleur Bluetooth (s'il est branché à un haut-parleur amplifié bien sûr). Il y a des commentaires sur le Web sur la bêtise de cela étant donné le faible prix des haut-parleurs Bluetooth dédiés. D'accord, mais j'ai une utilité pour cette fonctionnalité. Je vais utiliser mon Raspberry Pi pour mettre à jour un bon système de son relativement cher pour qu'il puisse diffuser des stations de radio Internet. Il serait utile de pouvoir utiliser une tablette pour trouver de nouvelles stations sur le Web et les transmettre au système audio jusqu'à ce que je décide de mettre à jour la base de données des stations radio Internet sur le RPi3 lui-même. En plus, j'envisage de faire jouer la trame sonore de vidéo vue sur la tablette avec le système de son.

    Pour mes premiers tests, j'ai utilisé un service nommé A simple Bluetooth Speaker Daemon for the Raspberry Pi 3 de lukasjapan (Lukas qui s'identifie comme «[the] german Full Stack Software Engineer currently working and living in Tokyo»). Je suivais les instructions de Markus Järvisalo Making the Raspberry Pi 3 a bluetooth audio receiver qui datent de décembre 2017, sans avoir mis à jour la version 5.43 de la pile BleuZ fournie avec Rasbian Stretch. J'ai été un peu déçu par le retard de la sortie audio et c'est ce qui m'a incité à mettre à jour le paquet bluealsa. Si vous décidez d'essayer le démon de Lukas, je recommande de ne pas suivre les instructions de Markus sur la mise à jour. La séquence habituelle ./configure, make et sudo make install, comme décrite dans la section 2 ci-dessus fonctionne très bien.

    Il n'est pas nécessaire d'installer quoi que ce soit, BleuZ tout ce qu'il faut pour jouer un flux audio Bluetooth. En effet, il a son propre utilitaire de lecture: bluealsa-aplay dont l'utilisation ne pourrait être plus simple. Encore une fois, merci à max chez SCRIBBLES pour avoir souligné cette possibilité. Voici en gros comment procéder.

    Le plus difficile était d'établir la connexion Bluetooth entre la tablette et le Raspberrry Pi. C'était une première tentative avec beaucoup de tâtonnements. J'ai trouvé l'expérience un peu déroutante et je ne peux pas me rappeler de la démarche exacte. Je l'ai fait à nouveau de manière plus contrôlée avec un Acer Iconia (Android 7.0), en prenant quelques captures d'écran en cours de route. Je vais montrer les étapes ci-dessous, mais attendez-vous à ce que les détails soient différents d'un appareil à l'autre et avec différentes versions d'Android. Bien sûr, cela pourrait être fait avec une tablette IOS, mais encore une fois les détails seront différents.

    1. Accédez à Paramètres sur la tablette Android, puis passez à Bluetooth et, si elle est désactivée, réglez-la sur Activé en faisant glisser le contrôle vers la droite.



      On peut voir qu'aucun dispositif Bluetooth n'avait été trouvé.
    2. Démarrez l'utilitaire bluetoothctl sur le Rpi3 et rendez le Raspberry Pi détectable.
      pi@raspberrypi:~ $ bluetoothctl Agent registered [bluetooth]# discoverable on Changing discoverable on succeeded [CHG] Controller B8:27:EB:B2:91:B5 Discoverable: yes [bluetooth]#
    3. Attendez que raspberrypi apparaisse comme périphérique disponible sur la tablette.

      Impatient? Désactivez puis activez Bluetooth, le RPi3 sera trouvé immédiatement.
    4. Appuyez sur l'icône du casque d'écoute raspberrypi ou sur l'étiquette elle-même. Juste en dessous, Association... s'affichera en gris, puis une fenêtre de dialogue apparaîtra vous demandant si l'appareil doit être associé.

      Cliquez sur le bouton ASSOCIER. Sur le RPi3, bluetoothctl montrera que la tablette a été découverte, mais qu'elle n'est pas connectée.
      bluetoothctl [CHG] Device 68:B3:5E:48:E2:5F Connected: yes [CHG] Device 68:B3:5E:48:E2:5F Connected: no
      Lorsque l'appariement est terminé, le raspberrypi sera désormais classé comme périphérique associé.
    5. Depuis le Raspberry Pi, connectez-vous à la tablette.
      [bluetooth]# connect 68:B3:5E:48:E2:5F Attempting to connect to 68:B3:5E:48:E2:5F [CHG] Device 68:B3:5E:48:E2:5F Connected: yes Connection successful [CHG] Device 68:B3:5E:48:E2:5F ServicesResolved: yes
      Maintenant la tablette affiche que le RPi3 est un périphérique associé.
    6. Cliquez sur l'icône en forme de roue dentée à côté de raspberrypi et assurez-vous que l'appareil peut être utilisé pour le Multimédia.
      Maintenant, tout le flux audio de la tablette Android est détourné des haut-parleurs internes pour être diffusé sur la connexion Bluetooth.
    7. L'utilitaire bluetoothctl peut être fermé ou une nouvelle session de terminal peut être ouverte, pour lancer lecteur BlueZ ALSA.
      [B3-A40]# quit pi@raspberrypi:~ $ bluealsa-aplay 00:00:00:00:00:00
    8. Pour tester, faite jouer du contenu audio sur la tablette, en visionnant une vidéo YouTube ou en écoutant une station de radio Internet ou un enregistrement, qu'importe. Utilisez le contrôle du volume de la tablette pour régler le niveau sonore. Si le son est toujours trop faible, utilisez alsamixer sur le Raspeberry Pi pour régler le volume du mélangeur à 100 (n'utilisez pas l'option -D, c'est un mélangeur PCM pour la prise 3,5 mm qui est en cours de réglage).

    Pourquoi l'adresse MAC 00:00:00:00:00:00 dans cette dernière invocation de bluealsa-aplay alors que l'adresse réelle du périphérique Bluetooth du Nexus était utilisée auparavant ? Parce que je suis paresseux.

    pi@raspberrypi:~ $ bluealsa-aplay --help Usage: bluealsa-aplay [OPTION]... ... Options: -h, --help print this help and exit -V, --version print version and exit -v, --verbose make output more verbose -i, --hci=hciX HCI device to use -d, --pcm=NAME PCM device to use --pcm-buffer-time=INT PCM buffer time --pcm-period-time=INT PCM period time --profile-a2dp use A2DP profile --profile-sco use SCO profile --single-audio single audio mode Note: If one wants to receive audio from more than one Bluetooth device, it is possible to specify more than one MAC address. By specifying any/empty MAC address (00:00:00:00:00:00), one will allow connections from any Bluetooth device.

    La note dit: « Si vous souhaitez recevoir de l'audio de plus d'un périphérique Bluetooth, il est possible de spécifier plus d'une adresse MAC. En spécifiant une adresse MAC vide (00:00:00:00:00:00), on permettra à n'importe quel dispositif Bluetooth de se connecter.»

    Si le son est saccadé, désactivez l'interface Wi-Fi. Comme indiqué dans la première section, une seule puce, parfois débordée; est responsable à la fois du Wi-Fi et du Bluetooth sur le Raspberry Pi 3 et Raspberry Pi Zero W. Arrêtez également la découverte Bluetooth.

    pi@raspberrypi:~ $ sudo ip link set wlan0 down pi@raspberrypi:~ $ echo -e "scan off" | bluetoothctl Agent registered [B3-A40]# scan off

    Quand on écoute de cette façon l'audio d'une vidéo jouant sur la tablette, il y a un retard ennuyeux. On a l'impression de voir un vieux film américain ou italien avec une trame sonore française mal synchronisée. Les paroles entendues ne correspondent pas aux mouvements des lèvres des acteurs. L'effet est encore pire lorsque le son du marteau arrive bien après que le clou soit déjà enfoncé dans les YouTube de bricolage. C'est un sujet de discussion sur le Web, mais je ne connais pas de solution. Dommage.

  13. Et encore ?
  14. On peut toujours faire plus; il faut savoir se contenter de ce qui a été réalisé à un moment donné, sinon il n'y a pas de fin. Ceci étant dit, se passer de la connectivité Wi-Fi si le Raspberry Pi 3 doit être utilisé comme récepteur Bluetooth n'est pas acceptable. J'ai besoin de placer mon RPi3 près du système de son où il n'y a pas de prise Ethernet.

    Il me semble qu'il y a deux façons de contourner ce problème: ajouter un adaptateur WiFi-USB ou ajouter un adaptateur Bluetooth-USB. Le seul que je possède est déjà en service sur mon Raspberry Pi 2 hébergeant mon système domotique. Je ne vais pas perturber ce système. En outre, je suis curieux d'essayer un adaptateur Bluetooth. À part la raison évidente, il se peut que l'impossibilité d'utiliser le profil SCO des haut-parleurs Bluetooth soit due à un défaut de la puce WiFi / Bluetooth BCM43438.

    L'appariement, la connexion des dispositifs Bluetooth et le lancement de l'utilitaire de lecture devraient être simplifiés et automatisés autant que possible. Je n'ai pas encore examiné cela, mais j'ai une bonne référence qui, je l'espère, sera utile plus tard. Et pendant ce temps, voici la référence pour l'utilisation de bluealsa-aplay. Ce n'est qu'après avoir lu ce message que j'ai pu comprendre les instructions sur le site BlueZ.

    Headless A2DP Audio Streaming on Raspbian Stretch de Tucker Kern
    https://gist.github.com/mill1000/74c7473ee3b4a5b13f6325e9994ff84c.
    Streaming Bluetooth Audio from Phone to Raspberry Pi using ALSA de max chez SCRIBBLES.
    https://scribles.net/streaming-bluetooth-audio-from-phone-to-raspberry-pi-using-alsa/.
<-Premier pas avec Bluetooth sur un Raspberry Pi 3 - Raspbian (Stretch) A Note on BlueAlsa 0.9 with BlueZ 5.43 on Rasbian Stretch->
<-Music on Console, ALSA, and Bluetooth on Raspbian Stretch)