Stacja pogody Meteo SP-73

Recenzja + informacje z reverse engineering stacji.


Spis treści:



Podstawowe informacje o stacji pogody

Stacja Meteo SP-73 to chiński klon innej stacji pogody GreenBlue, posiada czujniki wewnętrzne: wilgotności, temperatury i ciśnienia. W zestawie znajduje się jeden czujnik zewnętrzny, który mierzy temperature i wilgotność. Do stacji można dokupić dwa dodatkowe czujniki zewnętrzne, które będą pracowały na kanałach od 1 do 3. I tutaj uwaga, zainstalowałem tą stację w Chorzowie Batorym i stacja zbiera mój czujnik dołączony do stacji i czujnik sąsiada. Stacja nie posiada mechanizmu parowania czujników zewnętrznych, także jeśli w okolicy do 60m będziemy mieli działające czujniki podobnej stacji pogody, to może się zdarzyć, że sygnały będą się nakładały i stacja będzie sczytywała cudze odczyty.


Instalacja stacji

Instalacja stacji (bez parowania stacji z LivingSense) przebiegła bezproblemowo, wystarczyło włożyć baterie do czujnika zewnętrznego ustawić kanał na CH3 i podpiąć dołączony zasilacz do stacji bazowej. Stacja od razu się zaświeciła i pokazała wyniki, niestety okazało się, że ktośw pobliżu ma już podobną stację i nie mogłem użyć kanału pierwszego, także stacja cały czas pokazuje odczyt sąsiada na kanale CH1 i odczyt mojego zewnętrznego czujnika na kanale CH3. Czujnik zewnętrzny działał pomimo odległości 5 metrów i dwóch ścian z cegły i szyby, działa również po włożeniu do zamrażarki celem wyznaczenia zależności temperatury od wartości przesyłanych w pakietach UDP


Próba parowania z LivingSense na telefonie

A teraz próba parowania z aplikacją dostarczoną przez producenta o nazwie LivingSense w wersji v1.7.16 na nowym telefonie Samsung z najnowszym Androidem w wersji 10. Podchodząc do próby parowania wyłączyłem dane komórkowe w telefonie tak jak zalecali ludzie na filmikach z YouTube.
Włączam aplikacje LivingSense i na ekranie pojawia się ekran z trzema opcjami: "PAIR", "LOG IN" i "SETUP GUIDE". Wybieram "PAIR" na ekranie pojawiają się dwa przyciski: pierwszy oznaczony jako W001 a drugi jako W003 a na górze napis po angielsku że mam wybrać rodzaj stacji i mam to odczytać z tyłu urządzenia. Niestety z tyłu stacji pogody nie ma żadnej wzmianki o rodzaju stacji, ale nie zrażony próbuję W001 i naciskam właśnie ten przycisk. Na akranie telefonu pojawia się informacja że należy przestroić stacje w tryb AP (Access Point). Żaden problem, tak jak na youtube przytrzymuje przycisk WI-FI przez 3 sekundy, po czym na ekranie stacji pogody pojawia się znacznik "AP". Przyciskam "NEXT" w LivingSense. Na ekranie telefonu pojawia się ekran do wybrania WI-FI z którym ma współpracować stacja pogody, wybieram swoją sieć wpisuję hasło i naciskam Next, pojawia się ekran "Binding device" informujący mnie że muszę się podpiąć pod sieć "LivingSmart" WI-FI network, nie ma sprawy, tak też czynie, przepinam się na access pointa ze stacji pogody. Na ekranie telefonu pojawia się:
Mobile phone connects to the device na zielono a cała reszta na czerwono poczynając od "Transfer information to the device" i dalej już mogę jedynie powrócić na poprzedni ekran bo parowanie przebiegło niepomyślnie.
Wniosek z tego taki, że może powinienem wybrać inny typ stacji, np W003, więc tak też próbuje, przechodzę spowrotem do ekranu, na którym jest wybór typu stacji i wybieram W003, na ekranie pojawia się informacja że mam przestroić stację pogody w tryb AP, więc tak czynię czyli wyłączam AP i włączam AP na stacji pogody. Wybieram next ale tym razem LivingSense nie pyta sięo sieć WI-FI tylko od razu wyszukuje stacje pogody w pobliżu i niestety nic nie znajduje, więc próba sparowania Meteo SP-73 jako W003 przebiegła z niepowodzeniem.


Alternatywna konfiguracja stacji

Jako że łatwo się nie poddaję zaczynam szukać po internecie i znajduję stronę. Piszą tam że można się połączyć ze stacją pogody w alternatywny sposób podpinając się laptopem pod stacje wtedy gdy jest ona w trybie "AP", więc tak robie. Na komputerze z Windows 10 łącze się do otwartej sieci WI-FI o nazwie LivingSmart. Połączenie wi-fi zostało nawiązane i w oknie Firefox-a wpisuję adres:
http://11.11.11.254
Na ekranie przeglądarki pojawia się okienko do podania nazwy użytkownika i hasła, wpisuję admin/admin co pododuje zalogowanie do panelu administracyjnego stacji pogody, który wygląda tak:



Jak widzimy na załączonym obrazku wszystko jest po chińsku i nie możemy się przełączyć na angielski ani tym bardziej polski, ale od czego mamy google translate.
Konsola administracyjna przypomina chiński router.
NA pierwszej pozycji menu mamy podsumowanie ustawień Wi-Fi stacji, czyli nazwy sieci WI-FI dla trybu access pointa, adres mac i adres IP oraz konfigurację trybu klienta WI-Fi stacji
Na drugiej opcji menu mamy tryb wi-fi stacji czyli accesspoint lub client (to samo możemy osiągnąć przy pomocy wciśnięcia przycisku Wi-Fi z tyłu stacji)
Na trzeciej pozycji menu mamy to co jest najbardziej interesujące czyli opcje konfiguracujne służące do podpięcia stacji do naszego punktu dostępu Wi-Fi. Wpisuje więc nazwe Wi-Fi i hasło mojego accesspointa i klikam chiński guziczek na dole strony i przełączam stacje pogody w tryb klienta Wi-fi przyciskiem.
napis Wi-Fi na stacji pogody przestał mrugać i świeci się na stało. Sprawdzam więc w mojej sieci Wi-Fi czy pojawiło się nowe urządzenie i rzeczywiście stacja pogody jest podpięta pod moje Wi-Fi.
Wpisuje więc adres IP nowego urządzenia z mojej podsieci Wi-Fi i rzeczywiście pojawia się ten sam panel administracyjny z konfiguracją jak przy podłączeniu bezpośrednim do stacji.
Krótkie sprawdzenie czy stacja Meteo SP-73 łączy się ze światem i przesyła dane do internetu potwierdza komunikację z chińskim serwerem, czyli po tej operacji mimo że stacja nie jest sparowana z moją aplikacją LivingSense w telefonie to przesyła informacje do chińskiej chmury danych i dostaje odpowiedź.


Przechwytywanie ruchu z tcpdump

Jako że po skonfigurowaniu stacji pogody w tyb klienta Wi-Fi nie mam żadnych danych w internecie, które mógłbym sprawdzić na telefonie czy na komputerze ze stacji pogody więc podjąłem decyzję o próbie rozszyfrowania protokołu komunikacyjnego stacji i prezentację wyników w internecie we własnym zakresie i aby to zrobić należało przechwycić komunikację stacji z chińską danych chmurą na routerze celem późniejszej analizy. Do tego celu nadaje się idealnie aplikacja tcpdump na routerach Linuxowych. W tym celu wydałem komendę:

tcpdump -i eth0 -s 65535 -w sp73.bin host 192.168.1.73

Gdzie 192.168.1.73 to adres stacji pogody w mojej sieci Wi-Fi a eth0 to nazwa interfejsu sieci lokalnej w mojej sieci.
Poczekałem pół godziny i przeniosłem wygenerowany plik sp73.bin na stację roboczą z zainstalowanym Wiresharkiem w celu dalszej analizy.


Analiza przechwyconego ruchu na Wireshark

Po wczytaniu sp73.bin do programu Wireshark można zaobserwować następującą prawidłowość: od stacji pogody do chińskiej chmury wychodzą pakiety z zawartością 14 bajtów zawierającą bajt początkowy "<", bajt końcowy ">", w środku znajduje się adres MAC urządzenia i najprawdopodobniej numer wersji aplikacji na stacji meteo. Co jest ważne to jest fakt że chmura chińska odpowiada dokładnie taką samą zawartością w stronę stacji meteo. Możemy traktować te pakiety jako swego rodzaju protokół ping, dzięki czemu stacja meteo wie, że może później wysłać dane pomiarowe z czujników.
Drugim rodzajem pakietów przesyłanym do chmury są dane pomiarowe z czujników, treść tych pakietów ma długość zawsze 71 bajtów niezależnie od tego ile czujników mamy zainstalowanych. Po wysłaniu tych pakietów stacja meteo nie dostaje żadnego potwierdzenia odbioru z chińskiej chmury, czyli w tym przypadku łączność jest jednostronna.


Informacje o protokole komunikacyjnym stacji

