wiliot-certificate 1.5.3a1__py3-none-any.whl → 4.4.0__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.
Files changed (99) hide show
  1. brg_certificate/ag/energous_v0_defines.py +105 -114
  2. brg_certificate/ag/energous_v1_defines.py +105 -114
  3. brg_certificate/ag/energous_v2_defines.py +105 -114
  4. brg_certificate/ag/energous_v3_defines.py +105 -114
  5. brg_certificate/ag/energous_v4_defines.py +105 -114
  6. brg_certificate/ag/fanstel_lan_v0_defines.py +105 -114
  7. brg_certificate/ag/fanstel_lte_v0_defines.py +105 -114
  8. brg_certificate/ag/fanstel_wifi_v0_defines.py +105 -114
  9. brg_certificate/ag/minew_lte_v0_defines.py +105 -114
  10. brg_certificate/ag/wlt_types.html +980 -147
  11. brg_certificate/ag/wlt_types_ag.py +1318 -240
  12. brg_certificate/ag/wlt_types_ag_jsons/brg2brg_ota.json +69 -0
  13. brg_certificate/ag/wlt_types_ag_jsons/brg2gw_hb.json +101 -0
  14. brg_certificate/ag/wlt_types_ag_jsons/brg2gw_hb_sleep.json +45 -0
  15. brg_certificate/ag/wlt_types_ag_jsons/calibration.json +75 -0
  16. brg_certificate/ag/wlt_types_ag_jsons/custom.json +99 -0
  17. brg_certificate/ag/wlt_types_ag_jsons/datapath.json +133 -8
  18. brg_certificate/ag/wlt_types_ag_jsons/energy2400.json +99 -0
  19. brg_certificate/ag/wlt_types_ag_jsons/energySub1g.json +96 -0
  20. brg_certificate/ag/wlt_types_ag_jsons/externalSensor.json +113 -0
  21. brg_certificate/ag/wlt_types_ag_jsons/interface.json +157 -0
  22. brg_certificate/ag/wlt_types_ag_jsons/powerManagement.json +205 -0
  23. brg_certificate/certificate_bcc_test_list.txt +0 -2
  24. brg_certificate/certificate_test_list.txt +2 -2
  25. brg_certificate/tests/calibration/interval_test/interval_test.json +1 -1
  26. brg_certificate/tests/calibration/interval_test/interval_test.py +4 -4
  27. brg_certificate/tests/calibration/output_power_test/output_power_test.json +1 -1
  28. brg_certificate/tests/calibration/output_power_test/output_power_test.py +4 -4
  29. brg_certificate/tests/calibration/pattern_test/pattern_test.json +1 -1
  30. brg_certificate/tests/calibration/pattern_test/pattern_test.py +14 -8
  31. brg_certificate/tests/datapath/aging_test/aging_test.py +9 -8
  32. brg_certificate/tests/datapath/num_of_tags_test/num_of_tags_test.py +7 -12
  33. brg_certificate/tests/datapath/output_power_test/output_power_test.json +1 -1
  34. brg_certificate/tests/datapath/output_power_test/output_power_test.py +4 -4
  35. brg_certificate/tests/datapath/pacer_interval_ble5_test/pacer_interval_ble5_test.json +1 -1
  36. brg_certificate/tests/datapath/pacer_interval_ble5_test/pacer_interval_ble5_test.py +10 -6
  37. brg_certificate/tests/datapath/pacer_interval_tags_count_test/pacer_interval_tags_count_test.py +10 -3
  38. brg_certificate/tests/datapath/pacer_interval_test/pacer_interval_test.py +9 -9
  39. brg_certificate/tests/datapath/pattern_test/pattern_test.json +1 -1
  40. brg_certificate/tests/datapath/pattern_test/pattern_test.py +4 -5
  41. brg_certificate/tests/datapath/pkt_filter_ble5_test/pkt_filter_ble5_test.json +1 -1
  42. brg_certificate/tests/datapath/pkt_filter_ble5_test/pkt_filter_ble5_test.py +10 -9
  43. brg_certificate/tests/datapath/pkt_filter_gen3_test/pkt_filter_gen3_test.json +1 -1
  44. brg_certificate/tests/datapath/pkt_filter_gen3_test/pkt_filter_gen3_test.py +10 -9
  45. brg_certificate/tests/datapath/pkt_filter_test/pkt_filter_test.json +1 -1
  46. brg_certificate/tests/datapath/pkt_filter_test/pkt_filter_test.py +10 -9
  47. brg_certificate/tests/datapath/rssi_threshold_test/rssi_threshold_test.json +1 -1
  48. brg_certificate/tests/datapath/rssi_threshold_test/rssi_threshold_test.py +10 -9
  49. brg_certificate/tests/datapath/rx_channel_test/rx_channel_test.json +1 -1
  50. brg_certificate/tests/datapath/rx_channel_test/rx_channel_test.py +4 -5
  51. brg_certificate/tests/datapath/rx_rate_gen2_test/rx_rate_gen2_test.py +38 -36
  52. brg_certificate/tests/datapath/rx_rate_gen3_test/rx_rate_gen3_test.py +45 -45
  53. brg_certificate/tests/datapath/stress_gen3_test/stress_gen3_test.json +2 -3
  54. brg_certificate/tests/datapath/stress_gen3_test/stress_gen3_test.py +20 -16
  55. brg_certificate/tests/datapath/stress_test/stress_test.json +2 -3
  56. brg_certificate/tests/datapath/stress_test/stress_test.py +19 -16
  57. brg_certificate/tests/datapath/tx_repetition_test/tx_repetition_test.json +1 -1
  58. brg_certificate/tests/datapath/tx_repetition_test/tx_repetition_test.py +11 -9
  59. brg_certificate/tests/edge_mgmt/actions_test/actions_test.json +1 -1
  60. brg_certificate/tests/edge_mgmt/actions_test/actions_test.py +4 -4
  61. brg_certificate/tests/energy2400/duty_cycle_test/duty_cycle_test.json +1 -1
  62. brg_certificate/tests/energy2400/duty_cycle_test/duty_cycle_test.py +4 -4
  63. brg_certificate/tests/energy2400/output_power_test/output_power_test.json +1 -1
  64. brg_certificate/tests/energy2400/output_power_test/output_power_test.py +4 -4
  65. brg_certificate/tests/energy2400/pattern_test/pattern_test.json +1 -1
  66. brg_certificate/tests/energy2400/pattern_test/pattern_test.py +4 -4
  67. brg_certificate/tests/energy2400/signal_indicator_test/signal_indicator_test.py +6 -4
  68. brg_certificate/tests/energy_sub1g/duty_cycle_test/duty_cycle_test.json +1 -1
  69. brg_certificate/tests/energy_sub1g/duty_cycle_test/duty_cycle_test.py +4 -4
  70. brg_certificate/tests/energy_sub1g/pattern_test/pattern_test.json +1 -1
  71. brg_certificate/tests/energy_sub1g/pattern_test/pattern_test.py +4 -4
  72. brg_certificate/tests/energy_sub1g/signal_indicator_test/signal_indicator_test.json +1 -1
  73. brg_certificate/tests/energy_sub1g/signal_indicator_test/signal_indicator_test.py +4 -4
  74. brg_certificate/tests/sensors/ext_sensor_test/ext_sensor_test.json +1 -1
  75. brg_certificate/tests/sensors/ext_sensor_test/ext_sensor_test.py +4 -5
  76. brg_certificate/wltPb_pb2.py +4 -4
  77. brg_certificate/wltPb_pb2.pyi +2 -1
  78. gw_certificate/common/serialization_formatter.py +14 -1
  79. gw_certificate/common/wltPb_pb2.py +4 -4
  80. gw_certificate/common/wltPb_pb2.pyi +2 -1
  81. gw_certificate/interface/{4.4.82_app.zip → 4.4.91_app.zip} +0 -0
  82. gw_certificate/interface/{4.4.82_sd_bl_app.zip → 4.4.91_sd_bl_app.zip} +0 -0
  83. gw_certificate/interface/ble_simulator.py +5 -3
  84. gw_certificate/interface/flash_fw.py +90 -0
  85. gw_certificate/interface/uart_if.py +6 -4
  86. gw_certificate/tests/actions.py +1 -1
  87. gw_certificate/tests/downlink.py +2 -2
  88. gw_certificate/tests/generic.py +4 -3
  89. gw_certificate/tests/static/generated_packet_table.py +16 -16
  90. gw_certificate/tests/static/packet_table.csv +10052 -10052
  91. gw_certificate/tests/static/uplink_defines.py +1 -1
  92. gw_certificate/tests/throughput.py +3 -2
  93. gw_certificate/tests/uplink.py +38 -19
  94. {wiliot_certificate-1.5.3a1.dist-info → wiliot_certificate-4.4.0.dist-info}/METADATA +71 -30
  95. {wiliot_certificate-1.5.3a1.dist-info → wiliot_certificate-4.4.0.dist-info}/RECORD +99 -98
  96. {wiliot_certificate-1.5.3a1.dist-info → wiliot_certificate-4.4.0.dist-info}/WHEEL +1 -1
  97. {wiliot_certificate-1.5.3a1.dist-info → wiliot_certificate-4.4.0.dist-info}/entry_points.txt +0 -0
  98. {wiliot_certificate-1.5.3a1.dist-info → wiliot_certificate-4.4.0.dist-info}/licenses/LICENSE +0 -0
  99. {wiliot_certificate-1.5.3a1.dist-info → wiliot_certificate-4.4.0.dist-info}/top_level.txt +0 -0
