mirror of
https://github.com/micropython/micropython.git
synced 2025-07-21 13:01:10 +02:00
110 lines
2.7 KiB
Python
110 lines
2.7 KiB
Python
# Basic Wi-Fi MAC layer test where one device creates an Access Point and the
|
|
# other device connects to it as a Station. Also tests channel assignment (where
|
|
# possible) and disconnection.
|
|
|
|
try:
|
|
import network
|
|
|
|
network.WLAN
|
|
except (ImportError, NameError):
|
|
print("SKIP")
|
|
raise SystemExit
|
|
|
|
import os
|
|
import sys
|
|
import time
|
|
|
|
CHANNEL = 8
|
|
|
|
# Note that on slower Wi-Fi stacks this bumps up against the run-multitests.py
|
|
# timeout which expects <10s between lines of output. We work around this by
|
|
# logging something half way through the wait_for loop...
|
|
CONNECT_TIMEOUT = 15000
|
|
|
|
|
|
def wait_for(test_func):
|
|
has_printed = False
|
|
start = time.ticks_ms()
|
|
while not test_func():
|
|
time.sleep(0.1)
|
|
delta = time.ticks_diff(time.ticks_ms(), start)
|
|
if not has_printed and delta > CONNECT_TIMEOUT / 2:
|
|
print("...")
|
|
has_printed = True
|
|
elif delta > CONNECT_TIMEOUT:
|
|
break
|
|
|
|
if not has_printed:
|
|
print("...") # keep the output consistent
|
|
|
|
return test_func()
|
|
|
|
|
|
# AP
|
|
def instance0():
|
|
ap = network.WLAN(network.WLAN.IF_AP)
|
|
ssid = "MP-test-" + os.urandom(6).hex()
|
|
psk = "Secret-" + os.urandom(6).hex()
|
|
|
|
# stop any previous activity
|
|
network.WLAN(network.WLAN.IF_STA).active(False)
|
|
ap.active(False)
|
|
|
|
ap.active(True)
|
|
ap.config(ssid=ssid, key=psk, channel=CHANNEL, security=network.WLAN.SEC_WPA_WPA2)
|
|
|
|
# print("AP setup", ssid, psk)
|
|
print("AP started")
|
|
|
|
multitest.globals(SSID=ssid, PSK=psk)
|
|
multitest.next()
|
|
|
|
# Wait for station
|
|
if not wait_for(ap.isconnected):
|
|
raise RuntimeError("Timed out waiting for station, status ", ap.status())
|
|
|
|
print("AP got station")
|
|
time.sleep(
|
|
3
|
|
) # depending on port, may still need to negotiate DHCP lease for STA to see connection
|
|
|
|
print("AP disabling...")
|
|
ap.active(False)
|
|
|
|
|
|
# STA
|
|
def instance1():
|
|
sta = network.WLAN(network.WLAN.IF_STA)
|
|
|
|
# stop any previous activity
|
|
network.WLAN(network.WLAN.IF_AP).active(False)
|
|
sta.active(False)
|
|
|
|
multitest.next()
|
|
ssid = SSID
|
|
psk = PSK
|
|
|
|
# print("STA setup", ssid, psk)
|
|
|
|
sta.active(True)
|
|
sta.connect(ssid, psk)
|
|
|
|
print("STA connecting...")
|
|
|
|
if not wait_for(sta.isconnected):
|
|
raise RuntimeError("Timed out waiting to connect, status ", sta.status())
|
|
|
|
print("STA connected")
|
|
|
|
print("channel", sta.config("channel"))
|
|
|
|
print("STA waiting for disconnect...")
|
|
|
|
# Expect the AP to disconnect us immediately
|
|
if not wait_for(lambda: not sta.isconnected()):
|
|
raise RuntimeError("Timed out waiting for AP to disconnect us, status ", sta.status())
|
|
|
|
print("STA disconnected")
|
|
|
|
sta.active(False)
|