Poddałem analizie tylko pakiety UDP z zawartością 71 bajtową przesyłane do chińskiej chmury i oto jej rezultat:
Bajty od 22 do 30 zawierają informacje o temperaturze i wilgotności z czujników wewnętrznych stacji, (wszystkie bajty liczone od indeksu zerowego).
Bajty od 31 do 39 zawierają informacje o temperaturze i wilgotności z czujnika zawnętrznego na kanale CH1, jeśli nie posiadamy czujnika na tym kanale, bajty te będą zawierały warotść 0xFF (czytane hexem) na każdym polu.
Bajty od 40 do 48 zawierają informacje o temperaturze i wilgotności z czujnika zawnętrznego na kanale CH2, jeśli nie posiadamy czujnika na tym kanale, bajty te będą zawierały warotść 0xFF (czytane hexem) na każdym polu.
Bajty od 49 do 57 zawierają informacje o temperaturze i wilgotności z czujnika zawnętrznego na kanale CH3, jeśli nie posiadamy czujnika na tym kanale, bajty te będą zawierały warotść 0xFF (czytane hexem) na każdym polu.

Czyli mamy do czynienia z sekwencją 4 podobnych do siebie rzędów danych, każdy po 9 bajtów i teraz każdy rząd danych 9 bajtowych to:
temperatura (2 bajty), wilgotnośc 1 bajt (wartości z ostatniego odczytu, czyli to co najbardziej nas interesuje), temperatura (2 bajty), wilgotnośc 1 bajt (wartości min lub max), temperatura (2 bajty), wilgotnośc 1 bajt (wartości min lub max)
Wartości wilgotności są zakodowane tak jak wyświetla stacja na ekranie wyświetlacza, jednakże temeratury na 2 bajtach są zakodowane, najpierw idzie (na bajcie początkowym) młodsza część 16bitowej liczby a później starsza czyli temperatura z ostaniego odczytu dla kanału CH1 będzie na bajt32 i bajt31. Po złożeniu w 16 bitowego inta da to wartość liczbową temperatury, którą aby była odzwierciedleniem tego co jest na ekranie stacji, należy przeliczyć według wzoru na funkcję liniową:

f(x) = 0,0553127*x - 67,494980

Gdzie f(x) to temperatura w stopniach Celsjusza z dokładnością do 0,1 stopnia. x to wartość odczytana z bajtów 32 i 31

Ciśnienie atmosferyczne jest zakodowane na bajtach 60 i 59 i podobnie jak temperatury najpier idzie młodsza część liczby potem starsza. I tutaj nie musimy przeliczać wartości jak dla temperatur bo wartości są takie same jak te wyświetlane na ekranie stacji.


Własne zastępstwo dla LivingSense

Jak już mamy te wszystkie dane zebrane na temat protokołu komunikacyjnego stacji, to można spróbować napisać własną aplikację udającą chiński cloud w naszej sieci wewnętrzneji tak też zrobiłem. W przypadku gdy otrzymamy pakiet UDP z zawartością 14 bajtów to odsyłamy go do nadawcy. W przypadku gdy otrzymamy pakiet UDP z zawartością 71 bajtów wtedy poddajemy taki pakiet analizie, wyciągamy dane o temperaturze i wyliczamy funkcję f(x) wyciągamy informacje o wilgotności z czujników i informacje o ciśnieniu atmosferycznym po czym wysyłamy je do internetu i zapisujemy je w bazie danych celem prezentacji wynikó w internecie. Warto tutaj zauważyć, że w przeciągu 24h stacja wyśle około 6500 pakietów UDP z odczytami z czujników, więc jeśli chcemy mieć odczyty, np co minutę, to musimy dokonać agregacji wyników i powyciągać wartości średnie z kilku odczytów.
Należy także zauważyć że stacja sama z siebie nie wyśle od nas pakietów UDP i stacje trzeba skonfigurować do tego celu. Stacja SP-73 umożliwia podmiane adresu na który będzie wysyłała informacje o odczytach. Można to uczynić na 5 pozycji menu od góry w panelu administracyjnym stacji i jeśli w miejscu gdzie jest adres internetowy chińskiej chmury podamy adres komputera/routera, na którym jest odpalona nasza aplikacja to będziemy mieli spiętą stację Meteo SP-73 z naszą aplikacją do obsługi odczytów ze stacji.


Strona internetowa prezentująca wyniki ze stacji

Jak już mamy aplikację zbierającą dane ze stacji, to pora na prezentację wyników. Ja wybrałem do tego portal weatherunderground.com Dane z mojej stacji meteo są dostępne za darmo na stronie https://www.wunderground.com/dashboard/pws/ICHORZ4.