@@ -9,6 +9,6 @@ OBJECT_COLUMNS = [PAYLOAD]
9
9
  REPORT_COLUMNS = ['pkt_id', 'duplication', 'time_delay']
10
10
 
11
11
  ADV_TIMESTAMP = 'adv_timestamp'
12
- TS_DEVIATION = 1500
12
+ TS_DEVIATION = 4500
13
13
  TS_TOLERANCE = 2500
14
14
  REC_TIMESTAMP = 'rec_timestamp'
@@ -134,6 +134,7 @@ class StressTestStage(GenericStressStage):
134
134
  run_data = self.run_stress_data.data
135
135
  end_time = datetime.datetime.now() + datetime.timedelta(seconds=TIME_PER_DELAY_FIRST if delay == STRESS_DEFAULT_DELAYS[0] else TIME_PER_DELAY)
136
136
  last_sent_time = time.perf_counter_ns()
137
+ debug_print('Advertising packets...')
137
138
  for index, row in run_data.iterrows():
138
139
  if datetime.datetime.now() > end_time:
139
140
  debug_print(f"Timeout for PPS rate {int(ONE_SECOND_MS / delay)} reached")
@@ -142,7 +143,7 @@ class StressTestStage(GenericStressStage):
142
143
  self.local_pkts.append(row[PAYLOAD])
