wiliot-certificate 4.5.0__py3-none-any.whl → 4.5.0a2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- certificate/ag/wlt_types_ag_jsons/brg2brg_ota.json +211 -0
- certificate/ag/wlt_types_ag_jsons/brg2gw_hb.json +894 -0
- certificate/ag/wlt_types_ag_jsons/brg2gw_hb_sleep.json +184 -0
- certificate/ag/wlt_types_ag_jsons/calibration.json +490 -0
- certificate/ag/wlt_types_ag_jsons/custom.json +614 -0
- certificate/ag/wlt_types_ag_jsons/datapath.json +900 -0
- certificate/ag/wlt_types_ag_jsons/energy2400.json +670 -0
- certificate/ag/wlt_types_ag_jsons/energySub1g.json +691 -0
- certificate/ag/wlt_types_ag_jsons/externalSensor.json +727 -0
- certificate/ag/wlt_types_ag_jsons/interface.json +1095 -0
- certificate/ag/wlt_types_ag_jsons/powerManagement.json +1439 -0
- certificate/ag/wlt_types_ag_jsons/side_info_sensor.json +105 -0
- certificate/ag/wlt_types_ag_jsons/signal_indicator_data.json +77 -0
- certificate/ag/wlt_types_ag_jsons/unified_echo_ext_pkt.json +126 -0
- certificate/ag/wlt_types_ag_jsons/unified_echo_pkt.json +175 -0
- certificate/ag/wlt_types_ag_jsons/unified_sensor_pkt.json +65 -0
- certificate/cert_common.py +35 -65
- certificate/cert_config.py +18 -43
- certificate/cert_data_sim.py +9 -12
- certificate/cert_defines.py +0 -8
- certificate/cert_gw_sim.py +7 -32
- certificate/cert_mqtt.py +5 -15
- certificate/cert_prints.py +0 -1
- certificate/cert_results.py +37 -48
- certificate/cert_utils.py +15 -24
- certificate/certificate.py +5 -12
- certificate/certificate_cli.py +13 -10
- certificate/certificate_eth_test_list.txt +3 -4
- certificate/certificate_sanity_test_list.txt +2 -3
- certificate/certificate_test_list.txt +4 -4
- certificate/tests/calibration/interval_test/interval_test.json +0 -1
- certificate/tests/calibration/output_power_test/output_power_test.json +0 -1
- certificate/tests/calibration/pattern_test/pattern_test.json +0 -1
- certificate/tests/cloud_connectivity/acl_ext_adv_test/acl_ext_adv_test.json +0 -1
- certificate/tests/cloud_connectivity/acl_test/acl_test.json +0 -1
- certificate/tests/cloud_connectivity/acl_test/acl_test.py +15 -13
- certificate/tests/cloud_connectivity/brg_ota_test/brg_ota_test.json +1 -2
- certificate/tests/cloud_connectivity/brg_ota_test/brg_ota_test.py +6 -8
- certificate/tests/cloud_connectivity/channel_scan_behaviour_test/channel_scan_behaviour_test.json +0 -1
- certificate/tests/cloud_connectivity/channel_scan_behaviour_test/channel_scan_behaviour_test.py +3 -3
- certificate/tests/cloud_connectivity/connection_test/connection_test.json +0 -1
- certificate/tests/cloud_connectivity/connection_test/connection_test.py +13 -6
- certificate/tests/cloud_connectivity/deduplication_test/deduplication_test.json +0 -1
- certificate/tests/cloud_connectivity/deduplication_test/deduplication_test.py +11 -6
- certificate/tests/cloud_connectivity/downlink_test/downlink_test.json +0 -1
- certificate/tests/cloud_connectivity/downlink_test/downlink_test.py +4 -1
- certificate/tests/cloud_connectivity/ext_adv_stress_test/ext_adv_stress_test.json +0 -1
- certificate/tests/cloud_connectivity/ext_adv_stress_test/ext_adv_stress_test.py +9 -14
- certificate/tests/cloud_connectivity/reboot_test/reboot_test.json +0 -1
- certificate/tests/cloud_connectivity/reboot_test/reboot_test.py +0 -2
- certificate/tests/cloud_connectivity/registration_test/registration_test.json +0 -1
- certificate/tests/cloud_connectivity/registration_test/registration_test_cli.py +1 -1
- certificate/tests/cloud_connectivity/stress_test/stress_test.json +0 -1
- certificate/tests/cloud_connectivity/stress_test/stress_test.py +11 -15
- certificate/tests/cloud_connectivity/uplink_ext_adv_test/uplink_ext_adv_test.json +0 -1
- certificate/tests/cloud_connectivity/uplink_ext_adv_test/uplink_ext_adv_test.py +2 -1
- certificate/tests/cloud_connectivity/uplink_test/uplink_test.json +0 -1
- certificate/tests/cloud_connectivity/uplink_test/uplink_test.py +20 -27
- certificate/tests/datapath/aging_test/aging_test.json +0 -1
- certificate/tests/datapath/aging_test/aging_test.py +3 -7
- certificate/tests/datapath/event_ble5_test/event_ble5_test.json +2 -3
- certificate/tests/datapath/event_ble5_test/event_ble5_test.py +13 -7
- certificate/tests/datapath/event_test/event_test.json +2 -3
- certificate/tests/datapath/event_test/event_test.py +10 -5
- certificate/tests/datapath/num_of_tags_test/num_of_tags_test.json +1 -2
- certificate/tests/datapath/num_of_tags_test/num_of_tags_test.py +5 -9
- certificate/tests/datapath/output_power_test/output_power_test.json +0 -1
- certificate/tests/datapath/pacer_interval_ble5_test/pacer_interval_ble5_test.json +0 -1
- certificate/tests/datapath/pacer_interval_ble5_test/pacer_interval_ble5_test.py +4 -4
- certificate/tests/datapath/pacer_interval_test/pacer_interval_test.json +0 -1
- certificate/tests/datapath/pattern_test/pattern_test.json +0 -1
- certificate/tests/datapath/pkt_filter_ble5_chl21_test/pkt_filter_ble5_chl21_test.json +0 -1
- certificate/tests/datapath/pkt_filter_ble5_chl21_test/pkt_filter_ble5_chl21_test.py +5 -5
- certificate/tests/datapath/pkt_filter_ble5_test/pkt_filter_ble5_test.json +0 -1
- certificate/tests/datapath/pkt_filter_ble5_test/pkt_filter_ble5_test.py +5 -5
- certificate/tests/datapath/pkt_filter_brg2gw_ext_adv_test/pkt_filter_brg2gw_ext_adv_test.json +0 -1
- certificate/tests/datapath/pkt_filter_brg2gw_ext_adv_test/pkt_filter_brg2gw_ext_adv_test.py +8 -10
- certificate/tests/datapath/pkt_filter_gen3_test/pkt_filter_gen3_test.json +0 -1
- certificate/tests/datapath/pkt_filter_test/pkt_filter_test.json +0 -1
- certificate/tests/datapath/rssi_threshold_test/rssi_threshold_test.json +0 -1
- certificate/tests/datapath/rx_channel_hopping_test/rx_channel_hopping_test.json +0 -1
- certificate/tests/datapath/rx_channel_test/rx_channel_test.json +0 -1
- certificate/tests/datapath/rx_rate_gen2_test/rx_rate_gen2_test.json +0 -1
- certificate/tests/datapath/rx_rate_gen2_test/rx_rate_gen2_test.py +1 -1
- certificate/tests/datapath/rx_rate_gen3_test/rx_rate_gen3_test.json +0 -1
- certificate/tests/datapath/stress_gen3_test/stress_gen3_test.json +0 -1
- certificate/tests/datapath/stress_gen3_test/stress_gen3_test.py +0 -3
- certificate/tests/datapath/stress_test/stress_test.json +0 -1
- certificate/tests/datapath/stress_test/stress_test.py +0 -3
- certificate/tests/datapath/tx_repetition_test/tx_repetition_test.json +0 -1
- certificate/tests/edge_mgmt/action_blink_test/action_blink_test.json +0 -1
- certificate/tests/edge_mgmt/action_get_battery_sensor_test/action_get_battery_sensor_test.json +0 -1
- certificate/tests/edge_mgmt/action_get_module_test/action_get_module_test.json +0 -1
- certificate/tests/edge_mgmt/action_get_pof_data_test/action_get_pof_data_test.json +0 -1
- certificate/tests/edge_mgmt/action_gw_hb_test/action_gw_hb_test.json +0 -1
- certificate/tests/edge_mgmt/action_reboot_test/action_reboot_test.json +0 -1
- certificate/tests/edge_mgmt/action_restore_defaults_test/action_restore_defaults_test.json +0 -1
- certificate/tests/edge_mgmt/action_send_hb_test/action_send_hb_test.json +0 -1
- certificate/tests/edge_mgmt/action_send_hb_test/action_send_hb_test.py +14 -18
- certificate/tests/edge_mgmt/periodic_msgs_test/periodic_msgs_test.json +0 -1
- certificate/tests/energy2400/duty_cycle_test/duty_cycle_test.json +0 -1
- certificate/tests/energy2400/output_power_test/output_power_test.json +0 -1
- certificate/tests/energy2400/pattern_test/pattern_test.json +0 -1
- certificate/tests/energy2400/signal_indicator_ble5_test/signal_indicator_ble5_test.json +0 -1
- certificate/tests/energy2400/signal_indicator_ble5_test/signal_indicator_ble5_test.py +3 -4
- certificate/tests/energy2400/signal_indicator_ext_adv_test/signal_indicator_ext_adv_test.json +9 -9
- certificate/tests/energy2400/signal_indicator_ext_adv_test/signal_indicator_ext_adv_test.py +271 -113
- certificate/tests/energy2400/signal_indicator_test/signal_indicator_test.json +0 -1
- certificate/tests/energy2400/signal_indicator_test/signal_indicator_test.py +1 -1
- certificate/tests/energy_sub1g/duty_cycle_test/duty_cycle_test.json +0 -1
- certificate/tests/energy_sub1g/pattern_test/pattern_test.json +0 -1
- certificate/tests/pwr_mgmt/pwr_mgmt_test/pwr_mgmt_test.json +0 -1
- certificate/tests/sensors/ext_sensor_test/ext_sensor_test.json +0 -1
- certificate/tests/sensors/ext_sensor_test/ext_sensor_test.py +9 -4
- common/api_if/api_validation.py +0 -6
- common/web/templates/generator.html +79 -141
- common/web/web_utils.py +56 -78
- gui_certificate/server.py +78 -283
- gui_certificate/templates/cert_run.html +113 -179
- {wiliot_certificate-4.5.0.dist-info → wiliot_certificate-4.5.0a2.dist-info}/METADATA +22 -7
- {wiliot_certificate-4.5.0.dist-info → wiliot_certificate-4.5.0a2.dist-info}/RECORD +125 -109
- {wiliot_certificate-4.5.0.dist-info → wiliot_certificate-4.5.0a2.dist-info}/WHEEL +0 -0
- {wiliot_certificate-4.5.0.dist-info → wiliot_certificate-4.5.0a2.dist-info}/entry_points.txt +0 -0
- {wiliot_certificate-4.5.0.dist-info → wiliot_certificate-4.5.0a2.dist-info}/licenses/LICENSE +0 -0
- {wiliot_certificate-4.5.0.dist-info → wiliot_certificate-4.5.0a2.dist-info}/top_level.txt +0 -0
certificate/cert_common.py
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
from certificate.cert_prints import *
|
|
2
2
|
from certificate.cert_defines import *
|
|
3
3
|
from certificate.wlt_types import *
|
|
4
|
+
from certificate.cert_utils import Phase
|
|
5
|
+
from certificate.cert_utils import *
|
|
4
6
|
import certificate.cert_utils as cert_utils
|
|
5
7
|
import certificate.cert_config as cert_config
|
|
6
8
|
import certificate.cert_mqtt as cert_mqtt
|
|
@@ -479,8 +481,8 @@ def pacing_analysis(test, pacer_interval, df, pkt_filter_cfg=ag.PKT_FILTER_RANDO
|
|
|
479
481
|
# In non-sterile runs - rssi is less stable and can trigger more events
|
|
480
482
|
max_count_threshold = float('inf')
|
|
481
483
|
else:
|
|
482
|
-
# In rssi movement events the alpha filter takes about
|
|
483
|
-
max_count_threshold = 1 + (
|
|
484
|
+
# In rssi movement events the alpha filter takes about 10 packets to stabilize
|
|
485
|
+
max_count_threshold = 1 + (10 / expected_event_pkt_count)
|
|
484
486
|
else:
|
|
485
487
|
max_count_threshold = PACER_INTERVAL_CEIL_THRESHOLD
|
|
486
488
|
|
|
@@ -490,14 +492,12 @@ def pacing_analysis(test, pacer_interval, df, pkt_filter_cfg=ag.PKT_FILTER_RANDO
|
|
|
490
492
|
|
|
491
493
|
if not (PACER_INTERVAL_THRESHOLD <= len(event_pkts) / expected_event_pkt_count <= max_count_threshold):
|
|
492
494
|
test.rc = TEST_FAILED
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
utPrint(msg, "RED")
|
|
495
|
+
test.add_reason(f"Packet count for dynamic tag {tag} is wrong!")
|
|
496
|
+
print(f"expected_event_pkt_count = {expected_event_pkt_count}, received pkt count = {len(event_pkts)}")
|
|
496
497
|
if not (PACER_INTERVAL_THRESHOLD <= avg_event_pacer / event_pacing <= PACER_INTERVAL_CEIL_THRESHOLD):
|
|
497
498
|
test.rc = TEST_FAILED
|
|
498
|
-
|
|
499
|
-
test.add_reason(
|
|
500
|
-
utPrint(msg, "RED")
|
|
499
|
+
print(f"Tag {tag} with diff_time {list(event_pkts.timestamp.diff().div(1000))}, avg_event_pacer={avg_event_pacer} exceeds threshold!")
|
|
500
|
+
test.add_reason(f"Tag {tag} has a wrong avg time diff")
|
|
501
501
|
|
|
502
502
|
# Verify the tags pacer interval (without event)
|
|
503
503
|
failed_tags = 0
|
|
@@ -512,9 +512,8 @@ def pacing_analysis(test, pacer_interval, df, pkt_filter_cfg=ag.PKT_FILTER_RANDO
|
|
|
512
512
|
if ((avg_pacer / pacer_interval) < PACER_INTERVAL_THRESHOLD_HIGH and (pacer_interval - avg_pacer) > 1):
|
|
513
513
|
failed_tags += 1
|
|
514
514
|
test.rc = TEST_FAILED
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
test.add_reason(msg)
|
|
515
|
+
print(f"Tag {tag} with diff_time {list(pkts.timestamp.diff().div(1000))}, avg_pacer={avg_pacer} exceeds {PACER_INTERVAL_THRESHOLD_HIGH} minimum threshold!")
|
|
516
|
+
test.add_reason(f"{failed_tags}/{tags_count} tags with wrong time diff")
|
|
518
517
|
# Pass the test with real tags when less than 5% tag failed
|
|
519
518
|
if test.data != DATA_SIMULATION and failed_tags / tags_count < 0.05:
|
|
520
519
|
test.rc = TEST_PASSED
|
|
@@ -523,9 +522,7 @@ def pacing_analysis(test, pacer_interval, df, pkt_filter_cfg=ag.PKT_FILTER_RANDO
|
|
|
523
522
|
if max_received_pkts == len(pkts):
|
|
524
523
|
# we fail the tag only if it received all expected pkts and pacer caluculation is valid
|
|
525
524
|
failed_tags += 1
|
|
526
|
-
|
|
527
|
-
utPrint(msg, "RED")
|
|
528
|
-
test.add_reason(msg)
|
|
525
|
+
print(f"Tag {tag} with diff_time {list(pkts.timestamp.diff().div(1000))}, avg_pacer={avg_pacer} exceeds {PACER_INTERVAL_CEIL_THRESHOLD} maximum threshold!")
|
|
529
526
|
else:
|
|
530
527
|
print(f"Tag {tag} received only {len(pkts)} pkts out of {max_received_pkts}, avg_pacer failed but skipping pacer ceil validation")
|
|
531
528
|
if failed_tags / tags_count > 0.2: # Fail the test on ceil threshold only when more than 20% tag failed
|
|
@@ -605,13 +602,12 @@ def run_event_test_phase(test, phase, datapath_module, values, scan_time, event_
|
|
|
605
602
|
scan_time_multiplier = 1
|
|
606
603
|
delay = DATA_SIM_EVENT_TESTING_DELAY_MS
|
|
607
604
|
if "rssi" in phase:
|
|
608
|
-
test.sterile_run = is_quiet_setup_running()
|
|
609
605
|
delay = DATA_SIM_RSSI_EVENT_TESTING_DELAY_MS
|
|
610
606
|
scan_time_multiplier = (1 / 3)
|
|
611
607
|
fields += [BRG_RSSI_MOVEMENT_THRESHOLD]
|
|
612
608
|
|
|
613
|
-
|
|
614
|
-
|
|
609
|
+
test = (cert_config.brg_configure_ble5(test, fields=fields, values=values, module=datapath_module)[0] if ble5_test
|
|
610
|
+
else cert_config.brg_configure(test, fields=fields, values=values, module=datapath_module)[0])
|
|
615
611
|
test.set_phase_rc(phase, test.rc)
|
|
616
612
|
test.add_phase_reason(phase, test.reason)
|
|
617
613
|
if test.rc == TEST_FAILED and test.exit_on_param_failure:
|
|
@@ -748,9 +744,7 @@ def scan_for_mgmt_pkts(test, mgmt_type, target=DUT):
|
|
|
748
744
|
break
|
|
749
745
|
if not found:
|
|
750
746
|
test.rc = TEST_FAILED
|
|
751
|
-
|
|
752
|
-
test.add_reason(error)
|
|
753
|
-
utPrint(error, "RED")
|
|
747
|
+
test.add_reason(f"Didn't receive {mgmt_type[0].__name__} pkt after {DEFAULT_BRG_FIELD_UPDATE_TIMEOUT} seconds!")
|
|
754
748
|
return test, ret_pkts
|
|
755
749
|
|
|
756
750
|
# Actions test functions
|
|
@@ -782,7 +776,8 @@ def scan_for_modules(test, modules=[]):
|
|
|
782
776
|
|
|
783
777
|
|
|
784
778
|
def search_action_ack(test, action_id, **kwargs):
|
|
785
|
-
test, mgmt_pkts = scan_for_mgmt_pkts(test,
|
|
779
|
+
test, mgmt_pkts = cert_common.scan_for_mgmt_pkts(test,
|
|
780
|
+
mgmt_type=[eval_pkt(f'{ag.ACTIONS_DICT[action_id]}{test.active_brg.api_version}')])
|
|
786
781
|
if test.rc == TEST_FAILED:
|
|
787
782
|
return test
|
|
788
783
|
print("\nReceived ACK pkts:")
|
|
@@ -1056,24 +1051,14 @@ def get_gw_type(mqttc):
|
|
|
1056
1051
|
|
|
1057
1052
|
def get_module_if_pkt(test):
|
|
1058
1053
|
cert_config.send_brg_action(test, ag.ACTION_GET_MODULE, interface=1)
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1054
|
+
test, pkts = scan_for_mgmt_pkts(test, mgmt_type=[eval_pkt(f'ModuleIfV{test.active_brg.api_version}'),
|
|
1055
|
+
eval_pkt(f'ModuleIfV{test.active_brg.api_version - 1}'),])
|
|
1062
1056
|
if test.rc == TEST_FAILED:
|
|
1063
1057
|
return test, NO_RESPONSE
|
|
1064
1058
|
else:
|
|
1065
1059
|
print(pkts[-1][MGMT_PKT].pkt)
|
|
1066
1060
|
return test, pkts[-1][MGMT_PKT].pkt
|
|
1067
1061
|
|
|
1068
|
-
def get_gw_api_version(mqttc):
|
|
1069
|
-
messages = cert_mqtt.get_all_status_pkts(mqttc)
|
|
1070
|
-
for msg in messages:
|
|
1071
|
-
if GW_CONF in msg: # JSON
|
|
1072
|
-
return msg[GW_CONF][GW_API_VERSION]
|
|
1073
|
-
if GW_STATUS in msg: # protobuf
|
|
1074
|
-
return msg[GW_STATUS][GW_API_VERSION]
|
|
1075
|
-
return None
|
|
1076
|
-
|
|
1077
1062
|
def get_cfg_hash(test):
|
|
1078
1063
|
utPrint(f"Fetching BRG cfg hash for BRG {test.active_brg.id_str}", "BLUE")
|
|
1079
1064
|
test, module_if_pkt = get_module_if_pkt(test)
|
|
@@ -1288,28 +1273,10 @@ def output_power_supported(board_type, output_power):
|
|
|
1288
1273
|
else:
|
|
1289
1274
|
return output_power in ag.OUTPUT_POWER_2_4_SUPPORTED_VALUES
|
|
1290
1275
|
|
|
1291
|
-
|
|
1292
|
-
def validate_received_packets(pkts_array):
|
|
1293
|
-
for pkt in pkts_array:
|
|
1294
|
-
# Check all required fields are present
|
|
1295
|
-
if TIMESTAMP not in pkt:
|
|
1296
|
-
return False, "timestamp field is missing in some of the packets"
|
|
1297
|
-
if ALIAS_BRIDGE_ID not in pkt:
|
|
1298
|
-
return False, "alias_bridge_id field is missing in some of the packets"
|
|
1299
|
-
if PAYLOAD not in pkt:
|
|
1300
|
-
return False, "payload field is missing in some of the packets"
|
|
1301
|
-
if SEQUENCE_ID not in pkt:
|
|
1302
|
-
return False, "sequence_id field is missing in some of the packets"
|
|
1303
|
-
# Check that the payload length is either 62 or 74 hex characters (equevelnt to 31 or 37 bytes)
|
|
1304
|
-
if len(pkt[PAYLOAD]) != 62 and len(pkt[PAYLOAD]) !=74:
|
|
1305
|
-
return False, f"Payload length is invalid for packet {pkt[PAYLOAD]}"
|
|
1306
|
-
return True, ""
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
1276
|
def wiliot_pkts_validation(test, all_messages_in_test, all_data_pkts):
|
|
1310
1277
|
PHASE_NAME = "Wiliot packets validation"
|
|
1311
1278
|
phase_run_print(PHASE_NAME)
|
|
1312
|
-
wiliot_pkts_validation_phase =
|
|
1279
|
+
wiliot_pkts_validation_phase = Phase(PHASE_NAME, rc=TEST_PASSED)
|
|
1313
1280
|
|
|
1314
1281
|
if len(all_messages_in_test) == 0:
|
|
1315
1282
|
wiliot_pkts_validation_phase.rc = TEST_FAILED
|
|
@@ -1393,7 +1360,7 @@ def timestamps_validation(wiliot_pkts_validation_phase, all_messages_in_test, up
|
|
|
1393
1360
|
else:
|
|
1394
1361
|
if inner_pkt[TIMESTAMP] < previous_ts:
|
|
1395
1362
|
wiliot_pkts_validation_phase.rc = TEST_FAILED
|
|
1396
|
-
wiliot_pkts_validation_phase.reason = f'Timestamp is not incremental for inner packet {inner_pkt
|
|
1363
|
+
wiliot_pkts_validation_phase.reason = f'Timestamp is not incremental for inner packet {inner_pkt}'
|
|
1397
1364
|
return wiliot_pkts_validation_phase
|
|
1398
1365
|
previous_ts = inner_pkt[TIMESTAMP]
|
|
1399
1366
|
return wiliot_pkts_validation_phase
|
|
@@ -1450,8 +1417,11 @@ def generate_graph_stress_test(test, results, test_pkts_received):
|
|
|
1450
1417
|
|
|
1451
1418
|
|
|
1452
1419
|
def stress_analysis(test, pps, sent_pkts, received_pkts):
|
|
1453
|
-
|
|
1454
|
-
|
|
1420
|
+
_sent_pkts = []
|
|
1421
|
+
for pkt in sent_pkts:
|
|
1422
|
+
adva_endianness_change = change_endianness(pkt[:12]) + pkt[12:] # Switch to big endian adva
|
|
1423
|
+
_sent_pkts.append(adva_endianness_change)
|
|
1424
|
+
|
|
1455
1425
|
sent_df = pd.DataFrame(_sent_pkts, columns=[PACKETS])
|
|
1456
1426
|
received_df = pd.DataFrame(received_pkts, columns=[PACKETS])
|
|
1457
1427
|
|
|
@@ -1460,29 +1430,29 @@ def stress_analysis(test, pps, sent_pkts, received_pkts):
|
|
|
1460
1430
|
pkts_sent_count = len(sent_df)
|
|
1461
1431
|
pkts_received_count = len(merged_df)
|
|
1462
1432
|
|
|
1463
|
-
# Prints
|
|
1433
|
+
# Prints
|
|
1434
|
+
print(f'Number of packets sent: {pkts_sent_count}')
|
|
1435
|
+
print(f'Number of packets received: {pkts_received_count}')
|
|
1464
1436
|
percentage_received = round(pkts_received_count * 100 / pkts_sent_count)
|
|
1465
|
-
utPrint(f'Sent: {pkts_sent_count}, Received: {pkts_received_count} ({percentage_received}%)', "BLUE")
|
|
1466
1437
|
received_pps = pps * percentage_received / 100
|
|
1467
1438
|
|
|
1468
1439
|
# PASS/FAIL logic
|
|
1469
1440
|
if percentage_received < 1: # If less than 1% of the packets were received, fail the test
|
|
1470
|
-
test.
|
|
1471
|
-
test.
|
|
1441
|
+
test.rc = TEST_FAILED
|
|
1442
|
+
test.reason = "Insufficient amount of packets were scanned & uploaded by the gateway"
|
|
1472
1443
|
else:
|
|
1473
|
-
test.
|
|
1474
|
-
test.add_phase_reason(str(pps), f"received pps: {received_pps} ({percentage_received}% of packets)")
|
|
1444
|
+
test.reason = f'received pps: {received_pps} ({percentage_received}% of packets)'
|
|
1475
1445
|
|
|
1476
1446
|
return test, received_pps
|
|
1477
1447
|
|
|
1478
1448
|
|
|
1479
1449
|
def generate_adv_payload(test_indicator, unique_pkt=False):
|
|
1480
1450
|
# Keep last 4 bytes as zeroes so for incrementing them in FW 'ble_sim'
|
|
1481
|
-
adva = hex2alias_id_get(get_random_hex_str(12))
|
|
1482
|
-
unique_pkt_byte = get_random_hex_str(2) if unique_pkt == False else "00"
|
|
1451
|
+
adva = hex2alias_id_get(cert_utils.get_random_hex_str(12))
|
|
1452
|
+
unique_pkt_byte = cert_utils.get_random_hex_str(2) if unique_pkt == False else "00"
|
|
1483
1453
|
payload = (ag.Hdr(group_id=ag.GROUP_ID_UNIFIED_PKT_V2).dump() + test_indicator +
|
|
1484
|
-
get_random_hex_str(32) + unique_pkt_byte + "00000000")
|
|
1454
|
+
cert_utils.get_random_hex_str(32) + unique_pkt_byte + "00000000")
|
|
1485
1455
|
return adva + payload
|
|
1486
1456
|
|
|
1487
1457
|
def change_endianness(hex_str: str) -> str:
|
|
1488
|
-
return ''.join(f"{b:02X}" for b in bytes.fromhex(hex_str)[::-1])
|
|
1458
|
+
return ''.join(f"{b:02X}" for b in bytes.fromhex(hex_str)[::-1])
|
certificate/cert_config.py
CHANGED
|
@@ -4,7 +4,7 @@ from certificate.wlt_types import *
|
|
|
4
4
|
import certificate.cert_common as cert_common
|
|
5
5
|
import certificate.cert_protobuf as cert_protobuf
|
|
6
6
|
import certificate.cert_mqtt as cert_mqtt
|
|
7
|
-
import datetime, string, json, random
|
|
7
|
+
import datetime, string, json, random
|
|
8
8
|
|
|
9
9
|
BLE5_MAX_RETRIES = BLE5_MAX_DURATION_MS//20
|
|
10
10
|
|
|
@@ -40,9 +40,7 @@ def gw_configure(test, cfg={}, version="", extended_cfg={}, ret_pkt=False, wait=
|
|
|
40
40
|
while (datetime.datetime.now() - start_time).seconds < DEFAULT_GW_FIELD_UPDATE_TIMEOUT:
|
|
41
41
|
for p in cert_mqtt.get_all_status_pkts(mqttc):
|
|
42
42
|
if GW_CONF in p or GW_STATUS in p:
|
|
43
|
-
test.gw_api_version =
|
|
44
|
-
if target == DUT and is_gw(test.dut):
|
|
45
|
-
test.dut.gw_api_version = test.gw_api_version
|
|
43
|
+
test.gw_api_version = p[GW_CONF][GW_API_VERSION] if GW_CONF in p else p[GW_STATUS][GW_API_VERSION]
|
|
46
44
|
print_pkt(p)
|
|
47
45
|
utPrint("SUCCESS: Found GW cfg", "GREEN")
|
|
48
46
|
wait_time_n_print(2)
|
|
@@ -79,18 +77,15 @@ def gw_fw_upgrade(test, version, board_type, target=DUT):
|
|
|
79
77
|
def create_gw_config(test, cfg, target=DUT, version=""):
|
|
80
78
|
gw = test.dut if is_gw(test.dut) and target == DUT else test.tester
|
|
81
79
|
if version:
|
|
82
|
-
|
|
83
|
-
|
|
80
|
+
return dict({GW_CONF:{LAT: GW_LATITUDE_DEFAULT, LNG: GW_LONGITUDE_DEFAULT, WIFI_VERSION: version[WIFI_VERSION],
|
|
81
|
+
BLE_VERSION: version[BLE_VERSION], GW_API_VERSION: gw.gw_api_version, ADDITIONAL:dict(cfg)}})
|
|
84
82
|
elif gw.gw_orig_versions:
|
|
85
|
-
|
|
86
|
-
|
|
83
|
+
return dict({GW_CONF:{LAT: GW_LATITUDE_DEFAULT, LNG: GW_LONGITUDE_DEFAULT, WIFI_VERSION: gw.gw_orig_versions[WIFI_VERSION],
|
|
84
|
+
BLE_VERSION: gw.gw_orig_versions[BLE_VERSION], GW_API_VERSION: gw.gw_api_version, ADDITIONAL:dict(cfg)}})
|
|
87
85
|
# Protection for FDM gw config
|
|
88
86
|
else:
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if gw.gw_api_version is not None:
|
|
92
|
-
conf[GW_API_VERSION] = gw.gw_api_version
|
|
93
|
-
return dict({GW_CONF: conf})
|
|
87
|
+
return dict({GW_CONF:{LAT: GW_LATITUDE_DEFAULT, LNG: GW_LONGITUDE_DEFAULT, GW_API_VERSION: gw.gw_api_version,
|
|
88
|
+
ADDITIONAL:dict(cfg)}})
|
|
94
89
|
|
|
95
90
|
def gw_downlink(test, raw_tx_data="", is_ota=False, version="", max_duration=100, max_retries=8, target=DUT):
|
|
96
91
|
mqttc = test.get_mqttc_by_target(target)
|
|
@@ -318,14 +313,14 @@ def brg_configure_ble5(test, cfg_pkt=None, module=None, fields=None, values=None
|
|
|
318
313
|
if wait is False:
|
|
319
314
|
return test, DONE
|
|
320
315
|
while not pkts_found:
|
|
321
|
-
if ((datetime.datetime.now() - start_time).seconds >
|
|
316
|
+
if ((datetime.datetime.now() - start_time).seconds > ((ag.BLE5_PARAM_PRIMARY_CHANNEL_SCAN_CYCLE/1000)+1)):
|
|
322
317
|
if num_of_tries < 3:
|
|
323
318
|
num_of_tries += 1
|
|
324
319
|
start_time = datetime.datetime.now()
|
|
325
320
|
gw_downlink(test=test, raw_tx_data=cfg_pkt.dump(), max_duration=BLE5_MAX_DURATION_MS, max_retries=BLE5_MAX_RETRIES, target=target)
|
|
326
|
-
print(f"Brg configure - BLE5 mode : No pkts found after {
|
|
321
|
+
print(f"Brg configure - BLE5 mode : No pkts found after {(ag.BLE5_PARAM_PRIMARY_CHANNEL_SCAN_CYCLE/1000)+1} seconds, in try number {num_of_tries}")
|
|
327
322
|
else:
|
|
328
|
-
test.add_reason(f"Brg configure - BLE5 mode : No pkts found after {
|
|
323
|
+
test.add_reason(f"Brg configure - BLE5 mode : No pkts found after {BLE5_MAX_DURATION_MS} seconds, in 3 tries")
|
|
329
324
|
test.rc = TEST_FAILED
|
|
330
325
|
time.sleep(1)
|
|
331
326
|
mqttc.flush_pkts()
|
|
@@ -351,35 +346,15 @@ def send_brg_action(test, action_id, target=DUT, **kwargs):
|
|
|
351
346
|
action_pkt = get_default_brg_pkt(test, pkt_type=eval_pkt(f'{ag.ACTIONS_DICT[action_id]}{brg.api_version}'), **kwargs)
|
|
352
347
|
gw_downlink(test, raw_tx_data=action_pkt.dump(), target=target)
|
|
353
348
|
|
|
354
|
-
def backward_compatible_handler(test, pkt_type, **kwargs):
|
|
355
|
-
datapath_output_power = 8
|
|
356
|
-
energy_2400_output_power = 2
|
|
357
|
-
calibration_output_power = 2
|
|
358
|
-
init_params = inspect.signature(pkt_type.__init__).parameters
|
|
359
|
-
safe_kwargs = {}
|
|
360
|
-
for k, v in kwargs.items():
|
|
361
|
-
if k in init_params:
|
|
362
|
-
safe_kwargs[k] = v
|
|
363
|
-
else:
|
|
364
|
-
utPrint(f"WARNING: Parameter {k} not in {pkt_type.__name__} parameters, ignoring it!", "WARNING")
|
|
365
|
-
|
|
366
|
-
if test.active_brg.api_version < ag.API_VERSION_V13:
|
|
367
|
-
if "ModuleDatapathV12" in pkt_type.__name__ and BRG_OUTPUT_POWER not in safe_kwargs:
|
|
368
|
-
safe_kwargs.update({BRG_OUTPUT_POWER: datapath_output_power})
|
|
369
|
-
if "ModuleEnergy2400V12" in pkt_type.__name__ and BRG_OUTPUT_POWER not in safe_kwargs:
|
|
370
|
-
safe_kwargs.update({BRG_OUTPUT_POWER: energy_2400_output_power})
|
|
371
|
-
if "ModuleCalibrationV12" in pkt_type.__name__ and BRG_OUTPUT_POWER not in safe_kwargs:
|
|
372
|
-
safe_kwargs.update({BRG_OUTPUT_POWER: calibration_output_power})
|
|
373
|
-
return safe_kwargs
|
|
374
|
-
|
|
375
349
|
def get_default_brg_pkt(test, pkt_type, group_id=ag.GROUP_ID_GW2BRG, seq_id=0, target=DUT, **kwargs):
|
|
376
350
|
brg = get_brg_by_target(test, target)
|
|
377
351
|
seq_id = test.get_seq_id() if seq_id == 0 else seq_id
|
|
378
|
-
safe_kwargs = backward_compatible_handler(test, pkt_type, **kwargs)
|
|
379
352
|
# Bypass from default sub1g ep cfg of 0 (no energizing) ONLY if not using data simulation
|
|
380
|
-
if "ModuleEnergySub1G" in pkt_type.__name__ and BRG_PATTERN not in
|
|
381
|
-
|
|
382
|
-
|
|
353
|
+
if "ModuleEnergySub1G" in pkt_type.__name__ and BRG_PATTERN not in kwargs and test.data != DATA_SIMULATION:
|
|
354
|
+
# TODO - Remove on next api_version update - this is a patch for parameter name change from api version 11 to 12
|
|
355
|
+
brg_pattern = "sub1g_energy_" + BRG_PATTERN if brg.api_version < ag.API_VERSION_V12 else BRG_PATTERN
|
|
356
|
+
kwargs.update({brg_pattern: ag.SUB1G_ENERGY_PATTERN_ISRAEL})
|
|
357
|
+
brg_pkt = WltPkt(hdr=ag.Hdr(group_id=group_id), pkt=pkt_type(brg_mac=brg.id_int if brg else 0, seq_id=seq_id, **kwargs))
|
|
383
358
|
return brg_pkt
|
|
384
359
|
|
|
385
360
|
def config_brg_defaults(test, modules=[], ble5=False, wait=True, target=DUT):
|
|
@@ -400,7 +375,7 @@ def config_brg_defaults(test, modules=[], ble5=False, wait=True, target=DUT):
|
|
|
400
375
|
utPrint(f"SUCCESS: {module.__name__} configured to defaults", "GREEN")
|
|
401
376
|
return (test, DONE) if not failed_cfg else (test, NO_RESPONSE)
|
|
402
377
|
|
|
403
|
-
def brg_ota(test, ble_version, search_ack=True, ble5=False, target=DUT, upgrader=TESTER
|
|
378
|
+
def brg_ota(test, ble_version, search_ack=True, ble5=False, target=DUT, upgrader=TESTER):
|
|
404
379
|
brg = get_brg_by_target(test, target)
|
|
405
380
|
mqttc = test.get_mqttc_by_target(upgrader)
|
|
406
381
|
|
|
@@ -418,7 +393,7 @@ def brg_ota(test, ble_version, search_ack=True, ble5=False, target=DUT, upgrader
|
|
|
418
393
|
gw_downlink(test=test, raw_tx_data=action_pkt.dump(), is_ota=True, version=ble_version, max_duration=BLE5_MAX_DURATION_MS, max_retries=BLE5_MAX_RETRIES, target=upgrader)
|
|
419
394
|
|
|
420
395
|
# expected_hash=1 due to different cfgs and versions between builds
|
|
421
|
-
test = cert_common.reboot_config_analysis(test=test, expected_hash=1, ble_version=ble_version, timeout=
|
|
396
|
+
test = cert_common.reboot_config_analysis(test=test, expected_hash=1, ble_version=ble_version, timeout=VER_UPDATE_TIMEOUT)
|
|
422
397
|
# for debug - print all logs to see failure reason
|
|
423
398
|
cert_common.get_gw_logs_packets(test, print_log=True)
|
|
424
399
|
if test.rc == TEST_FAILED and test.exit_on_param_failure:
|
certificate/cert_data_sim.py
CHANGED
|
@@ -23,10 +23,10 @@ SECONDARY_CHANNEL_10 = 10
|
|
|
23
23
|
SECONDARY_CHANNEL_21 = 21
|
|
24
24
|
|
|
25
25
|
# Randomize pixel simulation indicator once per run (6 hex chars)
|
|
26
|
-
PIXEL_SIM_INDICATOR
|
|
26
|
+
PIXEL_SIM_INDICATOR = cert_utils.get_random_hex_str(6)
|
|
27
27
|
|
|
28
28
|
def init_adva(flow_version_major=0x4, flow_version_minor=0x34):
|
|
29
|
-
return "{0:02X}".format(flow_version_major) + get_random_hex_str(8) + "{0:02X}".format(flow_version_minor)
|
|
29
|
+
return "{0:02X}".format(flow_version_major) + cert_utils.get_random_hex_str(8) + "{0:02X}".format(flow_version_minor)
|
|
30
30
|
|
|
31
31
|
random_bytes = lambda n: int.from_bytes(os.urandom(n), "big")
|
|
32
32
|
|
|
@@ -41,16 +41,15 @@ def brg_pkt_gen(num_of_pkts_per_brg, num_of_brgs, brgs_list=[], pkt_type=PIXELS_
|
|
|
41
41
|
if brgs_list:
|
|
42
42
|
brg_mac = brgs_list[i]
|
|
43
43
|
else:
|
|
44
|
-
brg_mac = cert_common.hex2alias_id_get(get_random_hex_str(12))
|
|
44
|
+
brg_mac = cert_common.hex2alias_id_get(cert_utils.get_random_hex_str(12))
|
|
45
45
|
bridge_ids.append(brg_mac)
|
|
46
46
|
adva = cert_common.change_endianness(brg_mac) # Change endianness to little endian
|
|
47
|
-
|
|
47
|
+
|
|
48
48
|
for j in range(num_of_pkts_per_brg):
|
|
49
|
-
serial_pkt_id = f"{i % 256:02X}{j % 256:02X}{idx:04X}"
|
|
50
|
-
|
|
49
|
+
serial_pkt_id = f"{i % 256:02X}{j % 256:02X}{idx:04X}"
|
|
50
|
+
|
|
51
51
|
if pkt_type == PIXELS_PKT:
|
|
52
|
-
payload =
|
|
53
|
-
indicator + brg_mac + get_random_hex_str(22) + serial_pkt_id)
|
|
52
|
+
payload = ag.Hdr(group_id=ag.GROUP_ID_UNIFIED_PKT_V2).dump() + indicator + cert_utils.get_random_hex_str(34) + serial_pkt_id
|
|
54
53
|
|
|
55
54
|
if pkt_type == MGMT_PKT:
|
|
56
55
|
mgmt_pkt = eval_pkt(f'GenericV{ag.API_VERSION_LATEST}')
|
|
@@ -58,12 +57,10 @@ def brg_pkt_gen(num_of_pkts_per_brg, num_of_brgs, brgs_list=[], pkt_type=PIXELS_
|
|
|
58
57
|
payload = ag.Hdr(group_id=ag.GROUP_ID_BRG2GW).dump() + body.dump()[:-14] + indicator + serial_pkt_id
|
|
59
58
|
|
|
60
59
|
if pkt_type == SENSOR_PKT:
|
|
61
|
-
payload =
|
|
62
|
-
indicator + brg_mac + get_random_hex_str(22) + serial_pkt_id)
|
|
60
|
+
payload = ag.Hdr(uuid_msb=ag.HDR_DEFAULT_BRG_SENSOR_UUID_MSB, uuid_lsb=ag.HDR_DEFAULT_BRG_SENSOR_UUID_LSB).dump() + indicator + cert_utils.get_random_hex_str(34) + serial_pkt_id
|
|
63
61
|
|
|
64
62
|
if pkt_type == SIDE_INFO_SENSOR_PKT:
|
|
65
|
-
payload =
|
|
66
|
-
indicator + brg_mac + get_random_hex_str(22) + serial_pkt_id)
|
|
63
|
+
payload = ag.Hdr(group_id=ag.GROUP_ID_SIDE_INFO_SENSOR).dump() + indicator + cert_utils.get_random_hex_str(34) + serial_pkt_id
|
|
67
64
|
|
|
68
65
|
idx += 1
|
|
69
66
|
pkts += [GenericPkt(adva=adva, payload=payload)]
|
certificate/cert_defines.py
CHANGED
|
@@ -1,16 +1,11 @@
|
|
|
1
1
|
# Files
|
|
2
2
|
import os
|
|
3
|
-
import random
|
|
4
3
|
import datetime
|
|
5
4
|
import importlib.metadata
|
|
6
5
|
import certificate.ag.wlt_types_ag as ag
|
|
7
|
-
|
|
8
|
-
get_random_hex_str = lambda n: ''.join([random.choice('0123456789ABCDEF') for _ in range(n)])
|
|
9
|
-
|
|
10
6
|
# BASE_DIR should be initiated in the same dir as certificate.py
|
|
11
7
|
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
12
8
|
ARTIFACTS_DIR = os.path.join(os.getcwd(), f"cert_artifacts_{datetime.datetime.now().strftime("%d_%m_%Y__%H_%M_%S")}")
|
|
13
|
-
|
|
14
9
|
# CERT_VERSION handling - local/PyPi
|
|
15
10
|
LOCAL_DEV = "local-dev"
|
|
16
11
|
try:
|
|
@@ -283,7 +278,6 @@ GW_LONGITUDE_DEFAULT = -117.0839
|
|
|
283
278
|
GW_API_VER_DEFAULT = "201"
|
|
284
279
|
GW_API_VER_OLD = "200"
|
|
285
280
|
GW_API_VER_LATEST = "206"
|
|
286
|
-
API_OLDEST_SUPPORTED_VERSION = ag.API_VERSION_V12
|
|
287
281
|
BRG_CFG_HAS_LEN = 2
|
|
288
282
|
CLEAR_DATA_PATH_TIMEOUT = 10
|
|
289
283
|
ACTION_LONG_TIMEOUT = 120
|
|
@@ -307,7 +301,6 @@ BLE5_MAX_DURATION_SEC = BLE5_MAX_DURATION_MS // 1000
|
|
|
307
301
|
DATA_SIM_EVENT_TESTING_DELAY_SEC = DATA_SIM_EVENT_TESTING_DELAY_MS / 1000
|
|
308
302
|
DATA_SIM_RSSI_EVENT_TESTING_DELAY_SEC = DATA_SIM_RSSI_EVENT_TESTING_DELAY_MS / 1000
|
|
309
303
|
DATA_SIM_EVENT_PACER_INTERVAL_TESTING = 10
|
|
310
|
-
RSSI_EVENT_PKTS_TO_STABILIZE = 13 # The alpha filter takes about 13 packets to stabilize
|
|
311
304
|
PACKETS_ECHO_OFF = 16
|
|
312
305
|
TEST_PASSED = 0
|
|
313
306
|
TEST_FAILED = -1
|
|
@@ -350,7 +343,6 @@ MODULE = "module"
|
|
|
350
343
|
NAME = "name"
|
|
351
344
|
DOCUMENTATION = "documentation"
|
|
352
345
|
ALL_SUPPORTED_VALUES = "allSupportedValues"
|
|
353
|
-
SUPPORTED_FROM_API_VERSION = "SupportedFromApiVersion"
|
|
354
346
|
PRE_CONFIG = "Pre Configuration"
|
|
355
347
|
TEST_BODY = "Test Body"
|
|
356
348
|
RESTORE_CONFIG = "Restore Configuration"
|
certificate/cert_gw_sim.py
CHANGED
|
@@ -198,7 +198,7 @@ def gw_app_reponse(ble_serial):
|
|
|
198
198
|
start_time = datetime.datetime.now()
|
|
199
199
|
while (datetime.datetime.now() - start_time).seconds < 2:
|
|
200
200
|
input = read_from_ble(ble_serial)
|
|
201
|
-
if
|
|
201
|
+
if GW_APP_VERSION_HEADER in input:
|
|
202
202
|
print(input)
|
|
203
203
|
ble_chip_sw_ver = re.search(r'WILIOT_GW_BLE_CHIP_SW_VER=(\d+\.\d+\.\d+)', input).group(1)
|
|
204
204
|
ble_mac_address = re.search(r'WILIOT_GW_BLE_CHIP_MAC_ADDRESS=([0-9A-F]{12})', input).group(1)
|
|
@@ -327,42 +327,21 @@ def parse_uart_pkts(input, mqttc, custom_broker, gw_id, seq_id):
|
|
|
327
327
|
def handle_cmds(input, ble_serial):
|
|
328
328
|
if input.startswith(RX_NORDIC_RECOVER_RESET):
|
|
329
329
|
utPrint(f"Simulator received reboot packet", "CYAN")
|
|
330
|
-
global GW_SIM_RESET_TS
|
|
331
330
|
GW_SIM_RESET_TS = datetime.datetime.now()
|
|
332
331
|
write_to_ble(ble_serial, RESET_GW, sleep=0)
|
|
333
332
|
if input.startswith(RX_NORDIC_RECOVER_NORESET):
|
|
334
|
-
utPrint(f"
|
|
333
|
+
utPrint(f"Simulator recovered", "CYAN")
|
|
335
334
|
write_to_ble(ble_serial, f"{CONNECTIVITY_STATUS} 1 1")
|
|
336
335
|
|
|
337
|
-
def
|
|
338
|
-
try:
|
|
339
|
-
with serial.serial_for_url(url=port, baudrate=921600, timeout=SERIAL_TIMEOUT,
|
|
340
|
-
write_timeout=SERIAL_TIMEOUT * 10) as ser:
|
|
341
|
-
ser.flushInput()
|
|
342
|
-
write_to_ble(ser, txt=VERSION, print_enable=True)
|
|
343
|
-
start_time = datetime.datetime.now()
|
|
344
|
-
while (datetime.datetime.now() - start_time).seconds < 2:
|
|
345
|
-
input = read_from_ble(ser)
|
|
346
|
-
if input is not None and GW_APP_VERSION_HEADER in input:
|
|
347
|
-
return True
|
|
348
|
-
return False
|
|
349
|
-
except Exception as e:
|
|
350
|
-
utPrint(f"Failed to open serial: {e}", "RED")
|
|
351
|
-
return False
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
def gw_sim_run(port, gw_id, custom_broker, disable_interference_analyzer=False):
|
|
336
|
+
def gw_sim_run(port, gw_id, custom_broker, analyze_interference=False):
|
|
355
337
|
|
|
356
338
|
# Init serial side
|
|
357
339
|
if not port:
|
|
358
340
|
print("\nNo COM port given. Scanning for available ports:")
|
|
359
341
|
for port, desc, hwid in sorted(serial.tools.list_ports.comports()):
|
|
360
342
|
print("{}: {} [{}]".format(port, desc, hwid))
|
|
361
|
-
if validate_port(port):
|
|
362
|
-
utPrint(f"Found the tester's port ({port})", "GREEN")
|
|
363
|
-
break
|
|
364
343
|
if not port:
|
|
365
|
-
print("\nNo available COM port found!
|
|
344
|
+
print("\nNo available COM port found!")
|
|
366
345
|
sys.exit(-1)
|
|
367
346
|
print(f"###>>> GW SIM STARTED WITH PORT {port}")
|
|
368
347
|
ble_serial = serial.serial_for_url(url=port, baudrate=921600, timeout=SERIAL_TIMEOUT)
|
|
@@ -391,19 +370,15 @@ def gw_sim_run(port, gw_id, custom_broker, disable_interference_analyzer=False):
|
|
|
391
370
|
write_to_ble(ble_serial, RESET_GW, sleep=5)
|
|
392
371
|
gw_app_res = gw_app_reponse(ble_serial)
|
|
393
372
|
if gw_app_res[0] == TEST_FAILED:
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
if gw_app_res[2] not in cert_utils.TESTER_FW_VERSIONS:
|
|
397
|
-
utPrint(f"ERROR: Tester FW version={gw_app_res[2]} instead of versions={cert_utils.TESTER_FW_VERSIONS}!\n"
|
|
398
|
-
f"Please run the command wlt-cert-tester-upgrade to upgrade the tester firmware!", "RED")
|
|
399
|
-
sys.exit(1)
|
|
373
|
+
print("ERROR: didn't get version response!")
|
|
374
|
+
return
|
|
400
375
|
os.environ[GW_SIM_BLE_MAC_ADDRESS] = gw_app_res[1]
|
|
401
376
|
os.environ[GW_APP_VERSION_HEADER] = gw_app_res[2]
|
|
402
377
|
write_to_ble(ble_serial, STOP_ADVERTISING, sleep=2)
|
|
403
378
|
write_to_ble(ble_serial, f"{CONNECTIVITY_STATUS} 1 1")
|
|
404
379
|
|
|
405
380
|
# Run interference analysis
|
|
406
|
-
if
|
|
381
|
+
if analyze_interference:
|
|
407
382
|
print(color("BLUE", f"\nStarting interference analysis for channels {[ch[0] for ch in CHANNELS_TO_ANALYZE]}. This will take {30 * len(CHANNELS_TO_ANALYZE)} seconds (total)"))
|
|
408
383
|
interference_analysis(ble_serial)
|
|
409
384
|
|
certificate/cert_mqtt.py
CHANGED
|
@@ -198,8 +198,7 @@ def on_message_json(mqttc, userdata, message):
|
|
|
198
198
|
wlt_mqtt_pkts = userdata[PKTS]
|
|
199
199
|
data = json.loads(message.payload.decode("utf-8"))
|
|
200
200
|
wlt_mqtt_pkts.insert(WltMqttPkt(data, message.topic, userdata))
|
|
201
|
-
|
|
202
|
-
write_to_mqtt_log_file("// JSON message received at {}, topic={}:\n{}\n".format(datetime.datetime.now().strftime("%d/%m/%Y, %H:%M:%S"), message.topic, text))
|
|
201
|
+
write_to_mqtt_log_file("// JSON message received at {}, topic={}:\n{}\n".format(datetime.datetime.now().strftime("%d/%m/%Y, %H:%M:%S"), message.topic, str(message.payload.decode("utf-8"))))
|
|
203
202
|
|
|
204
203
|
def on_message_protobuf(mqttc, userdata, message):
|
|
205
204
|
pb_msg = None
|
|
@@ -223,8 +222,7 @@ def on_message_protobuf(mqttc, userdata, message):
|
|
|
223
222
|
# Align formats with JSON (bytes to hex strings)
|
|
224
223
|
if 'status' in message.topic:
|
|
225
224
|
if ACTION_STATUS in pb_msg_dict:
|
|
226
|
-
|
|
227
|
-
pb_msg_dict[ACTION_STATUS][BRIDGE_ID] = base64.b64decode(pb_msg_dict[ACTION_STATUS][BRIDGE_ID]).hex().upper()
|
|
225
|
+
pb_msg_dict[ACTION_STATUS][BRIDGE_ID] = base64.b64decode(pb_msg_dict[ACTION_STATUS][BRIDGE_ID]).hex().upper()
|
|
228
226
|
if GW_STATUS in pb_msg_dict and ACL_IDS in pb_msg_dict[GW_STATUS][CONFIG][ACL][ACL_VALUE]:
|
|
229
227
|
ids_list = pb_msg_dict[GW_STATUS][CONFIG][ACL][ACL_VALUE][ACL_IDS]
|
|
230
228
|
for idx, id in enumerate(ids_list):
|
|
@@ -266,9 +264,9 @@ def load_custom_broker(broker_filepath, gw):
|
|
|
266
264
|
except FileNotFoundError:
|
|
267
265
|
raise FileNotFoundError(f"No such file: {broker_filepath}")
|
|
268
266
|
data = json.load(f)
|
|
269
|
-
data[CUSTOM_BROKER_UPDATE_TOPIC]
|
|
270
|
-
data[CUSTOM_BROKER_STATUS_TOPIC]
|
|
271
|
-
data[CUSTOM_BROKER_DATA_TOPIC]
|
|
267
|
+
data[CUSTOM_BROKER_UPDATE_TOPIC] += gw
|
|
268
|
+
data[CUSTOM_BROKER_STATUS_TOPIC] += gw
|
|
269
|
+
data[CUSTOM_BROKER_DATA_TOPIC] += gw
|
|
272
270
|
return data
|
|
273
271
|
|
|
274
272
|
def mqttc_init(gw_id, custom_broker, data=DATA_REAL_TAGS):
|
|
@@ -300,14 +298,6 @@ def mqttc_init(gw_id, custom_broker, data=DATA_REAL_TAGS):
|
|
|
300
298
|
mqttc.subscribe(mqttc.status_topic)
|
|
301
299
|
print(f"Subscribed to status topic: {mqttc.status_topic}")
|
|
302
300
|
|
|
303
|
-
# v2 protobuf topics
|
|
304
|
-
mqttc.data_topic_pb = re.sub(r'^([^/]+)', r'\1-v2', custom_broker[CUSTOM_BROKER_DATA_TOPIC])
|
|
305
|
-
mqttc.subscribe(mqttc.data_topic_pb)
|
|
306
|
-
print(f"Subscribed to data topic: {mqttc.data_topic_pb}")
|
|
307
|
-
mqttc.status_topic_pb = re.sub(r'^([^/]+)', r'\1-v2', custom_broker[CUSTOM_BROKER_STATUS_TOPIC])
|
|
308
|
-
mqttc.subscribe(mqttc.status_topic_pb)
|
|
309
|
-
print(f"Subscribed to status topic: {mqttc.status_topic_pb}")
|
|
310
|
-
|
|
311
301
|
mqttc.flush_pkts = mqttc._userdata[PKTS].flush
|
|
312
302
|
mqttc.flush_data_pkts = mqttc._userdata[PKTS].flush_data
|
|
313
303
|
mqttc.flush_status_pkts = mqttc._userdata[PKTS].flush_status
|
certificate/cert_prints.py
CHANGED
|
@@ -18,7 +18,6 @@ COLORS = {
|
|
|
18
18
|
}
|
|
19
19
|
color = lambda c, t : COLORS["BOLD"]+COLORS[c]+t+COLORS["ENDC"]
|
|
20
20
|
pipeline_running = lambda : True if 'BITBUCKET_BUILD_NUMBER' in os.environ else False
|
|
21
|
-
is_quiet_setup_running = lambda : True if 'CI_GW' in os.environ else False
|
|
22
21
|
camelcase_to_title = lambda s: ' '.join(word.capitalize() for word in re.split('(?=[A-Z])', s))
|
|
23
22
|
SEP = '\n' + '#'*100 + '\n'
|
|
24
23
|
SEP2 = '\n' + '#'*100 + '\n' + '#'*100 + '\n'
|