/******************************************************************************** * File Name: GpsTask.c * Function Describe:The GpsTask for the system * Relate Module: * Explain: Hardware version is HS110C * Writer: ShiLiangWen * Date: 2015.4.12 *******************************************************************************/ #define THIS_FILE_ID 16 //-------------------------------------------------------------------------------- #include "includes.h" //OS_TID idGpsTask=0; //U64 stkGpsTask[GPS_TASK_STK_SIZE]; SUT_GPS_STATUS sutGpsStatus; SUT_MESS sutMess; int g_iCSQ=-1; const unsigned short GPS_TimeTable[GPS_TABLE_NUM]={0,5,10,15,30,60,120,300}; //const unsigned char GPS_TimeTable[]={5,10,15,30,60}; //====================================== static STATUE GpsServerStatus=CLOSE; unsigned char TimeFlag=1;//获取服务器时间标记 unsigned char sucGpsSentTcpCt=0;//从启动发送到收到计数器 unsigned char TeminalInfoRevOK=0; /******************************************************************************* 校验 *******************************************************************************/ unsigned char GetCheck(unsigned char *data, unsigned short datalen) { unsigned char ck=0; int i; for(i=0;iUART3_TX_BUFFER_SIZE)return 0; //包头 pBuf[0]=0x29;//Head pBuf[1]=0x29;//Head pBuf[2]=cmd;//CMD //DataLen ds.Data.usData=DataLen+6; pBuf[3]=ds.Data.ucData.b2; pBuf[4]=ds.Data.ucData.b1; //PSN dl.Data.ulData=sutProductPara.PSN; pBuf[5]=dl.Data.ucData.b4; pBuf[6]=dl.Data.ucData.b3; pBuf[7]=dl.Data.ucData.b2; pBuf[8]=dl.Data.ucData.b1; //Data j=9; for(i=0;i100){ ct=0; ModemSendAT("AT+CNUM?\r\n"); OSQFlush(ModemQ); } msg = (char *)OSQPend(ModemQ, 1, &err); if(err==OS_ERR_NONE){ if(ModemStrCmp(msg,"+CNUM:")){ //+CNUM:1064910139657 len=strlen(&msg[6]); if(15==len){ for(i=0;i<13;i++)sutProductPara.CNUM[i]=msg[6+i]; sutNetPara.CNUM[13]=0; return 1; } } } }*/ return 0; } /******************************************************************* *GetIPStatus 返回:0--未获取 1--获取成功 ********************************************************************/ int GetUIMID(void) { /* int timerout=300; int i,len; char *msg; INT8U err; int ct=100; while(timerout){ timerout--; if(++ct>100){ ct=0; ModemSendAT("AT+CIMI\r\n"); OSQFlush(ModemQ); } msg = (char *)OSQPend(ModemQ, 1, &err); if(err==OS_ERR_NONE){ if(ModemStrCmp(msg,"+CIMI:")){ //+CIMI: 460037590079119 len=strlen(&msg[7]); if(17==len){ for(i=0;i<15;i++)sutNetPara.UIMID[i]=msg[7+i]; sutNetPara.UIMID[15]=0; return 1; } } } } */ return 0; } void StartFeedBack(void) { if(sutFeed.feedBackStart==0) return; TSGpsServerConect(); sutFeed.feedBackStart=0; } /************************************************************* *^IPRECV:1,端口,IP域名,远程服务端口,五socket 1--UDP 0--TCP *************************************************************/ //+ZIPRECV:1,xxx,"7e8300 000c 000009771810000001 4130313233343536373839 b87e" void RecvModemData(char *msg) { int i; char *pData; unsigned short DataLen,temLen; unsigned char cmd; char tmp[5]; char buf[100]; DataLen=atoi((char *)&msg[11]); if(DataLen<10){ //+ZIPRECV:1,8,xxx pData=msg+13; }else if(DataLen<100){ pData=msg+14; }else if(DataLen<1000){ pData=msg+15; }else{//非法 pData=msg+16; } snprintf(buf, sizeof(buf),"\r\nTcpRecv[%d]",DataLen); SlwTrace(INF,buf,1); #if 0 //0 temLen = DataLen; if(temLen>30)temLen=30; buf[0]='<';buf[1]='<';buf[2]=0; for(i=0;i3){ sutGpsInfo.isServerLogin=0; g_ucModemSentTcpCt=0; snprintf(buf, sizeof(buf), "AT+TCPCLOSE=%d\r", GPS_DATA_SOCKET); ModemSendAT(buf); sutGpsStatus.IPStatus=CLOSE; g_ucModemSentTcpCt=0; sutGpsInfo.isServerLogin=0; } // if(g_iCSQ==99 || sutGpsStatus.IPStatus!=OPEN || 0==sutGpsInfo.isServerLogin) { susGpsTimingSendCt=0; sucGpsSentTcpCt=15;//这里能让条件达到后,及时去注册或鉴权 return; } //计算平均速度 sutGpsInfo.speedbuf[4]=sutGpsInfo.speedbuf[3]; sutGpsInfo.speedbuf[3]=sutGpsInfo.speedbuf[2]; sutGpsInfo.speedbuf[2]=sutGpsInfo.speedbuf[1]; sutGpsInfo.speedbuf[1]=sutGpsInfo.speedbuf[0]; sutGpsInfo.speedbuf[0]=sutGpsInfo.speed; for(i=0;i<5;i++){ AvgSpeed=sutGpsInfo.speedbuf[i]; } AvgSpeed/=5; sutGpsInfo.AvgSpeed=AvgSpeed; //////////////////////////////////////////////// if(sutGpsInfo.isGpsAuthOk==0) {//鉴权失败 if(++sucGpsSentTcpCt>=sutGpsCtl.reTryPerSeconds)//定时再去鉴权 {//15秒 sucGpsSentTcpCt=0; susGpsTimingSendCt=0; /////////////////////////////// //如果鉴权3次失败后则做一次注册请求 if(sutPocStatus.Logined) { if(++authTryTime >= sutGpsCtl.reTryAuthTimes) { authTryTime=0; sutGpsCtl.reTryAuthTimes=3; sutGpsCtl.reTryPerSeconds=15; Registration(); }else Authentication(); } } return;//鉴权未成功的返回 }else { if(g_ucModemSentTcpCt==0) { sucGpsSentTcpCt=0; g_ucModemSentTcpCt=0; } } //发送终端信息给服务器 if(++IccidTick>60&&TeminalInfoRevOK==0) { IccidTick=0; buBiaoICCID(GPS_DATA_SOCKET); } if(EventTick++>15&&sutGpsInfo.Ts_Event_Chek==1){ buSendEvent(GPS_DATA_SOCKET); sutGpsInfo.Ts_Event_Chek=0; } //鉴权成功并且定位上则定时发送位置包 //---控制按时间间隔发送GPS位置 sutGpsInfo.GPS_SecondCnt++; if(sutGpsInfo.isGpsValid && g_uiGpsStat) {//可以发位置包,检测时间是否到了 if(sutGpsInfo.GPS_SecondCnt>=GPS_TimeTable[newPara.gpsTimeIndex]) { sutGpsInfo.GPS_SecondCnt=0; sendLocation=1; } if(isSendDataEnable() && sendLocation != 0){ sendLocation=0; TSGpsTimingSendPos(); packetHadSend=1;//已发了数据包 } }else {//没定位,不发位置包,则发心跳 if(sutGpsInfo.GPS_SecondCnt >= 60) { if(isSendDataEnable()){ sutGpsInfo.GPS_SecondCnt=0; TS_SendHeartTick(); packetHadSend=1;//已发了数据包 } } } if(++realTimeSecond > 180 && packetHadSend==0) {//180秒获取一次时间 if(isSendDataEnable()){ TS_ReqRealTime(); realTimeSecond=0; } } if(++suctt >= 30) { suctt = 0; if(!g_uiGpsStat) SlwTrace(INF, "GPS close",1); } } STATUE GetIPNewStatus(char *msg, unsigned char socketNum) {//+TCPSTATUS:x:s [socket: status] //+TCPSTATUS:1:1 //+TCPSTATUS:ERROR! STATUE sta=CLOSE; unsigned char thisSocket; thisSocket = atoi(&msg[11]); if(msg[13] == '1') sta = OPEN; else if(msg[13] == '0')sta = CLOSE; if(thisSocket == socketNum) return sta; else return INVALID; } void IPStatusAna(char *msg, unsigned char *socket, STATUE *status) {//+TCPSTATUS:x:s [socket: status] //+TCPSTATUS:1:1 //+TCPSTATUS:ERROR! unsigned char thisSocket; STATUE sta=CLOSE; thisSocket=(unsigned char )atoi(&msg[11]); if('1'==msg[13]) sta=OPEN; else if('0' == msg[13]) sta=CLOSE; *socket=thisSocket; *status=sta; }