Wziąłem ten temat na tapet na początku zeszłego tygodnia i chciałbym się z Wami podzielić moimi dotychczasowymi doświadczeniami w tym temacie.
Miało być prosto, łatwo i przyjemnie - tym bardziej, że obsługa OTA została przecież dodana do biblioteki ZigBee w Arduino Core...
Owszem, obsługa OTA została dodana do biblioteki ZigBee w
Arduino Core, ale tylko w zakresie klienta OTA, a bramka ma pełnić funkcję serwera OTA.
Zakasałem więc rękawy i wziąłem się do pracy wykorzystując przykład z Espressif IDE (ota_server). Wkrótce udało mi się zaimplementować wszystkie niezbędne funkcje i mogłem przystąpić do testów.
Na obiekt testowy wybrałem głowicę Sonoff TRVZB z oprogramowaniem 1.3.0 oraz plik z nowym firmware w wersji 1.4.1 (celowo nie zacząłem od najnowszej wersji 1.4.4, żeby zostawić sobie przestrzeń na kolejną próbę).
Plik 1.4.1 ma około 320 kB, ale Sonoff pobiera dane w paczkach po 63 bajty, więc wysyłanie całego pliku OTA zajmuje około 32 minut, co oczywiście znacząco utrudnia testowanie tej funkcjonalności.
Pierwsza próba - wysłałem plik zgodnie z przykładem z biblioteki ZigBee, czyli bez nagłówka pliku (pierwsze 56 bajtów) - error INVALID IMAGE.
Druga próba - wysłałem cały plik - error INVALID IMAGE.
Trzecia próba - wysłałem tylko cześć pliku, tzw. sub-element 0x0000 - error INVALID IMAGE.
Oczywiście każdą z tych prób powtarzałem przynajmniej kilka razy, wprowadzając po drodze liczne modyfikacje i dodatkowe testy - biorąc pod uwagę czas pojedynczego testu, zajęło mi to łącznie kilka dni.
Niestety efekt za każdym razem był taki sam...INVALID IMAGE...Po 7 dniach walki z tym tematem pierwszy raz w historii bramki byłem gotowy poddać się, bo nie miałem pomysłu, co mógłbym jeszcze zrobić.
Wczoraj postanowiłem zrobić jeszcze jeden test - zacząłem analizować pakiety danych, które przysyła Sonoff (next image block request) i znalazłem błąd w bibliotece ZigBee Espressif - w skrócie polega on na tym, że Sonoff wysyła komunikat "wyślij mi 63 bajty od pozycji 0" a biblioteka ZigBee wysyła mu 7 bajtów, prawdopodobnie dlatego, że obcina ten nagłówek (56 bajtów + 7 bajtów = 63 bajty), natomiast Sonoff potrzebuje cały plik (łącznie z nagłówkiem).
Dla zainteresowanych wrzucam odnośnik do zgłoszenia błędu, które zrobiłem wczoraj do Espressif:
https://github.com/espressif/arduino-esp32/issues/12469.
Podsumowując - mamy zasadniczy błąd w bibliotece ESP ZigBee, uniemożliwiający wgranie całego pliku OTA do jakiegokolwiek komercyjnego urządzenia ZigBee.
W tej sytuacji pozostało mi już tylko poddać się i odpuścić temat - przynajmniej do momentu, aż Espressif poprawi kod.
