?? 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 + -