📄 busdispatchnew.c
字号:
#include "dispatch.h"
const char *PPP_InitOnFile="/etc/ppp/ppp-init";///etc/ppp/ppp-on";
const char *PPP_OffFile="/etc/ppp/ppp-off";
const char *GPSFile = "/bus/dat/gpsdata.dat";
const char *APCFile = "/bus/dat/passenger.dat";
const char *CRFile = "/bus/dat/carstate.dat";
char *SocketServer;
int SocketPort;
int RegTimes ;
unsigned short CurCarState;
time_t Begin;
int Dispatch_MsgHandle(char *tmpbuf,struct sockaddr_in echoServAddr,int SockFD)
{
unsigned short MsgID,tmpInfo;
Package_Info commInter;
GPS_Info LocalCurGPS_Info;
Dispatch_Info LocalDispatch_Info;
char tmpGps[25],LongP[4],SpeedH[2],Dispatch[3];
char ServerIP[16],Port[6],GPSID[13],ServerPort[22];
int i,j;
MsgID=BytesToUshort(tmpbuf,0);
switch(MsgID)
{
case 1: //System Halt down
break;
case 7: //KeyB message(报警或内置业务信息)
for(i=0;i<4;i++)
{
printf("%02x ",tmpbuf[i]&0xff);
}
printf("/n");
memset(&commInter,0,sizeof(Package_Info));
memset(tmpGps,0,sizeof(tmpGps));
IPC_ProcState_Read(PROCID_GPS,CurGPS_Info,&LocalCurGPS_Info);
IPC_ProcState_Read(PROCID_DISPATCH,CurDispatch_Info,&LocalDispatch_Info);
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;
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 (tmpbuf[2]==1)
{
//CInt16ToBytes((1 << (tmpbuf[3]-1)+LocalDispatch_Info.CarState),SpeedH);
CInt16ToBytes(tmpbuf[3],SpeedH);
tmpGps[16]=SpeedH[1];
tmpGps[17]=SpeedH[0];
CurCarState=tmpbuf[3];
LocalDispatch_Info.CarState=((1 << (tmpbuf[3]-1)) | LocalDispatch_Info.CarState);
time(&(LocalDispatch_Info.Proc_Info.ctime));
IPC_ProcState_Write(PROCID_DISPATCH,CurDispatch_Info,&LocalDispatch_Info);
}
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;
}
if (tmpbuf[2]==2)
{
tmpGps[18]=tmpbuf[3];
tmpGps[19]=tmpInfo;
}
else
{
tmpGps[18]=0x00;
tmpGps[19]=tmpInfo;
}
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];
//printf("GPS Data Longitude:%d\r\n",LocalCurGPS_Info.GPSData.longitude);
//printf("GPS Data Latitude:%d\r\n",LocalCurGPS_Info.GPSData.latitude);
//printf("GPS Data speed:%d\r\n",LocalCurGPS_Info.GPSData.speed);
//printf("GPS Data direction:%d\r\n",LocalCurGPS_Info.GPSData.direction);
//printf("GPS Data amount:%d\r\n",LocalCurGPS_Info.GPSData.amount);
//printf("GPS Data direction:%d\r\n",LocalCurGPS_Info.GPSData.valid);
//printf("GPS Data hpop:%d\r\n",LocalCurGPS_Info.GPSData.hpop);
//printf("GPS Data hpe:%d\r\n",LocalCurGPS_Info.GPSData.hpe);
memcpy(commInter.DataContent,tmpGps,sizeof(tmpGps));
printf("Didpatch EvnBus data Dispatch_DataIP:%s\r\n",Dispatch_DataIP);
printf("Didpatch EvnBus data SocketServer!%s\r\n",SocketServer);
printf("Didpatch EvnBus data SocketPort!%d\r\n",SocketPort);
SocketSendInfo(SockFD,commInter,echoServAddr);
break;
case 8: //KeyB message(调度确认信息信息)
memset(&commInter,0,sizeof(Package_Info));
commInter.BeginEnd=HEAD_GPS_PACKAGE;
memcpy(commInter.SerialNum,GPSID_Send,12);
commInter.AppType=0x16;
commInter.OperationNo=0x3D;
commInter.SerialNo=staticSendSeriNO;
commInter.DataType=0x02;
commInter.DataLength=0x03;
Dispatch[0]=tmpbuf[3];
Dispatch[1]=tmpbuf[4];
Dispatch[2]=tmpbuf[2];
memcpy(commInter.DataContent,Dispatch,sizeof(Dispatch));
printf("Didpatch sure data Dispatch_DataIP:%s\r\n",Dispatch_DataIP);
printf("Didpatch sure data SocketServer!%s\r\n",SocketServer);
printf("Didpatch sure data SocketPort!%d\r\n",SocketPort);
SocketSendInfo(SockFD,commInter,echoServAddr);
break;
case 9:
//设置通信服务器的IP和Port
memset(ServerIP,0,16);
memset(Port,0,6);
memset(ServerPort,0,22);
i=0;
while((tmpbuf[2+i]!='#') && (tmpbuf[2+i]!=0x00))
{
ServerIP[i]=tmpbuf[2+i];
i++;
}
ServerIP[i]='\0';
i++;
j=0;
while(tmpbuf[2+i+j]!=0x00)
{
Port[j]=tmpbuf[2+i+j];
j++;
}
Port[j]='\0';
IniSave("SERVER","SERVERIP",ServerIP);
IniSave("SERVER","SERVERPORT",Port);
memset(SocketServer,0,16);
memcpy(SocketServer,ServerIP,16);
SocketPort=atoi(Port);
//修改共享内存
memset(ServerPort,0,sizeof(ServerPort));
strcat(ServerPort,ServerIP);
strcat(ServerPort,"#");
strcat(ServerPort,Port);
memcpy(LocalDispatch_Info.CenterAddr,ServerPort,22);
LocalDispatch_Info.Proc_Info.PID = getpid();
time(&(LocalDispatch_Info.Proc_Info.ctime));
//Share mem write
IPC_ProcState_Write(PROCID_DISPATCH,CurDispatch_Info,&LocalDispatch_Info);
break;
default:
break;
}
return 0;
}
void main()
{
int sockFD,pppCount,selectRet,tmpInfo,WaitTime_S,DataCount;
Dispatch_Info LocalDispatch_Info; //Point the share mem
GPS_Info LocalCurGPS_Info;
struct sockaddr_in echoServAddr; /* Echo server address */
char tmpbuf[128],*ServerPort;
Package_Info commInter;
char tmpGps[25],LongP[4],SpeedH[2],Dispatch[3];
char tmpAPC[36],tmpCR[20];
time_t now;
//信号处理初始化
Signal_Init();
//为变量申请内存
ServerPort=malloc(22);
Dispatch_DataIP=malloc(16);
GPSID_Send=malloc(13);
SocketServer=malloc(16);
//初始化变量
memset(Dispatch_DataIP,0,16);
memset(GPSID_Send,0,13);
memset(SocketServer,0,16);
Waitresp = 0;
RegTimes = 0;
/* Get config value from config file */
//获取调度业务服务器IP
SocketServer = IniLoad("SERVER","SERVERIP","192.168.0.138");
//获取调度业务服务器端口
SocketPort = atoi(IniLoad("SERVER","SERVERPORT","8000"));
//获取GPS位置信息上发间隔
WaitTime_M= atoi(IniLoad("SERVER","TIMER_M","8"));
WaitTime_S= atoi(IniLoad("SERVER","TIMER_S","8"));
//proc state init
CurDispatch_Info = (Dispatch_Info *)IPC_ProcState_Init(PROCID_DISPATCH,0);
CurGPS_Info = (GPS_Info *)IPC_ProcState_Init(PROCID_GPS,SHM_RDONLY);
CurKeyB_Info = (KeyB_Info *)IPC_ProcState_Init(PROCID_KEYB,SHM_RDONLY);
//修改共享内存
memset(ServerPort,0,22);
LocalDispatch_Info.CarState=0;
LocalDispatch_Info.CommState=0;
strcat(ServerPort,SocketServer);
strcat(ServerPort,"#");
memset(tmpGps,0,sizeof(tmpGps));
DataCount=NumtoStrL(SocketPort,tmpGps);
strcat(ServerPort,tmpGps);
memcpy(LocalDispatch_Info.CenterAddr,ServerPort,22);
LocalDispatch_Info.Proc_Info.PID = getpid();
time(&(LocalDispatch_Info.Proc_Info.ctime));
//Share mem write
IPC_ProcState_Write(PROCID_DISPATCH,CurDispatch_Info,&LocalDispatch_Info);
//消息机制初始化
MSGQ_Init();
MSGQ_Clear(PROCID_DISPATCH); //清理之前发给调度进程的消息
ReceiveMsgQ=0;
CurCarState=0;
Begin=time(NULL); //初始化上次发送数据的时间
GPSFileInit(); //初始化GPS数据文件"gpsdata.dat"的读取
APCFileInit(); //初始化APC数据文件"passenger.dat"的读取
CRFileInit(); //初始化carstate数据文件"carstate.dat"的读取
printf("unsend GPS %d; send GPS %d!\n",Offset_UnSendGPS,Offset_SendGPS);
printf("unsend APC %d; send APC %d!\n",Offset_UnSendAPC,Offset_SendAPC);
printf("unsend CR %d; send CR %d!\n",Offset_UnSendCR,Offset_SendCR);
// DISPATCH_Exec(PPP_OffFile);
memset(CurDispatch_SendInfo,0,sizeof(CurDispatch_SendInfo));
// exit(0);
while(strcmp(GPSID_Send,"")==0)
{
//GPRS模块复位成功
if (GPRS_Reset()==0)
{
//从GPRS中读出SIM卡号,作为终端ID
GPRS_GetTermID(GPSID_Send);
}
GPSID_Send[12]='\0';
printf("GPSID_Send:%s\r\n",GPSID_Send);
if (PPP_Status())
{//如果此时已有ppp拨号网络,则关闭重播
if (DISPATCH_Exec(PPP_OffFile)==0)
{
//printf("ppp-off success!\r\n");
}
sleep(4);
}
else
{
sleep(2);
}
//修改共享内存
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);
}
//从GPRS模块中获取终端ID后,开始拨号登录GPRS网络
while(1) //main loop begins here!
{
//拨号处理
pppCount=0;
while((PPP_Status()==0) && (pppCount<3))
{ //如果连续拨号失败,则程序中止运行,等待guard进程重启
if (GPRS_Reset()==0)
{
//调用外部可执行文件(进行拨号)
printf("Begin ppp-init!\n");
if (DISPATCH_Exec(PPP_InitOnFile)==0)
{
printf("ppp-init On success!\r\n");
}
}
else
{
printf("ShutDown Modem!\n");
GPRS_ShutDown();
}
//修改共享内存
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);
//等待10秒钟,待系统完成TCP/IP协议和串口IO的重定向,否则控制台会看到大量收发的数据
sleep(10);
//修改共享内存
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);
pppCount++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -