?? packagedealnew.c
字號:
strcat(ServerIP,strIP3);
strcat(ServerIP,".");
strcat(ServerIP,strIP4);
Port=BytesToUshort(bReceiveBuffer,IdNum+12);
DataLength=NumtoStrL(Port,strid1);
memset(tmpbuf,0,sizeof(tmpbuf));
memcpy(tmpbuf,strid1,DataLength);
//數據內容不能超過數據長度
if (bReceiveLength>IdNum+12)
{
IniSave("SERVER","SERVERIP",ServerIP);
IniSave("SERVER","SERVERPORT",tmpbuf);
}
else
{
ReapFlag=1;
}
}
else if (OperNum==32)
{
//設置GPS發送間隔
memset(Timer1,0,4);
DataLength=NumtoStrL((bReceiveBuffer[IdNum+8] & 0xFF),Timer1); //車機移動時發送間隔
memset(Timer2,0,4);
DataLength=NumtoStrL((bReceiveBuffer[IdNum+9] & 0xFF),Timer2); //車機靜止時發送間隔
//數據內容不能超過數據長度
if (bReceiveLength>IdNum+9)
{
IniSave("SERVER","TIMER_M",Timer1);
IniSave("SERVER","TIMER_S",Timer2);
WaitTime_S = atol(Timer2);
WaitTime_M = atol(Timer1);
printf("New Set WaitTime_S is %d,WaitTime_M is %d",WaitTime_S,WaitTime_M);
}
else
{
ReapFlag=1;
}
}
else if (OperNum==37)
{
//設置內置信息(業務和報警菜單)
DataType=(bReceiveBuffer[IdNum+8] & 0xFF);
DataCount=(bReceiveBuffer[IdNum+9] & 0xFF);
memset(GPSMenuInfo,0,sizeof(GPSMenuInfo));
printf("DataLength is %d,type is %d!\n",DataLength,DataType);
if (DataType==1)
{
//報警菜單信息
for (i=0;i<DataCount;i++)
{
for (j=0;j<33;j++)
{
if (j==0)
{
NumtoStr(bReceiveBuffer[IdNum+10+i*33+j],GPSMenuInfo[i].infotype,3);
}
else
{
GPSMenuInfo[i].content[j-1]=bReceiveBuffer[IdNum+10+i*33+j];
}
}
}
//數據內容不能超過數據長度
if (bReceiveLength>IdNum+9+i*33)
{
DISPATCH_MenuFile(Dispatch_EveMenuFile,GPSMenuInfo,DataCount,"w");
}
else
{
ReapFlag=1;
}
}
else if (DataType==2)
{
//業務數據
for (i=0;i<DataCount;i++)
{
for (j=0;j<33;j++)
{
if (j==0)
{
NumtoStr(bReceiveBuffer[IdNum+10+i*33+j],GPSMenuInfo[i].infotype,3);
}
else
{
GPSMenuInfo[i].content[j-1]=bReceiveBuffer[IdNum+10+i*33+j];
}
}
}
//數據內容不能超過數據長度
if (bReceiveLength>IdNum+9+i*33)
{
DISPATCH_MenuFile(Dispatch_BusMenuFile,GPSMenuInfo,DataCount,"w");
}
else
{
ReapFlag=1;
}
}
}
else if (OperNum==33)
{
//設置超速閥值
SpeedPoint = (bReceiveBuffer[IdNum+8] & 0xFF);
printf("The speed Limit is %d!\r\n",SpeedPoint);
}
else if (OperNum==41)
{
//調整系統播放音量
unsigned short WaveLevel;
WaveLevel = (bReceiveBuffer[IdNum+8] & 0xFF);
printf("The Volumn is %d!\r\n",WaveLevel);
}
else if(OperNum==43)
{
//清除所有未上傳的數據
unsigned short ClearType;
ClearType = (bReceiveBuffer[IdNum+8] & 0xFF);
// printf("Clear Type is %d!\r\n",ClearType);
switch (ClearType)
{
case 0: //Mark all kinds of history data Sended!
ClearSendGPS();
break;
case 1:
ClearSendGPS();
break;
default:
break;
}
}
else if(OperNum==42)
{
//重啟車機
unsigned short ResetType;
ResetType = (bReceiveBuffer[IdNum+8] & 0xFF);
printf("Reset Type is %d!\r\n",ResetType);
switch (ResetType)
{
case 1:
case 2:
break;
default:
break;
}
}
else if(OperNum==14)
{
//請求存儲在車機內的歷史數據
unsigned short RequestType;
unsigned short DataMode;
time_t Start_time;
time_t End_time;
printf("receive history request!\n");
RequestType = (bReceiveBuffer[IdNum+8] & 0xFF);
DataMode = (bReceiveBuffer[IdNum+9] & 0xFF);
Start_time = (bReceiveBuffer[IdNum+10] & 0xFF)*256*256*256 +
(bReceiveBuffer[IdNum+11] & 0xFF)*256*256 + (bReceiveBuffer[IdNum+12] & 0xFF)*256 +
(bReceiveBuffer[IdNum+13] & 0xFF) ;
End_time = (bReceiveBuffer[IdNum+14] & 0xFF)*256*256*256 +
(bReceiveBuffer[IdNum+15] & 0xFF)*256*256 + (bReceiveBuffer[IdNum+16] & 0xFF)*256 +
(bReceiveBuffer[IdNum+17] & 0xFF) ;
RequestHistoryData(RequestType,DataMode,Start_time,End_time);
}
else if(OperNum==13)
{
//取消報警信息
//修改共享內存(服務端要求)
CurCarState = 0;
IPC_ProcState_Read(PROCID_DISPATCH,CurDispatch_Info,&LocalDispatch_Info);
LocalDispatch_Info.CarState=0;
LocalDispatch_Info.CommState=1;
LocalDispatch_Info.Proc_Info.PID = getpid();
time(&(LocalDispatch_Info.Proc_Info.ctime));
//Share mem write
IPC_ProcState_Write(PROCID_DISPATCH,CurDispatch_Info,&LocalDispatch_Info);
}
//如果校驗正確
if (((FlagByte & 0x02)==2) && (ReapFlag!=1))
{
//需要回復信息
memset(&commInter,0,sizeof(commInter));
commInter.BeginEnd=HEAD_GPS_PACKAGE;
commInter.ByteLength=0x06;
memcpy(commInter.SerialNum,GPSID_Send,12);
commInter.AppType=0x16;
commInter.OperationNo=OperNum;
commInter.SerialNo=SerialNo;
commInter.DataType=0x01;
commInter.DataLength=0x01;
commInter.DataContent[0]=0x00;
RepeatSendInfo(fd,commInter,echoClntAddr);
printf("repeat a info!\r\n");
}
}
else
{
//說明是錯誤信息信息.
printf("receive a error info!\r\n");
return;
}
}
free(ServerIP);
free(DeviceNo);
free(Timer1);
free(Timer2);
return;
}
//生成可發送短消息
int SendMessageCreate(Package_Info commInter,char *RecvDataAll)
{
unsigned short DataLength,LengthID,ContentLength,RecvLength;
int i,j;
char GPSID1[9],GPSID2[5],byteSendSeriaNo[2],bytecmdLength[2],
byteCheck[2],DeviceNo1[4],DeviceNo2[2],IPPort[2];
unsigned short iSendSeriaNo,cmdLength,checkVal;
char *RecvData, *respString ;
in_addr_t addr;
// printf("Here!\r\n");
RecvData = malloc(DataLength);
respString = malloc(DataLength+2);
LengthID=(unsigned short)(commInter.ByteLength & 0xFF);
ContentLength=(unsigned short)(commInter.DataLength & 0xFFFF);
DataLength=LengthID+ContentLength+10;
memset(RecvData,0,DataLength);
memset(respString,0,DataLength+2);
//設備ID的長度
RecvData[0]=LengthID;
if ((((commInter.OperationNo) & 0xFF)!=200))
{
// printf("Here not 200!\r\n");
for (i=0;i<8;i++)
{
GPSID1[i]=commInter.SerialNum[i];
}
GPSID1[8]='\0';
for (i=0;i<4;i++)
{
GPSID2[i]=commInter.SerialNum[i+8];
}
GPSID2[4]='\0';
CInt32ToBytes(atol(GPSID1),DeviceNo1);
CInt16ToBytes(atoi(GPSID2),DeviceNo2);
//設備ID
for (i=0;i<4;i++)
{
RecvData[i+1]=DeviceNo1[4-i-1];
}
for (i=0;i<2;i++)
{
RecvData[i+5]=DeviceNo2[1-i];
}
//應用類型
RecvData[LengthID+1]=commInter.AppType;
//操作碼
RecvData[LengthID+2]=(commInter.OperationNo & 0xFF);
//序列號
iSendSeriaNo=commInter.SerialNo;
CInt16ToBytes(iSendSeriaNo,byteSendSeriaNo); //發送序列號
RecvData[LengthID+3]=byteSendSeriaNo[1];
RecvData[LengthID+4]=byteSendSeriaNo[0];
//標識位
RecvData[LengthID+5]=commInter.DataType;
//數據長度
cmdLength =ContentLength;
CInt16ToBytes(cmdLength,bytecmdLength);//數據長度
RecvData[LengthID+6]=bytecmdLength[1];
RecvData[LengthID+7]=bytecmdLength[0];
//數據區
//RecvData[LengthID+8]=commInter.ContentType; //數據類型
for (i=0;i<cmdLength;i++)
{
RecvData[i+LengthID+8]=commInter.DataContent[i]; //數據內容
}
checkVal=GetCheckData(RecvData,DataLength);
CInt16ToBytes(checkVal,byteCheck);
RecvData[DataLength-2]=byteCheck[1];
RecvData[DataLength-1]=byteCheck[0];
for (i=0;i<DataLength+2;i++)
{
if ((i==0) || (i==DataLength+1))
{
respString[i]=commInter.BeginEnd;
}
else
{
respString[i]=RecvData[i-1];
}
//printf(" i:%d",i);
//printf(" respString:%02x\r\n",respString[i] & 0xFF);
}
RecvLength=EnESC(respString,RecvDataAll,DataLength+2);
}
else if ((((commInter.OperationNo) & 0xFF)==200))
{
// printf("Here yes 200!\r\n");
//需要IP和端口(本地)
for (i=0;i<8;i++)
{
GPSID1[i]=commInter.SerialNum[i];
}
GPSID1[8]='\0';
for (i=0;i<4;i++)
{
GPSID2[i]=commInter.SerialNum[i+8];
}
GPSID2[4]='\0';
CInt32ToBytes(atol(GPSID1),DeviceNo1);
CInt16ToBytes(atoi(GPSID2),DeviceNo2);
//設備ID
for (i=0;i<4;i++)
{
RecvData[i+1]=DeviceNo1[4-i-1];
}
for (i=0;i<2;i++)
{
RecvData[i+5]=DeviceNo2[1-i];
}
//應用類型
RecvData[LengthID+1]=commInter.AppType;
//操作碼
RecvData[LengthID+2]=(commInter.OperationNo & 0xFF);
//序列號
iSendSeriaNo=commInter.SerialNo;
CInt16ToBytes(iSendSeriaNo,byteSendSeriaNo); //發送序列號
RecvData[LengthID+3]=byteSendSeriaNo[1];
RecvData[LengthID+4]=byteSendSeriaNo[0];
//標識位
RecvData[LengthID+5]=commInter.DataType;
//數據長度
cmdLength =ContentLength;
CInt16ToBytes(cmdLength,bytecmdLength);//數據長度
RecvData[LengthID+6]=bytecmdLength[1];
RecvData[LengthID+7]=bytecmdLength[0];
//數據區
addr=inet_addr((char *)commInter.DataIP);
RecvData[LengthID+8]=BASE_DATA_ONE(addr);
RecvData[LengthID+9]=BASE_DATA_TWO(addr);
RecvData[LengthID+10]=BASE_DATA_THREE(addr);
RecvData[LengthID+11]=BASE_DATA_FOUR(addr);
CInt16ToBytes(commInter.DataPort,IPPort);
for (i=0;i<2;i++)
{
RecvData[i+LengthID+12]=IPPort[1-i]; //數據內容
}
checkVal=GetCheckData(RecvData,DataLength);
CInt16ToBytes(checkVal,byteCheck);
RecvData[DataLength-2]=byteCheck[1];
RecvData[DataLength-1]=byteCheck[0];
for (i=0;i<DataLength+2;i++)
{
if ((i==0) || (i==DataLength+1))
{
respString[i]=commInter.BeginEnd;
}
else
{
respString[i]=RecvData[i-1];
}
}
RecvLength=EnESC(respString,RecvDataAll,DataLength+2);
}
return RecvLength;
}
//轉義數據 EnESC
int EnESC(char *bytes,char *respString,int StringLen)
{
int j,i,TransferCount;
i=1;
j=1;
TransferCount=0;
for(i =1;i<StringLen-1 ;i++ )
{
if (bytes[i]==0x7E)
{
respString[j]=0x7D;
respString[j+1]=0x5E;
j++;
TransferCount++;
}
else
{
if (bytes[i]==0x7D)
{
respString[j]=0x7D;
respString[j+1]=0x5D;
j++;
TransferCount++;
}
else
{
respString[j]=bytes[i];
}
}
j++;
}
respString[0]=bytes[0];
respString[j]=bytes[StringLen-1];
StringLen=TransferCount+StringLen;
return StringLen;
}
//反轉義數據 DeESC
int DeESC(char *bytes,char *respString,int StringLen)
{
int i,k,TransferCount;//用來遍歷原始數據的下標
i=1;
k=1;
TransferCount=0; //轉義的次數
//兩次轉義必須進行兩輪循環才能完全轉義
//第一輪轉義:如果存在連續兩個字節0x7D和0x5D,將其改變為0x7D
//第二輪轉義:如果存在連續兩個字節0x7D和0x5E,將其改變為0x7E
respString[0]=bytes[0];//協議頭和指令的第一個字節一致
while(i<StringLen-1)
{
if ((bytes[i]==0x7D)&&(bytes[i+1]==0x5D))
{
respString[k]=0x7D;
TransferCount++;
i++;
}
else
{
if ((bytes[i]==0x7D)&&(bytes[i+1]==0x5E))
{
respString[k]=0x7E;
TransferCount++;
i++;
}
else
{
respString[k] =bytes[i];
}
}
k++;
i++;
}
respString[k]=bytes[StringLen-1];
StringLen=StringLen-TransferCount;
return StringLen;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -