Configuration d'un RPI 3B+ en récepteur bluetooth audio

Bonjour à tous,
Suite à une panne j’ai été obligé de reconfigurer le RPI 3B qui me sert de récepteur bluetooth audio. On se connecte en bluetooth au RPI depuis un smartphone sans interaction autre qu’accepter le code au moment de l’association entre eux des appareils. Le RPI a sa sortie son branchée sur l’ampli et donc on a le son du smartphone sur l’ampli et les enceintes.
Avant la panne ça fonctionnait très bien. Depuis j’ai réussi à réinstaller un système qui ne fonctionne que moyennement: on peut se connecter/déconnecter quelques fois puis le système bloque et il faut rebooter la framboise. Le son à l’air stable.
Si vous voulez reproduire l’expérience depuis une installation fraîche voilà la procédure qui finalement fonctionne le moins mal.

  1. Matériel:
    Dans un LAN, un RPI 3B connecté via un cable Jack/RCA à un ampli. On administre le RPI en SSH depuis le LAN, il faut un paramétrage DHCP dans la box.

2.Installation:

  • Avec RPI Os imager, choisir Raspberry Pi OS 64bits light comme image. On utilise le paramétrage de RPI Os imager pour pouvoir accéder au RPI en SSH dès le premier démarrage.
  • Au premier redémarrage on fait d’abord un :
    sudo apt update
    et un
    sudo apt upgrade -y
    qui mettent le système à jour. Ensuite je reboote:
    sudo reboot
    Au redémarrage on installe ces paquets:
  • « screen » qui est un gestionnaire de session
  • « bluetooth » qui,si j’ai bien compris, met à jour la dernière version du contrôleur « bluetoothctl »
  • « bluez » qui, si j’ai bien compris, permet entre autre de faire de transmettre l’audio par le bluetooth
    -« bluez-utils » qui permet d’installer l’agent « bt-agent » et la commande « bt-adapter »
    sudo apt install screen bluetooth bluez bluez-utils
    Enfin on se crée un dossier « bluetooth » en guise d’espace de travail
cd /home/sigmund/
mkdir bluetooth
cd bluetooth

3-paramétrage

Si on suit la plupart des tutos du Net sur le sujet, on aborde forcément comment utiliser le contrôleur « bluetoothctl ». Cependant m’est avis que bluetoothctl fonctionne de manière très aléatoire. Modifier /etc/bluetooth/main.conf est censé passer un paramétrage bluetoothctl mais cela fonctionne très mal. Le paramétrage proposé permet de se passer totalement de bidouiller « bluetoothctl ». J’utilise même un main.conf vide:

cd /etc/bluetooth
sudo cp main.conf main.conf.bak
sudo rm main.conf; sudo touch main.con

La suite consiste à créer un script de paramétrage qui se lancera à chaque démarrage. Appelons le « bt-launcher »:
sudo nano "bt-launcher"
Comme c’est un script simple la première ligne est:
#!/bin/sh
et la dernière:
exit 0
Voyons ce qu’on met entre les deux. La commande hciconfig permet, si j’ai saisie, de procéder à un premier paramétrage au niveau de l’interface. Donc après la première ligne on ajoute ces lignes les unes après les autres:

sudo hciconfig hci0 up     # active l'interface 
sudo hciconfig noauth    # déactive l'authentification
sudo hciconfig piscan     # active la visiblité de l'interface bluetooth
sudo hciconfig hci0 lm accept    # "the device will accept baseband connections even when there are no listening AF_BLUETOOTH sockets. (man hciconfig)"
sudo hciconfig hci0 sspmode 1     # active le "Simple Pairing Mode", réglage empirique
bt-adapter --set DiscoverableTimeout 0     # rend la visibilité de l'interface constante
bt-adapter --set PairableTimeout 0      # rend l'appairage constant
bt-adapter --set Discoverable on     # active la visibilité
bt-adapter --set Pairable on     # active l'appairage
sudo bt-agent --capability=DisplayOnly --pin /home/denis/bluetooth/pin # lance l'agent de façon à ce que l'utilisateur n'ai pas de code à saisir, juste un code à confirmer; le code est paramétré dans le fichier "pin"

