#Handshake Three Way with Arduino#
##Author##
- Author: Domenico Monaco
- e-mail: hack AT kiuz.it
- Site: http://monaco.kiuz.it
- Simple Handshake Three Way with Arduino over Serial communication
//TODO
//TODO
//TODO
#Handshake Three Way with Arduino#
##Author##
//TODO
//TODO
//TODO
/** | |
* | |
* Author: Domenico Monaco - hack@kiuz.it | |
* | |
* Description: | |
* Simple Handshake Three Way with Arduino over Serial communication | |
* | |
* License: GNU v2 2014 | |
**/ | |
int SYNIN = 0; | |
int SYNOUT = 0; | |
bool SYN_CHECK = false; | |
String SYNID ="SYN" ; | |
bool SYN_RECIVED = false; | |
int ACKIN = 0; | |
int ACKOUT = 0; | |
bool ACK_CHECK = false; | |
String ACKID ="ACK" ; | |
bool ACK_RECIVED = false; | |
String MESIN = ""; | |
String MESOUT = ""; | |
bool MES_CHECK = false; | |
String MESID ="MES"; | |
bool MES_RECIVED = false; | |
int incomingByte = 0; // for incoming serial data | |
long int timeStartCom = 0; | |
long int timeEndCom = 0; | |
long int charsIN = 0; | |
bool waiting = false; | |
String line=""; | |
void setup() { | |
Serial.begin(115200); | |
} | |
void loop() { | |
if(SYN_RECIVED==true&&ACK_RECIVED==true&&MES_RECIVED==true){ | |
readLine(); | |
}else{ | |
readLine(); | |
handeShake(); | |
} | |
} | |
void handeShake(){ | |
if(line.length()!=0 && waiting==true){ | |
int n_SYN= line.indexOf("SYN"); | |
//Serial.println(n_SYN); | |
int n_ACK=line.indexOf("ACK"); | |
//Serial.println(n_ACK); | |
int n_MES=line.indexOf("MES"); | |
//Serial.println(n_MES); | |
int n_end = line.indexOf(";"); | |
//Serial.println(n_end); | |
SYN_CHECK = false; | |
if(n_SYN==0&&n_ACK==-1&&n_MES==-1&&n_end==7){ | |
Serial.println("Detected SYN message"); | |
check_SYN(); | |
if(SYN_CHECK==true){ | |
SYNIN = line.substring(4,7).toInt(); | |
SYNOUT = SYNIN + 1; | |
Serial.println("Checked valid Syn;"); | |
SYN_RECIVED = true; | |
ACKOUT = random(100, 900); | |
String output = SYNID + " " + SYNOUT + " "+ ACKID + " " + ACKOUT +";"; | |
Serial.println(output); | |
}else{ | |
SYN_RECIVED = false; | |
Serial.print("Checked not valid Syn;"); | |
} | |
}else if(n_SYN==0&&n_ACK==8&&n_MES==-1&&n_end==15&&check_SYN()==true&&SYN_RECIVED==true){ | |
Serial.println("Detected ACK message"); | |
check_ACK(); | |
if(ACK_CHECK==true){ | |
Serial.println("Checked valid ACK;"); | |
ACK_RECIVED = true; | |
MESOUT = "OK"; | |
String output = SYNID + " " + SYNOUT + ","+ ACKID + " " + ACKIN + "," + MESID + " " + MESOUT + ";"; | |
Serial.println(output); | |
}else{ | |
ACK_RECIVED = false; | |
SYN_RECIVED = false; | |
Serial.print("Checked not valid ACK;"); | |
} | |
}else if(n_SYN==0&&n_ACK==8&&n_MES==16&&n_end>20&&check_ACK()==true&&ACK_RECIVED==true){ | |
Serial.println("Detected MES message"); | |
check_MES(); | |
if(MES_CHECK==true){ | |
Serial.println("Checked valid MES;"); | |
MES_RECIVED = true; | |
Serial.println("Are you allowed to communicate with me! "); | |
}else{ | |
Serial.println("Checked not valid MES;"); | |
} | |
}else{ | |
Serial.println("Not valid message."); | |
} | |
} | |
} | |
void readLine(){ | |
// send data only when you receive data: | |
if (Serial.available() > 0) { | |
if(charsIN==(long int)0){ | |
//line = ""; | |
timeStartCom = millis(); | |
timeEndCom = 0; | |
waiting = false; | |
} | |
charsIN++; | |
incomingByte = Serial.read(); | |
line = line + (char)incomingByte; | |
delay(1); //Delay of Serial transfer | |
}else{ | |
if(waiting==false){ | |
waiting = true; | |
timeEndCom = millis(); | |
///PRINT PREVUOUS MESSAGE | |
Serial.print("Message: "); | |
Serial.println(line); | |
Serial.print("Recived "); | |
Serial.print(charsIN); | |
Serial.print("chars in "); | |
Serial.print(timeEndCom-timeStartCom); | |
Serial.print("millis; "); | |
Serial.print((float)(timeEndCom-timeStartCom)/charsIN); | |
Serial.print(" mills for chars;"); | |
Serial.print(" "); | |
Serial.print((float)charsIN/(timeEndCom-timeStartCom)); | |
Serial.println("char/millis;"); | |
timeStartCom = 0; | |
charsIN = (long int)0; | |
Serial.println(""); | |
Serial.println("Waiting for message..."); | |
Serial.println(""); | |
}else{ | |
//in a seconde cicle reset line | |
line=""; } | |
} | |
} | |
bool check_SYN(){ | |
for(int i=4;i<=6;i++){ | |
if(isDigit(line.charAt(i))==true){ | |
SYN_CHECK=true; | |
}else{ | |
SYN_CHECK = false; | |
break; | |
} | |
} | |
return SYN_CHECK; | |
} | |
bool check_ACK(){ | |
for(int i=12;i<=14;i++){ | |
if(isDigit(line.charAt(i))==true){ | |
ACK_CHECK=true; | |
}else{ | |
ACK_CHECK = false; | |
break; | |
} | |
} | |
if(ACK_CHECK==true){ | |
SYNIN = line.substring(4,7).toInt(); | |
ACKIN = line.substring(12,15).toInt(); | |
if(SYNIN!=(SYNOUT)&&ACKOUT!=(ACKIN-1)){ | |
ACK_CHECK = false; | |
}else if(SYNIN==(SYNOUT)&&ACKOUT==(ACKIN-1)){ | |
ACK_CHECK = true; | |
}else{ | |
ACK_CHECK = false; | |
} | |
} | |
return ACK_CHECK; | |
} | |
bool check_MES(){ | |
SYNIN = line.substring(4,7).toInt(); | |
ACKIN = line.substring(12,15).toInt(); | |
MESIN = line.substring(20,line.length()-1); | |
if(SYNIN!=(SYNOUT)&&ACKOUT!=(ACKIN-1)&&MESIN!=MESOUT){ | |
MES_CHECK = false; | |
}else if(SYNIN==(SYNOUT)&&ACKOUT==(ACKIN-1)&&MESIN==MESOUT){ | |
MES_CHECK = true; | |
}else{ | |
MES_CHECK = false; | |
} | |
return MES_CHECK; | |
} |