Android
2020-03-14
Stało się i po ponad dwóch latach testowania, dostosowywania i poprawiania postanowiłem udostępnić jako Open Source mój projekt do sterowania paskami LED.
Sterowanie odbywa się z poziomu aplikacji za pomocą interfejsu Bluetooth, ale nic nie stoi na przeszkodzie, żeby do Arduino wysyłać komendy w inny sposób.
Repozytorium i jak skorzystać z projektu znajdziesz na Github w linku poniżej:
Arduino-LED-Controller
Sama aplikacja też jest otwarta i podatna na dostosowywanie. Osobne repozytorium znajduje się tutaj:
LEDController
W tym artykule zamierzam nieco przybliżyć jak z pomocą biblioteki RxJava zrealizowałem schemat połączenia.
Od początku planowałem użycie Bluetooth co było podyktowane dosyć tanim i przystępnym modułem HC-05.
Na początku chciałem uzyskać prosty interfejs do stanu i urządzeń BT.
Jeszcze pozostaje nasłuchiwanie na stan modułu Bluetooth w telefonie. To zrealizowałem za pomocą BroadcastReceiver.
Jako, że chciałem, żeby aplikacja była reaktywna i reagowała na to co dzieje się z połączeniem i danymi to zdefiniowałem prosty interfejs bazujący na RxJava.
Akcje wykonywane z poziomu klienta są Completable, gdyż interesuje nas tylko powodzenie lub błąd.
W zamian klient otrzymuje dwa Subjecty, które można zasubskrybować i nasłuchiwać.
Teraz po kolei omówię implementację tego interfejsu po stronie źródła danych. To jak widok reaguje na dane jest sprawą drugorzędną dla architektury.
Wspomnę tylko, że wątek połączenia Bluetooth zastosowałem zgodnie z oficjalną dokumentacją:
Android developers - Connect as a client
Metoda connect() jest dosyć prosta. Robi dokładnie dwie rzeczy:
1. Uruchamia wątek połączenia Bluetooth (ten przy timeout rzuca wyjątek)
2. Jeśli się powiedzie to uruchamia funkcję do nasłuchiwania wiadomości
Jak już jesteśmy przy nasłuchiwaniu to zobaczmy jak tutaj wygląda kod.
Funkcja ta subskrybuje się do streamObserver i emituje do messagePublisher niepuste wiadomości.
Funkcja streamObserver to zwykły interwał wywołujący co jakiś czas funkcję readStream(), która zwraca tekst.
W tym miejscu zczytywane są bajty znaków, aż się one nie skończą lub kod natrafi na znak terminacji. W moim przypadku jest to zwykły EOL ('\n').
Na sam koniec krótka funkcja do wysyłania ciągu znaków.
Jak okazało się nadawanie jest dużo prostsze niż odbieranie 😄
Całą klasę BluetoothSocketManager można podejrzeć pod linkiem:
BluetoothSocketManager
Dziękuję Ci za przeczytanie tego materiału 😀 Jeżeli spodobało Ci się to o czym piszę, możesz sprawdzić więcej materiałów na blogu lub udostępnić znajomym. Będzie mi bardzo miło 😊
Jestem młodym programistą, który dumnie dzierży wiele pasji takich jak bieganie czy piwowarstwo domowe. Jedną z nich jest także programowanie i o tym właśnie zamierzam tutaj pisać.
Zachęcam Cię do odwiedzenia mojej strony na Google Play store i sprawdzenia wszystkich moich aplikacji.