[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";
}
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";
}
评论
发表评论