⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 packagedeal.c

📁 基于嵌入式linux下
💻 C
📖 第 1 页 / 共 4 页
字号:
			}
			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 + -