⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmdproc.cpp

📁 湖北水文黄石试点集中器代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//添加小时 	
    itoa(t.ti_hour,string,10); //把整型转换成十进制字符型,存放在string字符串中
    if(strlen(string)<2)
    {
    	 PutOutTemBuff[13]='0';  //小时数少于两个字节前面补零
	     PutOutTemBuff[14]= string[0];
	  }
	  else 
	  {
    	 PutOutTemBuff[13]= string[0];	 
	     PutOutTemBuff[14]= string[1];	 
	  } 

//添加分钟
    itoa(t.ti_min,string,10);  //把整型转换成十进制字符型,存放在string字符串中
    if(strlen(string)<2)
    {
    	 PutOutTemBuff[15]='0';   //分钟数少于两个字节前面补零
	     PutOutTemBuff[16]= string[0];
	  }
	  else 
	  {
    	 PutOutTemBuff[15]= string[0];	 
	     PutOutTemBuff[16]= string[1];	 
	  }	 
	  
//添加秒钟
    itoa(t.ti_sec,string,10);  //把整型转换成十进制字符型,存放在string字符串中
    if(strlen(string)<2)
    {
    	 PutOutTemBuff[17]='0';   //分钟数少于两个字节前面补零
	     PutOutTemBuff[18]= string[0];
	  }
	  else
	  {
    	 PutOutTemBuff[17]= string[0];	 
	     PutOutTemBuff[18]= string[1];	 
	  }
/////////////////////////////////////////////添加时间结束  

    return 1;

}  	  

//对应用端做出应答
void Ack_center_command( unsigned char typeofdata, unsigned char CtrlCode )
{
	  unsigned char checksum = 0;
	  unsigned char cs_bytecount;
	  unsigned char i = 0;	
	  unsigned char *PutOutTemBuff;	
    
    PutOutTemBuff = TmpBuf; //让指针变量的地址指向TmpBuf
	  
	  PutOutTemBuff[0]=	0x68;
	  PutOutTemBuff[1]=	DTUAddress[0];
	  PutOutTemBuff[2]=	DTUAddress[1];
	  PutOutTemBuff[3]=	typeofdata;    
	  PutOutTemBuff[4]=	0x68;        
	  
	  PutOutTemBuff[5]= CtrlCode;  //应答校时的功能码 
	  
	  PutOutTemBuff[6]= 0x00; 
	  	
/////////////////////////////计算校验和  
		cs_bytecount = PutOutTemBuff[6]*8 + 7;
		for( i=0; i < cs_bytecount; i++ )
	 	checksum += PutOutTemBuff[i];   

	 	
	 	PutOutTemBuff[cs_bytecount]= checksum; //存放校验和的数值
	 	
	 	PutOutTemBuff[cs_bytecount+1]= FRAME_END_CHAR;  //帧结束标志	
	 	
	 	PutOutTemBuff[cs_bytecount+2]= '\0';
	 	
	 	//Send_to_Svr(PutOutTemBuff,cs_bytecount+2); //向应用端发送数据
    if(TCPManager[0]->GetConnState( )==OPEN)
    	Send_to_Single_Svr( PutOutTemBuff, APPSERVER1, cs_bytecount+2 );
    
    if(TCPManager[1]->GetConnState( )==OPEN)
    	Send_to_Single_Svr( PutOutTemBuff, APPSERVER2, cs_bytecount+2 ); 	 	
	 	
}  	  	

//对单个应用端做出应答
void Ack_single_center_command( unsigned char typeofdata, unsigned char CtrlCode, unsigned char center )
{
	  unsigned char checksum = 0;
	  unsigned char cs_bytecount;
	  unsigned char i = 0;	
	  unsigned char *PutOutTemBuff;	
    
    PutOutTemBuff = TmpBuf; //让指针变量的地址指向TmpBuf
	  
	  PutOutTemBuff[0]=	0x68;
	  PutOutTemBuff[1]=	DTUAddress[0];
	  PutOutTemBuff[2]=	DTUAddress[1];
	  PutOutTemBuff[3]=	typeofdata;    
	  PutOutTemBuff[4]=	0x68;        
	  
	  PutOutTemBuff[5]= CtrlCode;  //应答校时的功能码 
	  
	  PutOutTemBuff[6]= 0x00; 
	  	
/////////////////////////////计算校验和  
		cs_bytecount = PutOutTemBuff[6]*8 + 7;
		for( i=0; i < cs_bytecount; i++ )
	 	checksum += PutOutTemBuff[i];   

	 	
	 	PutOutTemBuff[cs_bytecount]= checksum; //存放校验和的数值
	 	
	 	PutOutTemBuff[cs_bytecount+1]= FRAME_END_CHAR;  //帧结束标志	
	 	
	 	PutOutTemBuff[cs_bytecount+2]= '\0';
	 	
	 	Send_to_Single_Svr(PutOutTemBuff, center, cs_bytecount+2); //向单个应用端发送数据
	 	
}

