Une enceinte Bluetooth stéréo et NFC avec le Raspberry Pi

Un petit montage amusant né d’un question simple : comment est-ce que l’appairage d’une enceinte NFC fonctionne ? La réponse l’est assez (simple) : la puce NFC contient l’adresse MAC (aucun rapport avec Apple) de l’enceinte Bluetooth et un petit bout de code qui prévient le smartphone qu’il faut se connecter à l’enceinte. J’ai donc essayé de me programmer ma propre enceinte Bluetooth, avec un Raspberry Pi.
NFC

Qu’est-ce qu’il faut ?

Pour la partie enceinte, un Raspberry Pi (modèle B 256 Mo, ici), un adaptateur Bluetooth USB (j’en avais un qui traînait) et des enceintes. ici, j’ai testé avec la (mauvaise) sortie jack du Raspberry Pi mais on peut forcer la sortie HDMI ou une carte son USB.
Pour la partie NFC, il faut un tag NFC (j’ai utilisé des NTAG203) et un smartphone Android compatible NFC pour programmer le tag.

Comment ça marche

C’est assez simple : si vous passez le smartphone — Android, BlackBerry, Windows Phone, Symbian, tout sauf l’iPhone — sur le tag, il va normalement se connecter à l’enceinte. Attention au type de tag NFC : les téléphones récents veulent du NTAG203 (« compatible Galaxy S 4 »), donc n’essayer pas de tester — comme moi — avec un vieux MiFare. Si votre tag est incompatible (ça arrive), les résultats varient d’une erreur (BlackBerry), un bruit mais pas de réaction (Nexus 4) à « Ce tag n’est pas pris en charge » (Galaxy Zoom).

Côté Raspberry Pi

Le tuto provient en partie de là, avec quelques modifications. Attention, le fonctionnement reste assez aléatoire, sur trois installations, une n’a jamais accepté de fonctionner. Et bien évidemment, on est sur le codec de base en Bluetooth, le SBC, l’AptX n’est pas supporté (il nécessite une licence), ni l’AAC.

On installe les dépendances

sudo apt-get install bluez pulseaudio-module-bluetooth python-gobject python-gobject-2 bluez-tools

On adapte pulse audio.

sudo usermod -a -G lp pi

On modifie un fichier.

sudo nano /etc/bluetooth/audio.conf

Et on ajoute la ligne Enable=Source,Sink,Gateway,Socket,Media sous [General].

On modifie un fichier.

sudo nano /etc/bluetooth/main.conf

Donner un nom à votre appareil, après Name=, et ajouter la classe de l’appareil (Class = 0x20041C).

Récupérez l’adresse MAC de votre adaptateur.

hcitool dev

Allez modifiez une fichier.

sudo nano /var/lib/bluetooth/adress:MAC/config

Modifiez le nom et la classe dans le fichier (0x20041C).

On modifie un fichier.

sudo nano /etc/pulse/daemon.conf

Sous les lignes qui commencent par resample, ajouter la ligne suivante.

resample-method = trivial

Créer le script suivant.

sudo nano /etc/udev/rules.d/99-input.rules

Dans le fichier, ajoutez la ligne suivante.

KERNEL=="input[0-9]*", RUN+="/usr/lib/udev/bluetooth"

On crée un script.

sudo mkdir /usr/lib/udev
sudo nano /usr/lib/udev/bluetooth

Avec le contenu suivant.

#!/bin/sh

#change if you don't use default audio out
AUDIOSINK="alsa_output.platform-bcm2835_AUD0.0.analog-stereo"

echo "Executing bluetooth script...|$ACTION|" >> /var/log/bluetooth_dev

ACTION=$(expr "$ACTION" : "\([a-zA-Z]\+\).*")
if [ "$ACTION" = "add" ]
then
for dev in $(find /sys/devices/virtual/input/ -name input*)
do
if [ -f "$dev/name" ]
then
mac=$(cat "$dev/name" | sed 's/:/_/g')
bluez_dev=bluez_source.$mac

sleep 1

CONFIRM='sudo -u pi pactl list short | grep $bluez_dev'
if [ ! -z "$CONFIRM" ]
then
echo "Setting bluez_source to: $bluez_dev" >> /var/log/bluetooth_dev
echo pactl load-module module-loopback source=$bluez_dev sink=$AUDIOSINK rate=44100 adjust_time=0 >> /var/log/bluetooth_dev
sudo -u pi pactl load-module module-loopback source=$bluez_dev sink=$AUDIOSINK rate=44100 adjust_time=0 >> /var/log/bluetooth_dev
fi
fi
done
fi

On donne les bons droits.

sudo chmod 774 /usr/lib/udev/bluetooth

Maintenant, un script de démarrage.

sudo nano /etc/init.d/bluetooth-agent

Avec le contenu suivant.

### BEGIN INIT INFO
# Provides: bluetooth-agent
# Required-Start: $remote_fs $syslog bluetooth pulseaudio
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Makes Bluetooth discoverable and connectable to 0000
# Description: Start Bluetooth-Agent at boot time.
### END INIT INFO
#! /bin/sh
# /etc/init.d/bluetooth-agent
USER=root
HOME=/root
export USER HOME
case "$1" in
start)
echo "setting bluetooth discoverable"
sudo hciconfig hci0 piscan
start-stop-daemon -S -x /usr/bin/bluetooth-agent -c pi -b -- 0000
echo "bluetooth-agent startet pw: 0000"
;;
stop)
echo "Stopping bluetooth-agent"
start-stop-daemon -K -x /usr/bin/bluetooth-agent
;;
*)
echo "Usage: /etc/init.d/bluetooth-agent {start|stop}"
exit 1
;;
esac
exit 0

On donne les bons droits.

sudo chmod 755 /etc/init.d/bluetooth-agent
sudo update-rc.d bluetooth-agent defaults

Maintenant, une petite modification pour pulse audio.

sudo nano /etc/inittab

Commentez la ligne suivante avec un #.

1:2345:respawn:/sbin/getty 115200 tty1

Ajoutez la ligne suivante.

1:2345:respawn:/bin/login -f pi tty1 /dev/tty1 2>&1

Maintenant, il suffit de redémarrer.

Si ça marche, un Mac ou un iPhone devrait voir l’appareil en tant qu’enceinte Bluetooth et s’y connecter (code classique, 0000).

Truc à savoir, dans certains cas, le Raspberry ne sort pas le son qui provient de l’appareil, il faut entrer la ligne suivante. Ca m’est arrivé avec un Mac sous Mavericks et un smartphone Android, alors que l’iPhone ou un autre smartphone Android n’ont pas ce souci. Il faut mettre l’adresse MAC Bluetooth de l’appareil qui émet, avec les valeurs séparées d’un _.

pactl load-module module-loopback source=bluez_source.adresse_MAC sink=alsa_output.platform-bcm2835_AUD0.0.analog-stereo rate=44100 adjust_time=0

La partie NFC

La partie NFC est plus simple. Première chose, il faut un smartphone Android équipé en NFC et déjà appairé à votre enceinte. Ensuite, il faut installer l’application Easy Pairing Tag Writer (et éventuellement une application NXP).

On choisit l'enceinte

On choisit l’enceinte


On clique sur write

On clique sur write


Next

Next

On met le tag au bon endroit, on attend et… c’est fini.

Done

Done

Voilà, c’est fini.

Normalement, ça marche avec la majorité des téléphones NFC, il suffit d’effleurer le tag NFC et le Bluetooth s’activera, l’enceinte se connectera et le son passera sur l’enceinte. Techniquement, on peut appairer n’importe quel appareil Bluetooth de cette façon…