143
144
  while True:
144
145
  if time.perf_counter_ns() - last_sent_time >= delay * 10**6:
145
- self.ble_sim.send_packet(data, duplicates=self.duplicates, delay=0)
146
+ self.ble_sim.send_packet(data, duplicates=self.duplicates, delay=0, print_for_debug=False)
146
147
  last_sent_time = time.perf_counter_ns()
147
148
  break
148
149
  self.ts_records_arr[delay_idx].set_adv_timestamp_current(data)
@@ -199,7 +200,7 @@ class StressTestStage(GenericStressStage):
199
200
  for idx, delay in enumerate(self.delays):
200
201
  if self.ts_records_arr[idx].is_ts_error():
201
202
  self.add_to_stage_report(f"Timestamps errors during PPS {self.report_data[str(delay)]['pkts_per_sec_desired']}:")
202
- self.ts_records_arr[idx].add_ts_errs_to_report(self)
203
+ self.ts_records_arr[idx].add_ts_errs_to_report(self, newline=False)
203
204
  self.add_report_line_separator()
204
205
  self.add_to_stage_report(f'Stage data saved - {self.csv_path}')
205
206
 
@@ -15,7 +15,7 @@ from gw_certificate.tests.static.uplink_defines import *
15
15
  from gw_certificate.interface.mqtt import MqttClient, Serialization
16
16
  from gw_certificate.interface.pkt_generator import BrgPktGenerator, apply_adva_bitmask
17
17
  from gw_certificate.tests.static.generated_packet_table import UnifiedRunData, SensorRunData, MgmtRunData, PacketTableHelper, ACLRunData
18
- from gw_certificate.tests.generic import PassCriteria, PERFECT_SCORE, MINIMUM_SCORE, GenericTest, GenericStage, ERR_SUMMARY_DEFAULT
18
+ from gw_certificate.tests.generic import PassCriteria, PERFECT_SCORE, MINIMUM_SCORE, GenericTest, GenericStage, ERR_SUMMARY_DEFAULT, INFORMATIVE
19
19
  from gw_certificate.api_if.api_validation import MESSAGE_TYPES, validate_message
20
20
  from gw_certificate.tests.static.generated_packet_table import CSV_NAME
21
21
  from gw_certificate.common.serialization_formatter import ACL_MODE, ACL_BRIDGE_IDS, SerializationFormatter, Configurable, ACL_ALLOW, ACL_DENY
@@ -108,21 +108,24 @@ class TimestampsHelper(PacketTableHelper):
108
108
 
109
109
  packets_sent_df[REC_TIMESTAMP] = packets_sent_df.apply(validate_row, axis=1)
110
110
 
111
- # Validate no 2 packets hold the same timestamp
112
- if REC_TIMESTAMP in packets_sent_df.columns:
113
- duplicates = packets_sent_df[REC_TIMESTAMP].value_counts()
114
- duplicated_ts = duplicates[duplicates > 1].index
111
+ # # Validate no 2 packets hold the same timestamp - disabled, not a requirement for certification
112
+ # if REC_TIMESTAMP in packets_sent_df.columns:
113
+ # duplicates = packets_sent_df[REC_TIMESTAMP].value_counts()
114
+ # duplicated_ts = duplicates[duplicates > 1].index
115
115
 
116
- for ts in duplicated_ts:
117
- self.ts_errors.append(f"Multiple packets were uploaded with identical timestamp (ts = {int(ts)})")
118
- self.has_identical_ts = True
116
+ # for ts in duplicated_ts:
117
+ # self.ts_errors.append(f"Multiple packets were uploaded with identical timestamp (ts = {int(ts)})")
118
+ # self.has_identical_ts = True
119
+
120
+ def add_ts_errs_to_report(self, stage:GenericStage, newline=True):
119
121
 
120
- def add_ts_errs_to_report(self, stage:GenericStage):
121
122
  for idx, ts_err in enumerate(self.ts_errors):
122
123
  stage.add_to_stage_report(ts_err)
123
124
  if idx == 1 and (len(self.ts_errors) - 1) > idx:
124
125
  stage.add_to_stage_report(f'Additional errors ({len(self.ts_errors) - 1 - idx}) are suppressed to avoid clutter')
125
126
  break
127
+ if len(self.ts_errors) > 0 and newline:
128
+ stage.add_to_stage_report('')
126
129
 
127
130
  def is_ts_error(self) -> bool:
128
131
  return len(self.ts_errors) > 0
@@ -205,6 +208,7 @@ class GenericUplinkStage(GenericStage):
205
208
  if len(not_received) > 0:
206
209
  self.add_to_stage_report('Packets not received:')
207
210
  self.add_to_stage_report(tabulate.tabulate(not_received, headers='keys', showindex=False))
211
+ self.add_to_stage_report('')
208
212
 
209
213
  self.ts_records.add_ts_errs_to_report(self)
210
214
 
@@ -223,6 +227,9 @@ class GenericUplinkStage(GenericStage):
223
227
 
224
228
  return self.report
225
229
 
230
+ def swap_endianness(self, hex_str: str) -> str:
231
+ return ''.join(format(b, '02X') for b in bytes.fromhex(hex_str)[::-1])
232
+
226
233
 
227
234
  class ManagementPacketStage(GenericUplinkStage):
228
235
  def __init__(self, **kwargs):
@@ -374,6 +381,7 @@ class SensorPacketStage(GenericUplinkStage):
374
381
  if len(not_received) > 0:
375
382
  self.add_to_stage_report('Packets not received:')
376
383
  self.add_to_stage_report(tabulate.tabulate(not_received_rep_cols, headers='keys', showindex=False))
384
+ self.add_to_stage_report('')
377
385
 
378
386
  def all_varying_len_sensors_missed(not_received_df):
379
387
  not_uploaded_count = 0
@@ -568,9 +576,6 @@ class AliasBridgeIDStage(GenericUplinkStage):
568
576
  if any(payload in test_payload for test_payload in self.all_test_payloads):
569
577
  filtered_pkts.append(pkt)
570
578
  message['packets'] = filtered_pkts
571
-
572
- def swap_endianness(hex_str: str) -> str:
573
- return ''.join(format(b, '02X') for b in bytes.fromhex(hex_str)[::-1])
574
579
 
575
580
  def is_alias_bridge_id_valid(message):
576
581
  nonlocal aliasBridgeId_valid
@@ -585,7 +590,7 @@ class AliasBridgeIDStage(GenericUplinkStage):
585
590
  debug_print(f"validation_data unexpected len:{len(validation_data)}, for payload:{pkt_payload}")
586
591
  return
587
592
  expected_bridge_id = validation_data.iloc[0]['adva']
588
- expected_bridge_ids = [expected_bridge_id, swap_endianness(expected_bridge_id)]
593
+ expected_bridge_ids = [expected_bridge_id, self.swap_endianness(expected_bridge_id)]
589
594
  if pkt_alias_bridge_id.upper() not in expected_bridge_ids:
590
595
  report.append(f"Alias bridge ID of the packet does not match. Expected alias bridge IDs:{expected_bridge_ids} but the packet alias bridge ID is {pkt_alias_bridge_id}")
591
596
  self.stage_pass = MINIMUM_SCORE
@@ -625,6 +630,7 @@ class GeolocationStage(GenericUplinkStage):
625
630
  self.__dict__.update(kwargs)
626
631
  super().__init__(**self.__dict__, stage_name=type(self).__name__)
627
632
  self.graph_html_path = os.path.join(self.test_dir, f'{self.stage_name}.html')
633
+ self.result_indication = INFORMATIVE
628
634
 
629
635
 
630
636
  def prepare_stage(self):
@@ -672,7 +678,7 @@ class GeolocationStage(GenericUplinkStage):
672
678
 
673
679
  class ACLStage(GenericUplinkStage):
674
680
  def __init__(self, **kwargs):
675
- self.stage_tooltip = "Tests the Access Control List capability of a gateway. Simulates packets from two bridges, with different ACL configurations"
681
+ self.stage_tooltip = "Configures the gateway's Access Control List and simulate bridges. Expects 100% discard rate"
676
682
  self.__dict__.update(kwargs)
677
683
  super().__init__(**self.__dict__, stage_name=type(self).__name__)
678
684
  self.pass_min = 60
@@ -712,7 +718,10 @@ class ACLStage(GenericUplinkStage):
712
718
  self.mqttc.send_payload(payload)
713
719
  time.sleep(5 if self.aggregation_time == 0 else self.aggregation_time)
714
720
  debug_print('Status message received from gw:')
