1 import sys
2 from datetime import datetime
3 import threading, signal
4 from killerbee import *
5
6
7 triggers = []
8
9
10
11
13 '''
14 Before calling, you should have already ensured the channel or the
15 channel which the key is associated with does not already have an active
16 capture occuring.
17 '''
18 nextDev = zbdb.get_devices_nextFree()
19
20 capChan = channel
21 key = "CH%d" % channel
22 if nextDev == None:
23 print 'Cap%s: No free device to use for capture.' % key
24 return None
25 print 'Cap%s: Launching a capture on channel %s.' % (key, capChan)
26 signal.signal(signal.SIGINT, interrupt)
27 trigger = threading.Event()
28 triggers.append(trigger)
29 CaptureThread(capChan, nextDev, trigger, dblog=dblog, gps=gps).start()
30 zbdb.update_devices_start_capture(nextDev, capChan)
31
32
38
39
40
41
43 - def __init__(self, channel, devstring, trigger, dblog=False, gps=None):
44 self.channel = channel
45 self.rf_freq_mhz = (channel - 10) * 5 + 2400
46 self.devstring = devstring
47 self.trigger = trigger
48 self.packetcount = 0
49 self.useDBlog = dblog
50 self.currentGPS = gps
51
52 timeLabel = datetime.now().strftime('%Y%m%d-%H%M')
53 fname = 'zb_c%s_%s.pcap' % (channel, timeLabel)
54 self.pd = PcapDumper(DLT_IEEE802_15_4, fname, ppi=True)
55
56 threading.Thread.__init__(self)
57
59 if self.useDBlog == True:
60 self.kb = KillerBee(device=self.devstring, datasource="Wardrive Live")
61 else:
62 self.kb = KillerBee(device=self.devstring)
63 self.kb.set_channel(self.channel)
64 self.kb.sniffer_on()
65 print "Capturing on \'%s\' at channel %d." % (self.kb.get_dev_info()[0], self.channel)
66
67 while not self.trigger.is_set():
68 packet = self.kb.pnext()
69 if packet != None:
70 self.packetcount+=1
71 if self.useDBlog:
72 self.kb.dblog.add_packet(full=packet)
73 try:
74 if self.currentGPS != None and 'lat' in self.currentGPS:
75
76
77 self.pd.pcap_dump(packet[0],
78 freq_mhz=self.rf_freq_mhz, ant_dbm=packet['dbm'],
79 location=(self.currentGPS['lng'], self.currentGPS['lat'], self.currentGPS['alt']) )
80 else:
81 self.pd.pcap_dump(packet[0], freq_mhz=self.rf_freq_mhz,
82 ant_dbm=packet['dbm'])
83 except IOError as e:
84
85
86
87 if e.errno == 32:
88 continue
89 else:
90 raise e
91
92
93
94 self.kb.sniffer_off()
95 self.kb.close()
96 self.pd.close()
97 print "%d packets captured on channel %d." % (self.packetcount, self.channel)
98