main_kppv.py 8.78 KB
"""
Created on Thu Jan 11 15:22:56 2018
@author: Robin Cavalieri 
IMA5SC - PFE 2018
P32 - Détection automatique de DoS sur réseau LoRa
Main avec méthode des KPPV
"""
###############################################################################
#LIBRAIRIES UTILES
###############################################################################
import time;
import serial;
import numpy as np;
import pandas as pd;
###############################################################################

###############################################################################
#VARIABLES MESUREES
###############################################################################
ping_mesured=0; 
rssi_mesured=0;
result=0;
puissance_read = 0;
temp_read = 0;
trame_read = [];
###############################################################################

##############################################################################
#DEFINITION DE LA LECTURE DE PORT 
##############################################################################
ser = serial.Serial(      
 #Pour Linux
 #port='/dev/ttyACM0',
 #Pour Windows
 port='COM4',
 #Vitesse4de communication
 baudrate = 9600,
 #Parité 
 parity=serial.PARITY_NONE,
 #Bit de stop
 stopbits=serial.STOPBITS_ONE,
 #Taille du message 
 bytesize=serial.EIGHTBITS,
 #Out
 timeout=1
)
counter=0;
##############################################################################

###############################################################################
#TRAVAIL PRELIMINAIRE DE TRAITEMENT DES DONNEES D'APPRENTISSAGE
###############################################################################
# Ouverture des bases d'apprentissage
dataset_ping_norm = pd.read_csv('C:/Users/Utilisateur/PFE/python/datasets/ping_norm.csv');
dataset_ping_attack = pd.read_csv('C:/Users/Utilisateur/PFE/python/datasets/ping_attack.csv');
dataset_rssi_norm = pd.read_csv('C:/Users/Utilisateur/PFE/python/datasets/rssi_norm.csv');
dataset_rssi_attack = pd.read_csv('C:/Users/Utilisateur/PFE/python/datasets/rssi_attack.csv');

#Concatenation pour avoir une base de ping et une base de rssi
dataset_ping = np.concatenate((dataset_ping_attack, dataset_ping_norm), axis=0);
dataset_rssi = np.concatenate((dataset_rssi_attack, dataset_rssi_norm), axis=0);

#Récupération des tailles de matrices
[X_ping, Y_ping] = np.shape(dataset_ping);
[X_rssi, Y_rssi] = np.shape(dataset_rssi);
###############################################################################

###############################################################################
#KPPV PING
###############################################################################
def prediction_ping(ping):
    cpt = 0;
    k = 5;
    dataset_ping_temp = np.zeros((X_ping,1));
    #Remplissage des distances euclidiennes 
    for i in range(0, X_ping):
        dataset_ping_temp[i,0] = ((dataset_ping[i,1]-ping)**2)**0.5;   
    #Concatenation avec distances euclidiennes 
    dataset_ping_temp = np.c_[dataset_ping, dataset_ping_temp];
    #Tri
    dataset_ping_temp = dataset_ping_temp[dataset_ping_temp[:,2].argsort()]
    #Checking des k premiers voisins
    for j in range(0, k-1): 
        if(dataset_ping_temp[j,0]==1):
            cpt = cpt+1;       
    if(cpt >= (k/2)+1):
        return 1; #Attaque
    else:
        return 0; #RAS
###############################################################################

###############################################################################
#KPPV RSSI
###############################################################################
def prediction_rssi(rssi):
    cpt = 0;
    k = 20;
    dataset_rssi_temp = np.zeros((X_rssi,1));
    #Remplissage des distances euclidiennes 
    for i in range(0, X_rssi):
        dataset_rssi_temp[i,0] = ((dataset_rssi[i,1]-rssi)**2)**0.5;   
    #Concatenation avec distances euclidiennes 
    dataset_rssi_temp = np.c_[dataset_rssi, dataset_rssi_temp];
    #Tri
    dataset_rssi_temp = dataset_rssi_temp[dataset_rssi_temp[:,2].argsort()]
    #Checking des k premiers voisins
    for j in range(0, k-1): 
        if(dataset_rssi_temp[j,0]==1):
            cpt = cpt+1;       
    if(cpt >= (k/2)+1):
        return 1; #Attaque
    else:
        return 0; #RAS
