gat.py 5.25 KB
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Do not execute directly. 
Please execute gateway_http_uplink.py

Created on Mon Oct 19 2021

@author: ALKADRI Mohammad
"""

from gateway_http_downlink import Downlink

from Endpoint import Endpoint

import time
from datetime import datetime
import os
import json
import base64
import numpy as np
import threading
import socket
import struct

sema=threading.Semaphore(value=0)
sema2=threading.Semaphore(value=0)
APIKey = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcGlfa2V5X2lkIjoiYzA2ZGY1MDMtNjE5Zi00ZjI2LTgxNzEtYTU0OTRmMWJmYmRmIiwiYXVkIjoiYXMiLCJpc3MiOiJhcyIsIm5iZiI6MTYyMjY1MzMzMSwic3ViIjoiYXBpX2tleSJ9.23eLyvgd5zheP9hDM0acCAl9ojhQjLTZAU77IKqhvQY'
server = 'localhost:8080'
#just defining an instance to be used
downlink = Downlink(server, APIKey)
directory = '/home/pi/python/'



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(endpoint):
    downlink.FlushQueue(endpoint.EUI)
    downlink.Lorasend(endpoint.EUI, b'\x46')
    print("State: The data sent by Gateway")
    #sema2.release() #threading.Thread(target=thread_server, args=()).start()
def step1(endpoint):
        global TT
        #global c
        #threading.Thread(target=thread_Tgw, args=()).start()
        sema.acquire(1)
        #if TT == 5555:
        #    c=1
        #threading.Thread(target=thread_Tgw, args=()).start()
        #print ("T : %s" %TT)
        print ("T : %s" % struct.pack('dd',TT[0],TT[1]))# TT.to_bytes(8, 'big'))
        downlink.FlushQueue(endpoint.EUI)
        # send all data
        downlink.Lorasend(endpoint.EUI, struct.pack('dd',TT[0],TT[1]))#TT.to_bytes(8, 'big'))


def reset(endpoint):
    downlink.FlushQueue(endpoint.EUI)
    downlink.Lorasend(endpoint.EUI, b'\x55') #initialisation packet
    print("enpoint reset : %s" % endpoint.EUI)


def postcompute(event, body, Tn):
    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()
        print(datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3])
        data = int.from_bytes(data, 'big')
        print("data  : %s" % data)
        if data == 0x5374617274 :     # 0x5374617274 : Start
            sema2.release()
            global c
            c=1
        if data == 0x54696D6573:     # 0x54696D6573 : Times
            threading.Thread(target=thread_Tgw, args=()).start()

        #step0(endpoint)
    elif event == 'txack':
        print("data  : %s" % data)
        if data == 0x5374617274 :     # 0x5374617274 : Start
            step0(endpoint)
        elif data == 0x54696D6573:     # 0x54696D6573 : Times
            step1(endpoint)
        else:
            print("error : uncovered State")
            reset(endpoint)
    elif event == 'error':
        print('error : ' + json_["error"])
    else:
                #step1(endpoint)
                print("possible error : uncovered event")
                print(body)
                reset(endpoint)
    print()

def thread_Tgw():
    global c
    global TT
    TT = [5555,5555]
    while(c):
        #global TT
        sock_T=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        sock_T.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
        sock_T.connect(('127.0.0.1',2222))
        TT=sock_T.recv(64)
        print(TT)
        #TT=int.from_bytes(TT, 'little')
        TT=struct.unpack('dd',TT)
        #sema.release()
        c=0
        sock_T.close()
    sema.release()
def thread_server():
    a=1
    while(1):
        #global TT
        sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
        sock.bind(('127.0.0.1',4242))
        sock.listen(1)
        conn,addr=sock.accept()
        with conn:
            data='q'
            sema2.acquire(1)
            conn.send(data.encode('ascii'))
            a=0
            sock.close()
threading.Thread(target=thread_server, args=()).start()
c=1
print("Chirpstack server for downlink  : %s" % downlink.server)