W poprzednich odcinkach najpierw omawialiśmy różne moduły MicroPythona oraz klasy w nim udostępnione, a dopiero po wstępie teoretycznym pokazywaliśmy przykłady praktyczne. Moduły związane z Wi-Fi są tak rozbudowane, że na ich temat można by napisać książkę, a nie odcinek kursu do czasopisma. Dlatego tym razem przejdziemy od razu do praktycznych przykładów, które pokażą, jak można zrealizować pewne typowe czynności.
Wyszukiwanie sieci Wi-Fi
Weźmy pod lupę kod przedstawiony na listingu 1. Jego zadaniem jest wykrycie wszystkich sieci Wi-Fi dostępnych w pobliżu i wyświetlenie ich na konsoli w formie tabelki.
# Plik wifi_scan.py
import network # 1
station = network.WLAN(network.STA_IF) # 2
station.active(True) # 3
nets = station.scan() # 4
counter = 0 # 5
authmodes = ["Open", "WEP", "WPA", "WPA2", # 6
"WPA/WPA2", "WPA2-Ent", "WPA3",
"WPA2/WPA3", "WAPI”, "OWE"]
print("Nr | Channel | RSSI | Security | Hidden | SSID") # 7
for net in nets: # 8
print(f"{counter:2d} | {net[2]:7d} | {net[3]:4d} | # 9
{authmodes[net[4]]:9s} | {net[5]:6d} | {net[0]:s}")
counter += 1
Listing 1. Kod pliku wifi_scan.py
Aby wykonywać jakiekolwiek operacje związane z Wi-Fi, najpierw musimy zaimportować moduł network (linia 1). Następnie trzeba utworzyć instancję klasy WLAN, co czynimy w linii 2. W zależności od zastosowanego argumentu konstruktora tej klasy, możliwe są dwa tryby pracy:
- network.STA_IF – ESP32 łączy się z istniejącym access pointem, który wskażemy w kolejnych liniach, podobnie jak łączą się z nim komputery, smartfony, itp. W taki sposób możemy uzyskać dostęp do Internetu.
- network.AP_IF – ESP32 tworzy swój własny access point, do którego mogą podłączyć się inne urządzenia. W tym trybie pracy możemy stworzyć własny serwer HTTP i DNS, aby generować strony WWW, które mogą być przeglądane na komputerze lub smartfonie. Omówimy ten temat w przyszłości.
Następnie w linii 3 musimy uaktywnić naszą klasę, po czym wywołujemy metodę scan (linia 4). Ta metoda zwraca listę krotek, po jednej na każdą znalezioną sieć. Każda krotka składa się z następujących danych:
- nazwy sieci (SSID),
- BSSID, czyli hardware’owej nazwy sieci,
- numeru kanału,
- RSSI, czyli wartości mocy sygnału,
- rodzaju zabezpieczeń,
- informacji o tym, czy sieć jest ukryta.
Tak otrzymaną listę zapisujemy do zmiennej nets. Jak zapewne się spodziewasz, reszta programu służy jedynie do zdekodowania i wyświetlenia otrzymanych informacji w formie zrozumiałej dla człowieka. Każdą sieć oraz odpowiadające jej informacje wyświetlimy w osobnych liniach.
W linii 5 tworzymy zmienną, która będzie przydatna do wyświetlania liczby porządkowej, a następnie budujemy listę authmodes, która ma służyć do przekształcenia numeru zabezpieczenia na zrozumiały komunikat. „Open” oznacza, że każdy może połączyć się z daną siecią bez podawania hasła.
W linii 7 wyświetlamy nagłówek tabeli, a następnie rozpoczynamy pętlę, która iteruje po wszystkich elementach listy nets. W każdym obiegu pętli wyświetlamy informacje z kolejnej krotki (linia 9), po czym inkrementujemy licznik counter.
Uruchamiamy kod klawiszem F5.
Czas NTP
W tym przykładzie zobaczymy, jak można połączyć się z siecią Wi-Fi oraz jak pobrać aktualny czas z serwera NTP. Najpierw jednak poznamy prostą sztuczkę pozwalającą bezpiecznie przechowywać nazwę sieci SSID oraz hasło, aby przypadkiem nie opublikować jej na GitHubie czy w inny sposób. Zobacz kod pokazany na listingu 2. Jest to plik Wi-Fi_config.py, który składa się tylko z dwóch linijek. Musimy ten plik przegrać do pamięci ESP32, a następnie zapisać w nim nazwę sieci oraz hasło. W ten sposób wrażliwe dane przechowujesz tylko w pamięci wewnętrznej ESP32, a na dysku w komputerze pozostaje plik z pustymi zmiennymi, niczym szablon gotowy do wypełnienia.
# Plik config.py
ssid = ""
password = ""
Listing 2. Kod pliku config.py
Możemy teraz przejść do analizy pliku sync_ntp_time.py, którego kod znajduje się na listingu 3. Na początku, jak zawsze, importujemy potrzebne moduły, w tym również moduł Wi-Fi_config zawierający nazwę i hasło do sieci Wi-Fi (linia 1).
# MicroPython 1.24.1 ESP32-S3 Octal SPIRAM
import network
import ntptime
import time
import wifi_config # 1
def wifi_connect(): # 2
station = network.WLAN(network.STA_IF)
station.active(True)
if not station.isconnected(): # 3
print("Łączenie z siecią", end="")
station.connect(wifi_config.ssid, wifi_config.password) # 4
while not station.isconnected(): # 5
print(".", end="")
time.sleep_ms(250)
print()
print(f"Adres IP: {station.ifconfig()[0]}") # 6
def print_system_time(): # 7
Y, M, D, h, m, s, w, _ = time.localtime()
days = ["Poniedziałek", "Wtorek", "Środa", "Czwartek",
"Piątek", "Sobota", "Niedziela"]
print(f"{Y}.{M:02}.{D:02} {h:02}:{m:02}:{s:02} {days[w]}")
print("Czas przed synchronizacją: ", end="") # 8
print_system_time()
wifi_connect() # 9
ntptime.settime() # 10
print("Czas po synchronizacji: ", end="")
print_system_time()
Listing 3. Kod pliku sync_ntp_time.py
W linii 2 definiujemy funkcję Wi-Fi_connect, której celem jest nawiązanie połączenia z siecią Wi-Fi. Pierwsze dwie linie są identyczne, jak w poprzednim przykładzie. W linii 3 sprawdzamy czy połączenie z siecią już zostało nawiązane, aby uniknąć próby powiązania z access pointem, do którego jesteśmy już podłączeni. W linii 4 wywołujemy metodę connect, do której przekazujemy nazwę i hasło sieci, odczytane z modułu Wi-Fi_config.
Łączenie z siecią trwa kilka sekund. Aby pokazać na konsoli proces łączenia, w linii 5 mamy pętlę while, która wykonuje się tak długo, aż metoda isconnected() zwróci True. Jeżeli zwróci False, wówczas na konsoli wyświetlamy kropkę i czekamy 250 ms przed kolejnym sprawdzeniem. Finalnie, kiedy jesteśmy już połączeni z siecią Wi-Fi, możemy wyświetlić adres IP, jaki został nam przydzielony.
W linii 7 mamy funkcję wyświetlającą aktualny czas systemowy. Była ona omówiona w 3 odcinku kursu, opublikowanym w EP 07/2025.
Przechodzimy wreszcie do właściwego programu. W linii 8 wyświetlamy czas, jaki aktualnie jest ustawiony w mikrokontrolerze. W tym momencie jeszcze nie mamy połączenia z siecią, a czas jaki nam się ukaże, pochodzi z programu Thonny. Jeżeli synchronizacja czasu z Thonny jest wyłączona w ustawieniach, zamiast właściwej godziny zobaczymy odczyt: 00:00 w dniu 1 stycznia 2000 r.