###### ###### Decode GMRv2 Layer 3 frames ###### # # Property of Groundworks Technologies # # import sys,math # Color class class bcolors: HEADER = '\033[95m' OKBLUE = '\033[94m' OKGREEN = '\033[92m' WARNING = '\033[93m' FAIL = '\033[91m' ENDC = '\033[0m' ## Print hexadecimal buffer def printHex(buf): str="" for c in buf: str+=" %02X" % ord(c) str+="|" for c in buf: echar=ord(c) if (echar<32) or (echar>128): echar=ord('.') str+="%c" % echar return str ## Return single bit from string def getbit(buf,bitnum): bitpos = bitnum % 8 bytepos=math.floor(bitnum/8) byte = buf[int(bytepos)] if (ord(byte) & (1<0: datastr = buf[3:3+LI] fillstr = buf[3+LI:23] # for printing to screen dataprint=datastr[:10] fillprint=fillstr[:10] print " Data: "+bcolors.FAIL+ printHex(dataprint) + bcolors.ENDC print " Fill: "+bcolors.FAIL+ printHex(fillprint) + bcolors.ENDC return (datastr,fillstr) print " Data: None" print " Fill: None" return (False,False) ## Return 7-bit decoded packet data ## See GMR-2 04.006 (ETSI TS 101 377-4-5 V1.1.1) def parseGMROut(buf): start=buf.find("\x98\xF8") # alignment hax! horrible, just for demo. if (start>-1): buf=buf[start+6:] r1=0 r2=1 else: r1=4 r2=5 str="" for q in range(r1,r2): bin="" for i in range(0,len(buf)*8-14,7): c = getbits(buf,q+i,q+i+6) bin+=c if (ord(c)>=32) and (ord(c)<=126): str+=c else: str+="." return str ###### MAIN def main(): if len(sys.argv)<3: print "Usage: %s [channel]" % (sys.argv[0]) infile=open(sys.argv[1]) recordlen=0x20 if len(sys.argv)>2: channel=int(sys.argv[2]) else: channel=0x0d #buf=infile.read(recordlen-1) msg="" buf=infile.read(recordlen-1) while(True): packetDir=infile.read(1) buf=infile.read(recordlen-1) if len(buf)<(recordlen-1): break #print "------------------------------------------------------" #print packetDir if packetDir=='O': if ord(buf[0])==channel: (data,fill)=parseGMR(buf+packetDir) if (data!=False): msg+=data #print printHex(msg) print "hex: %s" % printHex(msg) print "decoded: %s" % parseGMROut(msg) if __name__ == "__main__": main()