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