Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4839736

Browse files
author
Catalin Ioana
committed
2 parents eb87042 + 2646ca1 commit 4839736

27 files changed

+7597
-397
lines changed

examples/OTA-lorawan/LoraServer.py

Lines changed: 259 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,259 @@
1+
#!/usr/bin/env python3
2+
3+
4+
import urllib.request
5+
import binascii
6+
import base64
7+
import os
8+
import json
9+
import config
10+
11+
login_payload = {
12+
"password": "string",
13+
"username": "string"
14+
}
15+
16+
mcGroup_payload = {
17+
"multicastGroup": {
18+
"dr": 0,
19+
"fCnt": 0,
20+
"frequency": 0,
21+
"groupType": "CLASS_C",
22+
"id": "string",
23+
"mcAddr": "string",
24+
"mcAppSKey": "string",
25+
"mcNwkSKey": "string",
26+
"name": "string",
27+
"pingSlotPeriod": 0,
28+
"serviceProfileID": "string"
29+
}
30+
}
31+
32+
mcQueue_payload = {
33+
"multicastQueueItem": {
34+
"data": "string",
35+
"fCnt": 0,
36+
"fPort": 1,
37+
"multicastGroupID": "string"
38+
}
39+
}
40+
41+
mcAddDevice_payload = {
42+
"devEUI": "string",
43+
"multicastGroupID": "string"
44+
}
45+
46+
class LoraServerClient:
47+
48+
def __init__(self):
49+
self.server = config.LORASERVER_URL
50+
self.port = config.LORASERVER_API_PORT
51+
self.username = config.LORASERVER_USER
52+
self.passwd = config.LORASERVER_PASS
53+
54+
def login(self):
55+
url = self.server + ':' + str(self.port) + '/api/internal/login'
56+
57+
login_payload["password"] = self.passwd
58+
login_payload["username"] = self.username
59+
60+
payload = bytes(json.dumps(login_payload),'utf-8')
61+
62+
try:
63+
r = urllib.request.Request(url, data= payload, method= 'POST')
64+
r.add_header("Content-Type", "application/json")
65+
r.add_header("Accept", "application/json")
66+
67+
with urllib.request.urlopen(r) as f:
68+
return json.loads(f.read().decode('utf-8'))['jwt']
69+
70+
except Exception as ex:
71+
print("Error getting the jwt: {}".format(ex))
72+
73+
return None
74+
75+
def parse_service_profile_list(self, response, profile_name):
76+
77+
try:
78+
json_obj = json.loads(response)
79+
for sp_obj in json_obj["result"]:
80+
if sp_obj["name"] == profile_name:
81+
return sp_obj["id"]
82+
except Exception as ex:
83+
print("Error parsing service profile list: {}".format(ex))
84+
85+
return None
86+
87+
def request_service_profile_id(self, profile_name, jwt):
88+
url = self.server + ':' + str(self.port) + '/api/service-profiles?limit=100'
89+
90+
try:
91+
r = urllib.request.Request(url, method= 'GET')
92+
r.add_header("Accept", "application/json")
93+
r.add_header("Grpc-Metadata-Authorization", "Bearer " + jwt)
94+
95+
with urllib.request.urlopen(r) as f:
96+
return self.parse_service_profile_list(f.read().decode('utf-8'), profile_name)
97+
98+
except Exception as ex:
99+
print("Error getting service profile id: {}".format(ex))
100+
101+
return None
102+
103+
def create_multicast_group(self, dr, freq, group_name, serviceProfileID, jwt):
104+
105+
group_id = self.generate_random_id()
106+
mcAddr = self.generate_randon_addr()
107+
mcAppSKey = self.generate_random_key()
108+
mcNwkSKey = self.generate_random_key()
109+
110+
url = self.server + ':' + str(self.port) + '/api/multicast-groups'
111+
112+
mcGroup_payload["multicastGroup"]["dr"] = dr
113+
mcGroup_payload["multicastGroup"]["frequency"] = freq
114+
mcGroup_payload["multicastGroup"]["id"] = group_id.decode("utf-8")
115+
mcGroup_payload["multicastGroup"]["mcAddr"] = mcAddr.decode("utf-8")
116+
mcGroup_payload["multicastGroup"]["mcAppSKey"] = mcAppSKey.decode("utf-8")
117+
mcGroup_payload["multicastGroup"]["mcNwkSKey"] = mcNwkSKey.decode("utf-8")
118+
mcGroup_payload["multicastGroup"]["name"] = group_name
119+
mcGroup_payload["multicastGroup"]["serviceProfileID"] = serviceProfileID
120+
121+
payload = bytes(json.dumps(mcGroup_payload),'utf-8')
122+
123+
124+
try:
125+
r = urllib.request.Request(url, data= payload, method= 'POST')
126+
r.add_header("Content-Type", "application/json")
127+
r.add_header("Accept", "application/json")
128+
r.add_header("Grpc-Metadata-Authorization", "Bearer " + jwt)
129+
130+
with urllib.request.urlopen(r) as f:
131+
resp = f.read().decode('utf-8')
132+
if '"id":' in resp:
133+
multicast_id = json.loads(resp)["id"]
134+
return (multicast_id, mcAddr, mcNwkSKey, mcAppSKey)
135+
else:
136+
return None
137+
except Exception as ex:
138+
print("Error creating multicast data: {}".format(ex))
139+
140+
return None
141+
142+
def delete_multicast_group(self, group_id):
143+
144+
url = self.server + ':' + str(self.port) + '/api/multicast-groups/' + group_id
145+
146+
try:
147+
r = urllib.request.Request(url, method = 'DELETE')
148+
149+
with urllib.request.urlopen(r) as f:
150+
return f.getcode() == 200
151+
152+
except Exception as ex:
153+
print("Error deleting multicast group: {}".format(ex))
154+
155+
return False
156+
157+
def add_device_multicast_group(self, devEUI, group_id, jwt):
158+
159+
url = self.server + ':' + str(self.port) + '/api/multicast-groups/' + group_id + '/devices'
160+
161+
mcAddDevice_payload["devEUI"] = devEUI
162+
mcAddDevice_payload["multicastGroupID"] = group_id
163+
164+
payload = json.dumps(mcAddDevice_payload).encode('utf-8')
165+
166+
try:
167+
r = urllib.request.Request(url, data= payload, method= 'POST')
168+
r.add_header("Content-Type", "application/json")
169+
r.add_header("Accept", "application/json")
170+
r.add_header("Grpc-Metadata-Authorization", "Bearer " + jwt)
171+
172+
with urllib.request.urlopen(r) as f:
173+
return f.getcode() == 200
174+
175+
except Exception as ex:
176+
print("Error adding device to multicast group: {}".format(ex))
177+
178+
return False
179+
180+
def request_multicast_keys(self, group_id, jwt):
181+
182+
url = self.server + ':' + str(self.port) + '/api/multicast-groups/' + group_id
183+
184+
try:
185+
r = urllib.request.Request(url, method= 'GET')
186+
r.add_header("Accept", "application/json")
187+
r.add_header("Grpc-Metadata-Authorization", "Bearer " + jwt)
188+
189+
with urllib.request.urlopen(r) as f:
190+
resp = f.read().decode('utf-8')
191+
if "mcNwkSKey" in resp:
192+
json_resp = json.loads(resp)["multicastGroup"]
193+
return (json_resp["mcAddr"], json_resp["mcNwkSKey"], json_resp["mcAppSKey"])
194+
else:
195+
return None
196+
except Exception as ex:
197+
print("Error getting multicast keys: {}".format(ex))
198+
199+
return None
200+
201+
def generate_randon_addr(self):
202+
return binascii.hexlify(os.urandom(4))
203+
204+
def generate_random_key(self):
205+
return binascii.hexlify(os.urandom(16))
206+
207+
def generate_random_id(self):
208+
return binascii.hexlify(os.urandom(4)) + b'-' + binascii.hexlify(os.urandom(2)) + b'-' + binascii.hexlify(os.urandom(2)) \
209+
+ b'-' + binascii.hexlify(os.urandom(2)) + b'-' + binascii.hexlify(os.urandom(6))
210+
211+
def multicast_queue_length(self, jwt, multicast_group):
212+
url = self.server + ':' + str(self.port) + '/api/multicast-groups/' + multicast_group + '/queue'
213+
214+
try:
215+
r = urllib.request.Request(url, method= 'GET')
216+
r.add_header("Content-Type", "application/json")
217+
r.add_header("Grpc-Metadata-Authorization", "Bearer " + jwt)
218+
219+
with urllib.request.urlopen(r) as f:
220+
resp = f.read().decode('utf-8')
221+
if "multicastQueueItems" in resp:
222+
print(resp)
223+
json_resp = json.loads(resp)["multicastQueueItems"]
224+
print("Len: {}".format(len(json_resp)))
225+
return len(json_resp)
226+
else:
227+
return -1
228+
229+
except Exception as ex:
230+
print("Error getting multicast queue length: {}".format(ex))
231+
232+
return -1
233+
234+
235+
def send(self, jwt, multicast_group, data):
236+
url = self.server + ':' + str(self.port) + '/api/multicast-groups/' + multicast_group + '/queue'
237+
238+
mcQueue_payload["multicastQueueItem"]["data"] = base64.b64encode(data).decode("utf-8")
239+
mcQueue_payload["multicastQueueItem"]["multicastGroupID"] = multicast_group
240+
241+
payload = bytes(json.dumps(mcQueue_payload),'utf-8')
242+
243+
try:
244+
r = urllib.request.Request(url, data= payload, method= 'POST')
245+
r.add_header("Content-Type", "application/json")
246+
r.add_header("Accept", "application/json")
247+
r.add_header("Grpc-Metadata-Authorization", "Bearer " + jwt)
248+
249+
with urllib.request.urlopen(r) as f:
250+
return f.getcode() == 200
251+
252+
except Exception as ex:
253+
print("Error sending multicast data: {}".format(ex))
254+
255+
return False
256+
257+
258+
259+

examples/OTA-lorawan/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Coming soon
2+

examples/OTA-lorawan/config.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#!/usr/bin/env python3
2+
3+
4+
#LORASERVER configuration
5+
LORASERVER_IP = "127.0.0.1"
6+
LORASERVER_URL = 'http://localhost'
7+
LORASERVER_MQTT_PORT = 1883
8+
LORASERVER_API_PORT = 8080
9+
LORASERVER_USER = 'admin'
10+
LORASERVER_PASS = 'admin'
11+
12+
LORASERVER_SERVICE_PROFILE = 'multicast_sp'
13+
LORASERVER_DOWNLINK_DR = 5
14+
LORASERVER_DOWNLINK_FREQ = 869525000
15+
16+
#update configuration
17+
UPDATE_DELAY = 300
18+

0 commit comments

Comments
 (0)