gateway.py 5.49 KB
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Do not execute directly.
Please execute gateway_http_downlink.py
Created on Tue Jun 8 16:37:22 2021
@author: Georges de Massol
"""
from gateway_http_downlink import Downlink
from Endpoint import Endpoint
import time
from datetime import datetime
import os
import json
import base64
APIKey = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlfa2V5X2lkIjoiYzA2ZGY1MDMtNjE5Zi00ZjI2LTgxNzEtYTU0OTRmMWJmYmRmIiwiYXVkIjoiYXMiLCJpc3MiOiJhcyIsIm5iZiI6MTYyMjY1MzMzMSwic3ViIjoiYXBpX2tleSJ9.23eLyvgd5zheP9hDM0acCAl9ojhQjLTZAU77IKqhvQY'
server = 'localhost:8080'
#just defining an instance to be used
downlink = Downlink(server, APIKey)
directory = '/home/pi/python/'
State = 0
def WriteFile(body, event):
filename = directory + "log/" + \
time.strftime("%Y_%m_%d_%H-%M-%S") + '_' + event
# in case of unexisting folder 'log'
if not os.path.exists(directory + 'log'):
os.mkdir(directory + 'log')
# in case of already existing file :
if os.path.exists(filename + ".json"):
i = 2
while(os.path.exists(filename + '_' + str(i) + ".json")):
i += 1
path = filename + '_' + str(i) + ".json"
else:
path = filename + ".json"
f = open(path, "a")
f.write(body.decode("utf-8"))
f.close()
print("file written : %s" % path)
def step0(Tn, endpoint):
global T2, State
print("Last State sss : %s" % State)
if State != 0:
print("probable error : message unexpected :")
print("Last State sss : %s" % State)
print("Current State : 0")
#reset()
T2 = Tn
State = 0
State=0
dTg=0
T3=0
def step1(data, endpoint):
global T3, State, dTg
T3 = data
State = 1
#time spent by gateway between uplink and downlink
dTg = T3+1
print ("Tg : %s" % dTg.to_bytes(4, 'big'))
downlink.FlushQueue(endpoint.EUI)
# send all data for step 3
downlink.Lorasend(endpoint.EUI, b'\x01' + dTg.to_bytes(7, 'big'))
def step2(endpoint, data):
global State, dTg
if State != 1:
print("probable error : message unexpected :")
print("Last State : %s" % State)
print("Current State : 2")
reset(endpoint)
State = 2
dTe = int.from_bytes(data, 'big')
dTv = (dTe - dTg)/2
print("time of flight (samples number) : %s" % dTv)
print("time of flight (microseconds) : %s" % (dTv * 0.0005)) ## 1 sample = 500ns
def step3(endpoint):
global State
State = 3
#reset the endpoint
reset(endpoint)
def reset(endpoint):
global State
downlink.FlushQueue(endpoint.EUI)
downlink.Lorasend(endpoint.EUI, b'\x55')#initialisation packet
print("enpoint reset : %s" % endpoint.EUI)
State = 0
def postcompute(event, body, Tn):
print("D")
global data
print(datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
json_ = json.loads(body)
endpoint = Endpoint()
endpoint.EUIfromjson(json_)
print("request from :\nEUI : %s" % endpoint.EUI)
print("name : %s" % json_['deviceName'])
# write json in a file
WriteFile(body, event)
print("event : %s " % event)
print(datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
#treat all cases
if event == 'up':
#b64 to bytes
data = base64.b64decode(json_["data"])
#bytes to integer
integer = int.from_bytes(data, 'big')
print("data received from Endpoint : ")
print("base 64 : %s" % json_["data"])
print("bytes : %s" % data)
print("int : %s" % integer)
print()
step = data[0]
print("step : %s" % step)
print("data : %s" % data[1:])
if step == 0:
step0(Tn, endpoint)
elif step == 2:
step2(endpoint, data[1:])
else:
print("error : uncovered step : %s" % step)
reset(endpoint)
"""
print("preparation des donnees pour envoi a la prochaine connection du EndNode")
print(datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
print("message pour : %s" % endpoint.EUI)
print("message int : %s" % integer)
#send a LoRa packet
fCnt = downlink.Lorasend(endpoint.EUI, data)
# Print the downlink frame-counter value.
print("fCnt : %s" % fCnt)
"""
print(datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
data = int.from_bytes(data, 'big')
print("fin")
elif event == 'txack':
print("data sent to endpoint")
if State == 0:
step1(data, endpoint)
elif State == 2:
step3(endpoint)
else:
print('error : state %s not expected', State)
reset(endpoint)
elif event == 'error':
print('error : ' + json_["error"])
else:
print("possible error : uncovered event")
print(body)
reset(endpoint)
print()
# def start():
# ok = False
# while not ok:
# try:
# Time = time.time()
# fCnt = downlink.Lorasend("70b3d549966002e1", Time)
# print(fCnt)
# time.sleep(5)
# ok = True
# except:
# pass
#
# start()
#print ("Chirpstack API Key :\n%s" % downlink.api_token)
print("Chirpstack server for downlink : %s" % downlink.server)