From 47036ca60e6550e1ace4e2f02363e3da02db1240 Mon Sep 17 00:00:00 2001 From: travisutk Date: Sun, 6 Feb 2011 22:04:42 +0000 Subject: [PATCH] CCSPI port can now packet sniff 802.15.4! git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@896 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- client/GoodFETCCSPI.py | 28 ++++++++++++++++++++++++---- client/goodfet.ccspi | 30 +++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/client/GoodFETCCSPI.py b/client/GoodFETCCSPI.py index 2dfaa7e..2e69d46 100644 --- a/client/GoodFETCCSPI.py +++ b/client/GoodFETCCSPI.py @@ -50,7 +50,7 @@ class GoodFETCCSPI(GoodFET): return ord(self.data[0]); def CC_RFST_IDLE(self): """Switch the radio to idle mode, clearing overflows and errors.""" - self.strobe(0x00); #SNOP? + self.strobe(0x06); #SRXOFF def CC_RFST_TX(self): """Switch the radio to TX mode.""" self.strobe(0x04); #0x05 for CCA @@ -132,10 +132,30 @@ class GoodFETCCSPI(GoodFET): """Returns the received signal strenght, with a weird offset.""" rssival=self.peek(0x13)&0xFF; #raw RSSI register, should normalize this return rssival^0x80; + lastpacket=range(0,0xff); def RF_rxpacket(self): - """Get a packet from the radio. Returns None if none is waiting.""" - print "Don't know how to get a packet."; - return None; + """Get a packet from the radio. Returns None if none is waiting. In + order to not require the SFD, FIFO, or FIFOP lines, this + implementation works by comparing the buffer to the older + contents. + """ + self.strobe(0x03); #SRXON + self.strobe(0x08); #SFLUSHRX + + buffer=range(0,0xff); + buffer[0]=0x3F | 0x40; #RXFIFO + buffer=self.trans(buffer); + + new=False; + for foo in range(2,20): + if buffer[foo]!=self.lastpacket[foo]: + new=True; + if not new: + return None; + + + self.lastpacket=buffer; + return buffer; def RF_carrier(self): """Hold a carrier wave on the present frequency.""" print "Don't know how to hold a carrier."; diff --git a/client/goodfet.ccspi b/client/goodfet.ccspi index fb89dcf..b487a6c 100755 --- a/client/goodfet.ccspi +++ b/client/goodfet.ccspi @@ -12,6 +12,17 @@ import array, time; from GoodFETCCSPI import GoodFETCCSPI; +def printpacket(packet): + s=""; + i=0; + for foo in packet: + i=i+1; + if i>ord(packet[1])+2: break; + if i<2: continue; + s="%s %02x" % (s,ord(foo)); + print "%s" % s; + + if(len(sys.argv)==1): print "Usage: %s verb [objects]\n" % sys.argv[0]; print "%s regs" % sys.argv[0]; @@ -60,7 +71,24 @@ if(sys.argv[1]=="rssi"): for foo in range(0,rssi>>2): string=("%s."%string); print "%02x %04i %s" % (rssi,rssi, string); - +if(sys.argv[1]=="sniff"): + #if len(sys.argv)>2: + #print "Set MAC to %s" % sys.argv[2]; + #client.tune(sys.argv[2]); + #client.RF_setmaclen(5); + + client.CC_RFST_RX(); + print "Listening as %010x on %i MHz" % (client.RF_getsmac(), + client.RF_getfreq()/10**6); + #Now we're ready to get packets. + + while 1: + packet=None; + while packet==None: + #time.sleep(0.1); + packet=client.RF_rxpacket(); + printpacket(packet); + sys.stdout.flush(); if(sys.argv[1]=="peek"): start=0x0000; if(len(sys.argv)>2): -- 2.20.1