715
- debug_print(self.mqttc.get_status_message())
721
+ gw_status = self.mqttc.get_status_message()
722
+ if gw_status != None and isinstance(gw_status, dict) and ser_format.is_pb():
723
+ gw_status = ser_format.pb_status_acl_bytes_to_hex_string(gw_status)
724
+ debug_print(gw_status)
716
725
 
717
726
  # Configuring each bridge in ACL, once for each mode
718
727
  brg_ids = self.run_data['bridge_id'].unique().tolist()
@@ -759,18 +768,28 @@ class ACLStage(GenericUplinkStage):
759
768
  num_pkts_should_received = self.comparison[SHOULD_RECEIVE].eq(True).sum()
760
769
  num_pkts_should_discard = self.comparison[SHOULD_RECEIVE].eq(False).sum()
761
770
  num_pkts_discarded_correctly = (self.comparison[SHOULD_RECEIVE].eq(False) & self.comparison[RECEIVED].eq(False)).sum()
762
- num_pkts_received_falsly = (self.comparison[SHOULD_RECEIVE].eq(False) & self.comparison[RECEIVED].eq(True)).sum()
771
+ num_pkts_received_correctly = (self.comparison[SHOULD_RECEIVE].eq(True) & self.comparison[RECEIVED].eq(True)).sum()
772
+ num_pkts_failed_to_discard = (self.comparison[SHOULD_RECEIVE].eq(False) & self.comparison[RECEIVED].eq(True)).sum()
773
+ num_pkts_failed_to_receive = (self.comparison[SHOULD_RECEIVE].eq(True) & self.comparison[RECEIVED].eq(False)).sum()
763
774
  self.add_to_stage_report(f"Total packets advertised: {num_pkts_sent}")
764
- self.add_to_stage_report(f"Packets received / should've received: {num_pkts_received} / {num_pkts_should_received}")
775
+ self.add_to_stage_report(f"Packets received / should've received: {num_pkts_received_correctly} / {num_pkts_should_received}")
765
776
  self.add_to_stage_report(f"Packets discarded / should've discarded: {num_pkts_discarded_correctly} / {num_pkts_should_discard}")
766
- self.add_to_stage_report(f"False positives (failed to discard): {num_pkts_received_falsly}")
777
+ self.add_to_stage_report(f"Failed to discard: {num_pkts_failed_to_discard}\n")
767
778
 
768
- if num_pkts_received_falsly > 0:
779
+ if num_pkts_failed_to_discard > 0:
769
780
  self.stage_pass = MINIMUM_SCORE
770
781
  self.error_summary = "Received packet/s that should've been discarded"
771
782
  for index, row in self.comparison.iterrows():
772
783
  if row[RECEIVED] == True and row[SHOULD_RECEIVE] == False:
773
784
  self.add_to_stage_report(f"Payload from bridge {row['aliasBridgeId']} should have been filtered out: {row[PAYLOAD]}")
785
+ self.add_to_stage_report('')
786
+ # Report packets failed to receive only if we have issue discarding.
787
+ # Since it increase the likelyhood of bad logic, and not just missed packets
788
+ if num_pkts_failed_to_receive > 0:
789
+ for index, row in self.comparison.iterrows():
790
+ if row[RECEIVED] == False and row[SHOULD_RECEIVE] == True:
791
+ self.add_to_stage_report(f"Payload from bridge {row['aliasBridgeId']} wasn't received: {row[PAYLOAD]}")
792
+ self.add_to_stage_report('')
774
793
  elif num_pkts_received == 0:
775
794
  self.stage_pass = MINIMUM_SCORE
776
795
  self.error_summary = "No packets received"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wiliot_certificate
3
- Version: 1.5.3a1
3
+ Version: 4.4.0
4
4
  Summary: A library for certifying Wiliot-compliant boards
5
5
  Author-email: Wiliot <support@wiliot.com>
6
6
  License: MIT License
@@ -52,24 +52,33 @@ Requires-Dist: reportlab>=4.3.1
52
52
  Requires-Dist: google-api-python-client>=2.162.0
53
53
  Dynamic: license-file
