- A2DP
- Подготовка на Raspberry Pi за настройка без глава
- Предпоставки за инсталиране в Raspberry Pi
- Сдвояване на Bluetooth устройство с Raspberry Pi
- Автоматизирайте процеса на разделяне на Bluetooth с Python скриптове
- Задействайте Bluetooth скрипта за сдвояване с бутон
- Електрическа схема
- Настройте Cron Job, за да стартирате програмата Bluetooth Speaker Python при стартиране
Raspberry Pi е компютър с длан с вграден Bluetooth, Wi-Fi, Ethernet порт, порт за камера и т.н., което го прави най-подходящият микроконтролер за вградени приложения, базирани на IoT. Също така се използва за създаване на много видове сървъри като сървър за печат, медиен сървър, уеб сървър и др. Днес ще научим как Raspberry Pi може да преобразува нормален високоговорител с 3,5 мм жак в безжичен Bluetooth високоговорител.
В тази публикация ще изградим базиран на Raspberry Pi Bluetooth високоговорител, като обединим силата на A2DP, Linux и аудио кодек, за да предаваме безжично пакетите данни от аудио източник към аудио мивка. За целта ще хакнем малко Linux система и ще напишем парче код на bash и python и ще бъдем в бизнеса.
A2DP
A2DP е съкращението от Advanced Audio Distribution Profile. Това е протокол, който присъства в почти всички устройства с Bluetooth. Той проправя път за предаване на данни от звук от едно устройство на друго, при условие че и двете са свързани помежду си чрез Bluetooth. A2dp използва алгоритъм за компресиране без загуби, за да компресира аудио пакетите преди предаване, за да намали латентността, но загубите, дължащи се на тази компресия, едва ли се усещат за човешките уши.
Подготовка на Raspberry Pi за настройка без глава
За да конвертирате Raspberry Pi в безжичен високоговорител, първо инсталирайте операционната система (Raspbian Stretch) в Raspberry PI SD карта, ако сте нов в Raspberry Pi, следвайте тази статия, за да започнете с Raspberry Pi.
Повечето от нас притежават Raspberry Pi и лаптоп, но нямат монитор. Но за да SSH в Raspberry Pi искаме същото да бъде свързано в същата мрежа, в която е свързан нашият компютър. Нуждаем се от монитор, свързан с Pi, чрез който да можем да изберем Wi-Fi и да се свържем?
Всъщност не го правим. Raspberry Pi може да бъде свързан към Wi-Fi чрез добавяне на запис към файл с име wpa_supplicant.conf
За целта свържете SD картата към компютъра и отворете файла rootfs / etc / wpa_supplicant / wpa_supplicant.conf и добавете следния запис към същия. Не забравяйте да отворите файла с администраторски (root) права.
мрежа = {ssid = "wifi_ssid" psk = "wifi_passkey" key_mgmt = WPA-PSK}
Влизането трябва да изглежда подобно на това.
Горният запис трябва да ни свърже с Wi-Fi, но това не е достатъчно, за да създадем и поддържаме SSH връзка между Raspberry Pi и компютъра. По подразбиране SSH е деактивиран в Raspberry Pi, така че, за да го активирате, създайте празен файл с име ssh в директорията за зареждане.
Сега Raspberry Pi е технически разрешен за отдалечен достъп. Свържете малиновия pi към източника на захранване. Сега pi ще се свърже автоматично с Wi-Fi, но се изисква неговият IP адрес, за да SSH в него. Има няколко начина да разберете едно и също. Използвам командата nmap
nmap -sn / 24
Тази команда ще ни даде IP адресите на всички устройства, свързани в нашата мрежа. Например,
Един от тях е от малинови пи. Сега знаем IP адреса на pi, нека се свържем с него
ssh pi @ pi_ip_address
Има и други начини да започнете с Raspberry Pi без глава, проверете връзката, за да научите същото.
Предпоставки за инсталиране в Raspberry Pi
BlueZ
BlueZ е приложението по подразбиране, което се предлага с Raspbian дистрибуция. Използва се за достъп до Bluetooth контролите на системата. Той може да бъде инсталиран и в случай, че го нямате във вас pi по причини, които само вие може да знаете.
Командата по-долу получава приложението за интерфейс Bluetooth, инсталирано в нашия pi.
apt-get инсталирайте bluez
PulseAudio
Pulse Audio е приложение, което преобразува байтове от компютърни данни в човешко възприятие. Нарича се още музикален плейър. Протоколът A2DP е наличен в приставките за приложения на PulseAudio. Така че нека инсталираме всички приложения, свързани с импулсно аудио, като използваме командата по-долу:
apt-get инсталирайте pulseaudio- *.
Сдвояване на Bluetooth устройство с Raspberry Pi
Отворете приложението BlueZ, като използвате командата
bluetoothctl
А Bluetooth агент е брокер, който разговори между две Bluetooth устройства и инициализиране на връзка между тях. Има различни видове блутут агенти. Този, който ще използваме, е NoInputNoOutput агент, защото ни позволява да се свързваме без намеса на потребителя. Така че нека да инициализираме агента, като изпълним следните команди.
агент NoInputNoOutput
Като отговор трябва да получите съобщението „ Агент е регистриран “. След като регистрирахме нашия агент, нека го направим по подразбиране .
агент по подразбиране
За които отговорът трябва да бъде „Заявката по подразбиране за агент е успешна“
Сега нека направим устройството ни откриваемо
откриваем на
За което отговорът трябва да бъде „Промяна, която може да бъде открита при успех“
Сега опитайте да свържете мобилния си телефон или компютъра към Raspberry Pi
Приложението ще ни подкани да разрешим услугите и не е необходимо да ги правим. Вместо това просто ще се доверим на устройството и ще го свържем. Доверието на устройството е много важно, защото когато довереното устройство се опитва да се свърже с pi, то позволява същото, без никаква намеса на потребителя.
доверие свързване
След всички тези действия вашият терминал трябва да изглежда подобно на този.
Ех! Телефонът ни е свързан с Raspberry Pi чрез Bluetooth. Но достатъчно ли е това? Очевидно не, искаме нашите пакети със звукови данни да бъдат прехвърлени от телефона към pi и след това от pi към високоговорителя, който е свързан към аудио порта на pi.
Нека се уверим, че телефонът ни е включен в аудио източника на приложението PulseAudio , като изпълним командата по-долу:
pactl списък кратък
Той ще изброи всички заредени звукови модули, аудио мивки и аудио източници
Вижте стойностите спрямо серийния номер 30. Bluez_source означава източник на звук чрез приложението BlueZ, което е Bluetooth. Проверка на Mac адреса на устройството, който е между bluez_source и a2dp_source и адреса, който имате в приложението BlueZ. В моя случай това е bluez_source.3C_28_6D_FD_65_3D.a2dp_source, който е същият като този от приложението BlueZ. Сега, ако възпроизвеждате песен от устройството, което е свързано към pi, тя трябва да бъде насочена към високоговорителя, който е свързан към аудио порта на Raspberry Pi.
Еврика! Успешно изградихме Bluetooth високоговорител. Пренасочихме звука, но това не е всичко. Не можем да направим всички горепосочени стъпки ръчно, така че нека ги автоматизираме, използвайки очаквания скрипт и интерфейс pi с превключвател, който при натискане сдвоява Pi с устройства.
Готино? Нека сега да се заемем с работата.
Автоматизирайте процеса на разделяне на Bluetooth с Python скриптове
Очаквайте скриптове са като bash скриптове, но автоматизирани. Той търси дадената дума в терминала и когато пристигне същата, изпраща командата според скрипта. Нека автоматизираме процеса на сдвояване. Създайте файл, наречен pair_bluetooth_device.expect
задайте време за изчакване 30 хвърляне на хайвера bluetoothctl очаквайте "#" изпратете "агент изключен \ r" очаквайте "? регистриран" изпратете "\ r" очаквайте "#" изпратете "агент NoInputNoOutput \ r" очаквайте "Регистриран агент" изпратете \ r "очаквайте" # "изпрати" агента по подразбиране \ r "очаквайте" Искането на агент по подразбиране е успешно "изпрати" \ r "очаквайте" # "изпрати" откриваем на \ r "очаквам" Оторизира "изпрати" да \ r "изпрати" изход \ r "
Копирайте кода и го поставете във файла. Той просто прави автоматично действията, които извършихме, докато сдвоявахме мобилния телефон с Raspberry Pi. Той просто позволява на устройството да се свърже, но не му вярва. За да се доверим на дадено устройство, се нуждаем от неговия Mac адрес. Така че ще отпечатаме изхода на този очакван скрипт в лог файл, от който може да се вземе mac адреса.
grep -Pom 1 "(? <= Устройство). * (? = Свързано)"
Горната команда отпечатва стойността между низа „Устройство“ и „Свързано“. В нашия случай (Device 3C: 28: 6D: FD: 65: 3D Connected: no) това е Mac адресът на устройството.
Нека напишем скрипт за очакване, който ще вземе mac адреса като първи аргумент и ще се довери и свърже с това устройство.
Създайте файл с име trust_and_connect.expect
задайте изчакване 30 хвърляне на хайвера bluetoothctl очаквате "#" изпращане "агент изключен \ r" очаквате "? регистриран" изпращане "\ r" очаквайте "#" изпращане "агент на \ r" очаквайте "агент регистриран" изпращане "\ r" очаквайте "# " изпрати" агента по подразбиране \ r " очаквайте" Заявката по подразбиране за агент е успешна " изпрати" \ r " очаквайте" # " изпратете" доверие \ r " очаквайте" Промяна " изпратете" свържете \ r " очаквайте" Връзката е успешна " изпрати" изход \ r "
Копирайте горния код в този файл. Той прави частта за доверие и свързване автоматично.
Нека сега сложим всичко това в скриптов файл на Python, за да може целият процес на сдвояване да бъде автоматизиран.
Нека създадем файл pair_and_trust_bluetooth_device.sh
cd $ (dirname $ 0) echo "Сдвояване…" очаквайте pair_bluetooth_device.expect> очаквайте_скрипт.лог chmod 777 очаквайте_скрипт.лог сън 2 ехо "Доверяване и свързване.." device_mac_address = $ (котка очаквате_скрипт.лог - grep -Pom 1 " (? <= Устройство). * (? = Свързано) ") echo mac адрес е $ device_mac_address if]; след това очаквайте trust_and_connect.expect $ device_mac_address else echo "Няма свързано устройство" fi rm очаква_script.log
Така че bash скриптът,
- Извиква скрипт за очакване (чийто изход ще бъде отпечатан във файл, наречен await_script.log), който,
- Инициира агент NoInputNoOutput
- Прави го по подразбиране агент
- Включва откриваемостта на pi
- Изчаква някой да се свърже и излиза, когато някой го направи или изчака
- Спете 2 секунди
- Вземете файла awa_script.log за Mac адреса на устройството
- Доверява се и свързва устройството, ако mac_address е нула
- Премахва остатъчния файл await_script.log
Задействайте Bluetooth скрипта за сдвояване с бутон
Сега разполагаме със скрипта за автоматизиране на процеса на сдвояване. Но този скрипт трябва да работи удобно, когато потребителят пожелае. Така че нека свържем този скрипт с физически бутон, така че този скрипт да бъде извикан всеки път, когато бутонът е натиснат. Прекъсването е една от жизненоважните части на вграденото програмиране. Като начало, прекъсванията, когато се усетят, поставят обичайната рутина на програмата и изпълняват предварително дефинирана ISR, известна като Прекъсване на услугата.
Така че нека свържем бутона с gpio pin 11 и присвоим ISR на същия. Вътре в ISR ще извикаме скрипта.
Нека създадем python файл с име Bluetooth-speaker-main.py и добавим кода по-долу към него. Добавих коментарите в програмата, така че в случай, че използвате този код, пак ги имате
#import задължителни пакети импортиране подпроцес импортиране RPi.GPIO като gpio време за импортиране импортиране os импортиране регистрация pair_pin = 11 # извлечете файловата директория, от която се изпълнява скриптът на python fileDirectory = os.path.dirname (os.path.realpath (__ file__)) # Задайте местоположението на регистрационния файл по същия начин като местоположението на скрипта на python logFile = fileDirectory + "/ bluetoothSpeaker.log" logging.basicConfig (име на файла = logFile, filemode = 'w', format = '% (name) s -% (levelname) s -% (message) s ', level = logging.INFO) def pairNewDevice (channel): #ISR for pin 11 print ("Waiting to pair") logging.info ("Waiting to pair") output = subprocess.call () gpio.setmode (gpio.БОРД) gpio.setup (pair_pin, gpio.IN, pull_up_down = gpio.PUD_UP) try: # Задайте pair_pin като прекъсващ щифт, който открива падащия ръб и когато го направи, извикайте функцията pairNewDevice gpio.add_event_detect (pair_pin, gpio.FALLING, callback = pairNewDevice, bouncetime = 1000) print („Програмата за Bluetooth е стартирана“) logging.info („Програмата за Bluetooth е стартирана“), докато True: time.sleep (5) с изключение на KeyboardInterrupt: gpio.cleanup ()
Електрическа схема
По-долу е схемата за свързване на бутон с GPIO11 на Raspberry Pi за задействане на процеса на Bluetooth сдвояване за аудио трансфер чрез Bluetooth.
Настройте Cron Job, за да стартирате програмата Bluetooth Speaker Python при стартиране
Сега най-накрая нека зададем cron работа, която ще стартира тази програма на python всеки път, когато pi стартира.
crontab -e
Изберете вашия любим редактор и добавете долния ред в края на файла
@reboot python3 /home/pi/blueooth-speaker/Bluetooth-speaker-main.py
Това ще извика нашата програма на python всеки път, когато pi стартира.
И това е. Орелът е кацнал. Направили сте безгласен високоговорител Raspberry Pi Bluetooth.
Рестартирайте своя Pi, сдвоете телефона си и предайте аудиото.:)
Всички скриптове за този високоговорител на Raspberry Pi Bluetooth могат да бъдат изтеглени от акаунта в GitHub. Също така проверете видеото, дадено по-долу.