📄 cmdproc.cpp
字号:
else
{
PutOutTemBuff[8]= string[0];
PutOutTemBuff[9]= string[1];
} //D2
itoa(IvtimeWakeUp[flag],string,10);
len = strlen(string);
for(i=0;i<4-len;i++)
PutOutTemBuff[10+i]='0';
for(i=4-len;i<4;i++)
PutOutTemBuff[10+i]= string[i-(4-len)]; //D3
itoa(Num_of_thr[flag],string,10);
if(strlen(string)<2)
{
PutOutTemBuff[14]='0';
PutOutTemBuff[15]= string[0];
}
else
{
PutOutTemBuff[14]= string[0];
PutOutTemBuff[15]= string[1];
} //D4
for(j=0; j<Num_of_thr[flag]; j++) //D5
{
itoa(ThrWakeUp[flag][j].thr_unit,string,10);
len = strlen(string);
for(i=0;i<4-len;i++)
PutOutTemBuff[16+i+10*j]='0';
for(i=4-len;i<4;i++)
PutOutTemBuff[16+i+10*j]= string[i-(4-len)]; //D5-1
itoa(ThrWakeUp[flag][j].thr_value,string,10);
len = strlen(string);
for(i=0;i<6-len;i++)
PutOutTemBuff[20+i+10*j]='0';
for(i=6-len;i<6;i++)
PutOutTemBuff[20+i+10*j]= string[i-(6-len)]; //D5-2
} //D5
sum_datalen = 9 + 10*Num_of_thr[flag];
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//数据域的长度为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( 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); //向应用端发送数据
r = Send_to_Single_Svr(PutOutTemBuff, center, cs_bytecount+2); //向应用端发送数据
return r; //add by wuhuan 2006.5.24
}
void Ack_Wrong_ReadSendCondition( unsigned char typeofdata, unsigned char center )
{
Ack_single_center_command(typeofdata, 0xc6, center);
}
int DisconnectTCP( )
{
//接受到应用端的关闭指令后,执行连接关闭动作
if((Rm==ms)&&(RecFrom==APPSERVER1)) //主从模式下,只有主站才能关闭TCP连接
{
CloseAllTCPConn( );
TaskFlg = NeedInitUART; //串口需再次初始化的标志
if(GetKPState==LOCK) printf("MS_Mode: Svr1 shutdown TCP Conn!\n");
}
if(Rm==eb)
{
if((RecFrom == APPSERVER1)&&(TCPManager[1]->GetConnState( )!=OPEN))
{
CloseAllTCPConn( );
TaskFlg = NeedInitUART; //串口需再次初始化的标志
if(GetKPState==LOCK) printf("EB_Mode: Svr1 shutdown TCP Conn!\n");
}
else if((RecFrom == APPSERVER2)&&(TCPManager[0]->GetConnState( )!=OPEN))
{
CloseAllTCPConn( );
TaskFlg = NeedInitUART; //串口需再次初始化的标志
if(GetKPState==LOCK) printf("EB_Mode: Svr2 shutdown TCP Conn!\n");
}
}
return 1;
}
int Master_slave_mode( )
{
Rm = ms;
if(RecFrom == APPSERVER1) TCPManager[0]->SetTimeoutCnt( 1 );
else TCPManager[1]->SetTimeoutCnt( 1 );
return 1;
}
int Equal_backup_mode( )
{
Rm = eb;
if(RecFrom == APPSERVER1) TCPManager[0]->SetTimeoutCnt( 1 );
else TCPManager[1]->SetTimeoutCnt( 1 );
return 1;
}
int Simplex_mode( )
{
if(Rm==eb)
{
if (RecFrom == APPSERVER1) TCPManager[1]->Close( );
else TCPManager[0]->Close( );
}
Cm = simplex;
if(RecFrom == APPSERVER1) TCPManager[0]->SetTimeoutCnt( 1 );
else TCPManager[1]->SetTimeoutCnt( 1 );
return 1;
}
int Duplex_mode( )
{
Cm = duplex;
if(RecFrom == APPSERVER1) TCPManager[0]->SetTimeoutCnt( 1 );
else TCPManager[1]->SetTimeoutCnt( 1 );
return 1;
}
////////////////////////
int Modify_Svr_Addr( unsigned char *CmdDataBuf )
{
unsigned char i, datalen;
unsigned char GetInBuf[30];
unsigned char *ptr;
datalen = CmdDataBuf[6]*8;
for(i=0; i<datalen; i++)
GetInBuf[i] = CmdDataBuf[7+i];
GetInBuf[datalen] = '\0';
ptr=strtok( GetInBuf,"/" ); //取"/"号前面的字符到Content地址中
if( !stricmp( "s", ptr ) ) //找到符合要求的服务端
{
ptr=strtok( NULL,":" ); //遇到":" 字符取字符串动作结束
if(ptr!=NULL) //"/"号后面有字符
strcpy( Svr_ID.IPStr, ptr );
ptr=strtok( NULL,";" ); //遇到";" 字符或回车字符取字符串动作结束
Svr_ID.Port = atoi(ptr );
if(RecFrom == APPSERVER1) // 来自集中器第一条TCP的连接的请求
{
TCPManager[0]->Close( );
TCPManager[0]->Init( &Svr_ID );
}
else
{
TCPManager[1]->Close( );
TCPManager[1]->Init( &Svr_ID );
}
}
return 1;
}
int Save_Svr_Addr( )
{
SERVER_ID *CurrentServer_ID;
if(RecFrom == APPSERVER1) // 来自集中器第一条TCP的连接
{
CurrentServer_ID=TCPManager[0]->GetServer_ID();
ReadIni.WriteField( "Config.ini", "[CONFIG1]", "RemoteIP", CurrentServer_ID->IPStr );
ReadIni.WriteField( "Config.ini", "[CONFIG1]", "RemotePort", CurrentServer_ID->Port );
}
else // 来自集中器第二条TCP的连接
{
CurrentServer_ID=TCPManager[1]->GetServer_ID();
ReadIni.WriteField( "Config.ini", "[CONFIG2]", "RemoteIP", CurrentServer_ID->IPStr );
ReadIni.WriteField( "Config.ini", "[CONFIG2]", "RemotePort", CurrentServer_ID->Port );
}
return 1;
}
int Ack_Read_DTU_time( unsigned char typeofdata )
{
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]= 0x8F; //应答校时的功能码
PutOutTemBuff[6]= 0x02;
AddTimeInfo( PutOutTemBuff ); //给上报的数据包中添加时间
//不足8的整数倍字节的补0x00
PutOutTemBuff[19]= 0x00;
PutOutTemBuff[20]= 0x00;
PutOutTemBuff[21]= 0x00;
PutOutTemBuff[22]= 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, RecFrom, cs_bytecount+2); //向应用端发送数据
return 1;
}
//配置数据采集的间隔时间
int Write_interval_time_of_gatherdata( unsigned char *CmdDataBuf )
{
int configvar = 5;
configvar = (CmdDataBuf[7]-48)*100 + (CmdDataBuf[8]-48)*10 + CmdDataBuf[9]-48;
if(configvar)
{
if(CmdDataBuf[3]==0x01) Ivtime[0] = configvar; //配置雨量采集的间隔时间
if(CmdDataBuf[3]==0x02) Ivtime[1] = configvar; //配置水位采集的间隔时间
return configvar;
}
else return 5;
}
//正确应答配置数据采集的间隔时间
void Ack_Right_Write_interval_time_of_gatherdata( unsigned char typeofdata, unsigned char center )
{
Ack_single_center_command(typeofdata , 0x92, center);
}
//异常应答配置数据采集的间隔时间
void Ack_Wrong_Write_interval_time_of_gatherdata( unsigned char typeofdata, unsigned char center )
{
Ack_single_center_command(typeofdata , 0xd2, center);
}
//正确应答读数据采集的间隔时间
int Ack_Right_Read_interval_time_of_gatherdata( unsigned char typeofdata, unsigned char center )
{
int r; //add by wuhuan 2006.5.26
unsigned char i, j, k,len,checksum = 0;
unsigned char cs_bytecount;
unsigned char *PutOutTemBuff;
char string[10];
PutOutTemBuff = TmpBuf; //让指针变量的地址指向TmpBuf
PutOutTemBuff[0]= 0x68;
PutOutTemBuff[1]= DTUAddress[0];
PutOutTemBuff[2]= DTUAddress[1];
PutOutTemBuff[3]= typeofdata;
PutOutTemBuff[4]= 0x68;
PutOutTemBuff[5]= 0x93; //上报招测数据的功能码
PutOutTemBuff[6]= 0x01; //数据区的长度8个字节
if(typeofdata==0x01) itoa(Ivtime[0],string,10); //取雨量采集的间隔时间
else if(typeofdata==0x02) itoa(Ivtime[1],string,10); //取水位采集的间隔时间
else { if(GetKPState==LOCK) printf("\nUpFrame format erro!\n");}
len = strlen(string);
for(k=0;k<3-len;k++)
PutOutTemBuff[7+k]='0';
for(k=3-len;k<3;k++)
PutOutTemBuff[7+k]= string[k-(3-len)]; //D3
for(j=0; j<5; j++)
PutOutTemBuff[10+j] = 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); //向应用端发送数据
r = Send_to_Single_Svr(PutOutTemBuff, center, cs_bytecount+2); //向应用端发送数据
return r;
}
//错误应答读数据采集的间隔时间
void Ack_Wrong_Read_interval_time_of_gatherdata( unsigned char typeofdata, unsigned char center )
{
Ack_single_center_command(typeofdata, 0xd3, center);
}
//在发送包中添加时间信息
int AddTimeInfo( unsigned char *PutOutTemBuff )
{
char string[10];
struct time t;
struct date d;
///////////////////////////////////////给上报的数据包中添加时间
getdate( &d ); //取系统的时间
gettime( &t );
//添加年
itoa(d.da_year,string,10); //把整型转换成十进制字符型,存放在string字符串中
PutOutTemBuff[7]= string[2];
PutOutTemBuff[8]= string[3];
//添加月份
itoa(d.da_mon,string,10); //把整型转换成十进制字符型,存放在string字符串中
if(strlen(string)<2)
{
PutOutTemBuff[9]='0'; //月份少于两个字节前面补零
PutOutTemBuff[10]= string[0];
}
else
{
PutOutTemBuff[9]= string[0];
PutOutTemBuff[10]= string[1];
}
//添加日期
itoa(d.da_day,string,10); //把整型转换成十进制字符型,存放在string字符串中
if(strlen(string)<2)
{
PutOutTemBuff[11]='0'; //日期少于两个字节前面补零
PutOutTemBuff[12]= string[0];
}
else
{
PutOutTemBuff[11]= string[0];
PutOutTemBuff[12]= string[1];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -