[2017.6 Digital Twin] More details

More details

The test project is done. Now I need to write some detail about our system.

First of all. I want to write a packet program, which means, it can packet all the data that the system needs to a single data array. Then the data array could be transmitted by serial or internet. At the receiver it could be unpack and recover the original data.

for example:

I want to send a data:
light = 1000;
button = false;
switch = false;

I need to create a data packet like this:
3,1,"light","button","switch",1000,0,0

the first number 3 is the number of the data in the packet.
the next 3 string value are the tags, which are the name of the variables.
then are 3 variable.

The flow of data transmission:

Sensor1 :     int r=50;     string id="temperature"
Sensor2 :     bool r=true;   string id="switch"
Sensor3 :     floot r=38.6;  string id="humidity"
Sensor4 :     double r=1225.24string id="light intensty"
Controller1:   bool s=true;   string id="switch"

=> data paket:
[number of data] [[ string :id ][ unsigned char: type of variable ][ value ]] [ (Datum 2)] [ (Datum 3)] ...

type of variable to describe which type is, for example,
1 represent int
2 represent bool
3 represent float
4 represent double
5 represent string
6 represent char

---------------------------CODE----------------------------------------------
/*

  Packet Example:

  PacketAddInt("testInt",1);              //add a int varialbe 1 to the packet and its name is "testInt"
  PacketAddDouble("testDouble",1.123);
  PacketAddBool("testBool",true);
  PacketAddFloat("testfloat",1.124);
  PacketAddString("testStr","Hello");
  char c[]="Hello char";
  PacketAddChar("testChar",c);
 
  String pa=PacketSend();                 //send the packet through the serial
  ///////////////////////////////for the receiver///////////////////////////////////////////
  PacketUnpack(pa);          
  Serial.println(PacketGetInt("testInt"));        //get the int data "testInt"
  Serial.println(PacketGetInt("testfalseInt"));
  Serial.println(PacketGetDouble("testDouble"));
  Serial.println(PacketGetBool("testBool"));
  Serial.println(PacketGetFloat("testfloat"));
  Serial.println(PacketGetString("testStr"));
  Serial.println(PacketGetString("test"));
 */
#define MAXRECEIVE 10

int Packet_Date_Number;
int Packet_Date_R_Number;

String Packet_ID;
String Packet_DataType;
String Packet_Data;

String Packet_R_ID[MAXRECEIVE];
String Packet_R_DataType[MAXRECEIVE];
String Packet_R_Data[MAXRECEIVE];

void PacketInit(){
  Packet_Date_Number=0;
  Packet_Date_R_Number=0;
  Packet_ID="";
  Packet_DataType="";
  Packet_Data="";
  for(int i=0;i<MAXRECEIVE;i++){
    Packet_R_ID[i]="";
    Packet_R_DataType[i]="";
    Packet_R_Data[i]="";
  }
}

void PacketClean(){
  PacketInit();
}

String PacketMake(){
  String allData=String(Packet_Date_Number)+"\n";
    allData+=Packet_ID;
    allData+=Packet_DataType;
    allData+=Packet_Data;
  return allData;
}

String PacketSend(){
  String allData=PacketMake();
  Serial.print(allData);
  Serial.flush();
  PacketClean();
  return allData;
 
}

void PacketAddInt(String tag,int number){
  Packet_ID+=tag+"\n";
  Packet_DataType+="Int\n";
  Packet_Data+=String(number)+"\n";
  Packet_Date_Number++;
}

void PacketAddBool(String tag,bool value){
  Packet_ID+=tag+"\n";
  Packet_DataType+="Bool\n";
  Packet_Data+=  (value?String("true"):String("false"))+"\n";
  Packet_Date_Number++;
}

void PacketAddFloat(String tag,float number){
  Packet_ID+=tag+"\n";
  Packet_DataType+="Float\n";
  Packet_Data+=String(number)+"\n";
  Packet_Date_Number++;
}

void PacketAddDouble(String tag,double number){
  Packet_ID+=tag+"\n";
  Packet_DataType+="Double\n";
  Packet_Data+=String(number)+"\n";
  Packet_Date_Number++;
}

void PacketAddString(String tag,String str){
  Packet_ID+=tag+"\n";
  Packet_DataType+="String\n";
  Packet_Data+=str+"\n";
  Packet_Date_Number++;
}

void PacketAddChar(String tag,char* str){
  Packet_ID+=tag+"\n";
  Packet_DataType+="String\n";
  int i=0;
  while(str[i]!='\0' && str[i]!='\n'){
 
    Packet_Data+=String(str[i]);
    i++;
  }
  Packet_Data+="\n";
  Packet_Date_Number++;
}


String PacketUnpackGetSub(String str, int &start,char lookingfor){  
  int e;
  e=str.indexOf(lookingfor,start);
  if(e<0) return "none";
  String r=str.substring(start,e);
  start=e+1;
  return r;
}

void PacketUnpack(String packet){
  PacketClean();
  int start=0;
  String sub=PacketUnpackGetSub(packet,start,'\n');
  int num=sub.toInt();
  for(int i=0;i<num;i++){
    Packet_R_ID[i]=PacketUnpackGetSub(packet,start,'\n');
   
  }
  for(int i=0;i<num;i++){
    Packet_R_DataType[i]=PacketUnpackGetSub(packet,start,'\n');
  }
  for(int i=0;i<num;i++){
    Packet_R_Data[i]=PacketUnpackGetSub(packet,start,'\n');

  }
  Packet_Date_R_Number=num;
}

int PacketGetInt(String str){
  for(int i=0;i<Packet_Date_R_Number;i++){
    if(Packet_R_DataType[i].indexOf("Int")>=0){
    if(Packet_R_ID[i].equals(str))
      return Packet_R_Data[i].toInt();
    }
  }
  return -1;
}
double PacketGetDouble(String str){
  for(int i=0;i<Packet_Date_R_Number;i++){
    if(Packet_R_DataType[i].indexOf("Double")>=0   )
   if(Packet_R_ID[i].equals(str))
      return Packet_R_Data[i].toFloat();
  }
  return -1;
}
float PacketGetFloat(String str){
  for(int i=0;i<Packet_Date_R_Number;i++){
    if(Packet_R_DataType[i].indexOf("Float")>=0   )
   if(Packet_R_ID[i].equals(str))
      return Packet_R_Data[i].toFloat();
  }
  return -1;
}
bool PacketGetBool(String str){
  for(int i=0;i<Packet_Date_R_Number;i++){
    if(Packet_R_DataType[i].indexOf("Bool")>=0   )
   if(Packet_R_ID[i].equals(str))
      return Packet_R_Data[i].indexOf("true")>=0;
  }
  return false;
}
String PacketGetString(String str){
  for(int i=0;i<Packet_Date_R_Number;i++){
    if(Packet_R_DataType[i].indexOf("String")>=0 || Packet_R_DataType[i].indexOf("Char")>=0)
   if(Packet_R_ID[i].equals(str))
      return Packet_R_Data[i];
  }
  return "None";
}

评论

热门博文