Komunikacja Wi-Fi z żarówką RGB od ChiChinLighting
Jakiś czas temu wpadła mi w ręce żarówka RGB od ChiChinLighting sterowana za pomocą Wi-Fi. Moją uwagę zwróciła dzięki wbudowanemu modułowi Wi-Fi, który wyklucza konieczność posiadania dodatkowych hubów pośredniczących w komunikacji. Nie było by jednak żadnej frajdy, gdybyśmy mogli nią sterować tylko za pomocą dedykowanej aplikacji MagicHome.
Aplikacja MagicHome
Producent przygotował dedykowaną aplikację mobilną MagicHome dla systemów Android oraz Windows, która pozwala nam na sterowanie żarówkami, a także ich konfigurację. Aplikacja fabrycznie działa w trybie Access Point tworząc sieć LEDnetXXXXXX, do której po podłączeniu możemy ustawić przypisanie żarówki do aktualnie istniejącej sieci Wi-Fi w domu.
Sieć udostępniona przez żarówkę
Aplikacja pozwala na sterowanie żarówkami bez konieczności przypisywania ich domowej sieci Wi-Fi. Jednak brak zabezpieczeń oraz niewygoda takiego rozwiązania polegająca na konieczności skaknia pomiędzy sieciami, sprawia że warto zrezygnować z takiej opcji. W tym celu musimy skorzystać z opcji przypisania do wybranej sieci i podać hasło dostępowe. Dostępna jest również opcja konfiguracji, pozwalającej sterowanie przez chmurę producenta, ale tym zagadnieniem nie będziemy sobie zawracać głowy.
Konfiguracja połączenia z naszą siecią domową
Jeśli wszystko przebiegnie prawidłowo, żarówka zostanie przełączona w tryb klienta do naszej domowej sieci i powinniśmy ją zobaczyć na liście odnalezionych urządzeń wraz z adresem MAC oraz wersją firmware. Wybierając ten wariant konfiguracji, sieć LEDnetXXXXXX przestaje być dostępna.
Lista aktualnych urządzeń
Jeśli chcielibyśmy z jakiegoś powodu przywrócić żarówkę do ustawień fabrycznych, musimy ją trzykrotnie wyłączyć i włączyć w krótkich odstępach czasu. Sukces zostanie zasygnalizowany kilkukrotnym zapaleniem i zgaszeniem żarówki.
Sama aplikacja jest dość bogata w możliwości. Przede wszystkim możemy wybrać kolor świecenia i jasność, zarówno przy wykorzystaniu diod RGB jak i białych. Dodatkowo mamy możliwość wyboru jednego z dwudziestu efektów świetlnych, własnej sekwencji barw, a także sterowanie w rytm odtwarzanej muzyki lub dźwięku przechwyconego przez mikrofon. Ciekawą opcją jest również możliwość ustawienia timerów, w jakich dniach i godzinach żarówka ma zachować się w zaplanowany przez nas sposób.
Wygląd aplikacji MagicHome
Ale przejdźmy do sedna sprawy. Nie będziemy przecież opisywać tylko cech tego produktu, ale skupimy się na innym temacie. Konkretniej mówiąc, na możliwością jej sterowania z poziomu komputera lub Arduino. A więc, zaczynamy!
Podsłuchajmy o czym i gdzie gadają
W pierwszej kolejności interesuje nas w jaki sposób aplikacja mobilna znajduje żarówkę w sieci oraz jak przebiega jej konfiguracja do pracy w istniejącej sieci Wi-Fi. Do tego celu posłużył nam niezastąpiony program Wireshark, który po przechwyceniu pakietów uwierzytelniania EAPOL, pozwolił nam nasłuchiwać komunikację pomiędzy telefonem, a skonfigurowaną już żarówką.
Podsłuchiwanie transmisji za pomocą Wireshark
Jak możemy zauważyć, aplikacja mobilna wysyła pakiet UDP o treści HF-A11ASSISTHREAD na adres rozłgoszeniowy sieci i port [xdata]48899[/xdata], aby po chwili otrzymać odpowiedzi od urządzeń, które na niego zareagowały: 10.0.0.125,ACCF2371B770,HF-LPB100-ZJ200
Odpowiedź zwrotna od żarówki Wi-Fi
Komunikat zwrotny zawiera zatem adres IP żarówki, MAC oraz informacje o module WiFi HF-LPB100 od Hi-Flying, z którym jak się okazuje, możemy komunikować się za pomocą komend AT. Gdyby kogoś interesowało coś więcej na ten temat odsyłam do dokmentacji w formacie PDF.
Sprawdźmy zatem, czy uda nam się powtórzyć tą samą operację, ale już z komputera zamiast telefonu:
- sudo echo -n "HF-A11ASSISTHREAD" | socat - udp4-datagram:10.0.0.255:48899,broadcast | xxd
Wysłanie pakietu UDP i spodziewana odpowiedź
Skoro wiemy już jak odszukać naszą żarówkę i wiemy, że mamy do czynienia z modułem HF-LPB100 przyjmującym komendy AT, podsłuchamy tym razem cały proces konfiguracji, a więc wszystkie te operacje, które wykonywaliśmy podczas parowania żarówki z siecią domową.
Podsłuchiwanie procesu konfiguracji
Aplikacja ponownie wysyła pakiet rozgłoszeniowy UDP 10.10.123.255:48899 o treści HF-A11ASSISTHREAD, a następnie ponawia ten sam pakiet już bezpośrednio do adresu IP żarówki. Następnie zostaje wysłany pakiet o treści +ok. Od tego momentu żarówka będzie przyjmować komendy AT wysyłane wysyłane wciąż na tym samym porcie:
- AT+WSSSID=NAZWA_NASZEJ_SIECI_DOMOWEJ
- AT+WSKEY=WPS2PSK,AES,HASLO_DO_NASZEJ_SIECI
- AT+WMODE=STA
- AT+Z
- AT+Z
- AT+Q
Każdorazowy odbiór komendy AT żarówka także potwierdza komunikatem +ok. Co ciekawe, nie czyni tego na tym samym porcie co wysyłane pakiety UDP, ale losowym.
Powtarzając ten sam proces pod konsolą, będzie to wyglądało następująco:
- sudo echo -n "HF-A11ASSISTHREAD" | socat - udp4-datagram:10.10.123.255:48899,broadcast | xxd
- sudo echo -n "HF-A11ASSISTHREAD" | socat - udp4-datagram:10.10.123.3:48899 | xxd
- sudo echo -n "+ok" | socat - udp4-datagram:10.10.123.3:48899
- sudo echo "AT+WSSSID=NAZWA_AP" | socat - udp4-datagram:10.10.123.3:48899
- sudo echo "AT+WSKEY=WPA2PSK,AES,HASLO" | socat - udp4-datagram:10.10.123.3:48899
- sudo echo "AT+WMODE=STA" | socat - udp4-datagram:10.10.123.3:48899
- sudo echo "AT+Z" | socat - udp4-datagram:10.10.123.3:48899
- sudo echo "AT+Z" | socat - udp4-datagram:10.10.123.3:48899
- sudo echo "AT+Q" | socat - udp4-datagram:10.10.123.3:48899
- sudo echo "AT+Q" | socat - udp4-datagram:10.10.123.3:48899
Bingo! Żarówka została skonfigurowana i powinna połączyć się z naszym routerem. Pozostaje nam już tylko podsłuchać polecenia sterowania z aplikacji takimi jak włączenie, wyłączenie, zmiana koloru itp.
Oszczędzając Wam już zrzutów ekranu i analizy pakietów - polecenia wysyłane są protokołem TCP na porcie 5577. Poniżej dla przykładu pakiet TCP z komendą żądania informacji o aktualnym statusie żarówki.
Odpytanie o status żarówki
Odpowiedź zwrotna
Jak to będzie wyglądało pod konsolą?
- echo -ne "x81x8ax8bx96" | nc 10.0.0.125 5577 | xdd
Wysłanie komendy i odpowiedź
Suma kontrolna
Najważniejsza jest suma kontrolna, która pojawia się każdorazowo przy wysyłaniu poleceń i otrzymywanych odpowiedzi. To na jej podstawie, zarówno my jak i żarówka, jest w stanie stwierdzić czy składnia jest prawidłowa. Jak ją wyliczyć?
Obliczanie sumy kontrolnej polega na zsumowaniu wszystkich wartości poszczególnych bajtów, gdzie wykorzystujemy tylko najmłodszy bajt otrzymanego wyniku. Wysyłając zatem sekwencję 0x81 0x8A 0x8B musimy "dorzucić" na koniec ów sumę kontrolną (dalej CRC), wynoszącą 0x96:
0x81 + 0x8A + 0x8B = 0x0196
Reguła ta dotyczy również odpowiedzi jakie otrzymujemy.
Dostępne polecenia
Poniżej prezentuję listę poleceń, które udało mi się podejrzeć. Jak możecie zauważyć, niektóre składają się z jednego bajtu, a niektóre z trzech:
- 0x10 0x14 - ustaw czas
- 0x11 0x1A 0x1B - pobierz czas
- 0x21 - ustaw liczniki
- 0x22 0x2A 0x2B - pobierz liczniki
- 0x31 - ustaw kolor
- 0x41 - ustaw program muzyczny
- 0x51 - ustaw własny program
- 0x61 - ustaw predefiniowany program
- 0x71 - ustaw zasilanie
- 0x81 0x8A 0x8B - pobierz aktualny status
Pamiętajmy, iż każdy konkretny pakiet danych sładać się będzie z kodu polecenia, opcjonalnych parametrów oraz sumy kontrolnej znajdującej się na samym końcu.
Pobieranie aktualnego statusu
Podstawowym poleceniem jest odpytanie żarówki o jej aktualny stan, który zdradzi nam nieco informacj. Polecenie wygląda następująco:
0x81 0x8A 0x8B 0x96
W odpowiedzi otrzymamy:
0x81 0x44 0x24 0x61 0x21 0x07 0x00 0x00 0xFF 0x00 0x05 0x00 0xF0 0x66
Znaczenie poszczególnych bajtów jest następujące:
- 0x81 - komenda Status
- 0x44 - wartość stała
- 0x24 - żarówka jest włączona (0x24 - włączona, 0x23 - wyłączona)
- 0x61 - tryb pracy wybranego koloru (możliwe inne wartości)
- 0x21 - wartość stała
- 0x07 - opóźnienie dla predefiniowanych efektów (0x01 - 0x1F)
- 0x00 - wartość koloru czerwonego (0x00 - 0xFF)
- 0x00 - wartość koloru zielonego (0x00 - 0xFF)
- 0xFF - wartość koloru niebieskiego (0x00 - 0xFF)
- 0x00 - wartość koloru białego (0x00 - 0xFF)
- 0x05 - wersja firmware
- 0x00 - wartość stała
- 0xF0 - aktywne diody RGB (0xF0 - Tak, 0x0F - Nie)
- 0x66 - suma kontrolna
Jak możemy zauważyć, możemy tutaj wyróżnić stany 0x24 oraz 0x23, a także dwie wartości logiczne 0xF0 i 0x0F. Warto je zapamiętać, ponieważ będą pojawiać się także w innych przypadkach. Jeśli w dla parametru aktywnych diod RGB byłaby wartość 0x0F oznaczałoby to tyle, że wykorzystujemy diody białe i respektowana jest wartość dla nich, a nie dla poszczególnych wartości RGB.
Wartość aktualnego trybu pracy może przyjąć jeszcze następujące wartości:
- 0x25 - 0x38: jeden z dwudziestu predefiniowanych efektów
- 0x60 - własny program efektów
- 0x61 - jeden kolor
- 0x62 - program muzyczny
Sterowanie zasilaniem diod LED
Sterowanie zasilaniem diod odbywa się poprzez wysłanie komendy 0x71 i parametru włącz 0x23 lub wyłącz 0x24. Dochodzi nam również wartość logiczna 0x0F oraz suma kontrolna. Wartość logiczna definiuje, czy komenda pochodzi z zewnątrz naszej sieci (z chmury).
Aby włączyć diody, wysyłamy: 0x71 0x23 0x0F 0xA3
Odpowiedź: 0x0f 0x71 0x23 0xA3
Aby wyłączyć diody, wysyłamy: 0x71 0x24 0x0F 0xA3
Odpowiedź: 0x0F 0x71 0x24 0xA4
Z poziomu konsoli wygląda to tak:
- echo -ne "x71x24x0fxa4" | nc 10.0.0.125 5577 | xdd
Włączanie i wyłączanie
Wybór koloru świecenia
Ogólne polecenie ustawienia koloru świecenia wygląda następująco:
0x31 0xRR 0xGG 0xBB 0xWW 0xYY 0x0F 0xZZ
Dla bajtu 0xYY podajemy już wcześniej podaną wartość określającą czy chodzi nam o diody RGB 0xF0 czy białe 0x0F. Ostatni bajt 0xZZ to oczywiście wyliczona suma kontrolna.
Przykładowo dla koloru czerwonego: 0x31 0xFF 0x00 0x00 0x00 0xF0 0x0F 0x2F
- echo -ne "x31xffx00x00x00xf0x0fx2f" | nc 10.0.0.125 5577
Dla koloru białego na 50%: 0x31 0x00 0x00 0x00 0x80 0x0F 0x0F 0xCF
- echo -ne "x31x00x00x00x80x0fx0fxcf" | nc 10.0.0.125 5577
Wydanie polecenia ustawienia koloru nie zwraca żadnej odpowiedzi.
Wybór predefiniowanego programu
Żarówka posiada 20 predefiniowanych efektów świecenia oznaczonych bajtami o wartościach od 0x25 do 0x38. Dla przykładu efekt 12 to efekt stroboskopu z wykorzystaniem 7 kolorów, gdzie odpowiada mu wartość 0x30. Każdemu efektowi ustawiamy także prędkość działania, a konkretniej czas opóźnienia od wartości 0x01 (szybko) do 0x1F[xcode] (wolno).
Budowa całego polecenia wygląda następująco: [xcode]0x61 0x30 0x01 0x0F 0xA1.
Gdy zapytamy o status, zwróci nam stan jako numer wybranego programu - czyli w tym przypadku 0x30 oraz wybraną wartość opóźnienia 0x01.
Tryb dźwiękowy
Komenda wyboru trybu dźwiękowego praktycznie nie różni się niczym od tej przy wyborze koloru. Różnica polega tylko na pierwszym bajcie 0x41 zamiast 0x31:
0x41 0xRR 0xGG 0xBB 0xWW 0xYY 0x0F 0xZZ
Podejrzewam, że ma to związek z określeniem stanu pracy żarówki w aplikacji mobilnej, która próbkuje dźwięk i wysyła do żarówki odpowiadające im brawy. Jeśli zapytalibyśmy o status żarówki to otrzymamy informację, że żarówka pracuje właśnie w trybie 0x62
Warto jednak pamiętać, że w trybie dźwiękowym jak i koloru możliwe jest przysłanie w pakiecie kolejno następujących po sobie sekwencji kolorów.
Własny program
Możliwe jest również wysłanie do żarówki własnego programu efektów, składającego się z szesnastu barw opisanych czterema bajtami 0xRR 0xGG 0xBB 0x00, wartości opóźnienia przejść między kolorami 0x01 - 0x1F oraz rodzajem przejść pomiędzy nimi:
- 0x3A - przejście tonalne
- 0x3B - zwykła zmiana koloru
- 0x3C - stroboskop
Na sam koniec dochodzą nam wartości 0xFF 0x0F i obliczona suma kontrolna. Dla prześć tonalnych pomiędzy kolorami: czerwonym, zielonym i niebieskim z najmniejszym opóźnieniem 0x01 wyglądałoby to następująco:
0x51
0xFF 0x00 0x00 0x00 0x00 0xFF 0x00 0x00 0x00 0x00 0xFF 0x00
0x01 0x02 0x03 0x00 0x01 0x02 0x03 0x00 0x01 0x02 0x03 0x00
0x01 0x02 0x03 0x00 0x01 0x02 0x03 0x00 0x01 0x02 0x03 0x00
0x01 0x02 0x03 0x00 0x01 0x02 0x03 0x00 0x01 0x02 0x03 0x00
0x01 0x02 0x03 0x00 0x01 0x02 0x03 0x00 0x01 0x02 0x03 0x00
0x01
0x3A
0xFF 0x0F 0xDC
Kolory opisane jako 0x01 0x02 0x03 0x00 są kolorami nieaktywnymi i lepiej ich nie ustawiać, ponieważ na pierwszym z nich wykonywanie sekwencji efektu zostanie zakończone.
Ustawianie czasów i zaplanowanych działań
Skoro możliwe jest ustawienie zaplanowanych działań to potrzebna jest nam kontrola nad zegarem i musimy ustawić aktualny czas poleceniem 0x10 0x14. Pełny zapis:
0x10 0x14 0x11 0x01 0x0F 0x01 0x23 0x2D 0x07 0x00 0x0F 0xAC
Znaczenie kolejnych wartości
- 0x10 0x14 - polecenie ustawienia czasu
- 0x11 - rok 2017
- 0x01 - miesiąc styczeń
- 0x0F - 15 dzień miesiąca
- 0x01 - 1 godzina
- 0x23 - 35 minuta
- 0x2D - 45 sekunda
- 0x07 - dzień tygodnia
- 0x00 - stała wartość
- 0x0F - czy polecenie z chmury?
- 0xAC - suma kontrolna
- echo -ne "x10x14x11x01x0Fx01x23x2Dx07x00x0FxAC" | nc 10.0.0.107 5577 | xxd
W odpowiedzi otrzymamy potwierdzenie: 0x0F 0x10 0x00 0x1F
Ustawienie czasu i odpowiedź
Skoro znamy już sposób zapisu czasu, zapytajmy o niego poleceniem:
0x11 0x1A 0x1B 0x0F 0x55
- echo -ne "x11x1Ax1Bx0Fx55" | nc 10.0.0.107 5577 | xxd
W odpowiedzi otrzymamy aktualny czas:
0x0F 0x11 0x14 0x11 0x01 0x0F 0x01 0x2D 0x0A 0x07 0x00 0x94
Znaczenie kolejnych wartości
- 0x0F - czy odpowiedź z chmury?
- 0x11 0x14 - aktualny czas
- 0x11 - rok 2017
- 0x01 - miesiąc styczeń
- 0x0F - 15 dzień miesiąca
- 0x01 - 1 godzina
- 0x2D - 45 minuta
- 0x0A - 10 sekunda
- 0x07 - dzień tygodnia
- 0x00 - stała wartość
- 0x94 - suma kontrolna
Przejdźmy do sedna sprawy - żarówka pozwala na ustawienie sześciu zaplanowych działań, które wykonają się w zaplanowanym czasie. Każdy rekord składa się z 16 bajtów:
- określenia czy zadanie jest aktywne 0xF0 lub nie 0x0F
- daty, godziny i minuty
- ustawienie powtarzania w wybrane dni tygodnia
- ustawienie koloru lub wybór predefiniowanego programu
- określenia czy diody są włączone 0xF0 lub wyłączone 0x0F
Pamiętajmy, że musimy wysłać wszystkie 6 programów. Przykładowa konfiguracja:
0x21 - ustaw zadania
0xF0 - aktywny
0x11 0x01 0x10 0x01 0x00 0x00 - 2017-01-16 01:00:00
0x00 - bez powtórzeń w dniach tygodnia
0x00 0x00 0x00 0x00 0x00 0x00 - nie ingeruj w kolor
0xF0 - włącz diody
0x0F - nieaktywny
0x11 0x01 0x10 0x02 0x00 0x00 - 2017-01-16 02:00:00
0x00 - bez powtórzeń w dniach tygodnia
0x00 0x00 0x00 0x00 0x00 0x00 - nie ingeruj w kolor
0xF0 - włącz diody
0xF0 - aktywny
0x11 0x01 0x10 0x03 0x00 0x00 - 2017-01-16 03:00:00
0x00 - bez powtórzeń w dniach tygodnia
0x61 0xff 0x00 0x06 0x00 0x00 - ustaw kolor (R G B W)
0xF0 - włącz diody
0xF0 - aktywny
0x11 0x01 0x10 0x04 0x00 0x00 - 2017-01-16 04:00:00
0x00 - bez powtórzeń w dniach tygodnia
0x25 0x01 0x00 0x00 0x00 0x00 - włącz predefiniowany program 0x25
0xF0 - włącz diody
0xF0 - aktywny
0x11 0x01 0x10 0x05 0x00 0x00 - 2017-01-16 05:00:00
0x00 - bez powtórzeń w dniach tygodnia
0x00 0x00 0x00 0x00 0x00 0x00 - nie ingeruj w kolor
0x0F - wyłącz diody
0xF0 - aktywny
0x00 0x00 0x07 0x00 0x00 - 07:00:00
0x00 0x02 - powtarzaj w poniedziałki, wtorki i środy
0x00 0x00 0x00 0x00 0x00 0x00 - nie ingeruj w kolor
0xF0 - włącz diody
0x00 - stała wartość
0xF0 - stała wartość
0xDA - suma kontrolna
Jeśli chodzi o wybór kilku dni tygodnia do powtórzeń, posługujemy się nimi jak bitami o odpowiedniej wadze
- 2^0 niedziela
- 2^1 poniedziałek
- 2^2 wtorek
- 2^3 środa
- 2^4 czwartek
- 2^5 piątek
- 2^6 sobota
Chcąc ustawić poniedziałek, wtorek i srodę, otrzymamy wartość 2^1 + 2^2 + 2^3 = 0x07.
Aby pobrać aktualnie ustawione programy, wysyłamy polecenie 0x22 0x2A 0x2B 0x0F 0x86. W odpowiedzi otrzymamy presety zgodne skłądnią z powyższymi rekordami.
- echo -ne "x22x2Ax2Bx0fx86" | nc 10.0.0.107 5577 | xxd
Pobranie aktulanych zadań
Oczywiście pierwsze dwa bajty informują nas o źródle pochodzenia 0x0F i informacji o rodzaju zwracanych danych 0x22.
Galeria
Temperatury
Do chłodzenia żarówka wykorzystuje własną obudowę jako radiator o dość sporej powierzchni, co pozwala skutecznie odprowadzić nadmiar ciepła. Kiedy diody LED są wyłączone, temperatura obudowy oscyluje w granicach 29°C. Dwa kolejne pomiary przeprowadzono dla maksymalnej jasności świecenia diod RGB oraz białych. Obie temperatury były do siebie zbliżone, wynosząc kolejno 58°C i 55°C.
Diody LED wyłączone
Maksymalna jasność diod RGB
Maksymalna jasność diod białych
Co w środku?
Gdzie kupić?
Żarówki ChiChinLighting dostępne są w ofercie sklepu ElTy.pl.
Wpisy na podobny temat
- 20 Nov 2012 » Linux dla elektronika - w czym projektować? Software
- 24 Jun 2013 » SoundBall + oświetlenie relaksacyjne - Prototyp Arduino
Komentarze
witam,
czy w środku jest ESP ?
Jak testowałeś polecenia to miałeś skonfigurowanego access pointa na kompie z wiresharkiem? Czy jakoś inaczej?
Nie - komputer był takim samym klientem sieci co żarówka i telefon :)
To jak to skonfigurować żeby w wiresharku było widać te zapytania?
Nasłuchujesz co się dzieje w swojej sieci - musisz ustawić kartę w tryb monitora i przechwycić pakiety EAPOL urządzeń, kiedy same uzyskują dostęp, w przeciwnym wypadku transmisja będzie dla Ciebie zaszyfrowana
Jestem pod wrażeniem tego artykułu. Bardzo rzeczowy i szczegółowy. Dzięki za miłą lekturę.
Cała przyjemność po mojej stronie!
"Literówki"
W pkt. Pobieranie aktualnego statusy, gdzie opisujesz odpowiedź 0x81 0x8A 0x8B 0x96, dwoje bajtów opisujesz jako wartość zielonego, domyślam się iż jeden to niebieski.
I poniżej piszesz iż ważne są stany 0x24/0x23 oraz 0xF0/0xF0. W drugiej parze, powinno raczej być 0xF0/0x0F
Poprawione - dzięki za czujność :)
PS. Nie wiem, czy to wina tego iż tak mocno cache\'ujesz (?) stronę, ale w ostatnich komentarzach, wyświetla mi się info o tym lub o drugim w GPS - nigdy łącznie a czasem nawet bez info o tych dwóch.
Inna sprawa, fajnie by było, gdyby się dała dodać funkcjonalność powiadomienia via mail, jak ktoś odpowiedział na komentarz.
komentarze są rodzielone pomiędzy bloga, a dział arduino - powiadomienie email jest wdrożone w nowej odsłonie bloga, które pojawi się niebawem :)
Hello,
Thank you for this great article.
I want to assign a static ip to this device but couldn\'t find a way. Do you know if there is an AT command for this purpose?
Thankx.