54
54
 
55
- # wiliot-certificate
55
+ # wiliot-certificate Version 4.4.0
56
56
 
57
57
  <!-- Description -->
58
- wiliot-certificate is a python library with tools used to test & certify boards and their compatibility with Wiliot's echosystem.
58
+ wiliot-certificate is a Python library that provides tools for testing and certifying boards for compatibility with Wiliots ecosystem.
59
59
  This python package includes the following CLI utilities:
60
60
  - Gateway Certificate (`wlt-cert-gw`)
61
61
  - Bridge Certificate (`wlt-cert-brg`)
62
62
 
63
+ # Version:
64
+ wiliot-certificate versions 4.4.0 are compatible with firmware version 4.4.6 (ESP: 4.4.44, BLE: 4.4.93)
65
+
63
66
  ## Installing wiliot-certificate
67
+ Uninstall wiliot-deployment-tools if installed (relevant for old wlt-gw-certificate users):
68
+ ````commandline
69
+ pip uninstall wiliot-deployment-tools
70
+ ````
71
+
72
+ Install wiliot-certificate:
64
73
  ````commandline
65
74
  pip install wiliot-certificate
66
75
  ````
67
76
 
68
77
  ## Using wiliot-certificate
69
78
  ### Gateway Certificate
70
- Test Wiliot GWs capabilities.
71
- The GW Certificate includes different test that run sequentially to test each capability reported by the GW.
72
- To run the GW Certificate the GW needs to use a public MQTT Broker (Eclipse):
79
+ Test Wiliot Gateway capabilities.
80
+ The Gateway Certificate includes different test that run sequentially to test each capability reported by the Gateway.
81
+ To run the Gateway Certificate the Gateway needs to use a public MQTT Broker (Eclipse):
73
82
 
74
83
  Host: mqtt.eclipseprojects.io
75
84
  TLS TCP Port: 8883
@@ -79,59 +88,91 @@ Websocket Port: 80
79
88
 
80
89
  More information can be found at https://mqtt.eclipseprojects.io/.
81
90
 
82
- #### GW Certificate Release Notes:
91
+ #### Gateway Certificate Release Notes:
83
92
  Release:
84
93
  - Standalone wiliot-certificate package
85
94
  - Python 3.13 support
86
- - Gw API version 205 support
95
+ - Gateway API version 205 support
87
96
  - Registration test added
88
97
  - Bridge OTA stage added under actions
89
98
  - Aggregation flag supported by StressTest
90
99
  - -update flag compatibility fix. Upgrades bootloader if needed
91
100
  - -actions flag to select specific actions to test
101
+ - ACL (Access control list) test for gateways reporting API version 205 in the connection test
102
+
103
+ #### The following capabilities are not tested in this version
104
+ - Access control list stress stress
105
+ - Validation schema verification
106
+ - Board type registered within the Board Type Management system
107
+ - Bridge OTA progress reporting
108
+
92
109
 
93
110
  ```
94
- usage: wlt-gw-certificate [-h] -owner OWNER -gw GW [-suffix SUFFIX] [-tests {connection,uplink,downlink,stress}]
111
+ Usage: wlt-cert-gw [-h] -owner OWNER -gw GW [-suffix SUFFIX] [-tests {connection,uplink,downlink,stress}]
95
112
 
96
113
  Gateway Certificate - CLI Tool to test Wiliot GWs
97
114
 
98
- required arguments:
115
+ Required arguments:
99
116
  -gw GW Gateway ID
100
117
 
101
- optional arguments:
118
+ Optional arguments:
102
119
  -owner OWNER Owner ID (Required for non-registration tests)
103
120
  -tests Pick specific tests to run
104
121
  -actions Pick specific actions to test during the ActionsTest
105
122
  -update Update the firmware of the test board
106
123
  -pps Pick specific PPS rate for the stress test
107
- -agg Time the uplink stages should wait before processing packets
108
- -suffix Allow for different suffixes after the GW ID in MQTT topics
109
- -env Wiliot envrionment for Registration and bridgeOTA tests
124
+ -agg Duration uplink stages wait before processing packets
125
+ -suffix Allow for different suffixes after the Gateway ID in MQTT topics
126
+ -env Wiliot environment for registration and bridgeOTA tests
110
127
  -h, --help show this help message and exit
111
128
  ```
