wiliot-certificate 1.3.0a1__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.
- gw_certificate/__init__.py +0 -0
- gw_certificate/ag/ut_defines.py +361 -0
- gw_certificate/ag/wlt_types.py +85 -0
- gw_certificate/ag/wlt_types_ag.py +5310 -0
- gw_certificate/ag/wlt_types_data.py +64 -0
- gw_certificate/api/extended_api.py +1547 -0
- gw_certificate/api_if/__init__.py +0 -0
- gw_certificate/api_if/api_validation.py +40 -0
- gw_certificate/api_if/gw_capabilities.py +18 -0
- gw_certificate/common/analysis_data_bricks.py +1455 -0
- gw_certificate/common/debug.py +63 -0
- gw_certificate/common/utils.py +219 -0
- gw_certificate/common/utils_defines.py +102 -0
- gw_certificate/common/wltPb_pb2.py +72 -0
- gw_certificate/common/wltPb_pb2.pyi +227 -0
- gw_certificate/gw_certificate.py +138 -0
- gw_certificate/gw_certificate_cli.py +70 -0
- gw_certificate/interface/ble_simulator.py +91 -0
- gw_certificate/interface/ble_sniffer.py +189 -0
- gw_certificate/interface/if_defines.py +35 -0
- gw_certificate/interface/mqtt.py +469 -0
- gw_certificate/interface/packet_error.py +22 -0
- gw_certificate/interface/pkt_generator.py +720 -0
- gw_certificate/interface/uart_if.py +193 -0
- gw_certificate/interface/uart_ports.py +20 -0
- gw_certificate/templates/results.html +241 -0
- gw_certificate/templates/stage.html +22 -0
- gw_certificate/templates/table.html +6 -0
- gw_certificate/templates/test.html +38 -0
- gw_certificate/tests/__init__.py +11 -0
- gw_certificate/tests/actions.py +131 -0
- gw_certificate/tests/bad_crc_to_PER_quantization.csv +51 -0
- gw_certificate/tests/connection.py +181 -0
- gw_certificate/tests/downlink.py +174 -0
- gw_certificate/tests/generic.py +161 -0
- gw_certificate/tests/registration.py +288 -0
- gw_certificate/tests/static/__init__.py +0 -0
- gw_certificate/tests/static/connection_defines.py +9 -0
- gw_certificate/tests/static/downlink_defines.py +9 -0
- gw_certificate/tests/static/generated_packet_table.py +209 -0
- gw_certificate/tests/static/packet_table.csv +10051 -0
- gw_certificate/tests/static/references.py +4 -0
- gw_certificate/tests/static/uplink_defines.py +20 -0
- gw_certificate/tests/throughput.py +244 -0
- gw_certificate/tests/uplink.py +683 -0
- wiliot_certificate-1.3.0a1.dist-info/LICENSE +21 -0
- wiliot_certificate-1.3.0a1.dist-info/METADATA +113 -0
- wiliot_certificate-1.3.0a1.dist-info/RECORD +51 -0
- wiliot_certificate-1.3.0a1.dist-info/WHEEL +5 -0
- wiliot_certificate-1.3.0a1.dist-info/entry_points.txt +2 -0
- wiliot_certificate-1.3.0a1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import datetime
|
|
2
|
+
import logging
|
|
3
|
+
import os
|
|
4
|
+
import colorama
|
|
5
|
+
import tabulate
|
|
6
|
+
import pprint
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# Debugging & Printing
|
|
10
|
+
def debug_print(txt, pretty=False, center=False, tab=False, color=None, enable=True):
|
|
11
|
+
"""
|
|
12
|
+
:type txt: string
|
|
13
|
+
:param txt: text to print
|
|
14
|
+
:type pretty: bool
|
|
15
|
+
:param pretty: pretty print
|
|
16
|
+
:type center: bool
|
|
17
|
+
:param center: print with stars (*)
|
|
18
|
+
:type tab: bool
|
|
19
|
+
:param tab: tabulate input
|
|
20
|
+
:type color: str
|
|
21
|
+
:param color: colorama color code
|
|
22
|
+
"""
|
|
23
|
+
if enable:
|
|
24
|
+
if tab:
|
|
25
|
+
txt = '\n' + tabulate.tabulate(txt, tablefmt='rst')
|
|
26
|
+
if type(txt) != str:
|
|
27
|
+
try:
|
|
28
|
+
txt = str(txt)
|
|
29
|
+
except TypeError:
|
|
30
|
+
debug_print('Could not Print!')
|
|
31
|
+
if center:
|
|
32
|
+
txt = txt.center(94, '-')
|
|
33
|
+
if color is not None:
|
|
34
|
+
txt = eval(f'colorama.Fore.{color}') + txt + colorama.Style.RESET_ALL
|
|
35
|
+
if pretty:
|
|
36
|
+
txt = pprint.pformat(txt, sort_dicts=False)
|
|
37
|
+
|
|
38
|
+
# Print Text
|
|
39
|
+
if logging.getLogger().hasHandlers():
|
|
40
|
+
log = logging.getLogger()
|
|
41
|
+
log.info(txt)
|
|
42
|
+
else:
|
|
43
|
+
print(datetime.datetime.now().strftime("[%d/%m/%Y, %H:%M:%S]: ") + txt)
|
|
44
|
+
|
|
45
|
+
def is_databricks():
|
|
46
|
+
"""returns if running in databricks"""
|
|
47
|
+
try:
|
|
48
|
+
get_ipython().__class__.__name__
|
|
49
|
+
return True
|
|
50
|
+
except NameError:
|
|
51
|
+
return False
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def is_databricks():
|
|
55
|
+
try:
|
|
56
|
+
from IPython import get_ipython
|
|
57
|
+
if "IPKernelApp" not in get_ipython().config:
|
|
58
|
+
return False
|
|
59
|
+
if "VSCODE_PID" in os.environ:
|
|
60
|
+
return False
|
|
61
|
+
return True
|
|
62
|
+
except Exception as e:
|
|
63
|
+
return False
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# External libraries
|
|
2
|
+
import math
|
|
3
|
+
import pandas as pd
|
|
4
|
+
import numpy as np
|
|
5
|
+
import datetime
|
|
6
|
+
from collections import defaultdict
|
|
7
|
+
|
|
8
|
+
from gw_certificate.common.debug import is_databricks
|
|
9
|
+
|
|
10
|
+
try:
|
|
11
|
+
from zoneinfo import ZoneInfo # will run only in python 3.9+
|
|
12
|
+
except ImportError:
|
|
13
|
+
from backports.zoneinfo import ZoneInfo # backport to python < 3.9
|
|
14
|
+
|
|
15
|
+
# CSV Parsing
|
|
16
|
+
def get_ref_tags(csv_filepath):
|
|
17
|
+
# TODO - fix to insert header if not given
|
|
18
|
+
"""
|
|
19
|
+
returns an array of tags externalIds from a csv including one column of all the tags
|
|
20
|
+
:type csv_filepath: string
|
|
21
|
+
:param csv_filepath: filepath to csv with one column including all the tags
|
|
22
|
+
output type: array
|
|
23
|
+
output param: array of tags externalIds from a csv
|
|
24
|
+
"""
|
|
25
|
+
tags_list = pd.read_csv(csv_filepath)
|
|
26
|
+
tags_list = tags_list.to_dict()
|
|
27
|
+
res = defaultdict(list)
|
|
28
|
+
for key in tags_list.keys():
|
|
29
|
+
for idx in tags_list[key]:
|
|
30
|
+
if type(tags_list[key][idx]) == str and len(tags_list[key][idx]) == 31:
|
|
31
|
+
res[key].append(tags_list[key][idx])
|
|
32
|
+
return res
|
|
33
|
+
|
|
34
|
+
def get_bridges_from_csv(csv_filepath):
|
|
35
|
+
"""
|
|
36
|
+
:type csv_filepath: string
|
|
37
|
+
:param csv_filepath: bridges names csv file path
|
|
38
|
+
"""
|
|
39
|
+
if csv_filepath is None:
|
|
40
|
+
return None
|
|
41
|
+
bridges_df = pd.read_csv(csv_filepath)
|
|
42
|
+
zones_dict = bridges_df.to_dict('list')
|
|
43
|
+
return zones_dict
|
|
44
|
+
|
|
45
|
+
# Date & Time Related
|
|
46
|
+
def convert_datetime_to_timestamp(year=2022, month=1, day=1, hour=0, minute=0, seconds=0, micro_secs=0,
|
|
47
|
+
hours_from_utc=0):
|
|
48
|
+
"""
|
|
49
|
+
returns the timestamp of Israeli datetime
|
|
50
|
+
:type year: int
|
|
51
|
+
:param year: year of desired datetime
|
|
52
|
+
:type month: int
|
|
53
|
+
:param month: month of desired datetime
|
|
54
|
+
:type day: int
|
|
55
|
+
:param day: day of desired datetime
|
|
56
|
+
:type hour: int
|
|
57
|
+
:param hour: hour of desired datetime
|
|
58
|
+
:type minute: int
|
|
59
|
+
:param minute: minute of desired datetime
|
|
60
|
+
:type seconds: int
|
|
61
|
+
:param seconds: seconds of desired datetime
|
|
62
|
+
:type micro_secs: int
|
|
63
|
+
:param micro_secs: micro seconds of desired datetime
|
|
64
|
+
:type hours_from_utc: int
|
|
65
|
+
:param hours_from_utc: hours difference from UTC timezone
|
|
66
|
+
:returns: timestamp in UTC
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
dt = datetime.datetime(year, month, day, hour, minute, seconds, micro_secs)
|
|
70
|
+
# getting the timestamp
|
|
71
|
+
ts = datetime.datetime.timestamp(dt)
|
|
72
|
+
# if runs in data bricks - subtract hours_from_utc hours to transfer to relevant time zone
|
|
73
|
+
if is_databricks():
|
|
74
|
+
ts = ts - 3600 * hours_from_utc
|
|
75
|
+
# convert to ms
|
|
76
|
+
ts_in_ms = math.ceil(ts * 1000)
|
|
77
|
+
return ts_in_ms
|
|
78
|
+
|
|
79
|
+
def mstimestamp_to_timezone(timestamp, timezone='Israel', milli=True, hour=True, return_datetime=False):
|
|
80
|
+
"""
|
|
81
|
+
:type timestamp: float / str / int
|
|
82
|
+
:param timestamp: millisecond timestamp
|
|
83
|
+
:type timezone: str
|
|
84
|
+
:param timezone: ZoneInfo Timestamp name, defaults to Israel
|
|
85
|
+
:type milli: bool
|
|
86
|
+
:param milli: if false, omits millisecond from result
|
|
87
|
+
:type return_datetime: bool
|
|
88
|
+
:param return_datetime: whether to return datetime
|
|
89
|
+
:rtype: str | datetime
|
|
90
|
+
:return: String of datetime in timezone | datetime object in timezone
|
|
91
|
+
"""
|
|
92
|
+
server_timezone = ZoneInfo("Etc/UTC")
|
|
93
|
+
chosen_timezone = ZoneInfo(timezone)
|
|
94
|
+
if timestamp == 0 or np.isnan(timestamp):
|
|
95
|
+
return None
|
|
96
|
+
try:
|
|
97
|
+
timestamp = float(timestamp)
|
|
98
|
+
except ValueError as e:
|
|
99
|
+
raise ValueError(f'Timestamp {timestamp} could not be converted to float!' + e)
|
|
100
|
+
dt = datetime.datetime.fromtimestamp(timestamp / 1000)
|
|
101
|
+
dt.replace(tzinfo=server_timezone)
|
|
102
|
+
if return_datetime:
|
|
103
|
+
return dt.astimezone(chosen_timezone)
|
|
104
|
+
if hour:
|
|
105
|
+
if milli:
|
|
106
|
+
dt = dt.astimezone(chosen_timezone).strftime('%Y-%m-%d %H:%M:%S.%f %Z')
|
|
107
|
+
else:
|
|
108
|
+
dt = dt.astimezone(chosen_timezone).strftime('%Y-%m-%d %H:%M:%S %Z')
|
|
109
|
+
else:
|
|
110
|
+
dt = dt.astimezone(chosen_timezone).strftime('%Y-%m-%d')
|
|
111
|
+
return dt
|
|
112
|
+
|
|
113
|
+
def convert_timestamp_to_datetime(timestamp, up_to_sec_res=False):
|
|
114
|
+
"""
|
|
115
|
+
converts timestamp to datetime
|
|
116
|
+
:param timestamp: timestamp
|
|
117
|
+
:type timestamp: str
|
|
118
|
+
:param up_to_sec_res: if true will return the datetime in a resolution of seconds
|
|
119
|
+
:type up_to_sec_res: bool
|
|
120
|
+
"""
|
|
121
|
+
num_digits = len(str(int(float(timestamp))))
|
|
122
|
+
timestamp = float(timestamp)
|
|
123
|
+
timestamp = timestamp * math.pow(10, ((num_digits*-1) + 10))
|
|
124
|
+
dt = datetime.datetime.fromtimestamp(float(timestamp))
|
|
125
|
+
if up_to_sec_res:
|
|
126
|
+
dt = dt - datetime.timedelta(microseconds=dt.microsecond)
|
|
127
|
+
return dt
|
|
128
|
+
|
|
129
|
+
def datetime_to_timezone(dt, timezone='Israel'):
|
|
130
|
+
return dt.astimezone(ZoneInfo(timezone))
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def current_timestamp():
|
|
134
|
+
"""returns current timestamp (UTC) in milliseconds"""
|
|
135
|
+
return datetime.datetime.timestamp(datetime.datetime.now()) * 1000
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def timestamp_timedelta(method=False, **kwargs):
|
|
139
|
+
now = datetime.datetime.now()
|
|
140
|
+
if method:
|
|
141
|
+
calc = now + datetime.timedelta(**kwargs)
|
|
142
|
+
else:
|
|
143
|
+
calc = now - datetime.timedelta(**kwargs)
|
|
144
|
+
return calc.timestamp() * 1000
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def string_to_bool(string):
|
|
148
|
+
if string == 'True':
|
|
149
|
+
return True
|
|
150
|
+
if string == 'False':
|
|
151
|
+
return False
|
|
152
|
+
else:
|
|
153
|
+
raise ValueError('Value not equal to True or False!')
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def filter_namedtuple(namedtuple, keys, val_type=int):
|
|
157
|
+
"""
|
|
158
|
+
gets named tuple (from DataFrame.itertuples) and returns a dictionary of filtered keys from named tuple,
|
|
159
|
+
filtering out keys which have NaN values
|
|
160
|
+
:type namedtuple: Named Tuple
|
|
161
|
+
:param namedtuple: named tuple to filter
|
|
162
|
+
:type keys: list
|
|
163
|
+
:param keys: keys to filter from named tuple
|
|
164
|
+
:rtype: dict
|
|
165
|
+
:return: dictionary of keys and values filtered from named tuple
|
|
166
|
+
"""
|
|
167
|
+
d = dict()
|
|
168
|
+
for k in keys:
|
|
169
|
+
try:
|
|
170
|
+
val = getattr(namedtuple, k)
|
|
171
|
+
if pd.isna(val):
|
|
172
|
+
continue
|
|
173
|
+
if str(val).replace('.', '').isnumeric():
|
|
174
|
+
val = val_type(val)
|
|
175
|
+
d[k] = val
|
|
176
|
+
except AttributeError:
|
|
177
|
+
continue
|
|
178
|
+
return d
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def parse_si_packet(df):
|
|
182
|
+
def from_twos_complement(value):
|
|
183
|
+
if value>(pow(2,7)):
|
|
184
|
+
return value-(1<<8)
|
|
185
|
+
else:
|
|
186
|
+
return value
|
|
187
|
+
|
|
188
|
+
df['band'] = df.rawPacket.apply(lambda x: x[16:18])=="01"
|
|
189
|
+
dfn = pd.DataFrame()
|
|
190
|
+
# add column of output power
|
|
191
|
+
for band in df['band'].unique():
|
|
192
|
+
tmp = df[df['band']==band]
|
|
193
|
+
if band: # sub1g is 8 bit positive number
|
|
194
|
+
tmp = tmp.assign(tx_outputpower=tmp.rawPacket.apply(lambda x: int(x[14:16], 16)))
|
|
195
|
+
else: # ble is 8 bit negative 2's complement number
|
|
196
|
+
tmp = tmp.assign(tx_outputpower=tmp.rawPacket.apply(lambda x: from_twos_complement(int(x[14:16], 16))))
|
|
197
|
+
dfn = pd.concat([dfn, tmp])
|
|
198
|
+
# add columns of tx and rx antena
|
|
199
|
+
df['tx_ant'] = df.rawPacket.apply(lambda x: x[18:20])
|
|
200
|
+
df['rx_ant'] = df.rawPacket.apply(lambda x: x[20:22])
|
|
201
|
+
df['rssi'] = -df['rssi']
|
|
202
|
+
return df
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def match_bridge_ids(bridge_ids, alias_bridge_ids):
|
|
206
|
+
# Convert hex IDs to integers
|
|
207
|
+
bridge_ints = {bid: int(bid, 16) for bid in bridge_ids}
|
|
208
|
+
alias_ints = {abid: int(abid, 16) for abid in alias_bridge_ids}
|
|
209
|
+
matches = {}
|
|
210
|
+
for alias, alias_int in alias_ints.items():
|
|
211
|
+
cnt = 0
|
|
212
|
+
for bridge, bridge_int in bridge_ints.items():
|
|
213
|
+
# Check if aliasBridgeId matches bridgeId exactly, or with the first bit modified
|
|
214
|
+
if (alias_int == bridge_int or alias_int == (bridge_int | 0xC00000000000)):
|
|
215
|
+
cnt = cnt + 1
|
|
216
|
+
matches[alias] = bridge
|
|
217
|
+
if alias not in matches:
|
|
218
|
+
matches[alias] = None
|
|
219
|
+
return matches
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Brownout / OTA Defines
|
|
2
|
+
SEP = "#" * 50
|
|
3
|
+
MINUTES_TO_BROWN_OUT = 5
|
|
4
|
+
TABLES_SYNC_MINUTES = 70
|
|
5
|
+
MINUTES_FOR_LC = 2
|
|
6
|
+
LATEST_FW = "1.9.0"
|
|
7
|
+
SINGLE_BAT_BO_DICT = {"2.4GhzOutputPower": 2, 'txPeriodMs': 75, 'rxTxPeriodMs': 255, 'energyPattern': 25}
|
|
8
|
+
DUAL_BAT_BO_DICT = {"2.4GhzOutputPower": 2, 'txPeriodMs': 75, 'rxTxPeriodMs': 255, 'energyPattern': 50}
|
|
9
|
+
LEGACY_BO_DICT = {'energyPattern': 17, 'rxTxPeriodMs': 99}
|
|
10
|
+
# BO_DICT_PREV = {'energyPattern': 36}
|
|
11
|
+
BO_DICT = {
|
|
12
|
+
'datapath': {'config': {'pktFilter': 'Disable forwarding'}},
|
|
13
|
+
'energy2400': {'config': {'energyPattern2400': 'No Energizing'}},
|
|
14
|
+
'energySub1g': {'config': {'sub1gEnergyPattern': 'No Energizing'}},
|
|
15
|
+
'calibration': {'config': {'calibPattern': 'Disable calibration beaconing'}}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# Configuration tool / change Brg/Gw Defines
|
|
20
|
+
ATC_GW_CONFIG = {
|
|
21
|
+
'wifi': {'gwDataSrc': 'Bridges only (ch38)',
|
|
22
|
+
'pacerInterval': 60,
|
|
23
|
+
'txPeriodMs': 3,
|
|
24
|
+
'rxTxPeriodMs': 90,
|
|
25
|
+
'energizingPattern': 17,
|
|
26
|
+
"2.4GhzOutputPower": 8},
|
|
27
|
+
'lte': {},
|
|
28
|
+
'mobile': {},
|
|
29
|
+
'unknown': {}}
|
|
30
|
+
ATC_REGION_DICT = {
|
|
31
|
+
'IL': {
|
|
32
|
+
'sub1GhzFrequency': 919100,
|
|
33
|
+
'energyPattern': 50
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
energy_patterns = [18, 25, 26]
|
|
38
|
+
energy_patterns_db = {17: 50, 18: 51, 25: 56, 26: 57}
|
|
39
|
+
gw_rx_channel = {17: "Bridges only (ch39)", 18: "Bridges only (ch38)", 24: "Bridges only (ch39)",
|
|
40
|
+
25: "Bridges only (ch39)", 26: "Bridges only (ch39)", 51: "Bridges only (ch38)",
|
|
41
|
+
55: "Bridges only (ch39)", 56: "Bridges only (ch39)", 57: "Bridges only (ch39)",
|
|
42
|
+
50: "Bridges only (ch39)"}
|
|
43
|
+
shifted_brg_energy_patterns = [33, 34, 35, 58, 59, 60]
|
|
44
|
+
shifted_gw_energizing_patterns = [33]
|
|
45
|
+
lc_output_powers = [14, 17, 20, 23, 26, 29, 32]
|
|
46
|
+
fp_duty_cycles = [0.1, 0.15, 0.2, 0.25, 0.3]
|
|
47
|
+
|
|
48
|
+
# Power Mgmt
|
|
49
|
+
EXIT_POWER_MGMT_GW_DICT = {
|
|
50
|
+
'gwDataSrc': gw_rx_channel[17],
|
|
51
|
+
'txPeriodMs': 3,
|
|
52
|
+
'rxTxPeriodMs': 15,
|
|
53
|
+
'energizingPattern': 17,
|
|
54
|
+
'gwMgmtMode': 'active'
|
|
55
|
+
}
|
|
56
|
+
KEEP_ALIVE_PERIOD = 30 # seconds
|
|
57
|
+
KEEP_ALIVE_SCAN_DURATION = 300 # in millisecond
|
|
58
|
+
SEC_TO_SEND = 2
|
|
59
|
+
BROADCAST_DST_MAC = 'FFFFFFFFFFFF'
|
|
60
|
+
|
|
61
|
+
colors = ['red', 'blue', 'yellow', 'cyan', 'green', 'brown', 'orange', 'pink', 'purple', 'black']
|
|
62
|
+
|
|
63
|
+
# Test Tool
|
|
64
|
+
WH_OWNER = '832742983939'
|
|
65
|
+
INIT_GW_CONFIG = {
|
|
66
|
+
'wifi':{'gwDataSrc': gw_rx_channel[18],
|
|
67
|
+
'gwDataMode': gw_rx_channel[18]},
|
|
68
|
+
'lte':{},
|
|
69
|
+
'mobile':{},
|
|
70
|
+
'unknown':{}}
|
|
71
|
+
INIT_BRG_CONFIG = {
|
|
72
|
+
'calibration': {'config': {'calibPattern': 'Disable calibration beaconing', 'calibInterval': 10, 'calibOutputPower': 2}},
|
|
73
|
+
'externalSensor': {'config': {'adType0': 0, 'adType1': 0, 'uuidLsb0': 0, 'uuidLsb1': 0, 'uuidMsb0': 0, 'uuidMsb1': 0, 'sensor0Scramble': 0, 'sensor1Scramble': 0}},
|
|
74
|
+
'energy2400': {'config': {'dutyCycle': 30, 'outputPower': 2, 'energyPattern2400': 'No Energizing'}},
|
|
75
|
+
'datapath': {'config': {'pktFilter': 'Disable forwarding', 'txRepetition': 0, 'adaptivePacer': 0, 'pacerInterval': 15, 'unifiedEchoPkt': 0, 'commOutputPower': 2, 'globalPacingGroup': 0}},
|
|
76
|
+
'powerManagement': {'config': {'staticLedsOn': 1, 'dynamicLedsOn': 1, 'staticOnDuration': 0, 'dynamicOnDuration': 0, 'staticKeepAliveScan': 300, 'staticSleepDuration': 0, 'dynamicKeepAliveScan': 300, 'dynamicSleepDuration': 0, 'staticKeepAlivePeriod': 20, 'dynamicKeepAlivePeriod': 20}},
|
|
77
|
+
'energySub1g': {'config': {'cycle': 15, 'dutyCycle': 30, 'outputPower': 29, 'sub1gEnergyPattern': 'No Energizing'}},
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
# prev init cfg for prev brgs version (lower then version 4.0)
|
|
81
|
+
INIT_BRG_PREV_CONFIG = {
|
|
82
|
+
'energy2400': {'config': {'txPeriod': 5, 'rxTxPeriod': 15, 'outputPower': 2, 'energyPattern': 36}},
|
|
83
|
+
'datapath': {'config': {'txRepetition': 0, 'pacerInterval': 15, 'globalPacingGroup': 0}},
|
|
84
|
+
'energySub1g': {'config': {'frequency': 919100, 'outputPower': 32}}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
BRG_KEYS = ['calibPattern','calibInterval','calibOutputPower',
|
|
88
|
+
'adType0','adType1','uuidLsb0','uuidLsb1','uuidMsb0','uuidMsb1','sensor0Scramble','sensor1Scramble',
|
|
89
|
+
'txPeriod','rxTxPeriod','2.4GhzOutputPower','energyPattern','sub1GhzFrequency','sub1GhzOutputPower',
|
|
90
|
+
'dutyCycle','outputPower','energyPattern2400','pktFilter','txRepetition','adaptivePacer','pktTypesMask',
|
|
91
|
+
'pacerInterval','unifiedEchoPkt','commOutputPower','globalPacingGroup',
|
|
92
|
+
'staticLedsOn','dynamicLedsOn','staticOnDuration','dynamicOnDuration','staticKeepAliveScan','staticSleepDuration',
|
|
93
|
+
'dynamicKeepAliveScan','dynamicSleepDuration','staticKeepAlivePeriod','dynamicKeepAlivePeriod',
|
|
94
|
+
'cycle','dutyCycle','outputPower','sub1gEnergyPattern']
|
|
95
|
+
GW_KEYS = ['gwDataSrc', 'gwDataMode']
|
|
96
|
+
GW_DATA_SRC = 'gwDataSrc'
|
|
97
|
+
GW_DATA_MODE = 'gwDataMode'
|
|
98
|
+
GW_KEYS_THIN = ['dataCoupling', 'useStaticLocation', 'gwMgmtMode']
|
|
99
|
+
GW_SHARED_KEYS = ['gw_2.4GhzOutputPower', 'gw_txPeriodMs', 'gw_pacerInterval', 'gw_energizingPattern',
|
|
100
|
+
'gw_rxTxPeriodMs']
|
|
101
|
+
TIME_COLUMNS = ['endTimestamp', 'startTimestamp', 'receivedTestConfigTimestamp']
|
|
102
|
+
TEST_CONFIG_COLUMNS = ['testId', 'testTimeMins', 'gatewaysIncluded', 'bridgesIncluded']
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
|
3
|
+
# source: wltPb.proto
|
|
4
|
+
# Protobuf Python Version: 4.25.1
|
|
5
|
+
"""Generated protocol buffer code."""
|
|
6
|
+
from google.protobuf import descriptor as _descriptor
|
|
7
|
+
from google.protobuf import descriptor_pool as _descriptor_pool
|
|
8
|
+
from google.protobuf import symbol_database as _symbol_database
|
|
9
|
+
from google.protobuf.internal import builder as _builder
|
|
10
|
+
# @@protoc_insertion_point(imports)
|
|
11
|
+
|
|
12
|
+
_sym_db = _symbol_database.Default()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0bwltPb.proto\x12\x05wltPb\"$\n\x08Location\x12\x0b\n\x03lat\x18\x01 \x01(\x01\x12\x0b\n\x03lng\x18\x02 \x01(\x01\"j\n\x05Value\x12\x16\n\x0cintegerValue\x18\x01 \x01(\x03H\x00\x12\x15\n\x0bnumberValue\x18\x02 \x01(\x01H\x00\x12\x15\n\x0bstringValue\x18\x03 \x01(\tH\x00\x12\x13\n\tboolValue\x18\x04 \x01(\x08H\x00\x42\x06\n\x04type\"\x89\x02\n\x0bGatewayData\x12\x11\n\tgatewayId\x18\x01 \x01(\t\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\x12*\n\x07packets\x18\x03 \x03(\x0b\x32\x19.wltPb.GatewayData.Packet\x12&\n\x08location\x18\x04 \x01(\x0b\x32\x0f.wltPb.LocationH\x00\x88\x01\x01\x1as\n\x06Packet\x12\x0f\n\x07payload\x18\x01 \x01(\x0c\x12\x11\n\ttimestamp\x18\x02 \x01(\x04\x12\x12\n\nsequenceId\x18\x03 \x01(\r\x12\x11\n\x04rssi\x18\x04 \x01(\rH\x00\x88\x01\x01\x12\x15\n\raliasBridgeId\x18\x05 \x01(\tB\x07\n\x05_rssiB\x0b\n\t_location\"\xc9\x01\n\rUplinkMessage\x12-\n\rgatewayStatus\x18\x01 \x01(\x0b\x32\x14.wltPb.GatewayStatusH\x00\x12)\n\x0bgatewayInfo\x18\x02 \x01(\x0b\x32\x12.wltPb.GatewayInfoH\x00\x12)\n\x0bgatewayLogs\x18\x03 \x01(\x0b\x32\x12.wltPb.GatewayLogsH\x00\x12+\n\x0c\x61\x63tionStatus\x18\x04 \x01(\x0b\x32\x13.wltPb.ActionStatusH\x00\x42\x06\n\x04type\"\xdb\x03\n\rGatewayStatus\x12\x11\n\tgatewayId\x18\x01 \x01(\t\x12\x13\n\x0bgatewayType\x18\x02 \x01(\t\x12\x19\n\x11\x64ownlinkSupported\x18\x03 \x01(\x08\x12!\n\x19\x62ridgeOtaUpgradeSupported\x18\x04 \x01(\x08\x12\x12\n\napiVersion\x18\x05 \x01(\r\x12\x14\n\x07version\x18\x06 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0c\x62leSwVersion\x18\x07 \x01(\tH\x01\x88\x01\x01\x12\x1f\n\x12interfaceSwVersion\x18\x08 \x01(\tH\x02\x88\x01\x01\x12&\n\x08location\x18\t \x01(\x0b\x32\x0f.wltPb.LocationH\x03\x88\x01\x01\x12\x30\n\x06\x63onfig\x18\n \x03(\x0b\x32 .wltPb.GatewayStatus.ConfigEntry\x12\x17\n\nbleAddress\x18\x0b \x01(\tH\x04\x88\x01\x01\x1a;\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.wltPb.Value:\x02\x38\x01\x42\n\n\x08_versionB\x0f\n\r_bleSwVersionB\x15\n\x13_interfaceSwVersionB\x0b\n\t_locationB\r\n\x0b_bleAddress\"}\n\x0bGatewayInfo\x12\x30\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\x1f.wltPb.GatewayInfo.EntriesEntry\x1a<\n\x0c\x45ntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.wltPb.Value:\x02\x38\x01\"\x1b\n\x0bGatewayLogs\x12\x0c\n\x04logs\x18\x01 \x03(\t\".\n\x0c\x41\x63tionStatus\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\r\x12\x0e\n\x06status\x18\x02 \x01(\r\"\xa7\x02\n\x0f\x44ownlinkMessage\x12#\n\x08txPacket\x18\x01 \x01(\x0b\x32\x0f.wltPb.TxPacketH\x00\x12-\n\rgatewayAction\x18\x02 \x01(\x0b\x32\x14.wltPb.GatewayActionH\x00\x12-\n\rbridgeUpgrade\x18\x03 \x01(\x0b\x32\x14.wltPb.BridgeUpgradeH\x00\x12-\n\rgatewayConfig\x18\x04 \x01(\x0b\x32\x14.wltPb.GatewayConfigH\x00\x12+\n\x0c\x63ustomBroker\x18\x05 \x01(\x0b\x32\x13.wltPb.CustomBrokerH\x00\x12-\n\rcustomMessage\x18\x06 \x01(\x0b\x32\x14.wltPb.CustomMessageH\x00\x42\x06\n\x04type\"F\n\x08TxPacket\x12\x0f\n\x07payload\x18\x01 \x01(\x0c\x12\x12\n\nmaxRetries\x18\x02 \x01(\r\x12\x15\n\rmaxDurationMs\x18\x03 \x01(\r\"\x1f\n\rGatewayAction\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\"\xa5\x01\n\rBridgeUpgrade\x12\x14\n\x0crebootPacket\x18\x01 \x01(\x0c\x12\x17\n\x0ftxMaxDurationMs\x18\x02 \x01(\r\x12\x14\n\x0ctxMaxRetries\x18\x03 \x01(\r\x12\x10\n\x08\x62ridgeId\x18\x04 \x01(\t\x12\x13\n\x0bversionUuid\x18\x05 \x01(\t\x12\x13\n\x0bupgradeBlSd\x18\x06 \x01(\x08\x12\x13\n\x0bimageDirUrl\x18\x07 \x01(\t\"\xb9\x02\n\rGatewayConfig\x12\x14\n\x07version\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0c\x62leSwVersion\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x1f\n\x12interfaceSwVersion\x18\x03 \x01(\tH\x02\x88\x01\x01\x12&\n\x08location\x18\x04 \x01(\x0b\x32\x0f.wltPb.LocationH\x03\x88\x01\x01\x12\x30\n\x06\x63onfig\x18\x05 \x03(\x0b\x32 .wltPb.GatewayConfig.ConfigEntry\x1a;\n\x0b\x43onfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.wltPb.Value:\x02\x38\x01\x42\n\n\x08_versionB\x0f\n\r_bleSwVersionB\x15\n\x13_interfaceSwVersionB\x0b\n\t_location\"\xa6\x01\n\x0c\x43ustomBroker\x12\x14\n\x0c\x63ustomBroker\x18\x01 \x01(\x08\x12\x0c\n\x04port\x18\x02 \x01(\r\x12\x11\n\tbrokerUrl\x18\x03 \x01(\t\x12\x10\n\x08username\x18\x04 \x01(\t\x12\x10\n\x08password\x18\x05 \x01(\t\x12\x13\n\x0bupdateTopic\x18\x06 \x01(\t\x12\x13\n\x0bstatusTopic\x18\x07 \x01(\t\x12\x11\n\tdataTopic\x18\x08 \x01(\t\"\x81\x01\n\rCustomMessage\x12\x32\n\x07\x65ntries\x18\x01 \x03(\x0b\x32!.wltPb.CustomMessage.EntriesEntry\x1a<\n\x0c\x45ntriesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1b\n\x05value\x18\x02 \x01(\x0b\x32\x0c.wltPb.Value:\x02\x38\x01\x62\x06proto3')
|
|
18
|
+
|
|
19
|
+
_globals = globals()
|
|
20
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
21
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'wltPb_pb2', _globals)
|
|
22
|
+
if _descriptor._USE_C_DESCRIPTORS == False:
|
|
23
|
+
DESCRIPTOR._options = None
|
|
24
|
+
_globals['_GATEWAYSTATUS_CONFIGENTRY']._options = None
|
|
25
|
+
_globals['_GATEWAYSTATUS_CONFIGENTRY']._serialized_options = b'8\001'
|
|
26
|
+
_globals['_GATEWAYINFO_ENTRIESENTRY']._options = None
|
|
27
|
+
_globals['_GATEWAYINFO_ENTRIESENTRY']._serialized_options = b'8\001'
|
|
28
|
+
_globals['_GATEWAYCONFIG_CONFIGENTRY']._options = None
|
|
29
|
+
_globals['_GATEWAYCONFIG_CONFIGENTRY']._serialized_options = b'8\001'
|
|
30
|
+
_globals['_CUSTOMMESSAGE_ENTRIESENTRY']._options = None
|
|
31
|
+
_globals['_CUSTOMMESSAGE_ENTRIESENTRY']._serialized_options = b'8\001'
|
|
32
|
+
_globals['_LOCATION']._serialized_start=22
|
|
33
|
+
_globals['_LOCATION']._serialized_end=58
|
|
34
|
+
_globals['_VALUE']._serialized_start=60
|
|
35
|
+
_globals['_VALUE']._serialized_end=166
|
|
36
|
+
_globals['_GATEWAYDATA']._serialized_start=169
|
|
37
|
+
_globals['_GATEWAYDATA']._serialized_end=434
|
|
38
|
+
_globals['_GATEWAYDATA_PACKET']._serialized_start=306
|
|
39
|
+
_globals['_GATEWAYDATA_PACKET']._serialized_end=421
|
|
40
|
+
_globals['_UPLINKMESSAGE']._serialized_start=437
|
|
41
|
+
_globals['_UPLINKMESSAGE']._serialized_end=638
|
|
42
|
+
_globals['_GATEWAYSTATUS']._serialized_start=641
|
|
43
|
+
_globals['_GATEWAYSTATUS']._serialized_end=1116
|
|
44
|
+
_globals['_GATEWAYSTATUS_CONFIGENTRY']._serialized_start=977
|
|
45
|
+
_globals['_GATEWAYSTATUS_CONFIGENTRY']._serialized_end=1036
|
|
46
|
+
_globals['_GATEWAYINFO']._serialized_start=1118
|
|
47
|
+
_globals['_GATEWAYINFO']._serialized_end=1243
|
|
48
|
+
_globals['_GATEWAYINFO_ENTRIESENTRY']._serialized_start=1183
|
|
49
|
+
_globals['_GATEWAYINFO_ENTRIESENTRY']._serialized_end=1243
|
|
50
|
+
_globals['_GATEWAYLOGS']._serialized_start=1245
|
|
51
|
+
_globals['_GATEWAYLOGS']._serialized_end=1272
|
|
52
|
+
_globals['_ACTIONSTATUS']._serialized_start=1274
|
|
53
|
+
_globals['_ACTIONSTATUS']._serialized_end=1320
|
|
54
|
+
_globals['_DOWNLINKMESSAGE']._serialized_start=1323
|
|
55
|
+
_globals['_DOWNLINKMESSAGE']._serialized_end=1618
|
|
56
|
+
_globals['_TXPACKET']._serialized_start=1620
|
|
57
|
+
_globals['_TXPACKET']._serialized_end=1690
|
|
58
|
+
_globals['_GATEWAYACTION']._serialized_start=1692
|
|
59
|
+
_globals['_GATEWAYACTION']._serialized_end=1723
|
|
60
|
+
_globals['_BRIDGEUPGRADE']._serialized_start=1726
|
|
61
|
+
_globals['_BRIDGEUPGRADE']._serialized_end=1891
|
|
62
|
+
_globals['_GATEWAYCONFIG']._serialized_start=1894
|
|
63
|
+
_globals['_GATEWAYCONFIG']._serialized_end=2207
|
|
64
|
+
_globals['_GATEWAYCONFIG_CONFIGENTRY']._serialized_start=977
|
|
65
|
+
_globals['_GATEWAYCONFIG_CONFIGENTRY']._serialized_end=1036
|
|
66
|
+
_globals['_CUSTOMBROKER']._serialized_start=2210
|
|
67
|
+
_globals['_CUSTOMBROKER']._serialized_end=2376
|
|
68
|
+
_globals['_CUSTOMMESSAGE']._serialized_start=2379
|
|
69
|
+
_globals['_CUSTOMMESSAGE']._serialized_end=2508
|
|
70
|
+
_globals['_CUSTOMMESSAGE_ENTRIESENTRY']._serialized_start=1183
|
|
71
|
+
_globals['_CUSTOMMESSAGE_ENTRIESENTRY']._serialized_end=1243
|
|
72
|
+
# @@protoc_insertion_point(module_scope)
|