On rend le script exécutable avec:
sudo chmod +x bt-launcher
Il faut aussi créer le fichier « pin » avec le paramétrage dedans:
sudo nano pin
dedans on place ceci:
* *
on sauvegarde. Il y a 5 espaces entre les deux astérisques. La première astérisque correspond à la l’adresse mac d’une interface cliente, la deuxième au code pin correspondant. Ce paramétrage à double astérisque signifie « pour n’importe quel adresse mac correspond un code aléatoire ».
Il faut aussi corriger les droits du fichier sans quoi on obtient un message d’erreur:
sudo chmod 550 pin
Ici, avant de le lancer au démarrage, on peut tester que le script ne renvoie pas d’erreur en l’exécutant:
./bt-launcher
On remarque que le script s’exécute correctement mais semble gelé, on ne revient pas au prompt. (« Ctrl + c » permet de revenir au prompt mais termine l’exécution de bt-agent.)
A ce stade une connexion bluetooth depuis un smartphone devrait fonctionner: l’interface du RPI est visible, l’appairage affiche simplement un code sur le smartphone qu’il faut confirmer, ce dernier se connecte au Rpi en détectant le bon service.
Pour rendre pérenne ce changement on va exécuter le script au démarrage de la machine. On édite le fichier /etc/rc/local:
sudo nano /etc/rc.local
Et juste avant la dernière ligne « exit 0 » on place les lignes suivantes:

cd /home/sigmund/bluetooth
./bt-launcher

On sauvegarde et on redémarre la machine en se disant qu’au redémarrage on pourra se connecter sans problème. Et en essayant, on se prend un message d’erreur sur le smartphone. Là, grand mystère…Si on ouvre alors une session SSH et qu’on réessaie la connexion en bluetooth, elle fonctionne…Si on ferme la session SSH alors la connexion bt ne fonctionne plus. Du coup je lance une session ssh, un screen, je lance htop dans une fenêtre, je quitte en laissant la sesson screen active en utilisant screen -d avant exit, cela semble fonctionner comme ça. Plus ou moins car après quelques connexions/déconnexions ça ne fonctionne plus et il faut redémarrer le bouzin.

Vos commentaires sont les bienvenus, surtout si vous connaissez une façon d’obtenir un résultat stable. Merci de m’avoir lu.
Miaou.
Petit Chat

hello,

l’option -d (bt-agent(1) — Arch manual pages) devrait faire tourner le programme en tâche de fond et donc te rendre la main.

Salut bof, merci d’avoir porté attention à mon post et d’y avoir répondu. J’ai essayé d’ajouter un « -d » pour lancer le processus comme démon.

  • la connexion en bluetooth ne fonctionne pas
  • le redémarrage prend très très longtemps. Un coups d’œil dans les logs dit qu’il a échoué à fermer la session utilisateur.

En supprimant le « -d » le système refonctionne comme avant, la connexion bluetooth est possible et la machine redémarre rapidement.

Finalement voilà où j’en suis:
Lorsque je redémarre le RPI et que j’ouvre une session SSH dessus, là en général la connexion bluetooth fonctionne. Si un seul appareil (en l’occurrence un téléphone) cherche à se connecter/déconnecter, on a une chance que ça fonctionne. Si deux appareils cherchent à se connecter successivement, ça fonctionne une fois et rapidement la connexion ne se fait plus. Dans tous les cas, au bout d’un certains temps (pas très précis désolé), se connecter ne fonctionne plus et alors il faut redémarrer le RPI et ouvrir une session ssh.

Bonjour,

Je n’ai pas de solution immédiate mais j’avais dans mes favoris un tuto qui vise à faire la même chose mais en utilisant pulse audio et sans utiliser de script. C’est peut-être une solution de contournement intéressante ?

Je ne m’y connais pas vraiment mais j’enquêterais peut-être sur un problème d’autorisation ou de permission (ton user a les droits dans le groupe bluetooth ?) ??

Peut-être aussi prévoir dans ton script une déconnexion propre de l’appareil connecté en bluetooth, à l’interruption de ton script l’appareil reste peut être appairé côté raspi et bloque ensuite ?

Salut Jura39,
Je viens de trouver ton post, merci beaucoup de d’intéresser à ce sujet, les conseils et le tuto.
Je vais l’essayer dès que j’aurais le temps nécessaire. Je me demande si, avant que ma machine ne tombe en panne, ce n’était pas en utilisant justement le module bluetooth de Pulse-audio que ça fonctionnait, ça me dit quelque chose. Le système fonctionnait parfaitement bien, on pouvait sans problème se connecter, se déconnecter, même d’une machine étrangère au rpi, le son était fluide.

Dans ce tuto je vois une partie de configuration du fichier /etc/bluetooth/main.conf, j’ai longuement essayé de définir la classe de l’interface bt de bluetoothctl et ça ne fonctionne pas (et bluetoothctl néglige également la classe renseignée avec hciconfig). Dans ma config actuelle, j’ai l’impression qu’en installant bluez-tools la classe a trouvé une valeur satisfaisante. Ce point ne compromet pas forcément tout le tuto, en tout cas je n’avais pas penser au module bluetooth de PulseAudio.

Je vous tiens au courant de l’avancement du chantier, merci beaucoup pour vos post, ça m’aide humainement aussi devant l’humiliation d’être dominé par une machine. :laughing:

Pas de soucis le plaisir est partagé ! Entre passionnés il faut bien se donner la main de temps en temps sinon on serait entourés de presse papier onéreux !