W 2019 roku inżynierowie firmy Espressif podjęli trud pracowania nowego interfejsu komunikacji radiowej, który miał być prostszy niż Wi-Fi i Bluetooth, oferować większy zasięg i zapewniać wystarczający poziom bezpieczeństwa, aby nie dało się łatwo podsłuchać wiadomości, ani zastosować techniki ataku typu reply attack.
ESP-NOW wykorzystuje częstotliwość 2,4 GHz – podobnie jak Wi-Fi i Bluetooth, nie potrzeba zatem żadnych dodatkowych zasobów sprzętowych poza tymi, które moduły ESP32 (a także stare ESP8266) mają już wbudowane. Wynika z tego bardzo istotny wniosek: komunikację przez ESP-NOW można zastosować nawet w urządzeniach, które zostały wyprodukowane przed rokiem 2019. Wystarczy zaktualizować oprogramowanie i już można korzystać z możliwości ESP-NOW.
Interfejs ten umożliwia dwukierunkową komunikację pomiędzy dwoma urządzeniami, a także komunikację typu „jeden do wszystkich”. Urządzenia można ze sobą sparować (ale nie zawsze jest taka potrzeba), dzięki czemu można bardzo łatwo tworzyć proste sieci. Parowanie urządzeń ma zastosowanie w celu wprowadzenia szyfrowania – połączone w ten sposób urządzenia zapisują sobie klucz szyfru AES-128.
Zasięg komunikacji jest całkiem dobry. Testy przeprowadzone przez wielu radioamatorów dowodzą, że przy pomocy ESP-NOW można przesyłać dane na odległość ok. 300 metrów, a w trybie long range nawet 500...800 metrów w otwartej przestrzeni.
ESP-NOW ma jednak pewną wadę – działa tylko i wyłącznie na modułach produkowanych przez firmę Espressif. Zatem wybierając ten interfejs skreślamy jednocześnie możliwość komunikacji z modułami firm Nordic, Microchip czy jakiejkolwiek innej. Póki co nie jest pewne, czy Espressif kiedykolwiek umożliwi wykorzystywanie swojego interfejsu na sprzęcie innych producentów.
Interfejs ESP-NOW wciąż dynamicznie się rozwija i ciągle dodawane są nowe funkcjonalności. Dlatego przed przystąpieniem do testów koniecznie zainstaluj najnowszego MicroPythona. W chwili pisania tego odcinka dostępna jest wersja 1.27.0 i to z nią zgodne są wszystkie przykłady. Wiadomo już teraz, że MicroPython 1.27.0 obsługuje ESP-NOW w wersji 1.0, ale dostępny jest także ESP-NOW 2.0, który obsługiwać można póki co tylko w ESP-IDF, a w MicroPythonie jeszcze nie. Zasadnicza różnica jest taka, że stara wersja ESP-NOW umożliwia wysyłanie wiadomości o długości maksymalnie 250 bajtów, a nowa wersja – 1470 bajtów. Być może obsługa ESP-NOW 2.0 zostanie dodana w MicroPythonie 1.28.0.
Trochę teorii
Jak już wspomniano, ESP-NOW wykorzystuje transmiter Wi-Fi, zatem oprócz zaimportowania modułu odpowiedzialnego za ESP-NOW, musimy także dodać moduł obsługujący sieć Wi-Fi.
import network
import espnow
Wszystkie moduły z rodziny ESP32 mają po dwie karty sieciowe – jedna może pracować jako klient (station), a druga jako access point. Musimy utworzyć instancję jednej z nich, a następnie ją aktywować. Jeżeli chcemy wykorzystać kartę sieciową klienta, należy użyć poniższego polecenia:
wlan = network.WLAN(network.STA_IF)
Jeżeli chcemy wykorzystać access point do ESP-NOW, wystarczy tylko zmienić argument przekazywany do konstruktora klasy WLAN:
wlan = network.WLAN(network.AP_IF)
Obie karty sieciowe mogą być użyte na potrzeby ESP-NOW i mają takie same możliwości (ale inny adres MAC!). W praktycznych zastosowaniach może się zdarzyć, że oprócz ESP-NOW będziemy chcieli mieć dostęp do sieci Wi-Fi i Internetu. W takiej sytuacji możemy zastosować kartę sieciową station zupełnie normalnie na potrzeby dostępu do Internetu, a kartę access point – do obsługi ESP-NOW.
Niezależnie od tego, którą kartę sieciową wybierzemy, musimy ją aktywować poleceniem:
wlan.active(True)
Identyfikatorem wszystkich urządzeń w sieci ESP-NOW jest adres MAC karty sieciowej, która obsługuje transmisję bezprzewodową. Możemy ten adres pozyskać w następujący sposób:
mac = wlan.config('mac')
print(f"MAC Address: {mac}")
Tak odczytany adres MAC zapisany zostaje w zmiennej typu bytes, składającej się z 6 bajtów. Wyświetlając je funkcją print uzyskamy mniej więcej taki rezultat:
Możemy teraz przejść do obsługi klasy ESP-NOW. Najpierw musimy utworzyć i aktywować jej instancję:
Oto przykład wysłania krótkiej wiadomości tekstowej do wszystkich odbiorców, jacy są w zasięgu: