📄 packagedeal.c
字号:
}
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 + -