?? packagedealnew.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注冊
//GPRS發送,由毛鵬修改過,修改內容為不把注冊信息加入內存
#if 1
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); //此處移去把注冊信息添加到內存中的發送隊列中的內容
//此處添加為當前注冊信息生成流水號的內容
staticSendSeriNO=staticSendSeriNO+1;
commInter.SerialNo=staticSendSeriNO;
// printf("Here to send!\r\n");
if (commInter.SerialNo!=0)
{
echoStringLen=SendMessageCreate(commInter,RecvDataAll);
// printf("Here2!\r\n");
echoString=malloc(echoStringLen);
memcpy(echoString,RecvDataAll,echoStringLen);
if (echoStringLen > ECHOMAX) /* Check input length */
printf("word too length!\r\n");
// printf("Here to echo string!\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);
//IPC_ProcState_Read(PROCID_DISPATCH,CurDispatch_Info,&LocalDispatch_Info);
//put DISPATCH data and com status to sharemem
//printf("DISPATCH read success!\r\n");
//printf("DISPATCH Data CarState:%d\r\n",LocalDispatch_Info.CarState);
//printf("DISPATCH Data Proc_Info.CommState:%d\r\n",LocalDispatch_Info.CommState);
//printf("DISPATCH Data Proc_Info.PID:%d\r\n",LocalDispatch_Info.Proc_Info.PID);
//printf("DISPATCH Data Proc_Info.ctime:%s\r\n",ctime(&(LocalDispatch_Info.Proc_Info.ctime)));
return 0;
}
free(echoString);
}
return 1;
}
#endif
//GPRS發送數據
int SocketSendInfo(int sockFD, Package_Info commInter,struct sockaddr_in echoServAddr)
{
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");
/* Send the string to the server */
if (sendto(sockFD, echoString, echoStringLen, 0, (struct sockaddr *)
&echoServAddr, sizeof(echoServAddr)) != echoStringLen)
{
printf("SocketSendInfo 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);
//IPC_ProcState_Read(PROCID_DISPATCH,CurDispatch_Info,&LocalDispatch_Info);
//put DISPATCH data and com status to sharemem
//printf("DISPATCH read success!\r\n");
//printf("DISPATCH Data CarState:%d\r\n",LocalDispatch_Info.CarState);
//printf("DISPATCH Data Proc_Info.CommState:%d\r\n",LocalDispatch_Info.CommState);
//printf("DISPATCH Data Proc_Info.PID:%d\r\n",LocalDispatch_Info.Proc_Info.PID);
//printf("DISPATCH Data Proc_Info.ctime:%s\r\n",ctime(&(LocalDispatch_Info.Proc_Info.ctime)));
}
else
{
// printf("Here send out data!");
Waitresp = 1;
}
free(echoString);
return 0;
}
return 1;
}
//用于從內存中發送數據時,發送的數據已經存在緩沖中,此時,無須再次把要發送的數據再次加入內存
int SocketReSendInfo(int sockFD, Package_Info commInter,struct sockaddr_in echoServAddr)
{
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
int i=0;
// Deal_SendInfo(commInter,1); 和socketSendInfo的差別在這里
for(i=0;i<ECHOMAX;i++)
{
if (CurDispatch_SendInfo[i].SerialNo!=0)
{
printf("Unsend in position %d!",i);
echoStringLen=SendMessageCreate(CurDispatch_SendInfo[i],RecvDataAll);
echoString=malloc(echoStringLen);
memcpy(echoString,RecvDataAll,echoStringLen);
if (echoStringLen > ECHOMAX) /* Check input length */
printf("word too length!\r\n");
/* Send the string to the server */
if (sendto(sockFD, echoString, echoStringLen, 0, (struct sockaddr *)
&echoServAddr, sizeof(echoServAddr)) != echoStringLen)
{
printf("SocketSendInfo sendto fail!\r\n");
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -