#!/usr/bin/env python3 # -*- coding: utf-8 -*- import socketserver import threading import logging import modem import static #from other import * import other modem = modem.RF() class TCPRequestHandler(socketserver.BaseRequestHandler): def handle(self): # self.request is the TCP socket connected to the client self.data = self.request.recv(1024).strip() # interrupt listening loop "while true" by setting MODEM_RECEIVE to False #if len(self.data) > 0: # static.MODEM_RECEIVE = False ####print("{} wrote:".format(self.client_address[0])) ####print(self.data) # just send back the same data, but upper-cased #####self.request.sendall(self.data.upper()) #if self.data == b'TEST': #logging.info("DER TEST KLAPPT! HIER KOMMT DER COMMAND PARSER HIN!") # BROADCAST PARSER ----------------------------------------------------------- if self.data.startswith(b'BC:'): static.MODEM_RECEIVE = True ####### FALSE.... #print(static.MODEM_RECEIVE) data = self.data.split(b'BC:') daten = modem.Transmit(data[1]) static.MODEM_RECEIVE = True #print(static.MODEM_RECEIVE) # ACKNOWLEDGE PARSER ----------------------------------------------------------- if self.data.startswith(b'ACK:'): static.MODEM_RECEIVE = True ############## FALSE #print(static.MODEM_RECEIVE) data = self.data.split(b'ACK:') data_out = data[1] static.TX_BUFFER = [data_out[i:i+24] for i in range(0, len(data_out), 24)] # split incomming bytes to size of 30bytes, create a list and loop through it static.TX_BUFFER_SIZE = len(static.TX_BUFFER) logging.info("TX | TOTAL PAYLOAD BYTES/FRAMES TO SEND: " + str(len(data_out)) + " / " + str(static.TX_BUFFER_SIZE)) for frame in range(static.TX_BUFFER_SIZE): # LOOP THROUGH DATA LIST #--------------------------------------------- BUILD DATA PACKET ack = b'REQACK' data_to_transmit = ack + static.TX_BUFFER[frame] logging.info("TX | SENDING FRAME " + str(frame+1) + " / " + str(static.TX_BUFFER_SIZE)) #--------------------------------------------------------------- #--------------------------------------------- ATTEMPTS TO SEND A MESSAGE IF ACK FAILS for static.TX_N_RETRIES in range(static.TX_N_MAX_RETRIES): # --------------------------- SEND FRAME static.ACK_RECEIVED = 0 daten = modem.Transmit(data_to_transmit) # --------------------------- START TIMER ---> IF TIMEOUT REACHED, ACK_TIMEOUT = 1 static.ACK_TIMEOUT = 0 timer = threading.Timer(static.ACK_TIMEOUT_SECONDS, other.timeout) timer.start() # --------------------------- WHILE TIMEOUT NOT REACHED AND NO ACK RECEIVED --> LISTEN logging.info("TX | WAITING FOR ACK") while static.ACK_TIMEOUT == 0 and static.ACK_RECEIVED == 0: static.MODEM_RECEIVE = True #--------------- BREAK LOOP IF ACK HAS BEEN RECEIVED if static.ACK_RECEIVED == 1: static.TX_N_RETRIES = 3 break #-------------------------BREAK TX BUFFER LOOP IF ALL PACKETS HAVE BEEN SENT if frame == static.TX_BUFFER_SIZE: break logging.info("TX | BUFFER EMPTY")