.~~.   .~~.
		    '. \ ' ' / .'
		     .~ .~~~..~.                       _                          _
		    : .~.'~'.~. :      ___ ___ ___ ___| |_ ___ ___ ___ _ _    ___|_|
		   ~ (   ) (   ) ~    |  _| .'|_ -| . | . | -_|  _|  _| | |  | . | |
		  ( : '~'.~.'~' : )   |_| |__,|___|  _|___|___|_| |_| |_  |  |  _|_|
		   ~ .~ (   ) ~. ~                |_|                 |___|  |_|
		    (  : '~' :  )
		     '~ .~~~. ~'
			 '~'
		

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