?? protocol.c.bak
字號(hào):
/**************************************************************************
文件名: protocol.c
功能 : 終端和中心通信協(xié)議
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 調(diào)試通過(guò)
cwntSetWorkState 調(diào)試通過(guò)
centLoginConfirm 調(diào)試通過(guò)
centGetWorkState 調(diào)試通過(guò)
centGetWorkPara 調(diào)試通過(guò)
centGetCarState 調(diào)試通過(guò)
tmLoginMsg 調(diào)試通過(guò)
tmGetWorkStateMsg 調(diào)試通過(guò)
tmGetWorkParaMsg 調(diào)試通過(guò)
tmCarStateMsg 調(diào)試通過(guò)
tmEventProcess 調(diào)試通過(guò)
**************************************************************************/
#include "protocol.h"
//**************************************************************************
//函數(shù):FrameCheck
//功能: 校驗(yàn)命令幀的有效性
//輸入:Cmmd=中心命令,Commdlen=中心命令長(zhǎng)度
//返回:幀的有效性,
//0=有效,1=基本長(zhǎng)度錯(cuò)誤
//2=幀頭錯(cuò)誤,3=幀長(zhǎng)錯(cuò)誤
//4=校驗(yàn)和錯(cuò)誤
//**************************************************************************
//#define TEST
#ifdef TEST
#define Myprintf printf
#else
#define Myprintf RunMsgPrintf
#endif
char centFrameCheck( unsigned char *Commd, unsigned char Commdlen )
{
//基本長(zhǎng)度
if (Commdlen < F_BASIC_LENGTH)return 1;
//幀頭
if (strstr(Commd, F_HEAD_STR) ==0)return 2;
//幀長(zhǎng)度
// if (!(Commd[F_LENGTH_BEGIN] == Commdlen))return 3;
//校驗(yàn)和
//幀有效
return 0;
}
//**************************************************************************
//函數(shù):FrameDeal
//功能: 解析中心命令并進(jìn)行相應(yīng)的處理
//輸入:Cmmd=中心命令,Commdlen=中心命令長(zhǎng)度
//返回:無(wú)
//**************************************************************************
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無(wú)效的中心命令\n");
return;
}
switch (result)
{
case 0: Myprintf("\n中心命令正確\n");break;
case 1: Myprintf("\n中心命令基本長(zhǎng)度錯(cuò)誤\n");return;
case 2: Myprintf("\n中心命令幀頭錯(cuò)誤\n");return;
case 3: Myprintf("\n中心命令幀長(zhǎng)錯(cuò)誤\n");return;
case 4: Myprintf("\n中心命令校驗(yàn)和錯(cuò)誤\n");return;
}
//根據(jù)幀類型進(jìn)行相應(yīng)的處理
switch ((int)Commd[F_TYPE_BEGIN])
{
case F_TYPE_COMMD:
switch (Commd[F_CODE_BEGIN])
{
case F_CODE_LOGIN:
//中心要求重新注冊(cè)
//設(shè)置注冊(cè)狀態(tài)為0,重新注冊(cè)
SysState.Logined = 0;
Myprintf("中心要求重新注冊(cè)");
centNoteTmlogin(Commd +F_DATA_BEGIN, Commdlen - F_BASIC_LENGTH);
break;
case F_CODE_CARSTATE:
//中心請(qǐng)求車輛狀態(tài)
Myprintf("中心請(qǐng)求車輛狀態(tài)");
centGetCarState(Commd +F_DATA_BEGIN, Commdlen - F_BASIC_LENGTH);
break;
case F_CODE_GETWORKPARA:
Myprintf("中心請(qǐng)求工作參數(shù)");
centGetWorkPara(Commd +F_DATA_BEGIN, Commdlen - F_BASIC_LENGTH);
break;
case F_CODE_SETWORKPARA:
Myprintf("中心設(shè)置工作參數(shù)");
centSetWorkPara(Commd +F_DATA_BEGIN, Commdlen - F_BASIC_LENGTH);
break;
case F_CODE_GETWORKSTATE:
Myprintf("中心請(qǐng)求工作狀態(tài)");
centGetWorkState(Commd +F_DATA_BEGIN, Commdlen - F_BASIC_LENGTH);
break;
case F_CODE_SETWORKSTATE:
Myprintf("中心設(shè)置工作狀態(tài)");
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中心確認(rè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
}
}
//**************************************************************************
//函數(shù):LoginConfirm
//功能: 中心對(duì)終端注冊(cè)確認(rèn)/否認(rèn)幀
//輸入:Data=DATA部分,Datalen=Data長(zhǎng)度
//返回:無(wú)
//
//
//**************************************************************************
void centLoginConfirm( unsigned char *Data , int Datalen)
{
if (Data[0] == LP_DATA_SEGMENT_PMT)
{
//合法/允許
//停止計(jì)時(shí),進(jìn)入工作狀態(tài)
SysState.Logined = 1;
SysState.fSendLoginMsg.TimeEnabled = 0;
SysState.fSendLoginMsg.flag = 0;
}
}
//**************************************************************************
//函數(shù):centNoteTmlogin
//功能: 中心要求終端重新注冊(cè)
//輸入:Data=DATA部分,Datalen=Data長(zhǎng)度
//返回:無(wú)
//
//
//**************************************************************************
void centNoteTmlogin( unsigned char *Data , int Datalen)
{
SysState.fSendLoginMsg.flag = 1;
SysState.Logined = 0;
}
//**************************************************************************
//函數(shù):centGetCarState
//功能: 中心讀取車輛狀態(tài)
//輸入:Data=DATA部分,Datalen=Data長(zhǎng)度
//返回:無(wú)
//**************************************************************************
void centGetCarState( unsigned char *Data, int Datalen)
{
//發(fā)送一次車輛狀態(tài)
SysState.fSendCarStateMsg.flag = 1;
}
//**************************************************************************
//函數(shù):centGetWorkPara
//功能: 中心讀取工作參數(shù)
//輸入:Data=Data部分,Datalen=Data長(zhǎng)度
//返回:無(wú)
//**************************************************************************
void centGetWorkPara( unsigned char *Data, int Datalen)
{
//發(fā)送一次工作參數(shù)
SysState.fSendSetPataMsg = 1;
}
//**************************************************************************
//函數(shù):centSetWorkPara
//功能: 中心設(shè)定工作狀態(tài)
//輸入:Data=DATA部分,Datalen=Data長(zhǎng)度
//返回:無(wú)
//**************************************************************************
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號(hào)碼
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://終端消息發(fā)送間隔時(shí)間
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://終端報(bào)警消息發(fā)送間隔時(shí)間
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路傳感器報(bào)警門(mén)限
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://報(bào)警使能
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:
//開(kāi)關(guān)量正常狀態(tài)值
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:
//開(kāi)關(guān)量報(bào)警使能
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:
//活動(dòng)范圍
//左上角緯度
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;
//左上角經(jīng)度
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;
//右下角經(jīng)度
//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;
}
}
//終端回應(yīng),發(fā)送參數(shù)設(shè)定消息
SysState.fSendSetPataMsg = 1;
}
//**************************************************************************
//函數(shù):centGetWorkState
//功能: 中心查詢工作狀態(tài)
//輸入:Data=DATA部分,Datalen=Data長(zhǎng)度
//返回:無(wú)
//**************************************************************************
void centGetWorkState( unsigned char *Data, int Datalen)
{
//返回工作狀態(tài)
SysState.fSendWorkState = 1;
}
//**************************************************************************
//函數(shù):centSetWorkState
//功能: 中心設(shè)定工作狀態(tài)
//輸入:Data=DATA部分,Datalen=Data長(zhǎng)度
//返回:無(wú)
//**************************************************************************
void centSetWorkState( unsigned char *Data, int Datalen)
{
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -