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

📄 packagedeal.c

📁 基于嵌入式linux下
💻 C
📖 第 1 页 / 共 4 页
字号:
#include "dispatch.h"

const char *Dispatch_SureFile="/bus/config/dispatch.msg";
const char *Dispatch_BusMenuFile="/bus/config/BusReport.menu";
const char *Dispatch_EveMenuFile="/bus/config/EveReport.menu";
extern unsigned short CurCarState;

/*根据byte数组和指定的位置,返回其对应的数值

*/
//将传入的字节数组进行倒序
void ConvertData(char *dataByte,char *rDataByte,int charLen)
{
	int i; 	
	for (i=0;i<charLen ;i++)
	{
		rDataByte[i]= dataByte[charLen-1-i];
	}
	return;

}

//将16位无符号整形转化为字节数组
void CInt16ToBytes(unsigned short bytedata,char *rbytesData)
{
	byte bytesdata[2];
	
	bytesdata[0]=BASE_DATA_ONE(bytedata);
	bytesdata[1]=BASE_DATA_TWO(bytedata);
	
	//memcpy(rbytesData,ConvertData(bytesdata),2);
	memcpy(rbytesData,bytesdata,2);

	return;
}

//将32位无符号整形转化为字节数组
void CInt32ToBytes(unsigned int bytedata,char *rbytesData)
{
	byte bytesdata[4] ;
	
	bytesdata[0]=BASE_DATA_ONE(bytedata);
	bytesdata[1]=BASE_DATA_TWO(bytedata);
	bytesdata[2]=BASE_DATA_THREE(bytedata);
	bytesdata[3]=BASE_DATA_FOUR(bytedata);
	
	//memcpy(rbytesData,ConvertData(bytesdata),4);
	
	memcpy(rbytesData,bytesdata,4);	
	return;
}

//根据传入的字节数组和指点的位置,从相连的两个字节中返回对应的数值
unsigned short BytesToUshort(char *bytesdata,int index)
{
	unsigned short rushort;
	
	rushort =BACK_DATA_TWO(bytesdata[index]);
	rushort =rushort+BACK_DATA_ONE(bytesdata[index+1]);

	return rushort;

}

//根据传入的字节数组和指点的位置,从相连的四个字节中返回对应的数值
unsigned int BytesToUInt(char *bytesdata,int index)
{
	unsigned int ruint;
	
	ruint =BACK_DATA_FOUR(bytesdata[index]);
	ruint =ruint+BACK_DATA_THREE(bytesdata[index+1]);
	ruint =ruint+BACK_DATA_TWO(bytesdata[index+2]);
	ruint =ruint+BACK_DATA_ONE(bytesdata[index+3]);
	
	return ruint;

}

//把数字型转换为字符型,位数不够则前面补零
void NumtoStr(const unsigned long Num,char *target,int intLength)
{
	char *value;
	unsigned long sourceL,charByte;
	int i;
	
	sourceL = Num;

	i=0;
	while(sourceL > 0)
	{
		charByte = sourceL % 10;
		target[intLength-i-1]= (char)charByte+'0';
		sourceL = sourceL/10;
		i++;
	}
	while (i<intLength)
	{
		target[intLength-i-1]= (char)0+'0';
		i++;
	}
	return;
}

