Blame view
gw_RPi3/python/gate.py
4.46 KB
7e6be9319 gateway commit |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
#!/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 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(4, 'big')) def step2(endpoint, data): global State if State != 1: print("probable error : message unexpected :") print("Last State : %s" % State) print("Current State : 2") reset() 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 : EUI : %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(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() print("Chirpstack server for downlink : %s" % downlink.server) |