📄 cmdproc.cpp
字号:
//添加小时
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 + -