- A2DP
- Forberedelse af Raspberry Pi til hovedløs opsætning
- Forudsætninger, der skal installeres i Raspberry Pi
- Parring af Bluetooth-enhed med Raspberry Pi
- Automatiser Bluetooth-parringsprocessen med Python-scripts
- Udløs Bluetooth-parringsscript med en knap
- Kredsløbsdiagram
- Opsæt et Cron-job for at starte Bluetooth Speaker Python-programmet ved opstart
Raspberry Pi er en håndfladestørrelse computer med indbygget Bluetooth, Wi-Fi, Ethernet-port, kameraport osv., Som gør den bedst egnede mikrocontroller til IoT-baserede indlejrede applikationer. Det bruges også til at fremstille mange slags servere som printserver, medieserver, webserver osv. I dag lærer vi, hvordan en Raspberry Pi kan konvertere en normal højttaler med 3,5 mm jackstik til en trådløs Bluetooth-højttaler.
I dette indlæg vil vi opbygge Raspberry Pi-baseret Bluetooth-højttaler ved at smelte kraften fra A2DP, Linux og lydkodek til at streame datapakkerne fra en lydkilde til en lydvask trådløst. For at gøre det skal vi hacke en lille smule Linux-system og skrive et stykke kode i bash og python, og vi vil være i forretning.
A2DP
A2DP er akronymet med Advanced Audio Distribution Profile. Dette er en protokol, der findes i næsten alle Bluetooth-aktiverede enheder. Det baner vej for dataoverførsel af lyd fra en enhed til den anden, forudsat at de begge er forbundet til hinanden via Bluetooth. A2dp bruger tabsfri komprimeringsalgoritme til at komprimere lydpakkerne før transmission for at reducere latens, men tabene på grund af denne komprimering er næppe mærkbare for menneskelige ører.
Forberedelse af Raspberry Pi til hovedløs opsætning
For at konvertere Raspberry Pi til en trådløs højttaler skal du først og fremmest installere OS (Raspbian Stretch) i Raspberry PI SD-kort. Hvis du ikke er ny på Raspberry Pi, skal du følge denne artikel for at komme i gang med Raspberry Pi.
De fleste af os ejer en Raspberry Pi og en bærbar computer, men mangler en skærm. Men for at SSH ind i Raspberry Pi ønsker vi, at det samme skal forbindes i det samme netværk, som vores computer er tilsluttet. Vi har brug for skærm tilsluttet Pi, hvorigennem vi kan vælge Wi-Fi og få forbindelse?
Det gør vi faktisk ikke. Raspberry Pi kan tilsluttes Wi-Fi ved at tilføje en post til en fil med navnet wpa_supplicant.conf
For at gøre det skal du slutte SD-kortet til computeren og åbne filen rootfs / etc / wpa_supplicant / wpa_supplicant.conf og tilføje følgende post til den samme. Glem ikke at åbne filen med administratorrettigheder (root).
netværk = {ssid = "wifi_ssid" psk = "wifi_passkey" key_mgmt = WPA-PSK}
Indgang skal se ud som denne.
Ovenstående post skal få os tilsluttet Wi-Fi, men det er ikke nok til at oprette og vedligeholde en SSH-forbindelse mellem Raspberry Pi og computer. Som standard er SSH deaktiveret i Raspberry Pi, så for at aktivere det skal du oprette en tom fil med navnet ssh i startmappen.
Nu er Raspberry Pi teknisk aktiveret for at få adgang til eksternt. Tilslut hindbær pi til strømkilden. Nu vil pi automatisk blive forbundet til Wi-Fi, men dens IP-adresse er påkrævet for at SSH ind i den. Der er flere måder at finde ud af det samme på. Jeg bruger nmap- kommando
nmap -sn / 24
Denne kommando giver os IP-adresserne på alle enheder, der er tilsluttet i vores netværk. For eksempel,
En af dem er af hindbærpier. Nu kender vi IP-adressen til pi, lad os oprette forbindelse til den
ssh pi @ pi_ip_address
Der er også andre måder at starte med Raspberry Pi uden hoved, tjek linket for at lære det samme.
Forudsætninger, der skal installeres i Raspberry Pi
BlueZ
BlueZ er standardapplikationen, der følger med Raspbian distro. Det bruges til at få adgang til systemets Bluetooth-kontrol. Det kan også installeres, hvis du ikke har det tilgængeligt i dit pi af kun årsager, du måske ved.
Nedenstående kommando får Bluetooth-interface-applikationen installeret i vores pi.
apt-get installer bluez
PulseAudio
Pulse Audio er et program, der konverterer byte af computerdata til menneskelig opfattelse. Det kaldes også som musikafspilleren. A2DP-protokol er tilgængelig i PulseAudio-applikations-plugins. Så lad os installere alle de puls-lydrelaterede applikationer ved hjælp af kommandoen nedenfor:
apt-get install pulseaudio- *.
Parring af Bluetooth-enhed med Raspberry Pi
Åbn BlueZ-applikationen ved hjælp af kommandoen
bluetoothctl
En Bluetooth-agent er en mægler, der taler mellem to Bluetooth-aktiverede enheder og initialiserer en forbindelse mellem dem. Der er forskellige typer Bluetooth-agenter. Den, vi vil bruge, er NoInputNoOutput- agent, fordi den lader os oprette forbindelse uden brugerindblanding. Så lad os initialisere agenten ved at køre følgende kommandoer.
agent NoInputNoOutput
Du skal få beskeden " Agent registreret " som svar. Nu hvor vores agent er registreret, lad os gøre det til standard .
standardagent
For hvilket svaret skal være "Standardagentanmodning vellykket"
Lad os nu gøre vores enhed synlig
kan findes på
For hvilket svaret skal være "Ændring, der kan findes, når det lykkes"
Prøv nu at forbinde din mobiltelefon eller computeren til Raspberry Pi
Ansøgning vil bede os om at godkende tjenesterne, og vi behøver ikke at udføre dem. I stedet stoler vi bare på enheden og forbinder den. Det er meget vigtigt at stole på enheden, for når den betroede enhed forsøger at oprette forbindelse til pi'en, tillader den den samme uden brugerintervention overhovedet.
tillid forbinde
Efter alle disse handlinger skal din terminal se ud som denne.
Yay! Vi har vores telefon forbundet med Raspberry Pi via Bluetooth. Men er det nok? Naturligvis nej, vi ønsker, at vores lyddatapakker overføres fra telefonen til pi og derefter fra pi til højttaleren, der er forbundet til pis lydport.
Lad os sørge for, at vi har vores telefon opført i lydkilden til PulseAudio- applikationen ved at køre nedenstående kommando:
pactl liste kort
Den viser alle indlæste lydmoduler, lydvaske og lydkilder
Se på værdierne mod serienummer 30. Bluez_source betyder lydkilden via BlueZ-applikationen, som er bluetooth. Kryds check enhedens mac-adresse, der er mellem bluez_source og a2dp_source, og den adresse, du har i BlueZ-applikationen. I mit tilfælde er det bluez_source.3C_28_6D_FD_65_3D.a2dp_source, som er den samme som den fra BlueZ-applikationen. Hvis du nu spiller en sang fra enheden, der er tilsluttet pi'en, skal den dirigeres til højttaleren, der er tilsluttet lydporten på hindbær pi.
Eureka! Vi har med succes bygget en Bluetooth-højttaler. Vi har dirigeret lyden, men det er ikke alt. Vi kan ikke udføre alle de ovennævnte trin manuelt, så lad os automatisere dem ved hjælp af forventet script og interface pi med en switch, der, når den trykkes, parrer Pi med enheder.
Fedt nok? Lad os nu komme i gang.
Automatiser Bluetooth-parringsprocessen med Python-scripts
Forvent, at scripts er som bash-scripts, men automatiserede. Det ser efter det givne ord i terminalen, og når det samme ankommer, sender det kommandoen i henhold til scriptet. Lad os automatisere processen med parring. Opret en fil, der hedder pair_bluetooth_device.expect
indstil timeout 30 spawn bluetoothctl forvent "#" send "agent fra \ r" forvent "? registreret" send "\ r" forvent "#" send "agent NoInputNoOutput \ r" forvent "Agent registreret" send "\ r" forvent "# "send" standardagent \ r "forvent" Standardagentanmodning vellykket "send" \ r "forvent" # "send" synlig på \ r "forvent" Godkend "send" ja \ r "send" afslutning \ r "
Kopier koden og indsæt den samme i filen. Det gør bare automatisk, de handlinger, vi gjorde, mens vi parrede mobilen med hindbær pi. Det lader bare enheden oprette forbindelse, men stoler ikke på det. For at stole på en enhed har vi brug for mac-adressen på den. Så vi skal udskrive output fra dette forventede script til en logfil, hvorfra mac-adressen kan gribes.
grep -Pom 1 "(? <= Enhed). * (? = Tilsluttet)"
Ovenstående kommando udskriver værdien mellem strengen "Enhed" og "Forbundet". I vores tilfælde (Device 3C: 28: 6D: FD: 65: 3D Connected: no) er det enhedens mac-adresse.
Lad os skrive et forventet script , der tager mac-adressen som det første argument og stoler på og opretter forbindelse til den enhed.
Opret en fil med navnet trust_and_connect.expect
indstil timeout 30 spawn bluetoothctl forvent "#" send "agent fra \ r" forvent "? egisteret" send "\ r" forvent "#" send "agent til \ r" forvent "Agent registreret" send "\ r" forvent "# " send" standardagent \ r " forvent" Standardagentanmodning vellykket " send" \ r " forvent" # " send" tillid \ r " forvent" Ændring af " send" forbindelse \ r " forvent" Forbindelse vellykket " send" afslut \ r "
Kopier ovenstående kode til den fil. Det gør den tillidsfulde og forbindende del automatisk.
Lad os nu lægge alt dette i en Python-scriptfil, så hele parringsprocessen kan automatiseres.
Lad os oprette en fil pair_and_trust_bluetooth_device.sh
cd $ (dirname $ 0) ekko "Parring…" forventer pair_bluetooth_device.expect> expect_script.log chmod 777 expect_script.log sleep 2 echo "Tillid og tilslutning.." device_mac_address = $ (cat expect_script.log - grep -Pom 1 " (? <= Enhed). * (? = Tilsluttet) ") ekko-mac-adresse er $ device_mac_address if]; forvent derefter trust_and_connect.expect $ device_mac_address ellers ekko "Ingen enhed tilsluttet" fi rm expect_script.log
Så bash-scriptet,
- Kalder et forventet script (hvis output vil blive udskrevet til en fil med navnet expect_script.log), som
- Initierer NoInputNoOutput- agenten
- Gør det til standardagenten
- Tænder pi's opdagelighed
- Venter på, at nogen opretter forbindelse og afslutter, når nogen gør det eller timeout
- Sov i 2 sekunder
- Grib expect_script.log-filen til enhedens mac-adresse
- Stoler på og forbinder enheden, hvis mac_adressen er nul
- Fjerner restfilen expect_script.log
Udløs Bluetooth-parringsscript med en knap
Nu har vi scriptet til at automatisere parringsprocessen. Men dette script skal køre på bekvemmelighed, når brugeren ønsker det. Så lad os tilslutte dette script med en fysisk knap, så dette script bliver kaldt hver gang, når der trykkes på knappen. Interrupt er en af de vigtige dele af integreret programmering. For det første sætter afbrydelser, når de registreres, programmets regelmæssige rutine og kører en foruddefineret ISR kendt som Interrupt Service Routine.
Så lad os forbinde trykknappen til gpio pin 11 og tildele en ISR til den samme. Inde i ISR kalder vi scriptet.
Lad os oprette en python-fil ved navn Bluetooth-speaker-main.py og tilføje nedenstående kode til den. Jeg har tilføjet kommentarerne i programmet, så hvis du bruger denne kode, har du dem stadig
#import krævede pakker importerer underproces import RPi.GPIO som gpio importtid import os import logning pair_pin = 11 # hent filmappen, hvorfra python-scriptet køres fileDirectory = os.path.dirname (os.path.realpath (__ file__)) # Indstil logfilplaceringen som den samme som python- scriptplaceringen logFile = fileDirectory + "/ bluetoothSpeaker.log" logging.basicConfig (filnavn = logFile, filemode = 'w', format = '% (navn) s -% (niveaunavn) s -% (meddelelse) s ', niveau = logging.INFO) def pairNewDevice (kanal): #ISR for pin 11 print ("Waiting to pair") logging.info ("Waiting to pair") output = subprocess.call () gpio.setmode (gpio.BESTYRELSE) gpio.setup (pair_pin, gpio.IN, pull_up_down = gpio.PUD_UP) prøv: # Indstil pair_pin som en afbrydestift, der registrerer den faldende kant, og når den gør det, skal du ringe til pairNewDevice-funktionen gpio.add_event_detect (pair_pin, gpio.FALLING, callback = pairNewDevice, bouncetime = 1000) print ("Bluetooth-program er startet") logging.info ("Bluetooth-program er startet") mens True: time.sleep (5) undtagen KeyboardInterrupt: gpio.cleanup ()
Kredsløbsdiagram
Nedenfor er kredsløbsdiagrammet til at forbinde en knap med GPIO11 fra Raspberry Pi for at udløse Bluetooth-parringsprocessen til lydoverførsel via Bluetooth.
Opsæt et Cron-job for at starte Bluetooth Speaker Python-programmet ved opstart
Lad os endelig indstille et cron-job, der starter dette python-program hver gang pi starter op.
crontab -e
Vælg din foretrukne editor og tilføj nedenstående linje i slutningen af filen
@reboot python3 /home/pi/blueooth-speaker/Bluetooth-speaker-main.py
Dette kalder vores python-program hver gang pi starter op.
Og det er det. Ørnen er landet. Du har lavet en hovedløs Raspberry Pi Bluetooth-højttaler.
Genstart din Pi, par din telefon og stream lyden.:)
Alle scripts til denne Raspberry Pi Bluetooth-højttaler kan downloades fra GitHub-kontoen. Tjek også videoen nedenfor.