tests/multi_espnow: Add channel setting test, add some docs.

Test currently passes. It was added so it can be used to check for
regressions when fixing channel selection for AP mode in a follow-up
commit.

Also add some docs about how channel setting is observed to work for
ESP-NOW.

This work was funded through GitHub Sponsors.

Signed-off-by: Angus Gratton <angus@redyak.com.au>
This commit is contained in:
Angus Gratton
2024-11-13 11:20:03 +11:00
committed by Angus Gratton
parent 78d017fc4e
commit 7647c828de
4 changed files with 109 additions and 2 deletions

View File

@@ -0,0 +1,89 @@
# Test that ESP-NOW picks up the channel configuration for STA
# mode on ESP32.
#
# Note that setting the channel on a peer in ESP-NOW on modern ESP-IDF only
# checks it against the configured channel, it doesn't ever change the radio
# channel
import sys
import time
try:
import network
import espnow
except ImportError:
print("SKIP")
raise SystemExit
# ESP8266 doesn't support config('channel') on the STA interface,
# and the channel parameter to add_peer doesn't appear to set the
# channel either.
if sys.platform == "esp8266":
print("SKIP")
raise SystemExit
timeout_ms = 1000
default_pmk = b"MicroPyth0nRules"
CHANNEL = 3
WRONG_CHANNEL = 8
def init_sta():
sta = network.WLAN(network.WLAN.IF_STA)
e = espnow.ESPNow()
e.active(True)
sta.active(True)
sta.disconnect() # Force AP disconnect for any saved config, important so the channel doesn't change
sta.config(channel=CHANNEL)
e.set_pmk(default_pmk)
return sta, e
# Receiver
def instance0():
sta, e = init_sta()
multitest.globals(PEER=sta.config("mac"))
multitest.next()
print(sta.config("channel"))
while True:
peer, msg = e.recv(timeout_ms)
if peer is None:
print("Timeout")
break
print(msg)
e.active(False)
# Sender
def instance1():
sta, e = init_sta()
multitest.next()
peer = PEER
# both instances set channel via sta.config(), above
msg = b"sent to right channel 1"
e.add_peer(peer, channel=CHANNEL)
for _ in range(3):
e.send(peer, msg)
e.del_peer(peer)
print(sta.config("channel"))
sta.config(channel=WRONG_CHANNEL)
msg = b"sent to wrong channel"
e.add_peer(peer, channel=WRONG_CHANNEL)
for _ in range(3):
e.send(peer, msg)
e.del_peer(peer)
print(sta.config("channel"))
# switching back to the correct channel should also work
sta.config(channel=CHANNEL)
msg = b"sent to right channel 2"
e.add_peer(peer, channel=CHANNEL)
for _ in range(3):
e.send(peer, msg)
e.del_peer(peer)
print(sta.config("channel"))
e.active(False)

View File

@@ -0,0 +1,13 @@
--- instance0 ---
3
b'sent to right channel 1'
b'sent to right channel 1'
b'sent to right channel 1'
b'sent to right channel 2'
b'sent to right channel 2'
b'sent to right channel 2'
Timeout
--- instance1 ---
3
8
3