wiliot-certificate 4.4.3__py3-none-any.whl → 4.5.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.
- {brg_certificate → certificate}/ag/wlt_cmd_if.html +10 -4
- {brg_certificate → certificate}/ag/wlt_types_ag.py +1878 -519
- certificate/cert_common.py +1488 -0
- certificate/cert_config.py +480 -0
- {brg_certificate → certificate}/cert_data_sim.py +134 -46
- {brg_certificate → certificate}/cert_defines.py +129 -128
- {brg_certificate → certificate}/cert_gw_sim.py +183 -53
- {brg_certificate → certificate}/cert_mqtt.py +179 -64
- {brg_certificate → certificate}/cert_prints.py +35 -33
- {brg_certificate → certificate}/cert_protobuf.py +15 -6
- {brg_certificate → certificate}/cert_results.py +240 -64
- certificate/cert_utils.py +634 -0
- certificate/certificate.py +205 -0
- certificate/certificate_cli.py +76 -0
- certificate/certificate_eth_test_list.txt +76 -0
- certificate/certificate_sanity_test_list.txt +66 -0
- certificate/certificate_test_list.txt +76 -0
- {brg_certificate → certificate}/tests/calibration/interval_test/interval_test.json +3 -2
- {brg_certificate → certificate}/tests/calibration/interval_test/interval_test.py +7 -6
- certificate/tests/calibration/output_power_test/output_power_test.json +23 -0
- certificate/tests/calibration/output_power_test/output_power_test.py +39 -0
- {brg_certificate → certificate}/tests/calibration/pattern_test/pattern_test.json +2 -1
- {brg_certificate → certificate}/tests/calibration/pattern_test/pattern_test.py +20 -15
- certificate/tests/cloud_connectivity/acl_ext_adv_test/acl_ext_adv_test.json +15 -0
- certificate/tests/cloud_connectivity/acl_ext_adv_test/acl_ext_adv_test.py +140 -0
- certificate/tests/cloud_connectivity/acl_test/acl_test.json +15 -0
- certificate/tests/cloud_connectivity/acl_test/acl_test.py +96 -0
- certificate/tests/cloud_connectivity/brg_ota_test/brg_ota_test.json +19 -0
- certificate/tests/cloud_connectivity/brg_ota_test/brg_ota_test.py +41 -0
- certificate/tests/cloud_connectivity/channel_scan_behaviour_test/channel_scan_behaviour_test.json +19 -0
- certificate/tests/cloud_connectivity/channel_scan_behaviour_test/channel_scan_behaviour_test.py +215 -0
- certificate/tests/cloud_connectivity/connection_test/connection_test.json +18 -0
- certificate/tests/cloud_connectivity/connection_test/connection_test.py +67 -0
- certificate/tests/cloud_connectivity/deduplication_test/deduplication_test.json +15 -0
- certificate/tests/cloud_connectivity/deduplication_test/deduplication_test.py +80 -0
- certificate/tests/cloud_connectivity/downlink_test/downlink_test.json +21 -0
- certificate/tests/cloud_connectivity/downlink_test/downlink_test.py +201 -0
- certificate/tests/cloud_connectivity/ext_adv_stress_test/ext_adv_stress_test.json +17 -0
- certificate/tests/cloud_connectivity/ext_adv_stress_test/ext_adv_stress_test.py +104 -0
- certificate/tests/cloud_connectivity/reboot_test/reboot_test.json +18 -0
- certificate/tests/cloud_connectivity/reboot_test/reboot_test.py +59 -0
- certificate/tests/cloud_connectivity/registration_test/registration_test.json +20 -0
- certificate/tests/cloud_connectivity/registration_test/registration_test.py +384 -0
- certificate/tests/cloud_connectivity/registration_test/registration_test_cli.py +90 -0
- certificate/tests/cloud_connectivity/stress_test/stress_test.json +17 -0
- certificate/tests/cloud_connectivity/stress_test/stress_test.py +101 -0
- certificate/tests/cloud_connectivity/uplink_ext_adv_test/uplink_ext_adv_test.json +25 -0
- certificate/tests/cloud_connectivity/uplink_ext_adv_test/uplink_ext_adv_test.py +92 -0
- certificate/tests/cloud_connectivity/uplink_test/uplink_test.json +20 -0
- certificate/tests/cloud_connectivity/uplink_test/uplink_test.py +169 -0
- {brg_certificate → certificate}/tests/datapath/aging_test/aging_test.json +2 -1
- certificate/tests/datapath/aging_test/aging_test.py +142 -0
- certificate/tests/datapath/event_ble5_test/event_ble5_test.json +17 -0
- certificate/tests/datapath/event_ble5_test/event_ble5_test.py +89 -0
- certificate/tests/datapath/event_test/event_test.json +17 -0
- certificate/tests/datapath/event_test/event_test.py +80 -0
- {brg_certificate → certificate}/tests/datapath/num_of_tags_test/num_of_tags_test.json +4 -3
- {brg_certificate → certificate}/tests/datapath/num_of_tags_test/num_of_tags_test.py +19 -13
- certificate/tests/datapath/output_power_test/output_power_test.json +23 -0
- {brg_certificate → certificate}/tests/datapath/output_power_test/output_power_test.py +17 -6
- {brg_certificate → certificate}/tests/datapath/pacer_interval_ble5_test/pacer_interval_ble5_test.json +2 -1
- {brg_certificate → certificate}/tests/datapath/pacer_interval_ble5_test/pacer_interval_ble5_test.py +13 -11
- {brg_certificate → certificate}/tests/datapath/pacer_interval_test/pacer_interval_test.json +2 -1
- {brg_certificate → certificate}/tests/datapath/pacer_interval_test/pacer_interval_test.py +9 -7
- {brg_certificate → certificate}/tests/datapath/pattern_test/pattern_test.json +3 -2
- {brg_certificate → certificate}/tests/datapath/pattern_test/pattern_test.py +18 -6
- certificate/tests/datapath/pkt_filter_ble5_chl21_test/pkt_filter_ble5_chl21_test.json +20 -0
- certificate/tests/datapath/pkt_filter_ble5_chl21_test/pkt_filter_ble5_chl21_test.py +61 -0
- {brg_certificate → certificate}/tests/datapath/pkt_filter_ble5_test/pkt_filter_ble5_test.json +2 -1
- {brg_certificate → certificate}/tests/datapath/pkt_filter_ble5_test/pkt_filter_ble5_test.py +15 -14
- certificate/tests/datapath/pkt_filter_brg2gw_ext_adv_test/pkt_filter_brg2gw_ext_adv_test.json +19 -0
- certificate/tests/datapath/pkt_filter_brg2gw_ext_adv_test/pkt_filter_brg2gw_ext_adv_test.py +85 -0
- {brg_certificate → certificate}/tests/datapath/pkt_filter_gen3_test/pkt_filter_gen3_test.json +2 -1
- {brg_certificate → certificate}/tests/datapath/pkt_filter_gen3_test/pkt_filter_gen3_test.py +10 -9
- {brg_certificate → certificate}/tests/datapath/pkt_filter_test/pkt_filter_test.json +2 -1
- {brg_certificate → certificate}/tests/datapath/pkt_filter_test/pkt_filter_test.py +10 -9
- {brg_certificate → certificate}/tests/datapath/rssi_threshold_test/rssi_threshold_test.json +3 -2
- {brg_certificate → certificate}/tests/datapath/rssi_threshold_test/rssi_threshold_test.py +9 -8
- brg_certificate/tests/datapath/output_power_test/output_power_test.json → certificate/tests/datapath/rx_channel_hopping_test/rx_channel_hopping_test.json +6 -4
- certificate/tests/datapath/rx_channel_hopping_test/rx_channel_hopping_test.py +77 -0
- {brg_certificate → certificate}/tests/datapath/rx_channel_test/rx_channel_test.json +3 -2
- {brg_certificate → certificate}/tests/datapath/rx_channel_test/rx_channel_test.py +7 -6
- {brg_certificate → certificate}/tests/datapath/rx_rate_gen2_test/rx_rate_gen2_test.json +8 -7
- {brg_certificate → certificate}/tests/datapath/rx_rate_gen2_test/rx_rate_gen2_test.py +113 -73
- {brg_certificate → certificate}/tests/datapath/rx_rate_gen3_test/rx_rate_gen3_test.json +8 -7
- {brg_certificate → certificate}/tests/datapath/rx_rate_gen3_test/rx_rate_gen3_test.py +112 -72
- {brg_certificate → certificate}/tests/datapath/stress_gen3_test/stress_gen3_test.json +4 -3
- {brg_certificate → certificate}/tests/datapath/stress_gen3_test/stress_gen3_test.py +15 -11
- {brg_certificate → certificate}/tests/datapath/stress_test/stress_test.json +4 -3
- {brg_certificate → certificate}/tests/datapath/stress_test/stress_test.py +15 -11
- {brg_certificate → certificate}/tests/datapath/tx_repetition_test/tx_repetition_test.json +3 -1
- {brg_certificate → certificate}/tests/datapath/tx_repetition_test/tx_repetition_test.py +14 -13
- certificate/tests/edge_mgmt/action_blink_test/action_blink_test.json +15 -0
- certificate/tests/edge_mgmt/action_blink_test/action_blink_test.py +24 -0
- certificate/tests/edge_mgmt/action_get_battery_sensor_test/action_get_battery_sensor_test.json +15 -0
- certificate/tests/edge_mgmt/action_get_battery_sensor_test/action_get_battery_sensor_test.py +43 -0
- certificate/tests/edge_mgmt/action_get_module_test/action_get_module_test.json +15 -0
- certificate/tests/edge_mgmt/action_get_module_test/action_get_module_test.py +42 -0
- certificate/tests/edge_mgmt/action_get_pof_data_test/action_get_pof_data_test.json +15 -0
- certificate/tests/edge_mgmt/action_get_pof_data_test/action_get_pof_data_test.py +44 -0
- certificate/tests/edge_mgmt/action_gw_hb_test/action_gw_hb_test.json +16 -0
- certificate/tests/edge_mgmt/action_gw_hb_test/action_gw_hb_test.py +42 -0
- certificate/tests/edge_mgmt/action_reboot_test/action_reboot_test.json +15 -0
- certificate/tests/edge_mgmt/action_reboot_test/action_reboot_test.py +49 -0
- certificate/tests/edge_mgmt/action_restore_defaults_test/action_restore_defaults_test.json +15 -0
- certificate/tests/edge_mgmt/action_restore_defaults_test/action_restore_defaults_test.py +102 -0
- certificate/tests/edge_mgmt/action_send_hb_test/action_send_hb_test.json +15 -0
- certificate/tests/edge_mgmt/action_send_hb_test/action_send_hb_test.py +45 -0
- {brg_certificate → certificate}/tests/edge_mgmt/periodic_msgs_test/periodic_msgs_test.json +3 -2
- {brg_certificate → certificate}/tests/edge_mgmt/periodic_msgs_test/periodic_msgs_test.py +22 -11
- {brg_certificate → certificate}/tests/energy2400/duty_cycle_test/duty_cycle_test.json +2 -1
- {brg_certificate → certificate}/tests/energy2400/duty_cycle_test/duty_cycle_test.py +7 -6
- certificate/tests/energy2400/output_power_test/output_power_test.json +23 -0
- {brg_certificate → certificate}/tests/energy2400/output_power_test/output_power_test.py +17 -6
- {brg_certificate → certificate}/tests/energy2400/pattern_test/pattern_test.json +2 -1
- {brg_certificate → certificate}/tests/energy2400/pattern_test/pattern_test.py +7 -6
- certificate/tests/energy2400/signal_indicator_ble5_test/signal_indicator_ble5_test.json +26 -0
- certificate/tests/energy2400/signal_indicator_ble5_test/signal_indicator_ble5_test.py +379 -0
- certificate/tests/energy2400/signal_indicator_ext_adv_test/signal_indicator_ext_adv_test.json +20 -0
- certificate/tests/energy2400/signal_indicator_ext_adv_test/signal_indicator_ext_adv_test.py +173 -0
- certificate/tests/energy2400/signal_indicator_test/signal_indicator_test.json +24 -0
- certificate/tests/energy2400/signal_indicator_test/signal_indicator_test.py +350 -0
- {brg_certificate → certificate}/tests/energy_sub1g/duty_cycle_test/duty_cycle_test.json +2 -1
- {brg_certificate → certificate}/tests/energy_sub1g/duty_cycle_test/duty_cycle_test.py +7 -6
- {brg_certificate → certificate}/tests/energy_sub1g/pattern_test/pattern_test.json +2 -1
- {brg_certificate → certificate}/tests/energy_sub1g/pattern_test/pattern_test.py +7 -6
- {brg_certificate → certificate}/tests/pwr_mgmt/pwr_mgmt_test/pwr_mgmt_test.json +2 -1
- {brg_certificate → certificate}/tests/pwr_mgmt/pwr_mgmt_test/pwr_mgmt_test.py +10 -10
- {brg_certificate → certificate}/tests/sensors/ext_sensor_test/ext_sensor_test.json +5 -4
- certificate/tests/sensors/ext_sensor_test/ext_sensor_test.py +450 -0
- certificate/wlt_types.py +122 -0
- {gw_certificate → common}/api_if/202/status.json +6 -0
- {gw_certificate → common}/api_if/203/status.json +6 -0
- {gw_certificate → common}/api_if/204/status.json +6 -0
- common/api_if/206/data.json +85 -0
- common/api_if/206/status.json +69 -0
- common/api_if/api_validation.py +91 -0
- common/web/templates/generator.html +210 -0
- common/web/templates/index.html +20 -0
- common/web/templates/menu.html +54 -0
- common/web/templates/parser.html +53 -0
- {brg_certificate/ag → common/web/templates}/wlt_types.html +1216 -191
- common/web/web_utils.py +399 -0
- {brg_certificate → common}/wltPb_pb2.py +14 -12
- {gw_certificate/common → common}/wltPb_pb2.pyi +16 -2
- gui_certificate/gui_certificate_cli.py +14 -0
- gui_certificate/server.py +1267 -0
- gui_certificate/templates/cert_run.html +1273 -0
- wiliot_certificate-4.5.0.dist-info/METADATA +99 -0
- wiliot_certificate-4.5.0.dist-info/RECORD +168 -0
- {wiliot_certificate-4.4.3.dist-info → wiliot_certificate-4.5.0.dist-info}/WHEEL +1 -1
- wiliot_certificate-4.5.0.dist-info/entry_points.txt +5 -0
- wiliot_certificate-4.5.0.dist-info/top_level.txt +3 -0
- brg_certificate/ag/energous_v0_defines.py +0 -925
- brg_certificate/ag/energous_v1_defines.py +0 -931
- brg_certificate/ag/energous_v2_defines.py +0 -925
- brg_certificate/ag/energous_v3_defines.py +0 -925
- brg_certificate/ag/energous_v4_defines.py +0 -925
- brg_certificate/ag/fanstel_lan_v0_defines.py +0 -925
- brg_certificate/ag/fanstel_lte_v0_defines.py +0 -925
- brg_certificate/ag/fanstel_wifi_v0_defines.py +0 -925
- brg_certificate/ag/minew_lte_v0_defines.py +0 -925
- brg_certificate/ag/wlt_types_ag_jsons/brg2brg_ota.json +0 -142
- brg_certificate/ag/wlt_types_ag_jsons/brg2gw_hb.json +0 -785
- brg_certificate/ag/wlt_types_ag_jsons/brg2gw_hb_sleep.json +0 -139
- brg_certificate/ag/wlt_types_ag_jsons/calibration.json +0 -394
- brg_certificate/ag/wlt_types_ag_jsons/custom.json +0 -515
- brg_certificate/ag/wlt_types_ag_jsons/datapath.json +0 -672
- brg_certificate/ag/wlt_types_ag_jsons/energy2400.json +0 -550
- brg_certificate/ag/wlt_types_ag_jsons/energySub1g.json +0 -595
- brg_certificate/ag/wlt_types_ag_jsons/externalSensor.json +0 -598
- brg_certificate/ag/wlt_types_ag_jsons/interface.json +0 -938
- brg_certificate/ag/wlt_types_ag_jsons/powerManagement.json +0 -1234
- brg_certificate/ag/wlt_types_ag_jsons/side_info_sensor.json +0 -105
- brg_certificate/ag/wlt_types_ag_jsons/signal_indicator_data.json +0 -77
- brg_certificate/ag/wlt_types_ag_jsons/unified_echo_ext_pkt.json +0 -61
- brg_certificate/ag/wlt_types_ag_jsons/unified_echo_pkt.json +0 -110
- brg_certificate/brg_certificate.py +0 -225
- brg_certificate/brg_certificate_cli.py +0 -63
- brg_certificate/cert_common.py +0 -923
- brg_certificate/cert_config.py +0 -402
- brg_certificate/cert_utils.py +0 -362
- brg_certificate/certificate_bcc_sanity_test_list.txt +0 -40
- brg_certificate/certificate_bcc_test_list.txt +0 -48
- brg_certificate/certificate_sanity_test_list.txt +0 -43
- brg_certificate/certificate_test_list.txt +0 -53
- brg_certificate/config/eclipse.json +0 -10
- brg_certificate/config/hivemq.json +0 -10
- brg_certificate/config/mosquitto.json +0 -10
- brg_certificate/config/mosquitto.md +0 -95
- brg_certificate/config/wiliot-dev.json +0 -10
- brg_certificate/restore_brg.py +0 -61
- brg_certificate/tests/calibration/output_power_test/output_power_test.json +0 -16
- brg_certificate/tests/calibration/output_power_test/output_power_test.py +0 -28
- brg_certificate/tests/datapath/aging_test/aging_test.py +0 -143
- brg_certificate/tests/datapath/pacer_interval_tags_count_test/pacer_interval_tags_count_test.json +0 -16
- brg_certificate/tests/datapath/pacer_interval_tags_count_test/pacer_interval_tags_count_test.py +0 -73
- brg_certificate/tests/datapath/tx_repetition_algo_test/tx_repetition_algo_test.json +0 -17
- brg_certificate/tests/datapath/tx_repetition_algo_test/tx_repetition_algo_test.py +0 -118
- brg_certificate/tests/edge_mgmt/actions_test/actions_test.json +0 -14
- brg_certificate/tests/edge_mgmt/actions_test/actions_test.py +0 -396
- brg_certificate/tests/edge_mgmt/brg2brg_ota_ble5_test/brg2brg_ota_ble5_test.json +0 -20
- brg_certificate/tests/edge_mgmt/brg2brg_ota_ble5_test/brg2brg_ota_ble5_test.py +0 -94
- brg_certificate/tests/edge_mgmt/brg2brg_ota_test/brg2brg_ota_test.json +0 -19
- brg_certificate/tests/edge_mgmt/brg2brg_ota_test/brg2brg_ota_test.py +0 -87
- brg_certificate/tests/edge_mgmt/leds_test/leds_test.json +0 -17
- brg_certificate/tests/edge_mgmt/leds_test/leds_test.py +0 -223
- brg_certificate/tests/edge_mgmt/ota_test/ota_test.json +0 -17
- brg_certificate/tests/edge_mgmt/ota_test/ota_test.py +0 -128
- brg_certificate/tests/energy2400/output_power_test/output_power_test.json +0 -16
- brg_certificate/tests/energy2400/signal_indicator_ble5_10_250k_test/signal_indicator_ble5_10_250k_test.json +0 -20
- brg_certificate/tests/energy2400/signal_indicator_ble5_10_250k_test/signal_indicator_ble5_10_250k_test.py +0 -321
- brg_certificate/tests/energy2400/signal_indicator_ble5_10_500k_test/signal_indicator_ble5_10_500k_test.json +0 -20
- brg_certificate/tests/energy2400/signal_indicator_ble5_10_500k_test/signal_indicator_ble5_10_500k_test.py +0 -321
- brg_certificate/tests/energy2400/signal_indicator_sub1g_2_4_test/signal_indicator_sub1g_2_4_test.json +0 -20
- brg_certificate/tests/energy2400/signal_indicator_sub1g_2_4_test/signal_indicator_sub1g_2_4_test.py +0 -141
- brg_certificate/tests/energy2400/signal_indicator_test/signal_indicator_test.json +0 -20
- brg_certificate/tests/energy2400/signal_indicator_test/signal_indicator_test.py +0 -276
- brg_certificate/tests/energy_sub1g/signal_indicator_functionality_test/signal_indicator_functionality_test.json +0 -20
- brg_certificate/tests/energy_sub1g/signal_indicator_functionality_test/signal_indicator_functionality_test.py +0 -390
- brg_certificate/tests/energy_sub1g/signal_indicator_test/signal_indicator_test.json +0 -16
- brg_certificate/tests/energy_sub1g/signal_indicator_test/signal_indicator_test.py +0 -28
- brg_certificate/tests/sensors/ext_sensor_test/ext_sensor_test.py +0 -305
- brg_certificate/wltPb_pb2.pyi +0 -234
- brg_certificate/wlt_types.py +0 -113
- gw_certificate/ag/ut_defines.py +0 -364
- gw_certificate/ag/wlt_types.py +0 -85
- gw_certificate/ag/wlt_types_ag.py +0 -5310
- gw_certificate/ag/wlt_types_data.py +0 -64
- gw_certificate/api/extended_api.py +0 -23
- gw_certificate/api_if/200/data.json +0 -106
- gw_certificate/api_if/200/status.json +0 -47
- gw_certificate/api_if/201/data.json +0 -98
- gw_certificate/api_if/201/status.json +0 -53
- gw_certificate/api_if/205/logs.json +0 -12
- gw_certificate/api_if/api_validation.py +0 -38
- gw_certificate/api_if/gw_capabilities.py +0 -54
- gw_certificate/cert_results.py +0 -145
- gw_certificate/common/analysis_data_bricks.py +0 -60
- gw_certificate/common/debug.py +0 -42
- gw_certificate/common/serialization_formatter.py +0 -93
- gw_certificate/common/utils.py +0 -8
- gw_certificate/common/utils_defines.py +0 -15
- gw_certificate/common/wltPb_pb2.py +0 -84
- gw_certificate/gw_certificate.py +0 -154
- gw_certificate/gw_certificate_cli.py +0 -87
- gw_certificate/interface/4.4.93_app.zip +0 -0
- gw_certificate/interface/4.4.93_sd_bl_app.zip +0 -0
- gw_certificate/interface/ble_simulator.py +0 -61
- gw_certificate/interface/ble_sniffer.py +0 -189
- gw_certificate/interface/flash_fw.py +0 -90
- gw_certificate/interface/if_defines.py +0 -36
- gw_certificate/interface/mqtt.py +0 -563
- gw_certificate/interface/nrfutil-linux +0 -0
- gw_certificate/interface/nrfutil-mac +0 -0
- gw_certificate/interface/nrfutil.exe +0 -0
- gw_certificate/interface/pkt_generator.py +0 -594
- gw_certificate/interface/uart_if.py +0 -236
- gw_certificate/interface/uart_ports.py +0 -20
- gw_certificate/templates/results.html +0 -241
- gw_certificate/templates/stage.html +0 -22
- gw_certificate/templates/table.html +0 -6
- gw_certificate/templates/test.html +0 -38
- gw_certificate/tests/__init__.py +0 -10
- gw_certificate/tests/actions.py +0 -289
- gw_certificate/tests/bad_crc_to_PER_quantization.csv +0 -51
- gw_certificate/tests/connection.py +0 -188
- gw_certificate/tests/downlink.py +0 -172
- gw_certificate/tests/generic.py +0 -238
- gw_certificate/tests/registration.py +0 -340
- gw_certificate/tests/static/__init__.py +0 -0
- gw_certificate/tests/static/connection_defines.py +0 -9
- gw_certificate/tests/static/downlink_defines.py +0 -9
- gw_certificate/tests/static/generated_packet_table.py +0 -195
- gw_certificate/tests/static/packet_table.csv +0 -10067
- gw_certificate/tests/static/references.py +0 -5
- gw_certificate/tests/static/uplink_defines.py +0 -14
- gw_certificate/tests/throughput.py +0 -240
- gw_certificate/tests/uplink.py +0 -853
- wiliot_certificate-4.4.3.dist-info/METADATA +0 -211
- wiliot_certificate-4.4.3.dist-info/RECORD +0 -210
- wiliot_certificate-4.4.3.dist-info/entry_points.txt +0 -3
- wiliot_certificate-4.4.3.dist-info/top_level.txt +0 -3
- {brg_certificate → certificate}/__init__.py +0 -0
- {gw_certificate → common}/api_if/202/data.json +0 -0
- {gw_certificate/api_if/200 → common/api_if/202}/logs.json +0 -0
- {gw_certificate → common}/api_if/203/data.json +0 -0
- {gw_certificate/api_if/201 → common/api_if/203}/logs.json +0 -0
- {gw_certificate → common}/api_if/204/data.json +0 -0
- {gw_certificate/api_if/202 → common/api_if/204}/logs.json +0 -0
- {gw_certificate → common}/api_if/205/data.json +0 -0
- {gw_certificate/api_if/203 → common/api_if/205}/logs.json +0 -0
- {gw_certificate → common}/api_if/205/status.json +0 -0
- {gw_certificate/api_if/204 → common/api_if/206}/logs.json +0 -0
- {gw_certificate → common/api_if}/__init__.py +0 -0
- {gw_certificate/api_if → gui_certificate}/__init__.py +0 -0
- {wiliot_certificate-4.4.3.dist-info → wiliot_certificate-4.5.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,594 +0,0 @@
|
|
|
1
|
-
import binascii
|
|
2
|
-
import datetime
|
|
3
|
-
from typing import Literal, List
|
|
4
|
-
import random
|
|
5
|
-
import os
|
|
6
|
-
|
|
7
|
-
from gw_certificate.ag.ut_defines import (
|
|
8
|
-
BRIDGE_ID,
|
|
9
|
-
NFPKT,
|
|
10
|
-
PAYLOAD,
|
|
11
|
-
RSSI,
|
|
12
|
-
TIMESTAMP,
|
|
13
|
-
)
|
|
14
|
-
from gw_certificate.interface.if_defines import ADVA_LENGTH, GAP_LENGTH, GROUP_ID_LENGTH, SERVICE_UUID_LENGTH
|
|
15
|
-
from gw_certificate.ag.wlt_types import *
|
|
16
|
-
from gw_certificate.ag.wlt_types_ag import (
|
|
17
|
-
GROUP_ID_SIDE_INFO,
|
|
18
|
-
GROUP_ID_BRG2GW,
|
|
19
|
-
Hdr,
|
|
20
|
-
SideInfo,
|
|
21
|
-
)
|
|
22
|
-
from gw_certificate.ag.wlt_types_data import DataPacket
|
|
23
|
-
|
|
24
|
-
BRG_LATENCY = "brg_latency"
|
|
25
|
-
|
|
26
|
-
# Shared Functions
|
|
27
|
-
def generate_random_adva(device:Literal['Tag', 'Bridge']):
|
|
28
|
-
"""generate random 6-byte AdvA
|
|
29
|
-
|
|
30
|
-
:return: AdvA (12 hex chars)
|
|
31
|
-
:rtype: str
|
|
32
|
-
"""
|
|
33
|
-
adva = os.urandom(6).hex().upper()
|
|
34
|
-
if device == 'Tag':
|
|
35
|
-
adva = apply_adva_bitmask(adva, 'non_resolvable')
|
|
36
|
-
if device == 'Bridge':
|
|
37
|
-
adva = apply_adva_bitmask(adva, 'random_static')
|
|
38
|
-
return adva
|
|
39
|
-
|
|
40
|
-
def apply_adva_bitmask(adva, address_type:Literal['random_static', 'non_resolvable']):
|
|
41
|
-
"""apply AdvA Bitmask
|
|
42
|
-
BRGs AdvA comply with BTLE Random Static Address
|
|
43
|
-
Pixel AdvA comply with BTLE Random Private Non-Resolvable Address
|
|
44
|
-
|
|
45
|
-
:param adva: AdvA
|
|
46
|
-
:type adva: str
|
|
47
|
-
:return: AdvA (12 hex chars)
|
|
48
|
-
:rtype: str
|
|
49
|
-
"""
|
|
50
|
-
masked_adva = bytearray(binascii.unhexlify(adva))
|
|
51
|
-
if address_type == 'random_static':
|
|
52
|
-
masked_adva[5] = masked_adva[5] | 0b11000000
|
|
53
|
-
if address_type == 'non_resolvable':
|
|
54
|
-
masked_adva[5] = masked_adva[5] & 0b00111111
|
|
55
|
-
masked_adva = masked_adva.hex().upper()
|
|
56
|
-
return masked_adva
|
|
57
|
-
|
|
58
|
-
def init_adva(adva=None, device:Literal['Tag', 'Bridge']='Tag'):
|
|
59
|
-
"""Init function helper
|
|
60
|
-
|
|
61
|
-
:param adva: AdvA, defaults to None
|
|
62
|
-
:type adva: str, optional
|
|
63
|
-
:return: AdvA (12 hex chars)
|
|
64
|
-
:rtype: str
|
|
65
|
-
"""
|
|
66
|
-
if adva is None:
|
|
67
|
-
adva = generate_random_adva(device)
|
|
68
|
-
|
|
69
|
-
adva_type = ''
|
|
70
|
-
if device == 'Bridge':
|
|
71
|
-
adva_type = 'random_static'
|
|
72
|
-
elif device == 'Tag':
|
|
73
|
-
adva_type = 'non_resolvable'
|
|
74
|
-
|
|
75
|
-
adva = apply_adva_bitmask(adva, adva_type)
|
|
76
|
-
|
|
77
|
-
return adva
|
|
78
|
-
|
|
79
|
-
def increment_circular(x, num_to_inc, bits):
|
|
80
|
-
"""Increment object of {bits} size circularly
|
|
81
|
-
:param x: number to increment
|
|
82
|
-
:type x: int
|
|
83
|
-
:param num_to_inc: number to increment
|
|
84
|
-
:type num_to_inc: int
|
|
85
|
-
:param bits: bit size
|
|
86
|
-
:type bits: int
|
|
87
|
-
"""
|
|
88
|
-
return (x + num_to_inc) % (2 ^ bits)
|
|
89
|
-
|
|
90
|
-
def decrease_circular(x, num_to_dec, bits):
|
|
91
|
-
"""Decrease object of {bits} size circularly
|
|
92
|
-
:param x: number to decrease
|
|
93
|
-
:type x: int
|
|
94
|
-
:param num_to_dec: number to decrease
|
|
95
|
-
:type num_to_dec: int
|
|
96
|
-
:param bits: bit size
|
|
97
|
-
:type bits: int
|
|
98
|
-
"""
|
|
99
|
-
return (x-num_to_dec) % (2 ^ bits)
|
|
100
|
-
|
|
101
|
-
def generate_random_bridge_id():
|
|
102
|
-
"""Generate random 6 byte bridge ID
|
|
103
|
-
|
|
104
|
-
:return: bridge ID - (12 hex chars, int)
|
|
105
|
-
:rtype: tuple (str, int)
|
|
106
|
-
"""
|
|
107
|
-
bridge_id = os.urandom(6).hex().upper()
|
|
108
|
-
bridge_id_int = int.from_bytes(binascii.unhexlify(bridge_id), "big")
|
|
109
|
-
return bridge_id, bridge_id_int
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
class TagPktGenerator:
|
|
113
|
-
"""Tag Packet Generator - represents 1 Wiliot Pixel"""
|
|
114
|
-
def __init__(self, adva=None, group_id=None, service_uuid:Literal["tag", "bridge"]='bridge') -> None:
|
|
115
|
-
"""
|
|
116
|
-
:param adva: AdvA, defaults to None
|
|
117
|
-
:type adva: str, optional
|
|
118
|
-
:param group_id: Tag's group id, defaults to 0x020000 if none given
|
|
119
|
-
:type group_id: int, optional
|
|
120
|
-
:param service_uuid: set the generator's service uuid ("tag"=0xAFFD, "bridge"=0xC6FC)
|
|
121
|
-
:type service_uuid: string
|
|
122
|
-
"""
|
|
123
|
-
self.adva = init_adva(adva, device='Tag')
|
|
124
|
-
self.data_packet = DataPacket(group_id=group_id, service_uuid=service_uuid)
|
|
125
|
-
pass
|
|
126
|
-
|
|
127
|
-
def __repr__(self) -> str:
|
|
128
|
-
return f'Tag: {self.adva}, PktID: {self.get_pkt_id()[0]}'
|
|
129
|
-
|
|
130
|
-
def get_pkt_id(self):
|
|
131
|
-
"""Get generator's current packet ID
|
|
132
|
-
|
|
133
|
-
:return: 6 byte packet ID - (12 hex chars, int)
|
|
134
|
-
:rtype: tuple (str, int)
|
|
135
|
-
"""
|
|
136
|
-
pkt_id_int = self.data_packet.generic.pkt_id
|
|
137
|
-
pkt_id_bytes = pkt_id_int.to_bytes(4, "big").hex()
|
|
138
|
-
return pkt_id_bytes, pkt_id_int
|
|
139
|
-
|
|
140
|
-
def set_pkt_id(self, pkt_id_int):
|
|
141
|
-
"""Set generator's packet ID
|
|
142
|
-
|
|
143
|
-
:param pkt_id_int: packet ID
|
|
144
|
-
:type pkt_id_int: int
|
|
145
|
-
"""
|
|
146
|
-
assert 0 < pkt_id_int < (2 ** 32), "PacketID Must be a 32 bit unsigned integer!"
|
|
147
|
-
self.data_packet.generic.pkt_id = pkt_id_int
|
|
148
|
-
|
|
149
|
-
def randomize_pkt_id(self):
|
|
150
|
-
"""Randomize generator's packet ID"""
|
|
151
|
-
pkt_id_int = int.from_bytes(os.urandom(4), "big")
|
|
152
|
-
self.set_pkt_id(pkt_id_int)
|
|
153
|
-
|
|
154
|
-
def randomize_packet_payload(self):
|
|
155
|
-
"""Randomize Generator's packet payload (keep packet ID as is)"""
|
|
156
|
-
self.data_packet.generic.payload = int.from_bytes(os.urandom(20), "big")
|
|
157
|
-
|
|
158
|
-
def randomize_packet_payload_unified(self):
|
|
159
|
-
"""Randomize Generator's packet payload (keep packet ID as is) for unified packet"""
|
|
160
|
-
self.data_packet.pkt.nonce_n_unique_id = int.from_bytes(os.urandom(10), "big")
|
|
161
|
-
self.data_packet.pkt.mic = int.from_bytes(os.urandom(3), "big")
|
|
162
|
-
self.data_packet.pkt.data = int.from_bytes(os.urandom(8), "big")
|
|
163
|
-
self.data_packet.data_hdr.group_id_major == GROUP_ID_UNIFIED_PKT
|
|
164
|
-
|
|
165
|
-
def increment_pkt_data(self):
|
|
166
|
-
packet = self.get_packet()
|
|
167
|
-
data = packet[(ADVA_LENGTH+GAP_LENGTH+SERVICE_UUID_LENGTH+GROUP_ID_LENGTH):]
|
|
168
|
-
incremented_data = [bytes([((int(data[i:i+2], 16) + 1) % 256)]).hex().upper() for i in range(0, len(data), 2)]
|
|
169
|
-
incremented_packet = packet[:ADVA_LENGTH+GAP_LENGTH+SERVICE_UUID_LENGTH+GROUP_ID_LENGTH] + ''.join(incremented_data)
|
|
170
|
-
self.set_packet(incremented_packet)
|
|
171
|
-
|
|
172
|
-
def get_packet(self):
|
|
173
|
-
"""Get current packet from generator (hex string)
|
|
174
|
-
|
|
175
|
-
:return: Tag's Packet [12 char AdvA + 62 char BLE Packet]
|
|
176
|
-
:rtype: str
|
|
177
|
-
"""
|
|
178
|
-
return self.adva + self.data_packet.dump()
|
|
179
|
-
|
|
180
|
-
def set_packet(self, pkt):
|
|
181
|
-
"""set packet to input pkt"""
|
|
182
|
-
if len(pkt) == 74:
|
|
183
|
-
self.adva = pkt[:12]
|
|
184
|
-
pkt = pkt[12:]
|
|
185
|
-
assert len(pkt) == 62, "packet must be 74 / 62 hex chars long!"
|
|
186
|
-
self.data_packet.set(pkt)
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
class BrgPktGenerator:
|
|
190
|
-
"""Bridge Packet Generator - represents 1 wiliot Bridge"""
|
|
191
|
-
def __init__(self, bridge_id:str=None):
|
|
192
|
-
"""
|
|
193
|
-
:param bridge_id: bridge ID, defaults to randomly generated if None
|
|
194
|
-
:type bridge_id: str, optional
|
|
195
|
-
"""
|
|
196
|
-
if bridge_id is None:
|
|
197
|
-
self.bridge_id, self.bridge_id_int = generate_random_bridge_id()
|
|
198
|
-
else:
|
|
199
|
-
self.bridge_id = bridge_id
|
|
200
|
-
self.bridge_id_int = int.from_bytes(binascii.unhexlify(bridge_id), "big")
|
|
201
|
-
self.adva = apply_adva_bitmask(self.bridge_id, 'random_static')
|
|
202
|
-
# Data packet init
|
|
203
|
-
self.tag_list:List[TagPktGenerator] = []
|
|
204
|
-
self.append_data_pkt()
|
|
205
|
-
# SI packet init
|
|
206
|
-
self.si_list:List[WltPkt]
|
|
207
|
-
self.update_si_list()
|
|
208
|
-
|
|
209
|
-
# BRG CFG packet init
|
|
210
|
-
self.brg_cfg = WltPkt(
|
|
211
|
-
hdr=Hdr(group_id=GROUP_ID_BRG2GW),
|
|
212
|
-
generic=Brg2GwCfgV7(
|
|
213
|
-
msg_type=BRG_MGMT_MSG_TYPE_CFG_INFO,
|
|
214
|
-
major_ver=3,
|
|
215
|
-
minor_ver=12,
|
|
216
|
-
build_ver=35,
|
|
217
|
-
brg_mac=self.bridge_id_int,
|
|
218
|
-
),
|
|
219
|
-
)
|
|
220
|
-
self.brg_hb = WltPkt(
|
|
221
|
-
hdr=Hdr(group_id=GROUP_ID_BRG2GW),
|
|
222
|
-
generic=Brg2GwHbV7(
|
|
223
|
-
msg_type=BRG_MGMT_MSG_TYPE_HB, brg_mac=self.bridge_id_int
|
|
224
|
-
),
|
|
225
|
-
)
|
|
226
|
-
self.brg_seq_id = 0
|
|
227
|
-
|
|
228
|
-
def __repr__(self):
|
|
229
|
-
return f'BRG {self.bridge_id}, Tags {self.tag_list}'
|
|
230
|
-
|
|
231
|
-
def set_bridge_id(self, brg_mac):
|
|
232
|
-
"""Set generator's bridge ID
|
|
233
|
-
|
|
234
|
-
:param brg_mac: bridge ID (12 hex chars)
|
|
235
|
-
:type brg_mac: str
|
|
236
|
-
"""
|
|
237
|
-
self.bridge_id = brg_mac
|
|
238
|
-
self.bridge_id_int = int.from_bytes(binascii.unhexlify(brg_mac), "big")
|
|
239
|
-
self.brg_cfg = WltPkt(
|
|
240
|
-
hdr=Hdr(group_id=GROUP_ID_BRG2GW),
|
|
241
|
-
generic=Brg2GwCfgV7(
|
|
242
|
-
msg_type=BRG_MGMT_MSG_TYPE_CFG_INFO,
|
|
243
|
-
major_ver=3,
|
|
244
|
-
minor_ver=12,
|
|
245
|
-
build_ver=35,
|
|
246
|
-
brg_mac=self.bridge_id_int,
|
|
247
|
-
),
|
|
248
|
-
)
|
|
249
|
-
self.brg_hb = WltPkt(
|
|
250
|
-
hdr=Hdr(group_id=GROUP_ID_BRG2GW),
|
|
251
|
-
generic=Brg2GwHbV7(
|
|
252
|
-
msg_type=BRG_MGMT_MSG_TYPE_HB, brg_mac=self.bridge_id_int
|
|
253
|
-
),
|
|
254
|
-
)
|
|
255
|
-
|
|
256
|
-
def set_random_bridge_id(self):
|
|
257
|
-
bridge_id, bridge_id_int = generate_random_bridge_id()
|
|
258
|
-
self.set_bridge_id(bridge_id)
|
|
259
|
-
|
|
260
|
-
# Data Packet
|
|
261
|
-
|
|
262
|
-
def append_data_pkt(self, data_pkt=None):
|
|
263
|
-
"""Append data packet to tag list
|
|
264
|
-
if no data packet is input, a new TagPktGenerator object will be appended to tag list
|
|
265
|
-
|
|
266
|
-
:param data_pkt: 62 hex char string, defaults to None
|
|
267
|
-
:type data_pkt: str, optional
|
|
268
|
-
"""
|
|
269
|
-
idx_to_append = len(self.tag_list)
|
|
270
|
-
self.tag_list.append(None)
|
|
271
|
-
self.set_data_pkt(tag_idx=idx_to_append, data_pkt=data_pkt)
|
|
272
|
-
|
|
273
|
-
def set_data_pkt(self, tag_idx, data_pkt=None):
|
|
274
|
-
"""Set tag generator at specific idx's data packet from string
|
|
275
|
-
if no data packet is input, a new TagPktGenerator object will be created at tag_idx
|
|
276
|
-
|
|
277
|
-
:param tag_idx: tag index
|
|
278
|
-
:type tag_idx: int
|
|
279
|
-
:param data_pkt: data packet (62 hex chars), defaults to None
|
|
280
|
-
:type data_pkt: str, optional
|
|
281
|
-
"""
|
|
282
|
-
assert tag_idx <= len(self.tag_list), f'Tag index must be in {[i for i in range(len(self.tag_list))]}'
|
|
283
|
-
tag_pkt_gen = TagPktGenerator()
|
|
284
|
-
if data_pkt is not None:
|
|
285
|
-
tag_pkt_gen.set_packet(data_pkt)
|
|
286
|
-
self.tag_list[tag_idx] = tag_pkt_gen
|
|
287
|
-
|
|
288
|
-
# SideInfo Packet
|
|
289
|
-
|
|
290
|
-
def generate_si_from_pkt_id(self, pkt_id_int):
|
|
291
|
-
"""Generate SI from packet ID
|
|
292
|
-
|
|
293
|
-
:param pkt_id_int: packet ID
|
|
294
|
-
:type pkt_id_int: int
|
|
295
|
-
:return: WltPkt for SideInfo, with RSSI, NFPKT zeroed out
|
|
296
|
-
:rtype: WltPkt(hdr:Hdr, generic:SideInfo)
|
|
297
|
-
"""
|
|
298
|
-
assert 0 <= pkt_id_int < (2 ** 32), "Packet ID must be a 32 bit unsigned integer!"
|
|
299
|
-
si_packet = WltPkt(
|
|
300
|
-
hdr=Hdr(group_id=GROUP_ID_SIDE_INFO),
|
|
301
|
-
generic=SideInfo(brg_mac=self.bridge_id_int, pkt_id=pkt_id_int),
|
|
302
|
-
)
|
|
303
|
-
return si_packet
|
|
304
|
-
|
|
305
|
-
def update_si_list(self):
|
|
306
|
-
"""Update the SI list according to current pixel's packet IDs"""
|
|
307
|
-
si_table = []
|
|
308
|
-
for tag in self.tag_list:
|
|
309
|
-
tag_pkt_id_bytes, tag_pkt_id_int = tag.get_pkt_id()
|
|
310
|
-
si_table.append(self.generate_si_from_pkt_id(tag_pkt_id_int))
|
|
311
|
-
self.si_list = si_table
|
|
312
|
-
|
|
313
|
-
def randomize_si_rssi_nfpkt(self):
|
|
314
|
-
"""Randomize all SI's rssi and nfpkt values
|
|
315
|
-
"""
|
|
316
|
-
for si in self.si_list:
|
|
317
|
-
rssi = int.from_bytes(os.urandom(1), "big")
|
|
318
|
-
nfpkt = int.from_bytes(os.urandom(2), "big")
|
|
319
|
-
si.generic.rssi = rssi
|
|
320
|
-
si.generic.nfpkt = nfpkt
|
|
321
|
-
|
|
322
|
-
def randomize_unified_rssi_nfpkt_latency_gpacing(self):
|
|
323
|
-
"""Randomize all rssi, nfpkt, global pacing and brg latency values
|
|
324
|
-
"""
|
|
325
|
-
for tag in self.tag_list:
|
|
326
|
-
tag.data_packet.pkt.rssi = random.randint(0,63) + 40
|
|
327
|
-
tag.data_packet.pkt.nfpkt = int.from_bytes(os.urandom(1), "big")
|
|
328
|
-
tag.data_packet.pkt.brg_latency = random.randint(0,63)
|
|
329
|
-
tag.data_packet.pkt.global_pacing_group = random.randint(0,15)
|
|
330
|
-
tag.data_packet.hdr.group_id = 0x00003F
|
|
331
|
-
tag.data_packet.data_hdr.group_id_major = GROUP_ID_UNIFIED_PKT
|
|
332
|
-
tag.data_packet.data_hdr.group_id_minor = 0x0000
|
|
333
|
-
|
|
334
|
-
def set_rssi_nfpkt(self, rssi, nfpkt, tag_idx:int=None):
|
|
335
|
-
if tag_idx is None:
|
|
336
|
-
tag_idx = 0
|
|
337
|
-
assert tag_idx <= len(self.tag_list), f'Tag index must be in {[i for i in range(len(self.tag_list))]}'
|
|
338
|
-
self.si_list[tag_idx].generic.rssi = rssi
|
|
339
|
-
self.si_list[tag_idx].generic.nfpkt = nfpkt
|
|
340
|
-
|
|
341
|
-
# Coupling (Shared Data + SideInfo)
|
|
342
|
-
|
|
343
|
-
def set_tag_list(self, tag_list:List[TagPktGenerator]):
|
|
344
|
-
self.tag_list = tag_list
|
|
345
|
-
self.update_si_list()
|
|
346
|
-
|
|
347
|
-
def increment_pkt_id(self, tag_idx:int=None):
|
|
348
|
-
"""Increment tag generator at specific idx's data packet's packet ID
|
|
349
|
-
|
|
350
|
-
:param tag_idx: tag index, defaults to None
|
|
351
|
-
:type tag_idx: int, optional
|
|
352
|
-
"""
|
|
353
|
-
if tag_idx is None:
|
|
354
|
-
tag_idx = 0
|
|
355
|
-
assert tag_idx <= len(self.tag_list), f'Tag index must be in {[i for i in range(len(self.tag_list))]}'
|
|
356
|
-
self.tag_list[tag_idx].generic.pkt_id = increment_circular(self.tag_list[tag_idx].generic.pkt_id, 1, 32)
|
|
357
|
-
self.update_si_list()
|
|
358
|
-
|
|
359
|
-
def randomize_data_packet(self, tag_idx:int=None):
|
|
360
|
-
"""Randomize tag generator at specific idx's data packet (payload + ID),
|
|
361
|
-
Update SI to match
|
|
362
|
-
|
|
363
|
-
:param tag_idx: tag index, defaults to None
|
|
364
|
-
:type tag_idx: int, optional
|
|
365
|
-
"""
|
|
366
|
-
if tag_idx is None:
|
|
367
|
-
tag_idx = 0
|
|
368
|
-
assert tag_idx <= len(self.tag_list), f'Tag index must be in {[i for i in range(len(self.tag_list))]}'
|
|
369
|
-
tag = self.tag_list[tag_idx]
|
|
370
|
-
# randomize packet ID
|
|
371
|
-
tag.randomize_pkt_id()
|
|
372
|
-
# randomize packet payload
|
|
373
|
-
tag.randomize_packet_payload()
|
|
374
|
-
# update SI
|
|
375
|
-
self.update_si_list()
|
|
376
|
-
|
|
377
|
-
def randomize_packet_unified(self, tag_idx:int=None):
|
|
378
|
-
"""Randomize tag generator at specific idx's data packet (payload + ID)
|
|
379
|
-
|
|
380
|
-
:param tag_idx: tag index, defaults to None
|
|
381
|
-
:type tag_idx: int, optional
|
|
382
|
-
"""
|
|
383
|
-
if tag_idx is None:
|
|
384
|
-
tag_idx = 0
|
|
385
|
-
assert tag_idx <= len(self.tag_list), f'Tag index must be in {[i for i in range(len(self.tag_list))]}'
|
|
386
|
-
tag = self.tag_list[tag_idx]
|
|
387
|
-
# randomize packet ID
|
|
388
|
-
tag.randomize_pkt_id()
|
|
389
|
-
# randomize packet payload
|
|
390
|
-
tag.randomize_packet_payload_unified()
|
|
391
|
-
|
|
392
|
-
def get_data(self, tag_idx:int):
|
|
393
|
-
"""Get tag at index's data packet (AdvA + BLE Packet)
|
|
394
|
-
|
|
395
|
-
:param tag_idx: tag index
|
|
396
|
-
:type tag_idx: int
|
|
397
|
-
:return: data packet (74 hex char)
|
|
398
|
-
:rtype: str
|
|
399
|
-
"""
|
|
400
|
-
assert tag_idx <= len(self.tag_list), f'Tag index must be in {[i for i in range(len(self.tag_list))]}'
|
|
401
|
-
return self.tag_list[tag_idx].get_packet()
|
|
402
|
-
|
|
403
|
-
def get_si(self, tag_idx:int):
|
|
404
|
-
"""Get tag at index's sideinfo packet (AdvA + BLE Packet)
|
|
405
|
-
|
|
406
|
-
:param tag_idx: _description_
|
|
407
|
-
:type tag_idx: int
|
|
408
|
-
:return: _description_
|
|
409
|
-
:rtype: _type_
|
|
410
|
-
"""
|
|
411
|
-
assert tag_idx <= len(self.tag_list), f'Tag index must be in {[i for i in range(len(self.tag_list))]}'
|
|
412
|
-
return self.adva + self.si_list[tag_idx].dump()
|
|
413
|
-
|
|
414
|
-
def get_expected_coupled_mqtt(self, tag_idx:int=None):
|
|
415
|
-
if tag_idx is None:
|
|
416
|
-
tag_idx = 0
|
|
417
|
-
assert tag_idx <= len(self.tag_list), f'Tag index must be in {[i for i in range(len(self.tag_list))]}'
|
|
418
|
-
si = self.si_list[tag_idx]
|
|
419
|
-
"""generates expected MQTT packet"""
|
|
420
|
-
timestamp = int(datetime.datetime.now().timestamp() * 1000)
|
|
421
|
-
expected = {
|
|
422
|
-
TIMESTAMP: timestamp,
|
|
423
|
-
BRIDGE_ID: self.bridge_id,
|
|
424
|
-
NFPKT: si.generic.nfpkt,
|
|
425
|
-
RSSI: si.generic.rssi,
|
|
426
|
-
PAYLOAD: self.get_data(tag_idx)[(ADVA_LENGTH+GAP_LENGTH):]
|
|
427
|
-
}
|
|
428
|
-
return expected
|
|
429
|
-
|
|
430
|
-
def get_expected_uncoupled_mqtt(self, tag_idx:int=None):
|
|
431
|
-
if tag_idx is None:
|
|
432
|
-
tag_idx = 0
|
|
433
|
-
assert tag_idx <= len(self.tag_list), f'Tag index must be in {[i for i in range(len(self.tag_list))]}'
|
|
434
|
-
timestamp = int(datetime.datetime.now().timestamp() * 1000)
|
|
435
|
-
expected_data = {
|
|
436
|
-
TIMESTAMP: timestamp,
|
|
437
|
-
PAYLOAD: self.get_data(tag_idx)[(ADVA_LENGTH+GAP_LENGTH):]
|
|
438
|
-
}
|
|
439
|
-
expected_si = {
|
|
440
|
-
TIMESTAMP: timestamp,
|
|
441
|
-
PAYLOAD: self.get_si(tag_idx)[(ADVA_LENGTH+GAP_LENGTH):]
|
|
442
|
-
}
|
|
443
|
-
return [expected_data, expected_si]
|
|
444
|
-
|
|
445
|
-
def get_expected_hb_mqtt(self):
|
|
446
|
-
timestamp = int(datetime.datetime.now().timestamp() * 1000)
|
|
447
|
-
expected = {
|
|
448
|
-
TIMESTAMP: timestamp,
|
|
449
|
-
PAYLOAD: self.get_brg_hb()[(ADVA_LENGTH+GAP_LENGTH):]
|
|
450
|
-
}
|
|
451
|
-
return expected
|
|
452
|
-
# Management packets (Heartbeat / CFG)
|
|
453
|
-
|
|
454
|
-
def increment_brg_seq_id(self):
|
|
455
|
-
"""Increment Bridge sequenceID (Relevant for CFG/HB Packets only)"""
|
|
456
|
-
self.brg_seq_id = increment_circular(self.brg_seq_id, 2, 8)
|
|
457
|
-
self.brg_cfg.generic.seq_id = decrease_circular(self.brg_seq_id, 2, 8)
|
|
458
|
-
self.brg_hb.generic.seq_id = decrease_circular(self.brg_seq_id, 1, 8)
|
|
459
|
-
|
|
460
|
-
def increment_hb_counters(self, num=1):
|
|
461
|
-
"""Update bridge HB counters values
|
|
462
|
-
|
|
463
|
-
:param num: num to increment by, defaults to 1
|
|
464
|
-
:type num: int, optional
|
|
465
|
-
"""
|
|
466
|
-
self.brg_hb.generic.non_wlt_rx_pkts_ctr = increment_circular(self.brg_hb.generic.non_wlt_rx_pkts_ctr, num, 24)
|
|
467
|
-
self.brg_hb.generic.bad_crc_pkts_ctr = increment_circular(self.brg_hb.generic.bad_crc_pkts_ctr, num, 24)
|
|
468
|
-
self.brg_hb.generic.wlt_rx_pkts_ctr = increment_circular(self.brg_hb.generic.wlt_rx_pkts_ctr, num, 24)
|
|
469
|
-
self.brg_hb.generic.wlt_tx_pkts_ctr = increment_circular(self.brg_hb.generic.wlt_tx_pkts_ctr, num, 16)
|
|
470
|
-
self.brg_hb.generic.tags_ctr = len(self.tag_list)
|
|
471
|
-
|
|
472
|
-
def increment_all(self):
|
|
473
|
-
"""Increment Bridge sequenceID and HB counters"""
|
|
474
|
-
self.increment_brg_seq_id()
|
|
475
|
-
self.increment_hb_counters()
|
|
476
|
-
|
|
477
|
-
def get_brg_cfg(self):
|
|
478
|
-
"""Get bridge CFG Packet
|
|
479
|
-
|
|
480
|
-
:return: CFG Packet (74 hex chars)
|
|
481
|
-
:rtype: str
|
|
482
|
-
"""
|
|
483
|
-
return self.adva + self.brg_cfg.dump()
|
|
484
|
-
|
|
485
|
-
def get_brg_hb(self):
|
|
486
|
-
"""Get bridge HB Packet
|
|
487
|
-
|
|
488
|
-
:return: HB Packet (74 hex chars)
|
|
489
|
-
:rtype: str
|
|
490
|
-
"""
|
|
491
|
-
return self.adva + self.brg_hb.dump()
|
|
492
|
-
|
|
493
|
-
# General
|
|
494
|
-
|
|
495
|
-
def get_existing_data_si(self, tag_idx:int=None) -> dict:
|
|
496
|
-
"""Get tag at tag_idx's Data packet and relevant SideInfo packet
|
|
497
|
-
|
|
498
|
-
:param tag_idx: tag index, defaults to None
|
|
499
|
-
:type tag_idx: int, optional
|
|
500
|
-
:return: dictionary with data packet and sideinfo packet
|
|
501
|
-
:rtype: dict
|
|
502
|
-
"""
|
|
503
|
-
if tag_idx is None:
|
|
504
|
-
tag_idx = 0
|
|
505
|
-
assert tag_idx <= len(self.tag_list), f'Tag index must be in {[i for i in range(len(self.tag_list))]}'
|
|
506
|
-
existing_packets = {
|
|
507
|
-
"data_packet": self.get_data(tag_idx),
|
|
508
|
-
"si_packet": self.get_si(tag_idx)
|
|
509
|
-
}
|
|
510
|
-
return existing_packets
|
|
511
|
-
|
|
512
|
-
def get_existing_data_unified(self, tag_idx:int=None) -> dict:
|
|
513
|
-
"""Get tag at tag_idx's Data packet for unified packet
|
|
514
|
-
|
|
515
|
-
:param tag_idx: tag index, defaults to None
|
|
516
|
-
:type tag_idx: int, optional
|
|
517
|
-
:return: dictionary with data packet and sideinfo packet
|
|
518
|
-
:rtype: dict
|
|
519
|
-
"""
|
|
520
|
-
if tag_idx is None:
|
|
521
|
-
tag_idx = 0
|
|
522
|
-
assert tag_idx <= len(self.tag_list), f'Tag index must be in {[i for i in range(len(self.tag_list))]}'
|
|
523
|
-
existing_packets = {
|
|
524
|
-
"data_packet": self.get_data(tag_idx)
|
|
525
|
-
}
|
|
526
|
-
return existing_packets
|
|
527
|
-
|
|
528
|
-
def get_new_data_si(self, tag_idx:int=None) -> dict:
|
|
529
|
-
"""Generate new Data+SideInfo packets for tag at tag_idx
|
|
530
|
-
|
|
531
|
-
:param tag_idx: tag index, defaults to None
|
|
532
|
-
:type tag_idx: int, optional
|
|
533
|
-
:return: dictionary with data packet and sideinfo packet
|
|
534
|
-
:rtype: dict
|
|
535
|
-
"""
|
|
536
|
-
if tag_idx is None:
|
|
537
|
-
tag_idx = 0
|
|
538
|
-
assert tag_idx <= len(self.tag_list), f'Tag index must be in {[i for i in range(len(self.tag_list))]}'
|
|
539
|
-
self.randomize_data_packet(tag_idx)
|
|
540
|
-
self.randomize_si_rssi_nfpkt()
|
|
541
|
-
self.increment_brg_seq_id()
|
|
542
|
-
self.increment_hb_counters()
|
|
543
|
-
return self.get_existing_data_si(tag_idx)
|
|
544
|
-
|
|
545
|
-
def get_new_data_unified(self, tag_idx:int=None) -> dict:
|
|
546
|
-
"""Generate new unified Data packets for tag at tag_idx
|
|
547
|
-
|
|
548
|
-
:param tag_idx: tag index, defaults to None
|
|
549
|
-
:type tag_idx: int, optional
|
|
550
|
-
:return: dictionary with data packet
|
|
551
|
-
:rtype: dict
|
|
552
|
-
"""
|
|
553
|
-
if tag_idx is None:
|
|
554
|
-
tag_idx = 0
|
|
555
|
-
assert tag_idx <= len(self.tag_list), f'Tag index must be in {[i for i in range(len(self.tag_list))]}'
|
|
556
|
-
# set the packet type to unified
|
|
557
|
-
self.tag_list[tag_idx].data_packet.pkt = UnifiedEchoPkt()
|
|
558
|
-
self.tag_list[tag_idx].adva = init_adva(self.bridge_id, 'Bridge')
|
|
559
|
-
self.randomize_packet_unified(tag_idx)
|
|
560
|
-
self.randomize_unified_rssi_nfpkt_latency_gpacing()
|
|
561
|
-
self.increment_brg_seq_id()
|
|
562
|
-
self.increment_hb_counters()
|
|
563
|
-
return self.get_existing_data_unified(tag_idx)
|
|
564
|
-
|
|
565
|
-
class BrgPktGeneratorNetwork:
|
|
566
|
-
"""Bridge Packet Generator Network - Represents multiple bridges setup at same location and echoing the same tags"""
|
|
567
|
-
def __init__(self, num_brgs=3):
|
|
568
|
-
"""
|
|
569
|
-
:param num_brgs: number of bridges in array, defaults to 3
|
|
570
|
-
:type num_brgs: int, optional
|
|
571
|
-
"""
|
|
572
|
-
assert num_brgs > 1, 'BrgArray cannot be smaller than 1!'
|
|
573
|
-
self.brg_list = [BrgPktGenerator() for brg in range(num_brgs)]
|
|
574
|
-
self.primary_brg = self.brg_list[0]
|
|
575
|
-
self.secondary_brgs = self.brg_list[1:]
|
|
576
|
-
for brg in self.secondary_brgs:
|
|
577
|
-
brg.set_tag_list(self.primary_brg.tag_list)
|
|
578
|
-
|
|
579
|
-
def get_new_pkt_unified(self) -> list:
|
|
580
|
-
"""Get new unified pkt for all bridges in bridge network
|
|
581
|
-
|
|
582
|
-
:return: List of dictionaries containing {bridge_id, data_packet} key:value pairs
|
|
583
|
-
:rtype: list[dict]
|
|
584
|
-
"""
|
|
585
|
-
pkts = []
|
|
586
|
-
new_pkt_primary = self.primary_brg.get_new_data_unified()
|
|
587
|
-
pkts.append(new_pkt_primary)
|
|
588
|
-
for brg in self.secondary_brgs:
|
|
589
|
-
brg.randomize_unified_rssi_nfpkt_latency_gpacing()
|
|
590
|
-
brg.tag_list[0].adva = init_adva(brg.bridge_id, 'Bridge')
|
|
591
|
-
pkts.append(brg.get_existing_data_unified())
|
|
592
|
-
for idx, pkt in enumerate(pkts):
|
|
593
|
-
pkt.update({'bridge_id': self.brg_list[idx].bridge_id})
|
|
594
|
-
return pkts
|