User Tools

Site Tools


motors-scanner-test-1

This is an old revision of the document!


salzamt, linz, 11. 09. 2012

airodump-ng is scanning the wifi

this code parses the .csv file airodump is writing to and uses the value of '#IV's or the amount of data packets to send positional values to linear actuators.

#!/usr/bin/python

# -*- coding: utf-8 -*-

import subprocess, glob, time, csv
from arduino import Arduino, Servo

# scanning part -----------------

# airodump-ng is running and logging the results into a csv file
# subprocess looks for the last edited csv file in current folder
# this file is parsed by the csv module to find the number of data packets that have passed through the network since the last check 

listlasted=subprocess.Popen("ls -ct1 $HOME/rknfg/*csv | head -1", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
lasted=listlasted.communicate()[0].strip()
print lasted

# reading the scan log from a csv file

def lookup(dump):
    scan=open(dump, "rU")
    next(scan)
    scanDict=csv.DictReader((line.replace('\0','') for line in scan), delimiter=',')
    for adict in scanDict:
         if adict.has_key(' # IV'):
            data=adict.get(' # IV')
            return data

packets=int(lookup(lasted))
print 'packets', packets

# moving part -------------------

portz=glob.glob("/dev/ttyUSB*")[0]
#print portz

my_board=Arduino(portz)
my_board.output([9, 10])
linear_one=my_board.attachServo(9)
linear_two=my_board.attachServo(10)

# !!!! motors are not in sync!!!!
# extreme positions of the motor one and two:

# |   linear one          |
# 72 - - - - - - - - - - 139

# |   linear two          |
# 87 - - - - - - - - - - 121

# thus a dictionary of compatible values tupples is used to make sure the two motors are always in the same position
positions = {0:[(72,87)],1:[(73,88)],2:[(74,88)],3:[(75,89)],4:[(76,90)],5:[(77,90)],6:[(78,91)],7:[(82,92)],8:[(83,92)],9:[(84,92)],10:[(86,94)],11:[(88,95)],12:[(90,96)],13:[(92,97)],14:[(93,98)],15:[(95,99)],16:[(98,100)],17:[(100,101)],18:[(102,102)],19:[(103,103)],20:[(104,104)],21:[(106,105)],22:[(107,106)],23:[(109,107)],24:[(110,108)],25:[(114,109)],26:[(117,110)],27:[(120,111)],28:[(122,112)],29:[(124,113)],30:[(125,114)],31:[(128,115)],32:[(129,116)],33:[(130,117)],34:[(132,118)],35:[(135,119)],36:[(137,120)],37:[(139,121)]}

# the main loop -----------------

# lookup function checks for difference in the number of packets
# it sends the motors to a new position accordingly

max_pos=len(positions)-1
key_pos=max_pos

# put the motors in the minimum position
linear_one.write(positions[key_pos][0][0])
linear_two.write(positions[key_pos][0][1])
time.sleep(5)

while True:
    newPackets=int(lookup(lasted))
    packetsDiff=newPackets-packets
    print 'packetsDiff', packetsDiff
    # decide whether to stretch or shrink (when shrinking the height of the space increases): 
    # case 1: motors will shrink for one position each; the initial key_pos value needs to be bigger than 0
    if packetsDiff>=8 and packetsDiff<50 and key_pos>0:
        new_key=key_pos-1
        print 'case 1: new_key=', new_key, 'position:', positions[new_key]
        #print 'linear1 will shrink',positions[new_key][0][0]
        #print 'linear2 will shrink',positions[new_key][0][1]
        #print 'current key_pos: ' + str(new_key) + " .. was oldkey: " + str(key_pos)
        linear_one.write(positions[new_key][0][0])
        time.sleep(0.3)
        linear_two.write(positions[new_key][0][1])
        time.sleep(0.3)
        key_pos=new_key #update position

    # case 2: motors will shrink for 5 positions; the initial value must be bigger than 5
    elif packetsDiff>=50 and key_pos>0:
        new_key=key_pos-5
        if new_key<=0:
            print 'case 2: but cannot shrink more'
            new_key=1 #reset position
            key_pos=new_key #update position
        else:
            print 'case 2: new_key=', new_key, 'position:', positions[new_key]
            #print 'linear1 will shrink',positions[new_key][0][0]
            #print 'linear2 will shrink',positions[new_key][0][1]
            linear_one.write(positions[new_key][0][0])
            time.sleep(0.3)
            linear_two.write(positions[new_key][0][1])
            time.sleep(0.3)
            key_pos=new_key #update position
    # case 3: motors will stretch for two positions; the initial value must not be bigger than max_pos
    elif packetsDiff<=0 and key_pos<max_pos:
        new_key=key_pos+2
        if new_key>=max_pos:
            print 'case 3: but cannot stretch more'
            new_key=max_pos
            key_pos=new_key #update position
        else:
            print 'case 3: new_key=', new_key, 'position:', positions[new_key]
            #print 'linear1 will stretch',positions[new_key][0][0]
            #print 'linear2 will stretch',positions[new_key][0][1]
            #print 'current key_pos: ' + str(new_key) + " .. was oldkey: " + str(key_pos)
            linear_one.write(positions[new_key][0][0])
            time.sleep(0.3)
            linear_two.write(positions[new_key][0][1])
            time.sleep(0.3)
            key_pos=new_key #update position
    else:
        print "else: packetDiff is too little", packetsDiff
        new_key=key_pos
        #print 'nothing changed, will stay in the position', positions[new_key]
    time.sleep(3)
    packets=newPackets #updates the packets
                                                                 

TODO

  • positions resolution
  • main loop flow: first add or first decide on the limit
  • exceptions, restart….
motors-scanner-test-1.1349548701.txt.gz · Last modified: 2012/10/06 18:38 by 85.218.109.130