Skip to content

Instantly share code, notes, and snippets.

@domenicomonaco
Last active July 31, 2019 06:02
Show Gist options
  • Save domenicomonaco/1a4eef56748e7d409635 to your computer and use it in GitHub Desktop.
Save domenicomonaco/1a4eef56748e7d409635 to your computer and use it in GitHub Desktop.
Handshake Three Way with Arduino

#Handshake Three Way with Arduino#

Tested GPL V2 License Gratipay Badge

##Author##

Description

  • Simple Handshake Three Way with Arduino over Serial communication

Special Thanks

Dependencies

//TODO

Changes

//TODO

Installation

//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;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment