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.
Files changed (51) hide show
  1. gw_certificate/__init__.py +0 -0
  2. gw_certificate/ag/ut_defines.py +361 -0
  3. gw_certificate/ag/wlt_types.py +85 -0
  4. gw_certificate/ag/wlt_types_ag.py +5310 -0
  5. gw_certificate/ag/wlt_types_data.py +64 -0
  6. gw_certificate/api/extended_api.py +1547 -0
  7. gw_certificate/api_if/__init__.py +0 -0
  8. gw_certificate/api_if/api_validation.py +40 -0
  9. gw_certificate/api_if/gw_capabilities.py +18 -0
  10. gw_certificate/common/analysis_data_bricks.py +1455 -0
  11. gw_certificate/common/debug.py +63 -0
  12. gw_certificate/common/utils.py +219 -0
  13. gw_certificate/common/utils_defines.py +102 -0
  14. gw_certificate/common/wltPb_pb2.py +72 -0
  15. gw_certificate/common/wltPb_pb2.pyi +227 -0
  16. gw_certificate/gw_certificate.py +138 -0
  17. gw_certificate/gw_certificate_cli.py +70 -0
  18. gw_certificate/interface/ble_simulator.py +91 -0
  19. gw_certificate/interface/ble_sniffer.py +189 -0
  20. gw_certificate/interface/if_defines.py +35 -0
  21. gw_certificate/interface/mqtt.py +469 -0
  22. gw_certificate/interface/packet_error.py +22 -0
  23. gw_certificate/interface/pkt_generator.py +720 -0
  24. gw_certificate/interface/uart_if.py +193 -0
  25. gw_certificate/interface/uart_ports.py +20 -0
  26. gw_certificate/templates/results.html +241 -0
  27. gw_certificate/templates/stage.html +22 -0
  28. gw_certificate/templates/table.html +6 -0
  29. gw_certificate/templates/test.html +38 -0
  30. gw_certificate/tests/__init__.py +11 -0
  31. gw_certificate/tests/actions.py +131 -0
  32. gw_certificate/tests/bad_crc_to_PER_quantization.csv +51 -0
  33. gw_certificate/tests/connection.py +181 -0
  34. gw_certificate/tests/downlink.py +174 -0
  35. gw_certificate/tests/generic.py +161 -0
  36. gw_certificate/tests/registration.py +288 -0
  37. gw_certificate/tests/static/__init__.py +0 -0
  38. gw_certificate/tests/static/connection_defines.py +9 -0
  39. gw_certificate/tests/static/downlink_defines.py +9 -0
  40. gw_certificate/tests/static/generated_packet_table.py +209 -0
  41. gw_certificate/tests/static/packet_table.csv +10051 -0
  42. gw_certificate/tests/static/references.py +4 -0
  43. gw_certificate/tests/static/uplink_defines.py +20 -0
  44. gw_certificate/tests/throughput.py +244 -0
  45. gw_certificate/tests/uplink.py +683 -0
  46. wiliot_certificate-1.3.0a1.dist-info/LICENSE +21 -0
  47. wiliot_certificate-1.3.0a1.dist-info/METADATA +113 -0
  48. wiliot_certificate-1.3.0a1.dist-info/RECORD +51 -0
  49. wiliot_certificate-1.3.0a1.dist-info/WHEEL +5 -0
  50. wiliot_certificate-1.3.0a1.dist-info/entry_points.txt +2 -0
  51. 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)