- A2DP
- Raspberry Pi für das Headless Setup vorbereiten
- Voraussetzungen für die Installation in Raspberry Pi
- Bluetooth-Gerät mit Raspberry Pi koppeln
- Automatisieren Sie den Bluetooth-Paring-Prozess mit Python-Skripten
- Lösen Sie das Bluetooth-Pairing-Skript mit einer Schaltfläche aus
- Schaltplan
- Richten Sie einen Cron-Job ein, um das Bluetooth Speaker Python-Programm beim Booten zu starten
Raspberry Pi ist ein handflächengroßer Computer mit integriertem Bluetooth, Wi-Fi, Ethernet-Anschluss, Kameraanschluss usw., wodurch er sich am besten für IoT-basierte eingebettete Anwendungen eignet. Es wird auch verwendet, um viele Arten von Servern wie Druckserver, Medienserver, Webserver usw. herzustellen. Heute werden wir lernen, wie ein Raspberry Pi einen normalen Lautsprecher mit 3,5-mm-Buchse in einen drahtlosen Bluetooth-Lautsprecher umwandeln kann.
In diesem Beitrag werden wir einen Raspberry Pi-basierten Bluetooth-Lautsprecher erstellen, indem wir die Leistung von A2DP, Linux und Audio-Codec zusammenführen, um die Datenpakete drahtlos von einer Audioquelle zu einer Audio-Senke zu streamen. Dazu werden wir ein bisschen Linux-System hacken und ein Stück Code in Bash und Python schreiben, und wir werden im Geschäft sein.
A2DP
A2DP ist die Abkürzung für Advanced Audio Distribution Profile. Dies ist ein Protokoll, das in fast allen Bluetooth-fähigen Geräten vorhanden ist. Es ebnet den Weg für die Datenübertragung von Ton von einem Gerät zum anderen, vorausgesetzt, beide sind über Bluetooth miteinander verbunden. A2dp verwendet einen verlustfreien Komprimierungsalgorithmus, um die Audiopakete vor der Übertragung zu komprimieren, um die Latenz zu verringern. Die Verluste aufgrund dieser Komprimierung sind jedoch für menschliche Ohren kaum wahrnehmbar.
Raspberry Pi für das Headless Setup vorbereiten
Um den Raspberry Pi in einen drahtlosen Lautsprecher umzuwandeln, installieren Sie zunächst das Betriebssystem (Raspbian Stretch) auf der Raspberry PI SD-Karte. Wenn Sie Raspberry Pi noch nicht kennen, folgen Sie diesem Artikel, um mit Raspberry Pi zu beginnen.
Die meisten von uns besitzen einen Raspberry Pi und einen Laptop, aber keinen Monitor. Um SSH in Raspberry Pi zu integrieren, möchten wir jedoch, dass dasselbe in demselben Netzwerk verbunden ist, in dem unser Computer angeschlossen ist. Wir brauchen einen mit Pi verbundenen Monitor, über den wir das WLAN auswählen und eine Verbindung herstellen können?
Eigentlich nicht. Raspberry Pi kann durch Hinzufügen eines Eintrags zu einer Datei mit dem Namen wpa_supplicant.conf mit Wi-Fi verbunden werden
Schließen Sie dazu die SD-Karte an den Computer an, öffnen Sie die Datei rootfs / etc / wpa_supplicant / wpa_supplicant.conf und fügen Sie den folgenden Eintrag hinzu. Vergessen Sie nicht, die Datei mit Administratorrechten (root) zu öffnen.
network = {ssid = "wifi_ssid" psk = "wifi_passkey" key_mgmt = WPA-PSK}
Der Eintrag sollte ähnlich aussehen.
Der obige Eintrag sollte uns mit dem Wi-Fi verbinden, aber das reicht nicht aus, um eine SSH-Verbindung zwischen Raspberry Pi und Computer herzustellen und aufrechtzuerhalten. Standardmäßig ist SSH in Raspberry Pi deaktiviert. Um dies zu aktivieren, erstellen Sie eine leere Datei mit dem Namen ssh im Startverzeichnis.
Jetzt ist es technisch möglich, auf Raspberry Pi remote zuzugreifen. Schließen Sie den Himbeer-Pi an die Stromquelle an. Jetzt würde pi automatisch eine Verbindung zum Wi-Fi herstellen, aber seine IP-Adresse ist erforderlich, um SSH zu verwenden. Es gibt mehrere Möglichkeiten, dasselbe herauszufinden. Ich benutze den Befehl nmap
nmap -sn / 24
Dieser Befehl gibt uns die IP-Adressen aller in unserem Netzwerk verbundenen Geräte. Zum Beispiel,
Einer von ihnen ist von Himbeer-Pi. Jetzt wissen wir, dass die IP-Adresse des Pi uns mit ihm verbinden lässt
ssh pi @ pi_ip_address
Es gibt auch andere Möglichkeiten, um mit Raspberry Pi kopflos zu beginnen. Überprüfen Sie den Link, um dasselbe zu erfahren.
Voraussetzungen für die Installation in Raspberry Pi
BlueZ
BlueZ ist die Standardanwendung, die mit Raspbian Distribution geliefert wird. Es wird verwendet, um auf die Bluetooth-Steuerelemente des Systems zuzugreifen. Es kann auch installiert werden, falls Sie es aus Gründen, die nur Sie kennen, nicht in Ihrem Pi verfügbar haben.
Mit dem folgenden Befehl wird die Bluetooth-Schnittstellenanwendung in unserem Pi installiert.
apt-get install bluez
PulseAudio
Pulse Audio ist eine Anwendung, die Bytes von Computerdaten in menschliche Wahrnehmung umwandelt. Es wird auch als Musik-Player bezeichnet. Das A2DP-Protokoll ist in PulseAudio-Anwendungs-Plugins verfügbar. Lassen Sie uns also alle Anwendungen im Zusammenhang mit Puls-Audio mit dem folgenden Befehl installieren:
apt-get install pulseaudio- *.
Bluetooth-Gerät mit Raspberry Pi koppeln
Öffnen Sie die BlueZ-Anwendung mit dem Befehl
bluetoothctl
Ein Bluetooth-Agent ist ein Broker, der zwischen zwei Bluetooth-fähigen Geräten kommuniziert und eine Verbindung zwischen ihnen initialisiert. Es gibt verschiedene Arten von Bluetooth-Agenten. Der Agent, den wir verwenden, ist der NoInputNoOutput- Agent, mit dem wir ohne Benutzereingriff eine Verbindung herstellen können. Lassen Sie uns den Agenten initialisieren, indem Sie die folgenden Befehle ausführen.
Agent NoInputNoOutput
Sie sollten die Nachricht " Agent registriert " als Antwort erhalten. Nachdem wir unseren Agenten registriert haben, können wir ihn zum Standard machen .
Standardagent
Für die sollte die Antwort "Standard-Agentenanforderung erfolgreich" lauten.
Lassen Sie uns nun unser Gerät auffindbar machen
auffindbar am
Für die die Antwort lauten sollte "Änderung erkennbar bei Erfolg"
Versuchen Sie nun , Ihr Mobiltelefon oder den Computer an den Raspberry Pi anzuschließen
Die Anwendung fordert uns auf, die Dienste zu autorisieren, und wir müssen sie nicht ausführen. Stattdessen werden wir dem Gerät einfach vertrauen und es verbinden. Das Vertrauen in das Gerät ist sehr wichtig, da das vertrauenswürdige Gerät, wenn es versucht, eine Verbindung mit dem pi herzustellen, dies ohne Benutzereingriff zulässt.
Vertrauen verbinden
Nach all diesen Aktionen sollte Ihr Terminal diesem ähnlich sehen.
Yay! Wir haben unser Telefon über Bluetooth mit dem Raspberry Pi verbunden. Aber ist das genug? Natürlich nein, wir möchten, dass unsere Sounddatenpakete vom Telefon zum Pi und dann vom Pi zum Lautsprecher übertragen werden, der an den Audioanschluss des Pi angeschlossen ist.
Stellen Sie sicher, dass unser Telefon in der Audioquelle der PulseAudio- Anwendung aufgeführt ist, indem Sie den folgenden Befehl ausführen :
Paktliste kurz
Es werden alle geladenen Soundmodule, Audio-Senken und Audioquellen aufgelistet
Schauen Sie sich die Werte anhand der Seriennummer 30 an. Bluez_source bezeichnet die Audioquelle über die BlueZ-Anwendung Bluetooth. Überprüfen Sie die Mac-Adresse des Geräts zwischen bluez_source und a2dp_source sowie die Adresse, die Sie in der BlueZ-Anwendung haben. In meinem Fall ist es bluez_source.3C_28_6D_FD_65_3D.a2dp_source, das mit dem aus der BlueZ-Anwendung identisch ist. Wenn Sie jetzt ein Lied von dem Gerät abspielen, das an den Pi angeschlossen ist, sollte es an den Lautsprecher weitergeleitet werden, der an den Audio-Port des Himbeer-Pi angeschlossen ist.
Eureka! Wir haben erfolgreich einen Bluetooth-Lautsprecher gebaut. Wir haben den Sound geroutet, aber das ist noch nicht alles. Wir können nicht alle oben genannten Schritte manuell ausführen. Lassen Sie uns sie daher mithilfe des Expect-Skripts und der Schnittstelle pi mit einem Schalter automatisieren, der den Pi beim Drücken mit Geräten koppelt.
Cool? Kommen wir jetzt zur Sache.
Automatisieren Sie den Bluetooth-Paring-Prozess mit Python-Skripten
Expect Scripts sind wie Bash-Skripte, jedoch automatisiert. Es sucht im Terminal nach dem angegebenen Wort und sendet den Befehl gemäß dem Skript, wenn dasselbe eintrifft. Lassen Sie uns den Pairing-Prozess automatisieren. Erstellen Sie eine Datei mit dem Namen pair_bluetooth_device.expect
Zeitüberschreitung festlegen 30 Spawn Bluetoothctl erwarten "#" senden "Agent aus \ r" erwarten "? gistered" senden "\ r" erwarten "#" senden "Agent NoInputNoOutput \ r" erwarten "Agent registriert" senden "\ r" erwarten "# "send" Standardagent \ r "erwarten" Standardagentenanforderung erfolgreich "senden" \ r "erwarten" # "senden" erkennbar am \ r "erwarten" Autorisieren "senden" ja \ r "senden" beenden \ r "
Kopieren Sie den Code und fügen Sie ihn in die Datei ein. Es werden nur automatisch die Aktionen ausgeführt, die wir beim Koppeln des Mobiltelefons mit Himbeer-Pi ausgeführt haben. Es lässt das Gerät nur eine Verbindung herstellen, vertraut ihm jedoch nicht. Um einem Gerät zu vertrauen, benötigen wir die Mac-Adresse. Wir werden also die Ausgabe dieses Expect-Skripts in eine Protokolldatei drucken, aus der die Mac-Adresse abgerufen werden kann.
grep -Pom 1 "(? <= Gerät). * (? = Verbunden)"
Der obige Befehl druckt den Wert zwischen der Zeichenfolge "Gerät" und "Verbunden" aus. In unserem Fall (Gerät 3C: 28: 6D: FD: 65: 3D verbunden: Nein) ist dies die Mac-Adresse des Geräts.
Lassen Sie uns ein Expect-Skript schreiben, das die Mac-Adresse als erstes Argument verwendet und diesem Gerät vertraut und eine Verbindung zu ihm herstellt.
Erstellen Sie eine Datei mit dem Namen trust_and_connect.expect
setze Timeout 30 Spawn Bluetoothctl erwarten "#" senden "Agent aus \ r" erwarten "? egistered" senden "\ r" erwarten "#" senden "Agent ein \ r" erwarten "Agent registriert" senden "\ r" erwarten "# " send" default-agent \ r " erwarten" Standard-Agentenanforderung erfolgreich " senden" \ r " erwarten" # " senden" vertrauen \ r " erwarten" Ändern " senden" verbinden \ r " erwarten" Verbindung erfolgreich " senden" beenden \ r "
Kopieren Sie den obigen Code in diese Datei. Der vertrauensvolle und verbindende Teil wird automatisch ausgeführt.
Lassen Sie uns dies alles jetzt in eine Python-Skriptdatei einfügen, damit der gesamte Pairing-Prozess automatisiert werden kann.
Lassen Sie uns eine Datei pair_and_trust_bluetooth_device.sh erstellen
cd $ (dirname $ 0) echo "Pairing…" erwartet pair_bluetooth_device.expect> expected_script.log chmod 777 expected_script.log sleep 2 echo "Vertrauen und Verbinden.." device_mac_address = $ (cat expected_script.log - grep -Pom 1 " (? <= Gerät). * (? = Verbunden) ") Die Echo-Mac-Adresse lautet $ device_mac_address if]; dann erwarten trust_and_connect.expect $ device_mac_address sonst echo "Kein Gerät angeschlossen" fi rm expect_script.log
Also das Bash-Skript,
- Ruft ein Expect-Skript auf (dessen Ausgabe in eine Datei mit dem Namen "await_script.log" gedruckt wird).
- Initiiert den NoInputNoOutput- Agenten
- Macht es zum Standardagenten
- Schaltet die Auffindbarkeit von pi ein
- Wartet darauf, dass sich jemand verbindet, und wird beendet, wenn jemand dies tut oder eine Zeitüberschreitung auftritt
- 2 Sekunden schlafen
- Rufen Sie die Datei "accept_script.log" für die Mac-Adresse des Geräts ab
- Vertraut dem Gerät und verbindet es, wenn die mac_address null ist
- Entfernt die Restdatei "require_script.log"
Lösen Sie das Bluetooth-Pairing-Skript mit einer Schaltfläche aus
Jetzt haben wir das Skript, um den Pairing-Prozess zu automatisieren. Dieses Skript muss jedoch nach Belieben ausgeführt werden, wann immer der Benutzer dies wünscht. Lassen Sie uns dieses Skript also mit einer physischen Schaltfläche verbinden, damit dieses Skript jedes Mal aufgerufen wird, wenn die Taste gedrückt wird. Interrupt ist einer der wichtigsten Bestandteile der eingebetteten Programmierung. Für den Anfang stellen Interrupts, wenn sie erkannt werden, die reguläre Routine des Programms dar und führen einen vordefinierten ISR aus, der als Interrupt Service Routine bekannt ist.
Lassen Sie uns also den Druckknopf an GPIO-Pin 11 anschließen und diesem einen ISR zuweisen. Innerhalb des ISR werden wir das Skript aufrufen.
Lassen Sie uns eine Python-Datei mit dem Namen Bluetooth-speaker-main.py erstellen und den folgenden Code hinzufügen. Ich habe die Kommentare im Programm hinzugefügt. Wenn Sie diesen Code verwenden, haben Sie sie dennoch
#import erforderliche Pakete importieren Subprozess importieren RPi.GPIO als gpio importieren Zeit importieren os importieren Protokollierung pair_pin = 11 #abrufen des Dateiverzeichnisses, aus dem das Python-Skript ausgeführt wird fileDirectory = os.path.dirname (os.path.realpath (__ file__)) #Stellen Sie den Speicherort der Protokolldatei auf den Speicherort des Python-Skripts ein. LogFile = fileDirectory + "/ bluetoothSpeaker.log" logging.basicConfig (Dateiname = logFile, Dateimodus = 'w', Format = '% (Name) s -% (Ebenenname) s -% (message) s ', level = logging.INFO) def pairNewDevice (channel): #ISR für Pin 11 print ("Warten auf Paar") logging.info ("Warten auf Paar") output = subprocess.call () gpio.setmode (gpio.TAFEL) gpio.setup (pair_pin, gpio.IN, pull_up_down = gpio.PUD_UP) try: # Setzen Sie den pair_pin als Interrupt-Pin, der die fallende Flanke erkennt, und rufen Sie in diesem Fall die pairNewDevice-Funktion gpio.add_event_detect (pair_pin, gpio.FALLING, callback = pairNewDevice, bouncetime = 1000) print ("Bluetooth-Programm wurde gestartet") logging.info ("Bluetooth-Programm wurde gestartet") während True: time.sleep (5) außer KeyboardInterrupt: gpio.cleanup ()
Schaltplan
Unten sehen Sie den Schaltplan zum Verbinden einer Taste mit GPIO11 von Raspberry Pi, um den Bluetooth-Pairing-Prozess für die Audioübertragung über Bluetooth auszulösen.
Richten Sie einen Cron-Job ein, um das Bluetooth Speaker Python-Programm beim Booten zu starten
Lassen Sie uns nun endlich einen Cron-Job festlegen, der dieses Python-Programm jedes Mal startet, wenn der Pi hochfährt.
crontab -e
Wählen Sie Ihren bevorzugten Editor und fügen Sie die folgende Zeile am Ende der Datei hinzu
@reboot python3 /home/pi/blueooth-speaker/Bluetooth-speaker-main.py
Dies ruft unser Python-Programm jedes Mal auf, wenn der Pi hochfährt.
Und das ist es. Der Adler ist gelandet. Sie haben einen Headless Raspberry Pi Bluetooth-Lautsprecher hergestellt.
Starten Sie Ihren Pi neu, koppeln Sie Ihr Telefon und streamen Sie das Audio.:):)
Alle Skripte für diesen Raspberry Pi Bluetooth-Lautsprecher können vom GitHub-Konto heruntergeladen werden. Überprüfen Sie auch das unten angegebene Video.