//把数字型转换为字符型
int NumtoStrL(const unsigned long Num,char *target)
{
	char *value,tmpstr[ECHOMAX];
	unsigned long sourceL,charByte;
	int i,j;
	
	sourceL = Num;

	i=0;
	while(sourceL > 0)
	{
		charByte = sourceL % 10;
		tmpstr[i]= (char)charByte+'0';
		sourceL = sourceL/10;
		i++;
	}

	for (j=0;j<i;j++)
	{
		target[j]=tmpstr[i-1-j];
	}
	
	return i;
}
//把所有内存中未发送的GPS数据全部删除
//把文件中所有未发送的GPS数据全部标记为已发送
void ClearSendGPS(void)
{
	int i;
	char buf[2];

	for (i=0;i<ECHOMAX;i++)
	{
		//把当前队列中所有未发送的GPS数据清除
		if((CurDispatch_SendInfo[i].SerialNo!=0)&&(CurDispatch_SendInfo[i].OperationNo==63))
		{
			memset(&CurDispatch_SendInfo[i],0,sizeof(CurDispatch_SendInfo[i]));			
		}
	}
	//把文件中的未发送数据全部标记
	while(1)
	{
		memset(buf,1,sizeof(buf));
		if(GPS_fd<=0)
		{
			printf("Clear GPS Info error!\n");
			return;
		}
		lseek(GPS_fd,Offset_UnSendGPS*GPS_RECORD_LEN,SEEK_SET);

		write(GPS_fd,buf,1);
		Offset_UnSendGPS = (Offset_UnSendGPS + 1) % RECORDMAX;
		lseek(GPS_fd,Offset_UnSendGPS*GPS_RECORD_LEN,SEEK_SET);
		read(GPS_fd,buf,1);
		if(buf[0]==1)
		{
			printf("Clear all file!\n");
			break;
		}
	}
}
//从本地保存的文件中找出需要的历史数据,填入到发送队列中
//填入到发送队列中的所有数据全部立即生成,加入内存队列中发送
void RequestHistoryData(unsigned short RequestType,unsigned short DataMode,time_t Start_time,time_t End_time)
{
	char	*tmpbuf;
	char	tmpGps[25],tmpAPC[36],tmpCR[20];
	int		recordnum;
	int		i;
	Package_Info commInter;

	printf("start time is %s!\n",gmtime(&Start_time));
	printf("end time is %s!\n",gmtime(&End_time));
	switch (RequestType)
	{
		case 1:		//GPS定位数据
			if(DataMode==1)				//返回历史数据
			{
				tmpbuf = GetGpsHisData(Start_time,End_time,&recordnum);
				printf("Find history data %d!\n",recordnum);
				for(i=0;i<recordnum;i++)
				{		//把找到的GPS数据加入到内存中					
					memset(tmpGps,0,sizeof(tmpGps));
//					printf("Send data from history file!\n");
					memcpy(tmpGps,tmpbuf+(25*i),sizeof(tmpGps));
					//形成GPS数据的包头信息
					commInter.BeginEnd=HEAD_GPS_PACKAGE;
					commInter.ByteLength=0x06;
					memcpy(commInter.SerialNum,GPSID_Send,12);
					commInter.AppType=0x16;
					commInter.OperationNo=0x3F;
					commInter.SerialNo=staticSendSeriNO;
					commInter.DataType=0x02;
					commInter.DataLength=0x19;

					tmpGps[19]=tmpGps[19]|0x08;
					memcpy(commInter.DataContent,tmpGps,sizeof(tmpGps));

					Deal_SendInfo(commInter,1);
				}
				free(tmpbuf);
			}
			else if(DataMode==2)		//返回当前最新的GPS数据
			{
				char LongP[4],SpeedH[2],Dispatch[3];
				int tmpInfo;

				GPS_Info LocalCurGPS_Info; 
				Dispatch_Info LocalDispatch_Info;			//Point the share mem

				printf("Get real time data ");
				IPC_ProcState_Read(PROCID_GPS,CurGPS_Info,&LocalCurGPS_Info);	
				IPC_ProcState_Read(PROCID_DISPATCH,CurDispatch_Info,&LocalDispatch_Info);
				CInt32ToBytes(LocalCurGPS_Info.GPSData.longitude,LongP);				
				tmpGps[0]=LongP[3];	tmpGps[1]=LongP[2];	tmpGps[2]=LongP[1];	tmpGps[3]=LongP[0];
				CInt32ToBytes(LocalCurGPS_Info.GPSData.latitude,LongP);				
				tmpGps[4]=LongP[3];	tmpGps[5]=LongP[2];	tmpGps[6]=LongP[1];	tmpGps[7]=LongP[0];
				CInt16ToBytes(LocalCurGPS_Info.GPSData.speed,SpeedH);				
				tmpGps[8]=SpeedH[1]; tmpGps[9]=SpeedH[0];
				CInt16ToBytes(LocalCurGPS_Info.GPSData.direction,SpeedH);				
				tmpGps[10]=SpeedH[1]; tmpGps[11]=SpeedH[0];
				CInt32ToBytes(LocalCurGPS_Info.GPSData.datetime,LongP);				
				tmpGps[12]=LongP[3]; tmpGps[13]=LongP[2]; tmpGps[14]=LongP[1]; tmpGps[15]=LongP[0];
				//报警标志
				if (LocalDispatch_Info.CarState>0)
				{
					CInt16ToBytes(CurCarState,SpeedH);
					tmpGps[16]=SpeedH[1]; tmpGps[17]=SpeedH[0];
				}
				else
				{
					tmpGps[16]=0x00; tmpGps[17]=0x00;
				}
				//信息标志
				if (LocalCurGPS_Info.GPSData.valid=='A')
				{
					tmpInfo=0x00;
				}
				else
				{
					tmpInfo=0x01;
				}
				if ((LocalDispatch_Info.CarState & 0xFFFF)>0)
				{
					tmpInfo=tmpInfo+0x04;
				}
				tmpGps[18]=0x00;
				tmpGps[19]=tmpInfo|0x10;		//置实时数据返回标志				
				tmpGps[20]=LocalCurGPS_Info.GPSData.amount;
				
				CInt16ToBytes(LocalCurGPS_Info.GPSData.hpop,SpeedH);				
				tmpGps[21]=SpeedH[1];
				tmpGps[22]=SpeedH[0];
				
				CInt16ToBytes(LocalCurGPS_Info.GPSData.hpe,SpeedH);				
				tmpGps[23]=SpeedH[1];
				tmpGps[24]=SpeedH[0];

				commInter.BeginEnd=HEAD_GPS_PACKAGE;
				commInter.ByteLength=0x06;
				memcpy(commInter.SerialNum,GPSID_Send,12);
				commInter.AppType=0x16;
				commInter.OperationNo=0x3F;
				commInter.SerialNo=staticSendSeriNO;
				commInter.DataType=0x02;
				commInter.DataLength=0x19;

				tmpGps[19]=tmpGps[19]|0x08;
				memcpy(commInter.DataContent,tmpGps,sizeof(tmpGps));

				Deal_SendInfo(commInter,1);
			}
			break;
		case 2:		//客流检测数据
			if(DataMode==1)		//历史数据
			{
				tmpbuf = GetAPCHisData(Start_time,End_time,&recordnum);
				for(i=0;i<recordnum;i++)
				{	//把找到的APC数据加入到内存中					
					memset(tmpAPC,0,sizeof(tmpAPC));
					memcpy(tmpAPC,tmpbuf+(35*i),25);	//首先复制GPS数据
					tmpAPC[25] = 0x1;		//数据标志,表示为历史数据
					memcpy(tmpAPC+26,tmpbuf+(35*i)+25,10);	//再复制客流数据

//					memcpy(commInter.DataContent,tmpAPC,sizeof(tmpAPC));
					//形成APC数据的包头信息
					commInter.BeginEnd=HEAD_GPS_PACKAGE;
					commInter.ByteLength=0x06;
					memcpy(commInter.SerialNum,GPSID_Send,12);
					commInter.AppType=0x16;
					commInter.OperationNo=0x40;		//客流量计数据的操作码64
					commInter.SerialNo=staticSendSeriNO;
					commInter.DataType=0x02;
					commInter.DataLength=0x24;		//客流量计数据的长度
					memcpy(commInter.DataContent,tmpAPC,sizeof(tmpAPC));
					Deal_SendInfo(commInter,1);
				}
				free(tmpbuf);
			}
			else if(DataMode==2)	//当前最新的APC数据
			{
			}
			break;
		case 3:		//行车状况数据
			if(DataMode==1)		//历史数据
			{
				tmpbuf = GetCRHisData(Start_time,End_time,&recordnum);
				for(i=0;i<recordnum;i++)
				{	//把找到的APC数据加入到内存中					
					memcpy(tmpCR,tmpbuf+(20*i),20);	//再复制客流数据
					tmpCR[0] = 0x1;		//数据标志,表示为历史数据
//					memcpy(commInter.DataContent,tmpCR,sizeof(tmpCR));
					//形成CR数据的包头信息
					commInter.BeginEnd=HEAD_GPS_PACKAGE;
					commInter.ByteLength=0x06;
					memcpy(commInter.SerialNum,GPSID_Send,12);
					commInter.AppType=0x16;
					commInter.OperationNo=0x41;		//carstate数据的操作码65
					commInter.SerialNo=staticSendSeriNO;
					commInter.DataType=0x02;
					commInter.DataLength=sizeof(tmpCR);
					memcpy(commInter.DataContent,tmpCR,sizeof(tmpCR));
					//memcpy(commInter.DataContent,tmpGps,sizeof(tmpGps));

					Deal_SendInfo(commInter,1);
				}
				free(tmpbuf);
			}
			else if(DataMode==2)	//当前最新的CR数据
			{
			}
			break;
		default:
			break;
	}
}
//检验校验位是否对
int CheckData(char *ReadByteData,int dataLen)
{
	int rFlag =FALSE;
	unsigned short Check;
	byte bytedatas[dataLen-2];
	unsigned short JiSuanCheck;

	Check=BytesToUshort(ReadByteData ,dataLen-2);
	memcpy(bytedatas,ReadByteData,dataLen-2);
	
	JiSuanCheck=GetCheckData(bytedatas,dataLen-2);

	if (Check !=JiSuanCheck )
	{
		rFlag=FALSE;
	}
	else if (Check ==JiSuanCheck)
	{
		rFlag=TRUE;
	}
	return rFlag;
}

