import socket import sys import os import struct import binascii import math import time import logging,coloredlogs # Open the config file and make it accessible via "cfg" import json with open("conf.json", "r") as file: cfg = json.load(file) l = logging.getLogger(__name__) coloredlogs.install() MCAST_GRP = cfg[multicastGroup] MCAST_IF = cfg[multicastIf] BUF_SIZE = 1396 MULTICAST_TTL = 2 conn = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) conn.setsockopt(socket.IPPROTO_IP,socket.IP_ADD_MEMBERSHIP,socket.inet_aton(MCAST_GRP)+socket.inet_aton(MCAST_IF)) test = b"This is a test" def sendFile(files, commands, numSgmts, Pri): if Pri == 0: MCAST_PORT = 7787 elif Pri == 1: MCAST_PORT = 7788 else: l.critical("Invalid Priority Flag. 0 = Routine Message 1 = High Priority Message\n\nScript will now terminate...") exit() #Get the next message ID with open('./.temp/msgId.txt', "r") as f: oMsgId = f.read() msgNum = int(oMsgId) f.close() nMsgNum = msgNum + 1 h = open('./.temp/msgId.txt', "w") h.write(str(nMsgNum)) h.close() segnmNum = 0 if Pri == 0: l.info("Sending Routine Msg-" + str(msgNum) + " on UDP " + MCAST_GRP + " " + str(MCAST_PORT) + "....") elif Pri == 1: l.info("Sending High Priority Msg-" + str(msgNum) + " on UDP " + MCAST_GRP + " " + str(MCAST_PORT) + "....") startFlag = False for x, y in zip(files, commands): size = os.path.getsize(x) check = size - BUF_SIZE pToBeSent = size / 1405 packRounded = math.ceil(pToBeSent) + 1 numSegments = numSgmts + 3 total_sent = 0 payloadLength = 0 packet_count = 1 j = 0 pc = packet_count.to_bytes(1, byteorder='big') i = 0 encode1 = bytes(y + 'I2MSG', 'UTF-8') commandLength = len(y) encode2 = commandLength.to_bytes(4, byteorder='little') theCommand = b"".join([encode1, encode2]) char = '' new_file = open(x, "ab") new_file.write(theCommand) # Append command to end of the file new_file.close() new_size = os.path.getsize(x) if startFlag == False: #Our 34 byte beginning packet p1 = struct.pack(">BHHHIIBBBBBBBIBIBBB", 18, 1, 0 , 16, msgNum, 0, segnmNum, 0, 0, 8, numSegments, 3, 0, 0, 8, packRounded, 0, 0, 0) conn.sendto(p1, (MCAST_GRP, MCAST_PORT)) startFlag = True with open(x,"rb") as message: message.seek(0) data = message.read(BUF_SIZE) while data: packetHeader = struct.pack(">BHHHIIBBB", 18, 1, 0, 1405, msgNum, packet_count, 0, 0, 0) fec = struct.pack("BHHHIIBBBBBBBI", 18, 1, 1, 8, msgNum, 0, segnmNum, 0, 0, 8, 0, 0, 0, 67108864) p4 = struct.pack(">BHHHIIBBB", 18, 1, 1, 14, msgNum, 1, segnmNum, 0, 0) + test conn.sendto(p3, (MCAST_GRP, MCAST_PORT)) conn.sendto(p4, (MCAST_GRP, MCAST_PORT)) segnmNum += 1 w -= 1 #------------------------------------------------------------------------------------------------------- def sendCommand(command, Pri, msgNum = None): if Pri == 0: MCAST_PORT = 7787 elif Pri == 1: MCAST_PORT = 7788 else: l.critical("Invalid Priority Flag. 0 = Routine Message 1 = High Priority Message\n\nScript will now terminate...") exit() #Get the next message ID with open('./.temp/msgId.txt', "r") as f: oMsgId = f.read() msgNum = int(oMsgId) f.close() nMsgNum = msgNum + 1 h = open('./.temp/msgId.txt', "w") h.write(str(nMsgNum)) h.close() segnmNum = 0 if Pri == 0: l.info("Sending Routine Msg-" + str(msgNum) + " on UDP " + MCAST_GRP + " " + str(MCAST_PORT) + "....") elif Pri == 1: l.info("Sending High Priority Msg-" + str(msgNum) + " on UDP " + MCAST_GRP + " " + str(MCAST_PORT) + "....") startFlag = False for x in command: bx = bytes(x, 'utf-8') with open('./.temp/command', 'wb') as c: c.write(bx) c.close() size = os.path.getsize('./.temp/command') encode1 = bytes('I2MSG', 'UTF-8') commandLength = size encode2 = commandLength.to_bytes(4, byteorder='little') theCommand = b"".join([encode1, encode2]) with open('./.temp/command', 'ab') as d: d.write(theCommand) d.close() check = size - BUF_SIZE pToBeSent = size / 1405 packRounded = math.ceil(pToBeSent) + 1 numSegments = 4 total_sent = 0 payloadLength = 0 packet_count = 1 j = 0 pc = packet_count.to_bytes(4, byteorder='little') i = 0 char = '' new_size = os.path.getsize('./.temp/command') if startFlag == False: #Our 34 byte beginning packet p1 = struct.pack(">BHHHIIBBBBBBBIBIBBB", 18, 1, 0 , 16, msgNum, 0, segnmNum, 0, 0, 8, numSegments, 3, 0, 0, 8, packRounded, 0, 0, 0) conn.sendto(p1, (MCAST_GRP, MCAST_PORT)) startFlag = True with open('./.temp/Command',"rb") as message: message.seek(0) data = message.read(BUF_SIZE) while data: packetHeader = struct.pack(">BHHHIIBBB", 18, 1, 0, 1405, msgNum, packet_count, 0, 0, 0) fec = struct.pack("BHHHIIBBBBBBBI", 18, 1, 1, 8, msgNum, 0, segnmNum, 0, 0, 8, 0, 0, 0, 67108864) p4 = struct.pack(">BHHHIIBBB", 18, 1, 1, 14, msgNum, 1, segnmNum, 0, 0) + test conn.sendto(p3, (MCAST_GRP, MCAST_PORT)) conn.sendto(p4, (MCAST_GRP, MCAST_PORT)) segnmNum += 1 w -= 1 #-------------------------------------------------------------------------------------------------------