Raspberry Pi jako przekaźnik bluetooth
Kiedyś potrzebowałem przekaźnika bluetooth, takiego który mogłem podłączyć do wieży czy głośników od komputera i puszczać muzykę bezprzewodowo z telefonu. Nie chciałem używać czegoś takiego jak "Balena Sound", towrzyć jakieś konta, logować się. To nie w moim stylu, przeglądając co wyniki wyszukiwania wujka Google trafiłem na jeden lub dwa poradniki, które okazały sie klapą. Jednym z wyników wyszukiwania były wątek na forum i on okazał się strzałem w 10 (powiedzmy, bo jakość dzwięku może srogo rozczarować). Nie owiajając w bawełnę konfiguracje Raspberry Pi zaczniemy od zainstalowania systemu na karcie i umożliwienia zalogowania się przez SSH.
Po zalogowaniu się do systemu, każdą konfigurację rozpoczynamy od aktualizacji.
$ sudo apt update $ sduo apt upgrade
Następnie instalujemy niezbędne oprogramowanie.
$ sudo apt install pulseaudio pulseaudio-module-bluetooth
Teraz musimy dodać naszego użytkownika do grupy bluetooth.
$ sudo usermod -aG bluetooth pi
Aby zmiany dotyczące grupy lub użytkownika zaczęły działać należy się wylogować i zalogować ponownie.
Kolejną czynnością jest przestawienie RPI aby było widziane jako
"Odpływ wysokiej jakość (A2DP)". W pliku
/etc/bluetooth/main.conf usuwamy znak komentarza z opcji
Class
i nadajemy jej wartość
0x41C oraz usuwamy znak komentarza z opcji
DiscoverableTimeout
... Class = 0x41C ... DiscoverableTimeout = 0 ...
Po zapisaniu zmian w pliku, restartujemy usługę.
$ sudo systemctl restart bluetooth
Następnie musimy uruchomić bluetooth na RPI, po wydaniu polecenia
bluetoothctl
, wydajemy kolejno
przedstawione poniżej polecenia.
Za nim to jednak zrobimy może być tak, że nasz kontroler bluetooth
będzie wyłączony za pomocą rfkill. W tym przypadku musimy
wydać polecenie raspi-config
następnie
wybrać:
Localisation Options -> WLAN Country -> [kraj, którym znajduje się urządzenie] -> Finish #Wyrażamy zgodę na restart RPI.
$ bluetoothctl Agent registered [bluetooth]# power on Changing power on succeeded [bluetooth]# discoverable on Changing discoverable on succeeded [CHG] Controler XX:XX:XX:XX:XX:XX Discoverable: yes [bluetooth]# pairable on Changing pairable on succeeded [bluetooth]# agent on Agent is already registered [bluetooth]# default-agent Default agent request successful [bluetooth]# quit
Uruchamiamy pulseaudio
$ pulseaudio --start
Następnie sprawdzamy czy usługa bluetooth zarejestrowała odpływ A2DP.
$ sudo systemctl status bluetooth
Jeśli zauważyliśmy jakieś linie Endpoint registered
zawierające napis "A2DP" oznacza to, że odpływ został zarejestrowany.
Teraz dokonamy testowego połączenia. Warto zaznaczyć, że abyśmy
mogli się połączyć z RPI to będziemy musieli "zaufać" naszemu
urządzeniu. Na malinie uruchamiamy polecenie
bluetoothctl
, a na telefonie
wyszukujemy urządzeń bluetooth, nazwa urządzenia będzie identyczna jak
nazwa hosta RPI. Próbuje my się z nim połączyć.
$ bluetoothctl
Przy próbie podłączenia zostanie na wyświetlona masa komunikatów
związanych z naszym telefonem, w tych komunikatch po słowie
Device, znajdować się będzie adres MAC modułu bluetooth w
telefonie. Nie należy zrazić się komunikatem "Błąd połączenia". Teraz
na RPI wpisujemy polecenie bluetooth
trust
oraz
MAC naszego bluetooth.
[bluetooth]# trust AA:BB:CC:DD:EE:FF
Powinniśmy się prawidłowo połączyć. Dzwięk również już pownien działać. Dla testu warto włączyć jakąś muzykę lub film na YT.
Mogło by się okazać, że już gotowe. Jednak to nie wszystko, teraz póki co uruchamialiśmy pulseaudio z ręki, jednak nie bedziemy się za każdym razem po włączeniu RPI logować i włączać usługę. Tu jest również pewien haczyk, otóż żeby pulseaudio mogło działać niezbędny jest zalogowany użytkownik, z poziomu którego systemd będzie ten program uruchamiać więc poza autostartem pulseaudio do ustawienia zostało jeszcze autologowanie na użytkownika pi.
Uruchomie pulseaudio wraz z systemem.
$ systemctl --user enable pulseaudio.service
Włączenie autologowania się na użytkownika pi.
$ sudo raspi-config System Options -> Boot / Auto Login -> Console Autologin -> Ok
Po ustawieniu autologowania, być może będzie trzeba zrestartować urządzenie.
Teraz formalnie to wszystko. Jednak pozostała jeszcze jedna kwestia, podłączanie się urządzeń do RPI. Można to zrobić na 3 sposoby.
Pierwszy najprostszy, pozostawienie tego tak jak jest. Każdeme nowemu urządzeniu będzie trzeba "zaufać", tak jak podczas testu.
Drugi pozwalający na połączenie z każdemu urządzeniu bez żadnych mechanizmów kontroli.
Trzeci wprowadzający klasyczny "PIN". Drugi i trzeci sposób opisze poniżej, każdy zdecyduje co jemu najbardziej odpowiada.
W tym jak i w trzecim sposobie musimy zainstalować dodatkowy pakiet. Sposoby różni tylko konfiguracja usługi bt-agent oraz jeden dodatkowy plik w trzecim. Usługa ta wchodzi w skład pakietu bluez-tools.
$ sudo apt install bluez-tools
Sposób 2: Pozwala na podłaczenie się każdego urządzenia
Po zainstalowaniu pakietu, musimy utworzyc plik usługi bt-agent.service w katalogu /etc/systemd/system.
[Unit] Description=Bluetooth Auth Agent After=bluetooth.service PartOf=bluetooth.service [Service] Type=simple ExecStart=/usr/bin/bt-agent -c NoInputNoOutput [Install] WantedBy=bluetooth.target
Zapisujemy plik, włączamy go aby uruchamiał się zgodnie zapisaną w nim sekwencją. I możemy startować usługę. Teraz każde nowe urządzenie podłączy się do RPI bez żadnych przeszkód.
$ sudo systemctl enable bt-agent.service $ sudo systemctl start bt-agent.service $ sudo systemctl status bt-agent.service
Sposób 3: Pozwala na podłączenie się tylko dla znających PIN
Ten sposób rózni się konfiguracją usługi oraz dodatkowym plikiem, w którym zdefiniowany jest PIN. Utworzy my teraz plik z PIN-em, w pliku pin.conf w katalogu /etc/bluetooth/ zapisujemy poniższą linię.
* 12345
Oczywiście PIN, możemy podać własny. Nadajemy odpowienie uprawnienia dla pliku.
$ sudo chmod 600 /etc/bluetooth/pin.conf
Teraz dokonujemy zmian w pliku usługi, tak aby bt-agent, wykorzystywał PIN do uwierzytelnienia połączeń z RPI.
[Unit] Description=Bluetooth Auth Agent After=bluetooth.service PartOf=bluetooth.service [Service] Type=simple ExecStart=/usr/bin/bt-agent -c NoInputNoOutput -p /etc/bluetooth/pin.conf ExecStartPost=/bin/sleep 1 ExecStartPost=/bin/hciconfig hci0 sspmode 0 [Install] WantedBy=bluetooth.target
Po zatwierdzeniu zmian, włączamy i uruchamiamy usługę.
$ sudo systemctl enable bt-agent.service $ sudo systemctl start bt-agent.service $ sudo systemctl status bt-agent.service
Nasz przekaźnik jest już gotowy. Możemy podłaczyć do niego zarówno głośnik jak i zestaw kina domowego, wszystko czego połączenie opiera się na złączu Jack 3,5mm.
~xf0r3m