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

📄 protocol.c

📁 用来pdu编解码
💻 C
📖 第 1 页 / 共 3 页
字号:
	//设置当前工作状态
	SysState.CarWorkState = Data[0];
	
	switch (SysState.CarWorkState)
	{
		case WS_PT_CLASS_1_LOCK:
			SysState.fClass1Loack.RemainTime = WorkPara.sClass1LockDelay_m;
			SysState.fClass1Loack.flag = 0;
			SysState.fClass1Loack.TimeEnabled = 1;
			break;
		case WS_PT_CLASS_2_LOCK:
			SysState.fClass2Loack.flag = 1;
			break;				
	}
		
	//返回车辆状态消息
	SysState.fSendWorkState = 1;			
}

//**************************************************************************
//函数:tmLoginMsg
//功能: 生成终端注册消息
//输出:Msg=消息,Msgtype=消息类型
//返回:0=消息无效,>0=消息长度
//**************************************************************************
int tmLoginMsg( unsigned char *Msg)
{
	unsigned char *pMsg = Msg;
	sprintf(pMsg , BasicPara.TM_Time);//生产日期
	
	pMsg +=TM_TIMELENGTH;

	sprintf(pMsg , BasicPara.TM_type);//型号
	pMsg +=TM_TYPELENGTH;

	sprintf(pMsg , BasicPara.TM_id);//编号
	pMsg +=TM_IDLENGTH;

	return (abs(Msg - pMsg));			
}
//**************************************************************************
//函数:tmCarStateMsg
//功能: 生成车辆状态消息
//输出:Msg=消息
//返回:0=消息无效,>0=消息长度
//**************************************************************************
int tmCarStateMsg( unsigned char *Msg)
{
	int len;
	unsigned char *pMsg = Msg;
	
	*pMsg++ = CS_PT_SENSOR;

	for(len=0; len < SENSORSNUM; len++)
	{
		*pMsg++ = SysState.SensorsValue[len] / 256;
		*pMsg++ = SysState.SensorsValue[len] % 256;		
	}

	
	*pMsg++ = CS_PT_CARSTATE;
	*pMsg++ = SysState.SwitchState[0];
	*pMsg++ = SysState.SwitchState[1];
	
	*pMsg++ = CS_PT_GPS;
	sprintf((char*)pMsg, SysState.gpsInfo);//gps信息
	pMsg +=strlen(SysState.gpsInfo);
	return  (abs(Msg - pMsg));				
}
//**************************************************************************
//函数:tmCarStateMsg
//功能: 生成工作参数查询/设置响应消息
//输出:Msg=消息,Msgtype=消息类型
//返回:0=消息无效,>0=消息长度
//**************************************************************************
int tmGetWorkParaMsg( unsigned char *Msg)
{
	int kk;
	unsigned char *pMsg = Msg;
		
	*pMsg++ = WP_PT_COMTYPE;
	*pMsg++ = BasicPara.ComuMode;//通信模式	

	//中心gsm号码
	*pMsg++ = WP_PT_CENTNUM;
	sprintf( pMsg, BasicPara.CenterGsmNum );
	pMsg += CENTERNUMLEN;

	//中心IP和port
	*pMsg++ = WP_PT_CENTIP;
	*pMsg++ = BasicPara.CenterIP[0][0];
	*pMsg++ = BasicPara.CenterIP[0][1];
	*pMsg++ = BasicPara.CenterIP[0][2];
	*pMsg++ = BasicPara.CenterIP[0][3];	
	*pMsg++ = BasicPara.CenterPort[0]/ 256;
	*pMsg++ = BasicPara.CenterPort[0]% 256;	
	
	//终端注册消息发送间隔时间
	*pMsg++ = WP_PT_MSGPERIOD;
	*pMsg++ = WorkPara.sLoginMsgPeriod / 256;
	*pMsg++ = WorkPara.sLoginMsgPeriod % 256;
	
	//终端报警消息发送间隔时间
	*pMsg++ = WP_PT_WARNPERIOD;
	*pMsg++ = WorkPara.sWarnMsgPeriod / 256;
	*pMsg++ = WorkPara.sWarnMsgPeriod % 256;

	//16路传感器报警门限
	*pMsg++ = WP_PT_SENSORSBOUND;
	for(kk=0; kk < SENSORSNUM; kk++)
	{
		*pMsg++ = WorkPara.SensorsBound[kk] / 256;
		*pMsg++ = WorkPara.SensorsBound[kk] % 256;		
	}
	
	//传感器报警使能
	*pMsg++ = WP_PT_SENSORWARNEN;
	*pMsg++ = WorkPara.SensorsWarnEnabled[0];
	*pMsg++ = WorkPara.SensorsWarnEnabled[1];
	
	//开关量正常状态
	*pMsg++ = WP_PT_WAITCHSTATE;
	*pMsg++ = WorkPara.SwitchNomalState[0];
	*pMsg++ = WorkPara.SwitchNomalState[1];
	
	//开关量报警使能
	*pMsg++ = WP_PT_WAITCHWARNEN;
	*pMsg++ = WorkPara.SwitchWarnEnable[0];
	*pMsg++ = WorkPara.SwitchWarnEnable[1];
	
	//活动范围
	//......		
	
	return (abs(Msg - pMsg));	
}
//**************************************************************************
//函数:tmCarStateMsg
//功能: 生成工作状态查询/设置响应消息
//输出:Msg=消息,Msgtype=消息类型
//返回:0=消息无效,>0=消息长度
//**************************************************************************
int tmGetWorkStateMsg( unsigned char *Msg)
{
	*Msg = SysState.CarWorkState;
	
	return 1;		
}
//**************************************************************************
//函数:tmCreateMsg
//功能: 生成消息/指示
//输入:主功能码和子功能码
//输出:消息
//返回:0=消息无效,>0=消息长度
//**************************************************************************
void tmCreateMsg( TFrame *Frame)
{

	unsigned char *pMsg = Frame->msg; 
	uint16_t ck;
	
	//添加帧头
	myCopy( F_HEAD_STR, pMsg, 0, F_HEAD_LENGTH);	
	pMsg += F_HEAD_LENGTH;
	Frame->msglen = F_HEAD_LENGTH;
	
	//添加ID
	myCopy( BasicPara.TM_Time, pMsg, 0, TM_TIMELENGTH);	
	pMsg += TM_TIMELENGTH;
	Frame->msglen += TM_TIMELENGTH;
	myCopy( BasicPara.TM_type, pMsg, 0, TM_TYPELENGTH);	
	pMsg += TM_TYPELENGTH;
	Frame->msglen += TM_TYPELENGTH;
	myCopy( BasicPara.TM_id, pMsg, 0, TM_IDLENGTH);	
	pMsg += TM_IDLENGTH;	
	Frame->msglen += TM_IDLENGTH;
	//添加分段
	*pMsg++ = '0';
	Frame->msglen++;
	//添加帧长
	*pMsg++ = '0';	
	Frame->msglen++;
	//添加帧主类型
	*pMsg++ = Frame->type;
	Frame->msglen++;
	//添加帧子类型
	*pMsg++ = Frame->code;	
	Frame->msglen++;

	//添加数据段	
	switch (Frame->type)
	{
		case F_TYPE_RESPOND:
					switch(Frame->code)
					{
						//注册消息
						case F_CODE_LOGIN:							
							Frame->msglen +=tmLoginMsg(pMsg);
							break;	
						//车辆状态消息
						case F_CODE_CARSTATE:							
							Frame->msglen +=tmCarStateMsg(pMsg);
							break;	
						//工作参数查询响应消息					
						case F_CODE_GETWORKPARA:							
							Frame->msglen +=tmGetWorkParaMsg(pMsg);
							break;			
						//工作参数设定响应消息			
						case F_CODE_SETWORKPARA:							
							Frame->msglen +=tmGetWorkParaMsg(pMsg);
							break;	
						//工作状态查询响应消息				
						case F_CODE_GETWORKSTATE:							
							Frame->msglen +=tmGetWorkStateMsg(pMsg);
							break;
						//工作状态设定响应消息							
						case F_CODE_SETWORKSTATE:							
							Frame->msglen +=tmGetWorkStateMsg(pMsg);
							break;	
					}			
					break;				
		case F_TYPE_NOTE:break;		
	}	
	
	//计算校验和
	ck = cksum(Frame->msg, Frame->msglen);

	Frame->msg[Frame->msglen++] = ck / 256;
	Frame->msg[Frame->msglen++] = ck % 256;
	
	Frame->msg[F_LENGTH_BEGIN] = Frame->msglen;
}

//**************************************************************************
//从source的beginindex开始拷贝degits字节到dest
//输入:source=源字符串;beginindex=起始位置(从0开始算)
//      dest=目标字符串; degits=请求字节数
//返回:实际拷贝的字节数
//dest以'\0'结束
//**************************************************************************
int myCopy(char *source , char *dest , int beginindex ,int degits)
{
	int n ;
	int len ;
	len = strlen(source) ;
	if (degits>=(len-beginindex))
	{
		for(n=beginindex;n<len;n++)
			*(dest++)=source[n];
		*dest='\0';
			
		return (len-beginindex) ;	
		
	}else
	{
		for(n=beginindex;n<(degits+beginindex);n++)
			*(dest++)=source[n];
		*dest='\0';
			
		return degits ;	
		
	}		
}
//***************************************************************************
//寻找字符c在PStr中第Num次出现的位置
//返回:	=-1 不存在
//		>-1 c在PStr中第Num次出现的位置
//**************************************************************************
int FindeCharInStr ( char* PStr , int nSrcLength ,int cNum , char c ) 
{
		int i ,FindeCharInStr = -1 ;
		for(i = 0 ; i<nSrcLength;i++ , PStr++)
		{
			if (*PStr==c)
			{
				cNum-- ;
				if (cNum < 1 )
				{
					FindeCharInStr = i ;
					break ;		
				}
			}	
		}
		return FindeCharInStr ;
}

//void main(void)
//{
//////////////////////////////////////////////////////////////////////////////
//
//	ParaInit();
//
//    centSimunator("ctGetCarState");
//	tmEventProcess();
//    centSimunator("ctSetWorkPara");
//	tmEventProcess();
//    centSimunator("ctSetWorkState");
//	tmEventProcess();
//    centSimunator("ctNoteTmlogin");
//	tmEventProcess();
//    centSimunator("ctGetWorkState");
//	tmEventProcess();
//    centSimunator("ctGetWorkPara");
//    
//	tmEventProcess();		
//}
int ctSetWorkPara(unsigned char *msg)
{
					unsigned char *pcmd=msg;
					int jj;
					
					
					//设置工作参数
					*pcmd++ = '#';
					*pcmd++ = 'Z';
					*pcmd++ = 'F';
					*pcmd++ = '>';
						
					*pcmd++ = '0';
					*pcmd++ = '7';
					*pcmd++ = '0';
					*pcmd++ = '6';
					*pcmd++ = '1';
					*pcmd++ = '4';
					
					*pcmd++ = '0';
					*pcmd++ = '0';
					*pcmd++ = '0';
					*pcmd++ = '1';
					
					*pcmd++ = '0';
					*pcmd++ = '0';
					*pcmd++ = '0';
					*pcmd++ = '1';	
					*pcmd++ = '0';
					*pcmd++ = '1';			
					//分段
					*pcmd++ = '0';
					//帧长
					*pcmd++ = 'F';
					//type
					*pcmd++ = F_TYPE_COMMD;
					//code
					*pcmd++ = F_CODE_SETWORKPARA;

	
					*pcmd++ = WP_PT_COMTYPE;
					*pcmd++ = 1;//通信模式	
					
					*pcmd++ = WP_PT_CENTNUM;
					myCopy( BasicPara.CenterGsmNum, pcmd ,0 ,CENTERNUMLEN);

					pcmd += CENTERNUMLEN;

					*pcmd++ = WP_PT_CENTIP;
					//中心IP和端口
					*pcmd++ = 192;
					*pcmd++ = 168;
					*pcmd++ = 2;
					*pcmd++ = 3;
					
					*pcmd++ = 3689/256;
					*pcmd++ = 3689%256;
					
					//终端消息发送间隔时间
					*pcmd++ = WP_PT_MSGPERIOD;
					*pcmd++ = 1;
					*pcmd++ = 1;
					
					//终端报警消息发送间隔时间
					*pcmd++ = WP_PT_WARNPERIOD;
					*pcmd++ = 1;
					*pcmd++ = 2;

					//16路传感器报警门限
					*pcmd++ = WP_PT_SENSORSBOUND;
					for(jj=0; jj < 16; jj++)
					{
						*pcmd++ = 1;
						*pcmd++ = jj;
					}

					//传感器报警使能
					*pcmd++ = WP_PT_SENSORWARNEN;
					*pcmd++ = 1;
					*pcmd++ = 2;
					
					//开关量正常状态值
					*pcmd++ = WP_PT_WAITCHSTATE;
					*pcmd++ = 0xff;
					*pcmd++ = 0;
	
					//开关量报警使能
					*pcmd++ = WP_PT_WAITCHWARNEN;
					*pcmd++ = 0;
					*pcmd++ = 0xff;
								
					msg[F_LENGTH_BEGIN] = 71+26;
										
//					centFrameDeal(cmd , cmd[F_LENGTH_BEGIN] );
					return msg[F_LENGTH_BEGIN];	

⌨️ 快捷键说明

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