Getestet wurde dieser Artikel mit einem Raspberry Pi 4B mit xfce4 als grafische Oberfläche. Ein Test mit einem Raspberry 3B ohne grafische Oberfläche aber mit WLan ist in Planung.
Bluetooth ist eine Funkverbindung mit der Grundfrequenz 2.4 GHz mit verschiedenen Kanälen, die dann die Bandbreite bilden.
Somit kollidiert Bluetooth mit WLan 2.4 GHz. Damit solche Kollisionen möglichst wenig sind, wird bei bestehenden Bluetooth-Verbindungen mehrmals pro Sekunde der Kanal gewechselt. Das erfordert etwas Energie in Milliwatt.
Man sollte gut überlegen, ob man beim Rasperry Pi unbedingt Bluetooth braucht. Weniger kann mehr sein. Für Audioein- und ausgaben kann das sinvoll sein, für Datenübertragungen würde ich jedoch das Netzwerk nutzen, da Bluetooth im Vergleich langsam ist.
Bluetooth-Verbindungen sind heutzutage sehr stabil (Ich war da anderer Meinung, aber das stimmt.) und 7 Geräte können miteinander verbunden werden. Werden Daten zu mehreren Geräten gleichzeitig übertragen, so leidet hier aber die Qualität der einzelnen Verbindungen.
Hier werden wir Bluetooth ausschließlich auf der Konsole einrichten. Beim Nutzen grafischer Programme wie blueman gab es Probleme bei mir. Natürlich dürft ihr die trotzdem nutzen.
In der Image-Datei von raspi-debian.net für Raspberry Pi 4 sind alle notwendigen Hardware-Implementationen für Bluetooth enthalten.
Bitte keine weiteren Packete "firmware-sonstwas" installieren. Da ensteht ein unreperables Troubleshooting, das sich nur mit einer Neuinstallation reparieren lässt.
Mehr erst mal nicht, wenn man es verstehen möchte.
Nun wurden der Server bluetoothd und der Client bluetoothctl (Bluetooth-Control) installiert. Der Server greift auf den Bluetooth-Adapter zu, der Client sagt, was der Server machen soll.
Hinweis: Sollte der Server bluetoothd einen funktionierenden Adapter gefunden haben, so wird standardmäßig bei jedem Neustart der Adapter eingeschaltet.
Man kann also bluetoothctl ohne Anweisung starten und sich dort bewegen, oder man gibt bluetoothctl eine Anweisung mit, wo hier bluetoothctl die Anweisung ausführt und beendet.
Bluetooth ein- und ausschalten
Mittels
bluetoothctl power on
sollte sich Bluetooth einschalten lassen. Mittels
bluetoothctl power off
sollte sich Bluetooth ausschalten lassen. Sind bereits grafische Programme für Bluetooth installiert, so kann es notwendig sein, voher die grafische Oberfläche zu starten.
Wenn das nicht funktioniert, wurde der Adapter nicht gefunden und man braucht nicht weiter machen. Die Hardware wurde nicht erkannt.
Zur Info: Nach einem Neustart des Systems ist Bluetooth standardmäßig eingeschaltet.
Das Gerät, mit dem die Verbindung hergestellt werden soll, muss auf "sichtbar" eingestellt sein.
Wir starten bluetoothctl in der Variante 1 und schalten es ein.
bluetoothctl
power on
Gerät suchen
Dazu nutzt man folgende Anweisung:
scan on
Nun werden alle Kanäle des Funkbereiches durchsucht, gefundene Geräte werden angezeigt, was etwas dauern kann.
Hat man das gewünschte Gerät gefunden, empfehle ich, den Discovery-Modus auszuschalten. Ansonsten nervt es bei dem weiteren Vorgehen, wenn irgend welche Leute mit Handies und Fittness-Trackern mit sichtbaren Bluetooth hier vorbei laufen.
scan off
Wichtig für uns ist nun die Geräte-Adresse, wo ich hier jetzt mal 12:34:56:A1:B2:C3 als Beispiel nehme.
Kopplung
Um sich mit dem Gerät verbinden zu können, muss eine Kopplung durchgeführt werden. Hier werden zwischen den Geräten Daten, ausgetauscht, wie zukünftige Verbindungen konfiguriert werden. Dazu wird kurzzeitig eine Verbindung zum Gerät erstellt.
Die Kopplung wird durchgeführt mittels:
pair 12:34:56:A1:B2:C3
Dem Gerät vertrauen
Soll es in Zukunft möglich sein, dass sich das Gerät mit dem Raspberry Pi verbinden darf, kann man es auf "vertraulich" setzten:
trust 12:34:56:A1:B2:C3
Und nun endlich die Verbindung und bluetoothctl beenden
Sehr oft wird Bluetooth für die Audioein- und -ausgabe genutzt. Beispiele sind Bluetooth-Lautsprecher, Headsets und sogar das Autoradio.
Ob man das an einem Raspberry Pi ohne grafische Oberfläche wirklich braucht, sollte man sich gut überlegen. Aber es geht.
Um die Audiodaten mittels Bluetooth zu übertragen, benötigt man einen Audio-Server. Ich habe das nur mittels pulseaudio getestet.
Um Audio mittels Bluetooth nutzen zu können, benötigen wir folgendes Packet:
sudo apt install pulseaudio-module-bluetooth
Ist keine grafische Oberfläche installiert, wird hier pulseaudio mit allen abhängigen Packeten installiert. Das ist eine Menge. Um das Bluetooth-Gerät für Audio zu nutzen, muss man sich in pactl einarbeiten und die Audioein- und Ausgabe setzen. Kurzes Beispiel:.
pactl list
pactl set-default-sink bluez_sink.12_34_56_A1_B2_C3.a2dp_sink
Wird die Verbindung zum Gerät getrennt, schaltet pulseaudio um. Wird eine Verbindung später neu erstellt, kann es sein, dass man die Sache erneut durchspielen muss. Deshalb kann man vielleicht ein Skript nutzen, wo die Verbindung erstellt und die Audio-Ausgabe gesetzt wird. Beispiel audio.sh:
#!/usr/bin/dash
# Verbindung erstellen
bluetoothctl connect 12:34:56:A1:B2:C3
# pulseaudio Zeit geben, Kanal zu erkennen
sleep 10
# Audioausgabekanal setzen
pactl set-default-sink bluez_sink.12_34_56_A1_B2_C3.a2dp_sink
Mittels
sh ./audio.sh
sollte nun die Sache automatisch durchgeführt werden.
Hat man eine grafische Oberfläche, so lässt sich alles mittels pavucontrol (oder mit dem Lautsprecher auf der Leiste) wie gewünscht einstellen.
Mein Test
Mein Raspberry Pi 4 befindet sich in einem Metallgehäuse, was nicht für gute Funkverbindungen spricht. Trotzdem konnte ich 2 Geräte in einigen Metern Entfernung mit Wänden dazwischen für die Audioausgabe nutzen.
Mittels pulseaudio habe ich in der Stube den Sound eines Films wiedergeben lassen, während in der Küche ein Radio-Stream wiedergegeben wurde.
Es ist ein bekanntes Problem nicht nur in Debian, dass Bluetooth irgendwann nicht mehr funktionieren will.
Bei mir trat das Problem beim Spielen mit bluman auf, weshalb ich es nun nicht mehr auf dem Raspberry Pi nutze. Auf Laptops trat dieses Problem bisher noch nicht auf.
Hier ist es notwendig, alle Geräte zu entkoppeln und zu entfernen.
Als erstes entzieht man dem Gerät die Vertraulichkeit falls gesetzt.
bluetoothctl untrust 12:34:56:A1:B2:C3
Danach wird das Gerät entkoppelt.
bluetoothctl cancel-pairing 12:34:56:A1:B2:C3
Zum Schluss wird das Gerät entfernt.
bluetoothctl remove 12:34:56:A1:B2:C3
Diese Prozedur führte ich mit allen Geräten durch, sieht viel aus, geht aber doch schnell.
Danach konnte ich Geräte wie oben beschrieben neu koppeln und seitdem läuft es stabil.