int Add_data_type_flag( unsigned char *PutOutTemBuff, unsigned char typeofdata, int type_of_Ivtime, 
                         int offset ) 
{   
	  int type_byte_len=1;
	  
    if((typeofdata&0xf)==0x02) //前面为GPRS信道,后面为CDMA信道
    {
    	 PutOutTemBuff[18+offset]= 'Z';
    	 type_byte_len=1;
    } 
    else if((typeofdata&0xf)==0x01)	//前面为GPRS信道,后面为CDMA信道
    {
    	 switch(type_of_Ivtime)
    	 {
    	 	  case 0x0001:
    	 	  	   PutOutTemBuff[18+offset]= 'P';
    	 	  	   PutOutTemBuff[19+offset]= 'N';
    	 	  	   PutOutTemBuff[20+offset]= '0';
    	 	  	   PutOutTemBuff[21+offset]= '1';
    	 	  	   type_byte_len = 4;
    	 	  	   break;

    	 	  case 0x0005:
    	 	  	   PutOutTemBuff[18+offset]= 'P';
    	 	  	   PutOutTemBuff[19+offset]= 'N';
    	 	  	   PutOutTemBuff[20+offset]= '0';
    	 	  	   PutOutTemBuff[21+offset]= '5';
    	 	  	   type_byte_len = 4;
    	 	  	   break; 

    	 	  case 0x000a:
    	 	  	   PutOutTemBuff[18+offset]= 'P';
    	 	  	   PutOutTemBuff[19+offset]= 'N';
    	 	  	   PutOutTemBuff[20+offset]= '1';
    	 	  	   PutOutTemBuff[21+offset]= '0';
    	 	  	   type_byte_len = 4;
    	 	  	   break;    	 	  	      	 	  

    	 	  case 0x000f:
    	 	  	   PutOutTemBuff[18+offset]= 'P';
    	 	  	   PutOutTemBuff[19+offset]= 'N';
    	 	  	   PutOutTemBuff[20+offset]= '1';
    	 	  	   PutOutTemBuff[21+offset]= '5';
    	 	  	   type_byte_len = 4;
    	 	  	   break;
    	 	  	   
    	 	  case 0x001e:
    	 	  	   PutOutTemBuff[18+offset]= 'P';
    	 	  	   PutOutTemBuff[19+offset]= 'N';
    	 	  	   PutOutTemBuff[20+offset]= '3';
    	 	  	   PutOutTemBuff[21+offset]= '0';
    	 	  	   type_byte_len = 4;
    	 	  	   break;  

    	 	  case 0x003c:
    	 	  	   PutOutTemBuff[18+offset]= 'P';
    	 	  	   PutOutTemBuff[19+offset]= '1';
               type_byte_len = 2;
    	 	  	   break;     	 	  	   

    	 	  case 0x0078:
    	 	  	   PutOutTemBuff[18+offset]= 'P';
    	 	  	   PutOutTemBuff[19+offset]= '2';
               type_byte_len = 2;
    	 	  	   break;     

    	 	  case 0x00b4:
    	 	  	   PutOutTemBuff[18+offset]= 'P';
    	 	  	   PutOutTemBuff[19+offset]= '3';
               type_byte_len = 2;
    	 	  	   break;  

    	 	  case 0x0168:
    	 	  	   PutOutTemBuff[18+offset]= 'P';
    	 	  	   PutOutTemBuff[19+offset]= '6';
               type_byte_len = 2;
    	 	  	   break; 

    	 	  case 0x02d0:
    	 	  	   PutOutTemBuff[18+offset]= 'P';
    	 	  	   PutOutTemBuff[19+offset]= '1';
    	 	  	   PutOutTemBuff[20+offset]= '2';
               type_byte_len = 3;
    	 	  	   break;  

    	 	  case 0x05a0:
    	 	  	   PutOutTemBuff[18+offset]= 'P';
    	 	  	   PutOutTemBuff[19+offset]= '2';
    	 	  	   PutOutTemBuff[20+offset]= '4';
               type_byte_len = 3;
    	 	  	   break;
    	 	  	       	 	  	   
          default: break;
       }
    }
    else   return 0;
    	
    return type_byte_len;	
}


RAINFALLDATA OutRainfallregdata;
int ReadRainfallHistroyData( unsigned char *CmdDataBuf, unsigned char center )
{   	  
	  int            i, k, value_of_return, readfilecnt = 0, sum_datalen=0;
	  int            Ifdataoverflg = 1;
	  unsigned char  j, checksum = 0;
	  unsigned char  history_data_len; 
	  int           cs_bytecount;	
	  int           type_byte_len, datalen=0;
	  unsigned char num_of_fill_byte;
	  unsigned char *PutOutTemBuff;  
	  unsigned char *TemDataBuff;
	  
    char StartQueryTime[6];
    char EndQueryTime[6];
    
    char string[10];    
    
    PutOutTemBuff = TmpBuf; //让指针变量的地址指向TmpBuf
    	
/////////////////////////应答读历史批量数据的固定格式	  
	  PutOutTemBuff[0]=	CmdDataBuf[0];
	  PutOutTemBuff[1]=	CmdDataBuf[1];
	  PutOutTemBuff[2]=	CmdDataBuf[2];
	  PutOutTemBuff[3]=	CmdDataBuf[3];    
	  PutOutTemBuff[4]=	CmdDataBuf[4];        
	  
	  PutOutTemBuff[5]= 0x84;  //上报招测数据的功能码  	
	  
	  StartQueryTime[0] = (CmdDataBuf[7]-48)*10 + CmdDataBuf[8]-48;
	  StartQueryTime[1] = (CmdDataBuf[9]-48)*10 + CmdDataBuf[10]-48;
	  StartQueryTime[2] = (CmdDataBuf[11]-48)*10 + CmdDataBuf[12]-48;	    
	  StartQueryTime[3] = 0x00; //把起始时间的小时数设为00
	  StartQueryTime[4] = 0x00; //把起始时间的分钟数设为00
	  StartQueryTime[5] = '\0';

	  
	  EndQueryTime[0] = (CmdDataBuf[13]-48)*10 + CmdDataBuf[14]-48;
	  EndQueryTime[1] = (CmdDataBuf[15]-48)*10 + CmdDataBuf[16]-48;
	  EndQueryTime[2] = (CmdDataBuf[17]-48)*10 + CmdDataBuf[18]-48;
	  EndQueryTime[3] = 0x17; //把截至时间的小时数设为23
	  EndQueryTime[4] = 0x3B;	//把截至时间的分钟数设为59 
	  EndQueryTime[5] = '\0';
	    	  
////////////////////////////////////////////////////////////////////////////////////////////////////
	  while(1)
    {
	      //从文件中读取满足要求的数据
	      //i==-1: Cannot open file
	      //i==-2: no match data
	      //i==-3: This file has no data

	     value_of_return = ReadOldRainfallData( "Rain.dat", StartQueryTime,EndQueryTime ); 
	     
	     if(value_of_return==0)	 readfilecnt++;   	          	
       else if(value_of_return==-2)
	     {   
	     	   if(readfilecnt>=1)
	     	   { 
	     	   	   if(GetKPState==LOCK) printf("readfilecnt=%d\n",readfilecnt);
	     	   	   break; //至少有一条满足要求的记录,并且找到文件的末尾
	     	   }
		       else 
		       { 
		       	   Ack_single_center_command(CmdDataBuf[3],	0x84, center); 
		       	   return 0;
		       }
	     }	     	            
	     else 
	     {
	     	   Ack_Wrong_ReadHistroyData( CmdDataBuf[3], center );
	     	   return 0;
	     }

///////////////////////////////////////在应答历史数据中添加时间信息

       GetTmpTimeInfo( PutOutTemBuff, 0x01, sum_datalen ); 
	  
 /////////////////////////////////////////////添加时间结束 

       PutOutTemBuff[17+sum_datalen]= 0x20; //添加空格符
 
       //////////////////////////添加水情数据种类标识符    	
       type_byte_len = Add_data_type_flag( PutOutTemBuff, CmdDataBuf[3], OutRainfallregdata.type_of_Ivtime, sum_datalen );	      	 	  	       	 	  	     	 	  	   	 	  	    	 	  	   
       ////////////////添加水情数据种类标识符结束       
 
    
       PutOutTemBuff[18+sum_datalen+type_byte_len]= 0x20; //添加空格符
    
//////////////////////////////////    

       	  history_data_len = strlen(OutRainfallregdata.rainfall);
       	  TemDataBuff = OutRainfallregdata.rainfall;
   
       for(j=0; j<history_data_len; j++)
       {  
    	    //存放采集的数值,字符型数据格式
          PutOutTemBuff[19+sum_datalen+type_byte_len+j]= TemDataBuff[j];	 
       }	          
    
       PutOutTemBuff[19 + sum_datalen + type_byte_len + history_data_len]= 0x20;  //添加空格符 

       PutOutTemBuff[20 + sum_datalen + type_byte_len + history_data_len]= 0x4E;  //添加固定格式的数据域结束字符
       
       PutOutTemBuff[21 + sum_datalen + type_byte_len + history_data_len]= 0x4E;  //添加固定格式的数据域结束字符  
    
       datalen = 21-7+1 + type_byte_len + history_data_len;      //每小段完整的数据包的长度
    
       sum_datalen += datalen;
    
       if(sum_datalen>976)  
       {  
       	  Ifdataoverflg = -1;
       	  PutOutTemBuff[5]= 0xA4;  //上报历史数据的功能码,表示有后续帧 
       	  break;
       }
    	
    }   
/////////////////////////////////////////////////////////////////////////////////////////////////////////
    //数据域的长度为PutOutTemBuff[6]*8个字节(包括0x00填充字节)
    if((sum_datalen%8)==0) PutOutTemBuff[6] = sum_datalen/8;    	
    else PutOutTemBuff[6] = sum_datalen/8 + 1;    	
    
    num_of_fill_byte = PutOutTemBuff[6]*8 - sum_datalen;
    
    for(i=0; i<num_of_fill_byte;i++)
      PutOutTemBuff[7 + sum_datalen + i] = 0x00; //填充0x00字节
      
/////////////////////////////计算校验和  
		cs_bytecount = PutOutTemBuff[6]*8 + 7;
		for( k=0; k < cs_bytecount; k++ )
	 	checksum += PutOutTemBuff[k];   

	 	
	 	PutOutTemBuff[cs_bytecount]= checksum; //存放校验和的数值
	 	
	 	PutOutTemBuff[cs_bytecount+1]= FRAME_END_CHAR;  //帧结束标志	 

//////////////////////////////招测数据打包结束

    PutOutTemBuff[cs_bytecount+2]= '\0';
    
    i = Send_to_Single_Svr(PutOutTemBuff, center, cs_bytecount+2); //向应用端发送数据	
    if(i<0) Send_to_Single_Svr(PutOutTemBuff, center, cs_bytecount+2); //向应用端发送数据
    
    return Ifdataoverflg;
        		  
} 


WATERLEVELDATA OutWaterLevelregdata;
int ReadWaterLevelHistroyData( unsigned char *CmdDataBuf, unsigned char center )
{   
	  int           i, k, value_of_return, readfilecnt = 0, sum_datalen=0;
	  int            Ifdataoverflg = 1;
	  unsigned char  j, checksum = 0;
	  unsigned char  history_data_len; 
	  int           cs_bytecount;	
	  int           type_byte_len, datalen=0;
	  unsigned char num_of_fill_byte;
	  unsigned char *PutOutTemBuff;  
	  unsigned char *TemDataBuff;
	  
    char StartQueryTime[6];
    char EndQueryTime[6];
    
    char string[10];    
    
    PutOutTemBuff = TmpBuf; //让指针变量的地址指向TmpBuf
    	
/////////////////////////应答读历史批量数据的固定格式	  
	  PutOutTemBuff[0]=	CmdDataBuf[0];
	  PutOutTemBuff[1]=	CmdDataBuf[1];
	  PutOutTemBuff[2]=	CmdDataBuf[2];
	  PutOutTemBuff[3]=	CmdDataBuf[3];    
	  PutOutTemBuff[4]=	CmdDataBuf[4];        
	  
	  PutOutTemBuff[5]= 0x84;  //上报招测数据的功能码  	
	  
	  StartQueryTime[0] = (CmdDataBuf[7]-48)*10 + CmdDataBuf[8]-48;
	  StartQueryTime[1] = (CmdDataBuf[9]-48)*10 + CmdDataBuf[10]-48;
	  StartQueryTime[2] = (CmdDataBuf[11]-48)*10 + CmdDataBuf[12]-48;	    
	  StartQueryTime[3] = 0x00; //把起始时间的小时数设为00
	  StartQueryTime[4] = 0x00; //把起始时间的分钟数设为00
	  StartQueryTime[5] = '\0';

	  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -