RxJava - Połączenie szeregowe przez Bluetooth

Kliknij i wspomóż mnie :)

Android

O projekcie

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

Aplikacja

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.

Po pierwsze Bluetooth

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.

Interfejs połączenia

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ć.

Implementacja

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

Połączenie

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

Nasłuchiwanie 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').

Wysyłanie wiadomości

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 😊

O mnie

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ć.

Zobacz więcej

Najnowsze posty

Kliknij i wspomóż mnie :)

Zostańmy w kontakcie

* Wymagane
Kliknij i wspomóż mnie :)
shop
Otwórz Sklep Play

Zachęcam Cię do odwiedzenia mojej strony na Google Play store i sprawdzenia wszystkich moich aplikacji.