- A2DP
- Підготовка Raspberry Pi до налаштування без голови
- Передумови для встановлення в Raspberry Pi
- Підключення пристрою Bluetooth до Raspberry Pi
- Автоматизуйте процес розбору Bluetooth за допомогою скриптів Python
- Увімкніть сценарій сполучення Bluetooth за допомогою кнопки
- Кругова діаграма
- Налаштуйте завдання Cron для запуску програми Bluetooth Speaker Python під час завантаження
Raspberry Pi - це комп’ютер розміром з долоню, який має вбудований Bluetooth, Wi-Fi, порт Ethernet, порт камери тощо, що робить його найбільш підходящим мікроконтролером для вбудованих програм на основі IoT. Він також використовується для створення багатьох видів серверів, таких як сервер друку, медіа-сервер, веб-сервер тощо. Сьогодні ми дізнаємося, як Raspberry Pi може перетворити звичайний динамік із роз'ємом 3,5 мм у бездротовий динамік Bluetooth.
У цій публікації ми створимо динамік Bluetooth на основі Raspberry Pi, поєднавши потужність 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 буде підключатися до 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 install pulseaudio- *.
Підключення пристрою Bluetooth до Raspberry Pi
Відкрийте програму BlueZ за допомогою команди
bluetoothctl
Bluetooth агент є брокером, що переговори між двома 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
Сценарії Expect схожі на сценарії bash, але автоматизовані. Він шукає дане слово в терміналі, і коли воно приходить, він відправляє команду відповідно до сценарію. Давайте автоматизуємо процес створення пари. Створіть файл із назвою pair_bluetooth_device.expect
встановити час очікування 30 spawn bluetoothctl очікувати "#" відправити "агента вимкнено \ r" очікувати "? зареєстровано" відправити "\ r" очікувати "#" надіслати "агента NoInputNoOutput \ r" очікувати "Агент зареєстрований" надіслати "\ r" очікувати "# "надіслати" агента за замовчуванням \ r "очікувати" Запит агента за замовчуванням успішно "відправити" \ r "очікувати" # "надіслати" виявляється \ r "очікувати" Авторизувати "відправити" так \ r "відправити" вихід \ r "
Скопіюйте код і вставте його у файл. Він просто робить автоматично, ті дії, які ми робили, поєднуючи мобільний телефон з Raspberry Pi. Це просто дозволяє пристрою підключатися, але йому не довіряє. Щоб довірити пристрій, нам потрібна його Mac-адреса. Отже, ми надрукуємо висновок цього очікуваного сценарію у файл журналу, з якого можна отримати мак-адресу.
grep -Pom 1 "(? <= Пристрій). * (? = Підключено)"
Вищевказана команда виводить значення між рядком "Пристрій" та "Підключено". У нашому випадку (Пристрій 3C: 28: 6D: FD: 65: Підключено 3D: ні) це мак-адреса пристрою.
Давайте напишемо сценарій очікування, який буде приймати адресу mac як перший аргумент, довірятиме та підключатиметься до цього пристрою.
Створіть файл з іменем trust_and_connect.expect
встановити час очікування 30 spawn bluetoothctl очікувати "#" відправити "агента вимкнено \ r" очікувати "? eg зареєстровано" надіслати "\ r" очікувати "#" відправити "агента на \ r" очікувати "Агент зареєстрований" надіслати "\ r" очікувати "# " надіслати" агента за замовчуванням \ r " очікувати" Запит агента за замовчуванням успішно " відправити" \ r " очікувати" # " надіслати" довіру \ r " очікувати" Зміна " відправити" з'єднати \ r " очікувати" Підключення вдале " відправити" вихід \ r "
Скопіюйте наведений вище код у цей файл. Це робить частину довіри та з'єднання автоматично.
Давайте покладемо все це у файл сценарію Python, щоб весь процес сполучення можна було автоматизувати.
Давайте створимо файл pair_and_trust_bluetooth_device.sh
cd $ (dirname $ 0) echo "Сполучення…" очікуйте pair_bluetooth_device.expect> awa_script.log chmod 777 awa_script.log sleep 2 echo "Довіра та підключення.." device_mac_address = $ (кішка awa_script.log - grep -Pom 1 " (? <= Пристрій). * (? = Підключено) ") echo mac-адреса $ device_mac_address if]; тоді очікуйте trust_and_connect.expect $ device_mac_address else echo "Немає підключеного пристрою" fi rm await_script.log
Отже, скрипт bash,
- Викликає скрипт очікування (вихідний файл якого буде надрукований у файл з ім'ям await_script.log), який,
- Ініціює агент NoInputNoOutput
- Робить його агентом за замовчуванням
- Вмикається виявлення пі
- Чекає, поки хтось підключиться, і вийде, коли хтось зробить або закінчить час
- Спати 2 секунди
- Візьміть файл awa_script.log для Mac-адреси пристрою
- Довіряє та підключає пристрій, якщо mac_address є нульовим
- Видаляє файл залишків awa_script.log
Увімкніть сценарій сполучення Bluetooth за допомогою кнопки
Тепер у нас є сценарій для автоматизації процесу створення пари. Але цей сценарій повинен запускатися зручно, коли завгодно користувач. Отже, давайте зможемо підключити цей сценарій за допомогою фізичної кнопки, щоб цей скрипт викликався кожного разу при натисканні кнопки. Переривання - одна з життєво важливих частин вбудованого програмування. Для початку, переривання при сприйнятті ставлять звичайну процедуру програми та запускають заздалегідь визначену ISR, відому як Interrupt Service Rutine.
Тож давайте підключимо кнопку до виводу 11 gpio і призначимо ISR тому ж. Усередині ISR ми будемо називати сценарій.
Давайте створимо файл python з назвою Bluetooth-speaker-main.py і додамо до нього код нижче. Я додав коментарі до програми, тому на випадок, якщо ви використовуєте цей код, вони все ще є
#import необхідні пакети імпорт підпроцесу імпорт RPi.GPIO як gpio час імпорту import os import logging pair_pin = 11 # виберіть каталог файлів, з якого запущений скрипт python fileDirectory = os.path.dirname (os.path.realpath (__ file__)) # Встановіть розташування файлу журналу так само, як і розташування сценарію python logFile = fileDirectory + "/ bluetoothSpeaker.log" logging.basicConfig (ім'я файлу = logFile, filemode = 'w', format = '% (ім'я) s -% (ім'я рівня) 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 для запуску програми Bluetooth Speaker Python під час завантаження
Тепер нарешті давайте встановимо завдання cron, яке запускатиме цю програму python кожного разу, коли пі завантажується.
кронтаб -е
Виберіть ваш улюблений редактор і додайте нижній рядок у кінці файлу
@reboot python3 /home/pi/blueooth-speaker/Bluetooth-speaker-main.py
Це буде викликати нашу програму python кожного разу, коли пі завантажується.
І це все. Орел приземлився. Ви зробили безголову колонку Raspberry Pi Bluetooth.
Перезапустіть свій Pi, підключіть телефон до телефону та передайте аудіо.:)
Усі сценарії для цього динаміка Bluetooth Raspberry Pi можна завантажити з облікового запису GitHub. Також перевірте відео, подане нижче.