###############################################################################

###############################################################################
#AFFICHAGE 
###############################################################################  
def Recorder():
    global temp;
    global temp_read;
    global ping_mesured;
    global puissance_read;
    global trame_read;
    global cpt_trames;
    global cpt_trames_temp;  
    cpt_trames = 0;
    cpt_trames_temp = 0;
    temp = 0;
    #REMISE A 0 DES FICHIERS
    temp_file = open('C:/xampp/htdocs/temperature.csv', 'w')
    ping_file = open('C:/xampp/htdocs/ping.csv', 'w')
    puissance_file = open('C:/xampp/htdocs/puissance.csv', 'w')
    import csv
    while(1):
        #RECUPERATION DES DONNEES
        x = ser.readline();
        
        #FICHIERS CSV APPLICATION WEB
        temp_file = open('C:/xampp/htdocs/temperature.csv', 'a')
        tempwriter = csv.writer(temp_file, delimiter=',');
        
        ping_file = open('C:/xampp/htdocs/ping.csv', 'a')
        pingwriter = csv.writer(ping_file, delimiter=',');
        
        puissance_file = open('C:/xampp/htdocs/puissance.csv', 'a')
        puissancewriter = csv.writer(puissance_file, delimiter=',');
        
        traficping_file = open('C:/xampp/htdocs/traficPing.csv', 'w')
        traficpingwriter = csv.writer(traficping_file);
        
        traficrssi_file = open('C:/xampp/htdocs/traficRssi.csv', 'w')
        traficrssiwriter = csv.writer(traficrssi_file);
        
        if(0x7C in x):
            #Lecture de la trame 
            trame_read = x;         
            #Récupération du compteur de trames
            cpt_trames = (trame_read[15]-48)*100 + (trame_read[16]-48)*10 + (trame_read[17]-48);
            
            if(0x7C in x and cpt_trames == 1):
                temp = time.time();
                
            if(0x7C in x and cpt_trames > 1):
                t2 = time.time();
                ping_mesured = (t2-temp)*1000;
                #Récupération de la température
                temp_read = (trame_read[12]-48)*10 + trame_read[13]-48;
                #Récupération de la puissance 
                x = ser.readline();
                puissance_read = (x[1]-48)*10 + x[2]-48;
                #T2 
                temp = t2;
            
            if(cpt_trames_temp + 1 == cpt_trames):
                #BOOLEEN
                state_ping = prediction_ping(ping_mesured);
                state_rssi = prediction_rssi(puissance_read);
                #AFFICHAGE
                print("\n###############################\n");
                print("TRAME : "+ "".join(map(chr, trame_read))+"\n");
                print("TRAME NUM. : "+str(cpt_trames)+"\n");
                print("TEMPERATURE : "+str(temp_read)+" °C\n");
                print("PUISSANCE : "+str(puissance_read)+" dBm\n");
                print("PING : "+str(ping_mesured)+" ms\n");
                if(state_ping == 0):
                    print("PING NORMAL\n");
                    traficpingwriter.writerow([0])
                elif(state_ping == 1):
                    print("PING ATTAQUE\n");
                    traficpingwriter.writerow([1])
                if(state_rssi == 0):
                    print("RSSI NORMAL\n");
                    traficrssiwriter.writerow([0])
                elif(state_rssi == 1):
                    print("RSSI ATTAQUE\n");
                    traficrssiwriter.writerow([1])
                print("###############################\n");
                ##########################################
                #ECRITURE DANS FICHIERS
                ##########################################
                tempwriter.writerow([time.time(),temp_read]);
                pingwriter.writerow([time.time(),ping_mesured])
                puissancewriter.writerow([time.time(),puissance_read]);                    
                ##########################################
            else:
                print("\n###############################\n");
                print("ON AIR");
                print("\n###############################\n");
            temp_file.close();          
            puissance_file.close();
            ping_file.close();
            traficping_file.close();
            traficrssi_file.close();
            cpt_trames_temp = cpt_trames;
###############################################################################

###############################################################################
#MAIN   
###############################################################################
if __name__ == '__main__':   
    Recorder();     
###############################################################################