112
129
 
113
130
  ### Bridge Certificate
114
- Test Wiliot BRGs capabilities.
115
- The BRG Certificate includes different tests that run sequentially to test each capability reported by the BRG.
116
- The BRG Certificate tool uses a public MQTT Broker (Eclipse):
117
-
118
- Host: mqtt.eclipseprojects.io
119
- TLS TCP Port: 8883
120
- TLS Websocket Port: 443
121
- TCP Port: 1883
122
- Websocket Port: 80
123
-
124
- More information can be found at https://mqtt.eclipseprojects.io/.
131
+ Test Wiliot Bridge capabilities.
132
+ The Bridge Certificate includes different tests that run sequentially to test each capability reported by the bridge.
133
+
134
+
135
+ # update Gateway sim version :
136
+ - Update your gateway and bridge using Wiliot's platform. (https://platform.wiliot.com/)
137
+ - Transfer the gateway to dev mode - run the following command: py ut\dev_mode.py --gw [GW] --enable
138
+ - Connect the gateway to your laptop via USB connection:
139
+ - Run the following: wlt-cert-brg --gw SIM --brg <XXXXXXXXXXXX> --port <COM_PORT>
140
+ - For other options of running, see the 'run example' section.
141
+
142
+ #### Bridge Certificate Release Notes:
143
+ Release
144
+ - First release of Bridge Certificate – includes validation tests for bridge functionality.
145
+ - Additional details are available in the JSON files.
146
+
147
+ # The following capabilities are not tested in this version
148
+
149
+ Power management
150
+ - Functionality of energize and transmit in sleep mode
151
+ Edge management
152
+ - Timing of heartbeat and interface packets
153
+ Module Energy 2400
154
+ - Functionality of energy pattern, output power and duty cycle
155
+ Module Energy SUB1G
156
+ - Functionality of energy pattern and duty cycle
157
+ Module Datapath
158
+ - RSSI edge cases: -127 and 0
159
+ - Functionality of transmission pattern, output power
160
+ - Pacer interval with channel 10 and 500k modulation
161
+ - Pacer interval using GEN3 Pixels
162
+ - Packet filter: the following configuration - DEBUG, TEMP & DEBUG, TEMPS & DEBUG & ADVANCE
163
+ - Rx rate feature with extended advertising
164
+ - Functionality of adaptive pacer algorithm
165
+ - Supported Pixels for extended advertising and GEN3
166
+ Calibration
167
+ - Functionality of output power and interval calibration
168
+ - Functionality of calibration transmission patterns for the configuration STANDARD & EU & DISABLE
125
169
 
126
- #### BRG Certificate Release Notes:
127
- 1.3.0:
128
- - FIRST VERSION
129
170
 
130
171
  ```
131
- usage: brg_certificate_cli.py [-h] [--brg BRG] [--brg_cloud_connectivity BRG_CLOUD_CONNECTIVITY] [--brg1 BRG1] --gw GW [--data {tags,sim}] [--port PORT] [--clean] [--tl TL] [--run RUN]
172
+ usage: wlt-cert-brg [-h] [--brg BRG] [--brg_cloud_connectivity BRG_CLOUD_CONNECTIVITY] [--brg1 BRG1] --gw GW [--data {tags,sim}] [--port PORT] [--clean] [--tl TL] [--run RUN]
132
173
  [--drun DRUN] [--exit_on_test_failure] [--exit_on_param_failure] [--analyze_interference]
133
174
 
134
- Bridge Certificate CLI
175
+ # Bridge Certificate CLI
135
176
 
136
177
  options:
137
178
  -h, --help show this help message and exit