mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
188 lines
5.8 KiB
Python
Executable File
188 lines
5.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
# Copyright (C) 2019 Inria
|
|
#
|
|
# This file is subject to the terms and conditions of the GNU Lesser
|
|
# General Public License v2.1. See the file LICENSE in the top level
|
|
# directory for more details.
|
|
|
|
import os
|
|
import sys
|
|
import time
|
|
|
|
from testrunner import run
|
|
|
|
# It's assumed that the same APPEUI is used for abp and otaa
|
|
DEVEUI_ABP = os.getenv('DEVEUI_ABP')
|
|
DEVEUI_OTA = os.getenv('DEVEUI_OTA')
|
|
APPEUI = os.getenv('APPEUI')
|
|
APPKEY = os.getenv('APPKEY')
|
|
DEVADDR = os.getenv('DEVADDR')
|
|
NWKSKEY = os.getenv('NWKSKEY')
|
|
APPSKEY = os.getenv('APPSKEY')
|
|
|
|
# Default to things network RX2_DR
|
|
TEST_RX2_DR = os.getenv('RX2_DR', 3)
|
|
|
|
# Theoretical duty cycling timeoff for EU863-870
|
|
# https://www.semtech.com/uploads/documents/LoraDesignGuide_STD.pdf#page=7
|
|
TEST_DATA_RATES = {"0": 164.6, "3": 20.6, "5": 6.2}
|
|
|
|
# Dummy Message
|
|
MSG = "This is RIOT"
|
|
|
|
|
|
def _send_line_echo(child, line):
|
|
child.sendline(line)
|
|
child.expect_exact(line)
|
|
child.expect_exact(">")
|
|
|
|
|
|
def _send_line(child, line, expect_line):
|
|
child.sendline(line)
|
|
child.expect_exact(expect_line)
|
|
child.expect_exact(">")
|
|
|
|
|
|
def _reset_config(child):
|
|
# Start with a clean config
|
|
child.sendline("loramac erase")
|
|
child.expect("loramac erase")
|
|
child.expect_exact(">")
|
|
child.sendline("reboot")
|
|
child.expect_exact("reboot")
|
|
child.expect_exact("All up, running the shell now")
|
|
child.expect_exact(">")
|
|
|
|
|
|
def _check_eeprom(child):
|
|
# Check if eeprom is supported
|
|
child.sendline("loramac help")
|
|
child.expect(r'Usage: loramac \<([\w+\|?]+)\>')
|
|
return (len(child.match.group(1).split('|')) == 7)
|
|
|
|
|
|
def _reboot(child, join):
|
|
if join == "abp":
|
|
child.sendline("loramac get ul_cnt")
|
|
child.expect(r'Uplink Counter: (\d+)')
|
|
uplink_counter = int(child.match.group(1))
|
|
child.sendline("reboot")
|
|
child.expect_exact("All up, running the shell now")
|
|
child.expect_exact(">")
|
|
if join == "abp":
|
|
_send_line_echo(child, "loramac set ul_cnt {}".format(uplink_counter))
|
|
|
|
|
|
def _loramac_setup(child, join):
|
|
if join == "abp":
|
|
_send_line_echo(child, "loramac set deveui {}".format(DEVEUI_ABP))
|
|
_send_line_echo(child, "loramac set appeui {}".format(APPEUI))
|
|
_send_line_echo(child, "loramac set devaddr {}".format(DEVADDR))
|
|
_send_line_echo(child, "loramac set nwkskey {}".format(NWKSKEY))
|
|
_send_line_echo(child, "loramac set appskey {}".format(APPSKEY))
|
|
_send_line_echo(child, "loramac set rx2_dr {}".format(TEST_RX2_DR))
|
|
else:
|
|
_send_line_echo(child, "loramac set deveui {}".format(DEVEUI_OTA))
|
|
_send_line_echo(child, "loramac set appeui {}".format(APPEUI))
|
|
_send_line_echo(child, "loramac set appkey {}".format(APPKEY))
|
|
|
|
|
|
def loramac_tx_test(child, join):
|
|
|
|
_reset_config(child)
|
|
|
|
# test all data rates
|
|
for key, time_off in TEST_DATA_RATES.items():
|
|
# Setup keys and rx2_dr
|
|
_loramac_setup(child, join)
|
|
# Set DR and join
|
|
_send_line_echo(child, "loramac set dr {}".format(key))
|
|
child.sendline("loramac join {}".format(join))
|
|
child.expect_exact(["Join procedure succeeded!",
|
|
"Warning: already joined!"])
|
|
child.expect_exact(">")
|
|
# Transmit cnf message
|
|
child.sendline("loramac tx \"{}\" cnf 123".format(MSG))
|
|
child.expect_exact("Received ACK from network", timeout=30)
|
|
child.expect_exact("Message sent with success")
|
|
child.expect_exact(">")
|
|
# Wake-up just before time_off, fail to send
|
|
time.sleep(time_off)
|
|
# Send uncnf message with success
|
|
child.sendline("loramac tx \"{}\" uncnf 42".format(MSG))
|
|
child.expect_exact("Message sent with success")
|
|
child.expect_exact(">")
|
|
# Reboot node
|
|
_reboot(child, join)
|
|
|
|
|
|
def test_task02(child):
|
|
loramac_tx_test(child, "otaa")
|
|
|
|
|
|
def test_task03(child):
|
|
loramac_tx_test(child, "abp")
|
|
|
|
|
|
def test_task04(child):
|
|
# Erase eeprom
|
|
_reset_config(child)
|
|
|
|
# Verify start from erased state
|
|
_send_line(child, "loramac get deveui", "DEVEUI: 0000000000000000")
|
|
_send_line(child, "loramac get appeui", "APPEUI: 0000000000000000")
|
|
_send_line(child, "loramac get appkey",
|
|
"APPKEY: 00000000000000000000000000000000")
|
|
_send_line(child, "loramac get devaddr", "DEVADDR: 00000000")
|
|
_send_line(child, "loramac get nwkskey",
|
|
"NWKSKEY: 00000000000000000000000000000000")
|
|
_send_line(child, "loramac get appskey",
|
|
"APPSKEY: 00000000000000000000000000000000")
|
|
|
|
# Save and verify otaa keys
|
|
_loramac_setup(child, "otaa")
|
|
_send_line_echo(child, "loramac save")
|
|
child.sendline("reboot")
|
|
child.expect_exact("All up, running the shell now")
|
|
child.expect_exact(">")
|
|
_send_line(child, "loramac get deveui", "DEVEUI: {}".format(DEVEUI_OTA))
|
|
_send_line(child, "loramac get appeui", "APPEUI: {}".format(APPEUI))
|
|
_send_line(child, "loramac get appkey", "APPKEY: {}".format(APPKEY))
|
|
_reset_config(child)
|
|
|
|
# Save and verify abp keys
|
|
_loramac_setup(child, "abp")
|
|
_send_line_echo(child, "loramac save")
|
|
child.sendline("reboot")
|
|
child.expect_exact("All up, running the shell now")
|
|
child.expect_exact(">")
|
|
_send_line(child, "loramac get devaddr", "DEVADDR: {}".format(DEVADDR))
|
|
_send_line(child, "loramac get nwkskey", "NWKSKEY: {}".format(NWKSKEY))
|
|
_send_line(child, "loramac get appskey", "APPSKEY: {}".format(APPSKEY))
|
|
|
|
|
|
def testfunc(child):
|
|
|
|
def run(func):
|
|
if child.logfile == sys.stdout:
|
|
func(child)
|
|
else:
|
|
try:
|
|
func(child)
|
|
print(".", end="", flush=True)
|
|
except Exception as e:
|
|
print("FAILED")
|
|
raise e
|
|
|
|
run(test_task02)
|
|
run(test_task03)
|
|
if(_check_eeprom(child)):
|
|
run(test_task04)
|
|
|
|
print("TEST PASSED")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(run(testfunc))
|