//取得校验码 
unsigned short GetCheckData(char *bytedatas,int dataLen)
{
	unsigned short JiSuanCheck;
	
	int i;
	JiSuanCheck=0;
	
	for (i=0;i<dataLen;i++)
	{
		JiSuanCheck=(JiSuanCheck ^ bytedatas[i]) & 0xFF;
	}
	return JiSuanCheck;
}

//GPRS注册
#if 0
int RegesterInfo(int sockFD, Package_Info commInter,struct sockaddr_in echoServAddr)
{
	int	i;
	char RecvDataAll[ECHOMAX];
	unsigned short echoStringLen;   /* Length of string to echo */
	char *echoString;                /* String to send to echo server */
	Dispatch_Info LocalDispatch_Info;			//Point the share mem
	
	Deal_SendInfo(commInter,1);
	
	if (CurDispatch_SendInfo[0].SerialNo!=0)
	{
		echoStringLen=SendMessageCreate(CurDispatch_SendInfo[0],RecvDataAll);
		
	    echoString=malloc(echoStringLen);
	    
	    memcpy(echoString,RecvDataAll,echoStringLen);
	
	    if (echoStringLen > ECHOMAX)  /* Check input length */
			printf("word too length!\r\n");
		
		for(i=0;i<echoStringLen;i++)
		{
			printf("-%02x",*(echoString+i)&0xff);
		}
	    /* Send the string to the server */
	    if (sendto(sockFD, echoString, echoStringLen, 0, (struct sockaddr *)
	               &echoServAddr, sizeof(echoServAddr)) != echoStringLen)
	    {
	        printf("RegesterInfo sendto fail!\r\n");
	        //修改共享内存(注册失败)
			IPC_ProcState_Read(PROCID_DISPATCH,CurDispatch_Info,&LocalDispatch_Info);
			//LocalDispatch_Info.CarState=0;
			LocalDispatch_Info.CommState=0;
			LocalDispatch_Info.Proc_Info.PID = getpid();
			time(&(LocalDispatch_Info.Proc_Info.ctime));
			
			//Share mem write
			IPC_ProcState_Write(PROCID_DISPATCH,CurDispatch_Info,&LocalDispatch_Info);
			

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -