📄 protocol.c
字号:
/**************************************************************************
文件名: 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 + -