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

📄 protocol.c

📁 用来pdu编解码
💻 C
📖 第 1 页 / 共 3 页
字号:
/**************************************************************************
文件名: protocol.c
功能  : 终端和中心通信协议

2007-6-13 0:44		v3.0

2007-6-14 0:44   	v4.0
2007-6-14 21:01   	v5.0





2007-6-15 1:30 	centSetWorkPara		调试通过
				cwntSetWorkState	调试通过
				centLoginConfirm	调试通过
				centGetWorkState	调试通过
				centGetWorkPara		调试通过
				centGetCarState		调试通过
				
				
				tmLoginMsg			调试通过
				tmGetWorkStateMsg	调试通过
				tmGetWorkParaMsg    调试通过
				tmCarStateMsg       调试通过
				
				tmEventProcess      调试通过
**************************************************************************/

#include "protocol.h"


//**************************************************************************
//函数:FrameCheck
//功能: 校验命令帧的有效性
//输入:Cmmd=中心命令,Commdlen=中心命令长度
//返回:帧的有效性,
//0=有效,1=基本长度错误
//2=帧头错误,3=帧长错误
//4=校验和错误
//**************************************************************************
//#define TEST

#ifdef TEST
	#define Myprintf printf
#else
	#define Myprintf RunMsgPrintf
#endif

char centFrameCheck( unsigned char *Commd, unsigned char Commdlen )
{
	//基本长度
	if (Commdlen < F_BASIC_LENGTH)return 1;
	//帧头		

	if (strstr(Commd, F_HEAD_STR) ==0)return 2;
			
	//帧长度
//	if (!(Commd[F_LENGTH_BEGIN] == Commdlen))return 3;	
		
	//校验和
	
	//帧有效
	return 0;
} 
//**************************************************************************
//函数:FrameDeal
//功能: 解析中心命令并进行相应的处理
//输入:Cmmd=中心命令,Commdlen=中心命令长度
//返回:无
//**************************************************************************
void centFrameDeal(unsigned char *Commd, unsigned char Commdlen)
{
	char result;
	
	result = centFrameCheck(Commd, Commdlen);

	//中心命令帧有效性判断
	if ((Commd[F_TYPE_BEGIN] != F_TYPE_COMMD)&&(Commd[F_TYPE_BEGIN] != F_TYPE_SURE))
	{
		Myprintf("\n无效的中心命令\n");
		return;
	}		
	
	switch (result)	
	{
		case 0:	Myprintf("\n中心命令正确\n");break;
		case 1:	Myprintf("\n中心命令基本长度错误\n");return;
		case 2:	Myprintf("\n中心命令帧头错误\n");return;
		case 3:	Myprintf("\n中心命令帧长错误\n");return;
		case 4:	Myprintf("\n中心命令校验和错误\n");return;		
	}	

	//根据帧类型进行相应的处理	
	switch ((int)Commd[F_TYPE_BEGIN])	
	{
			case F_TYPE_COMMD:
						switch (Commd[F_CODE_BEGIN]) 
						{
							case F_CODE_LOGIN: 
								//中心要求重新注册
								//设置注册状态为0,重新注册
								SysState.Logined = 0;
								Myprintf("中心要求重新注册");
								centNoteTmlogin(Commd +F_DATA_BEGIN, Commdlen - F_BASIC_LENGTH);
								break;
							
							case F_CODE_CARSTATE:
								//中心请求车辆状态
								Myprintf("中心请求车辆状态");
								centGetCarState(Commd +F_DATA_BEGIN, Commdlen - F_BASIC_LENGTH);	
								break;
							
							case F_CODE_GETWORKPARA:
								Myprintf("中心请求工作参数");
								centGetWorkPara(Commd +F_DATA_BEGIN, Commdlen - F_BASIC_LENGTH);	
							break;
						
							case F_CODE_SETWORKPARA:
								Myprintf("中心设置工作参数");
								centSetWorkPara(Commd +F_DATA_BEGIN, Commdlen - F_BASIC_LENGTH);	
								break;
							case F_CODE_GETWORKSTATE:
								Myprintf("中心请求工作状态");
								centGetWorkState(Commd +F_DATA_BEGIN, Commdlen - F_BASIC_LENGTH);	
								break;
							case F_CODE_SETWORKSTATE:
								Myprintf("中心设置工作状态");
								centSetWorkState(Commd +F_DATA_BEGIN, Commdlen - F_BASIC_LENGTH);
								break;
							case F_CODE_WARN:
								
								break;
							case F_CODE_CLEARWARN:
								
								break;
							case F_CODE_DETECT:
								
								break;
																		
					}
					break;//break case F_TYPE_COMMD
			case F_TYPE_SURE:
						switch (Commd[F_CODE_BEGIN]) 
						{
							case F_CODE_LOGIN: 
								Myprintf("\n中心确认登录\n");
								centLoginConfirm(Commd +F_DATA_BEGIN, Commdlen - F_BASIC_LENGTH);	
								break;

							case F_CODE_WARN:
								
								break;
							case F_CODE_CLEARWARN:
								
								break;
							case F_CODE_DETECT:
								
								break;
																		
					}
					break;//break case F_TYPE_SURE
	}
}
//**************************************************************************
//函数:LoginConfirm
//功能: 中心对终端注册确认/否认帧
//输入:Data=DATA部分,Datalen=Data长度
//返回:无
//
//
//**************************************************************************
void centLoginConfirm( unsigned char *Data , int Datalen)
{
	if (Data[0] == LP_DATA_SEGMENT_PMT)
	{
		//合法/允许
		//停止计时,进入工作状态	
		SysState.Logined = 1;	
		SysState.fSendLoginMsg.TimeEnabled = 0;
		SysState.fSendLoginMsg.flag = 0;	
	}	
}
//**************************************************************************
//函数:centNoteTmlogin
//功能: 中心要求终端重新注册
//输入:Data=DATA部分,Datalen=Data长度
//返回:无
//
//
//**************************************************************************
void centNoteTmlogin( unsigned char *Data , int Datalen)
{
	SysState.fSendLoginMsg.flag = 1;	
	SysState.Logined = 0;	
}
//**************************************************************************
//函数:centGetCarState
//功能: 中心读取车辆状态
//输入:Data=DATA部分,Datalen=Data长度
//返回:无
//**************************************************************************
void centGetCarState( unsigned char *Data, int Datalen)
{
	
	//发送一次车辆状态
	SysState.fSendCarStateMsg.flag = 1;	

}
//**************************************************************************
//函数:centGetWorkPara
//功能: 中心读取工作参数
//输入:Data=Data部分,Datalen=Data长度
//返回:无
//**************************************************************************
void centGetWorkPara( unsigned char *Data, int Datalen)
{
	
	//发送一次工作参数
	SysState.fSendSetPataMsg = 1;	

}
//**************************************************************************
//函数:centSetWorkPara
//功能: 中心设定工作状态
//输入:Data=DATA部分,Datalen=Data长度
//返回:无
//**************************************************************************
void centSetWorkPara( unsigned char *Data, int Datalen)
{
	int kk, jj;
	char type;
	
	for(kk=0; kk<Datalen; )
	{		
		type = *Data;
		
		switch (type)
		{
			case WP_PT_COMTYPE:
					Data++;
					BasicPara.ComuMode = Data[0];//通信模式	
					Data++ ;
					kk += 2;
					//Myprintf("commode=%d\n",BasicPara.ComuMode );
					//Myprintf("kk=%d", kk);
					break;
			case WP_PT_CENTNUM://中心gsm号码
					Data++;
					myCopy( Data , BasicPara.CenterGsmNum ,0 ,CENTERNUMLEN);
					Data += CENTERNUMLEN;
					kk += CENTERNUMLEN+1;
					
					//Myprintf("CenterGsmNum=%s\n",BasicPara.CenterGsmNum );
					//Myprintf("kk=%d", kk);
					break;
			case WP_PT_CENTIP://中心IP和端口
					Data++;
					myCopy( Data , BasicPara.CenterIP[0] ,0 ,4);
					Data += 4;
					//Myprintf("IP:%d.%d.%d.%d\n",BasicPara.CenterIP[0][0],BasicPara.CenterIP[0][1],BasicPara.CenterIP[0][2],BasicPara.CenterIP[0][3] );
					BasicPara.CenterPort[0] = Data[0]*256+Data[1];
					//Myprintf("PORT:%d\n",BasicPara.CenterPort[0]);
					Data += 2;
					kk += 7;
					//Myprintf("kk=%d", kk);
					break;
			case WP_PT_MSGPERIOD://终端消息发送间隔时间
					Data++;
					WorkPara.sLoginMsgPeriod = Data[0]*256 + Data[1];
					WorkPara.sCarStateMsgPeriod = WorkPara.sLoginMsgPeriod;
					//Myprintf("sCarStateMsgPeriod:%d\n",WorkPara.sCarStateMsgPeriod);
					Data += 2;
					kk +=3;
					//Myprintf("kk=%d", kk);
			case WP_PT_WARNPERIOD://终端报警消息发送间隔时间
					Data++;
					WorkPara.sWarnMsgPeriod = Data[0]*256 + Data[1];
					//Myprintf("sWarnMsgPeriod:%d\n",WorkPara.sWarnMsgPeriod);
					Data += 2;	
					kk +=3;
					//Myprintf("kk=%d", kk);
					break;
			case WP_PT_SENSORSBOUND://16路传感器报警门限
					Data++;
					for(jj=0; jj < 16; jj++)
					{
						WorkPara.SensorsBound[jj] = Data[0]*256 + Data[1];	
						//Myprintf("SensorsBound[%d]=%d\n",jj, WorkPara.SensorsBound[jj]);
						Data += 2;
						
						//Myprintf("kk=%d", kk);
					}
					kk +=16*2+1;
					break;
			case WP_PT_SENSORWARNEN://报警使能
					Data++;
					WorkPara.SensorsWarnEnabled[0] = Data[0];
					WorkPara.SensorsWarnEnabled[1] = Data[1];
					//Myprintf("SensorsWarnEnabled[%d][%d]\n", WorkPara.SensorsWarnEnabled[0], WorkPara.SensorsWarnEnabled[1]);
					Data +=2;
					kk +=3;
					//Myprintf("kk=%d", kk);
					break;
			case WP_PT_WAITCHSTATE:
					//开关量正常状态值
					Data++;
					WorkPara.SwitchNomalState[0] = Data[0];
					WorkPara.SwitchNomalState[1] = Data[1];
					//Myprintf("SwitchNomalState[%d][%d]\n", WorkPara.SwitchNomalState[0], WorkPara.SwitchNomalState[1]);

					Data +=2;
					kk +=3;
					//Myprintf("kk=%d", kk);
					break;
			case WP_PT_WAITCHWARNEN:
					//开关量报警使能
					Data++;
					WorkPara.SwitchWarnEnable[0] = Data[0];
					WorkPara.SwitchWarnEnable[1] = Data[1];
					//Myprintf("SwitchWarnEnable[%d][%d]\n", WorkPara.SwitchWarnEnable[0], WorkPara.SwitchWarnEnable[1]);
					//Myprintf("kk=%d", kk);
					Data +=2;
					kk +=3;
					//Myprintf("kk=%d", kk);
					break;	
			case WP_PT_RUNFIELD:
					//活动范围
					//左上角纬度
					jj = FindeCharInStr(Data, (Datalen - kk) , 1, ',');
					if (jj == -1) return;					
					myCopy(Data, (char*)WorkPara.gpsPositionBound_LEFT.latitude, 0, jj);
					Data += jj+1;
					kk += jj+1;	
					
					
					WorkPara.gpsPositionBound_LEFT.LatiIndit = Data[0];	
					Data += 2;
					kk += 2;	
					//左上角经度
					jj = FindeCharInStr(Data, (Datalen - kk) , 1, ',');
					if (jj == -1) return;					
					myCopy(Data, WorkPara.gpsPositionBound_LEFT.Longitude, 0, jj);
					Data += jj+1;
					kk += jj+1;	
					
					WorkPara.gpsPositionBound_LEFT.LongiIndit = Data[0];	
					Data += 2;
					kk += 2;				
					
					//右下角纬度
					jj = FindeCharInStr(Data, (Datalen - kk) , 1, ',');
					if (jj == -1) return;					
					myCopy(Data, WorkPara.gpsPositionBound_RIGHT.latitude, 0, jj);
					Data += jj+1;
					kk += jj+1;	
					
					WorkPara.gpsPositionBound_RIGHT.LatiIndit = Data[0];	
					Data += 2;
					kk += 2;	
					//右下角经度
					//jj = FindeCharInStr(Data, (Datalen - kk) , 1, ',');
					if (jj == -1) return;					
					myCopy(Data, WorkPara.gpsPositionBound_RIGHT.Longitude, 0, jj);
					Data += jj+1;
					kk += jj+1;	
					
					WorkPara.gpsPositionBound_RIGHT.LongiIndit = Data[0];	
					Data += 2;
					kk += 2;	
									
					break;		
			default : return;			
									
		}	
		
	}	
	//终端回应,发送参数设定消息
	SysState.fSendSetPataMsg = 1;

}
//**************************************************************************
//函数:centGetWorkState
//功能: 中心查询工作状态
//输入:Data=DATA部分,Datalen=Data长度
//返回:无
//**************************************************************************
void centGetWorkState( unsigned char *Data, int Datalen)
{
	//返回工作状态
	SysState.fSendWorkState = 1;		
}
//**************************************************************************
//函数:centSetWorkState
//功能: 中心设定工作状态
//输入:Data=DATA部分,Datalen=Data长度
//返回:无
//**************************************************************************
void centSetWorkState( unsigned char *Data, int Datalen)
{

⌨️ 快捷键说明

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