#!/usr/bin/python # (C) 2012, Mariano Alvira <mar@devl.org> import sys,os,time from struct import * import re import serial if len(sys.argv) < 3: sys.stderr.write( "Usage: %s tty channel [outfile]\n" %(sys.argv[0])) sys.stderr.write( " channel = 11-26\n") sys.exit(2) # change the channel # rftest-rx increments it's channel everytime you send a character and returns "channel: num" # send a character until we get to the right channel try: serport = serial.Serial(sys.argv[1], 115200, timeout=1) except IOError: print "error opening port" sys.exit(2) chan = '' while chan != int(sys.argv[2]) - 11: serport.write(' ') chanstr = '' while 1: chanstr += serport.read(1) m = re.match(".*channel: (\w+)\s+", chanstr) if m is not None: chan = int(m.group(1)) break try: sys.stderr.write('writing to file %s \n' % (sys.argv[3])) outfile = open(sys.argv[3], 'w+b') except IndexError: outfile = sys.stdout sys.stderr.write("RX: 0\r") ### PCAP setup MAGIC = 0xa1b2c3d4; MAJOR = 2; MINOR = 4; ZONE = 0; SIG = 0; SNAPLEN = 0xffff; NETWORK = 230; # 802.15.4 no FCS # output overall PCAP header outfile.write(pack('<LHHLLLL', MAGIC, MAJOR, MINOR, ZONE, SIG, SNAPLEN, NETWORK)) count = 0 fileempty = 1 newpacket = 0 try: while 1: line = serport.readline().rstrip() m_rftestline = re.match(".*rftest-rx --- len 0x(\w\w).*", line) if m_rftestline is not None: newpacket = 1 t = time.time() sec = int(t) usec = (t - sec) * 100000 length = int(m_rftestline.group(1), 16) # sys.stderr.write(line + "\n") # sys.stderr.write("rftestline: %d %d %d\n" % (sec, usec, length)) continue # if this is a new packet, add a packet header if newpacket == 1: newpacket = 0 outfile.write(pack('<LLLL',sec,usec,length,length)) count += 1 sys.stderr.write("RX: %d\r" % count) # clear file empty flag if fileempty: fileempty = 0 if fileempty == 0 : # write payload for d in line.split(' '): # do a match because their might be a \r floating around m = re.match('.*(\w\w).*', d) if m is not None: outfile.write(pack('<B', int(m.group(1),16))) # cn.recv_block() # if cn.data != None: # # sys.stderr.write(cn.data) # # sys.stderr.write(cn.data) # # sys.stderr.write(str(time.time())) # t = time.time() # sec = int(t) # usec = (t - sec) * 100000 # # sys.stderr.write("new packet: %d %d %d" % (sec, usec, len(cn.data))) # count += 1 # sys.stderr.write("\x1b[G") # Move the cursor up one # sys.stderr.write("RX: %d" % count) # sys.stdout.write(pack('<LLLL',sec,usec,len(cn.data),len(cn.data))) # sys.stdout.write(cn.data) except KeyboardInterrupt: # cn.close() sys.exit(2)