/******************************************************************************** * 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 char GPS_TimeTable[]={0,5,10,15,30,60}; //====================================== static STATUE GpsServerStatus=CLOSE; unsigned char TimeFlag=1;//获取服务器时间标记 unsigned char sucGpsSentTcpCt=0;//从启动发送到收到计数器 unsigned int heartTickCt=0; unsigned char registerActFlag=0;//是否发了注册(为了保证发了注册才去发鉴权,因为TCP一连接后会去发鉴权或心跳,这里保证为1时才会去发) /******************************************************************************* 校验 *******************************************************************************/ 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; } sprintf(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;iMsgBoxCheck)g_usGpsMinMsgBoxCheck=MsgBoxCheck; SlwTrace(DEBUG,(char *)pMsg->MsgData); #endif if(0==ModemStrCmp((char *)pMsg->MsgData,"+CSQ:")){ //SlwTrace(INF,(char *)pMsg->MsgData); csq=GetCSQ((char *)pMsg->MsgData); if(csq>=0 && csq<100)g_iCSQ=csq; if(g_iCSQ==99 ){ if(sutPocStatus.CSQ99Ct<255)sutPocStatus.CSQ99Ct++; if(sutPocStatus.CSQ99Ct==5){ sutPocStatus.Logined=0;//POC 离线 #ifdef GPS_ENABLE // if(sutGpsInfo.isServerLogin==1){ // sutGpsInfo.isServerLogin=0; // ModemSendAT("AT+ZIPCLOSE=0\r"); // SlwTrace(DEBUG,"AT+ZIPCLOSE=0\r\n"); // //ModemSendAT("AT+ZPPPCLOSE\r"); // IPStatus=CLOSE; // //PPPStatus=CLOSE; // } #endif } }else{ sutPocStatus.CSQ99Ct=0; } } #ifdef GPS_ENABLE else if(0==ModemStrCmp((char *)pMsg->MsgData,"+ZPPPSTATUS:")){ //SlwTrace(INF,(char *)pMsg->MsgData); PPPStatus=GetPPPStatus((char *)pMsg->MsgData); }else if(0==ModemStrCmp((char *)pMsg->MsgData,"+ZIPSTATUS:")){ //SlwTrace(INF,(char *)pMsg->MsgData); IPStatus=GetIPStatus((char *)pMsg->MsgData); }else if(0==ModemStrCmp((char *)pMsg->MsgData,"+ZIPRECV:")){ RecvModemData((char *)pMsg->MsgData); }else if(0==ModemStrCmp((char *)pMsg->MsgData,"+ZIPSEND:")){ //+ZIPSEND: 12 // if(pMsg->MsgData[10]>0x30 && pMsg->MsgData[10] <0x3A){ // g_ucModemSentTcpCt=0; // } } #endif _free_box(AtMpool,pMsg); } #ifdef GPS_ENABLE //GPS Uart消息处理 if(g_usUart2RecvLen){ process_nema((char *)RxBuffer2); g_usUart2RecvLen=0; } #endif //=======控制大概每1秒往下执行========= if(++SecFlag>49)SecFlag=0; else continue; //连续发3次未见成功,则断开链接并重启链接 if(g_ucModemSentTcpCt>3){ sutGpsInfo.isServerLogin=0; g_ucModemSentTcpCt=0; ModemSendAT("AT+ZIPCLOSE=0\r"); IPStatus=CLOSE; } #ifdef GPS_ENABLE //计算平均速度 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; //根据方向变化上报GPS数据 // if(sutGpsInfo.aspect>(sucAspect+15) || sutGpsInfo.aspect< (sucAspect-15) ){ // GpsTimingSendPos(); // susGpsTimingSendCt=0; // } // sucAspect=sutGpsInfo.aspect; //---控制定时发送GPS数据 --- if(g_iCSQ!=99 && IPStatus==OPEN && 0!=sutGpsInfo.isServerLogin){ //根据平均速度决定发送时间间隔 if(sutGpsInfo.AvgSpeed<20){//步行 SendTime=30; }else if(AvgSpeed<60){//慢速 SendTime=15; }else if(AvgSpeed<80){//中速 SendTime=10; }else{//高速 SendTime=5; } //控制按时间间隔发送GPS位置 if(++susGpsTimingSendCt>=SendTime){ susGpsTimingSendCt=0; GpsTimingSendPos(); } }else{ susGpsTimingSendCt=0; } #endif //-------------------- if(++sucNetStatusCt>4)sucNetStatusCt=0; switch(sucNetStatusCt) { case 0: ModemSendAT("AT+CSQ?\r"); break; #ifdef GPS_ENABLE case 1: if(g_iCSQ==99)break; ModemSendAT("AT+ZPPPSTATUS\r"); break; case 2: if(g_iCSQ==99)break; if(PPPStatus==OPEN){ SlwTrace(DEBUG,"AT+ZIPSTATUS=0\r\n"); ModemSendAT("AT+ZIPSTATUS=0\r"); }else{ SlwTrace(DEBUG,"AT+ZPPPOPEN\r\n"); ModemSendAT("AT+ZPPPOPEN\r"); } break; case 3: if(g_iCSQ==99)break; if(IPStatus!=OPEN && PPPStatus==OPEN){ sutGpsInfo.isServerLogin=0; sprintf(buf,"AT+ZIPSETUP=0,%s,%d\r\n",sutProductPara.GIP,sutProductPara.GpsPort); SlwTrace(DEBUG,buf); ModemSendAT(buf); } break; case 4: if(g_iCSQ==99)break; if(IPStatus==OPEN && 0==sutGpsInfo.isServerLogin){ if(sutGpsInfo.isGpsWork)GpsServerConect(); } break; #endif } } } */ /*********************************************************** *控制发送位置信息 此函数每秒执行一次 ************************************************************/ void GpsCtrlSendPos(void) { static unsigned short SendTime=0; static unsigned char suctt; uint32_t AvgSpeed; int i; static unsigned int susGpsTimingSendCt=0;//控制按时间发送 // static unsigned short sucGpsSentTcpCt=0;//从启动发送到收到计数器 // static unsigned int heartTickCt=0; char buf[30]; //连续发3次未见成功,则断开链接并重启链接 if(g_ucModemSentTcpCt>3){ sutGpsInfo.isServerLogin=0; g_ucModemSentTcpCt=0; sprintf(buf, "AT+ZIPCLOSE=%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; 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>15)//定时再去鉴权 {//5秒 sucGpsSentTcpCt=0; susGpsTimingSendCt=0; if(sutPocStatus.Logined) {//20161009登陆了才去鉴权 SlwTrace(INF,"Re-Authentication!",1); Authentication(); } } return;//鉴权未成功的返回 }else { if(g_ucModemSentTcpCt==0) { sucGpsSentTcpCt=0; g_ucModemSentTcpCt=0; } } //鉴权成功并且定位上则定时发送位置包 //---控制按时间间隔发送GPS位置 //if(++susGpsTimingSendCt>=sutGpsInfo.SendTime){ // susGpsTimingSendCt=0; #if 0 sutGpsInfo.GPS_SecondCnt = RTC_GetCounter(); if(sutGpsInfo.GPS_SecondCnt>=susGpsTimingSendCt) { susGpsTimingSendCt=sutGpsInfo.GPS_SecondCnt+sutGpsInfo.GPS_UploadTime; if(sutGpsInfo.isGpsValid && g_uiGpsStat) {//定位上了 sprintf(buf,"TSGpsTimingSendPos %d\r\n",sutGpsInfo.GPS_UploadTime); SlwTrace(INF,buf); TSGpsTimingSendPos(); }else {//发心跳 if(sutGpsInfo.GPS_SecondCnt >= heartTickCt) { heartTickCt = sutGpsInfo.GPS_SecondCnt+60; SlwTrace(INF, "HeartTick",1); TS_SendHeartTick(); } } } #else sutGpsInfo.GPS_SecondCnt = RTC_GetCounter(); if(sutGpsInfo.isGpsValid && g_uiGpsStat) {//可以发位置包,检测时间是否到了 if(sutGpsInfo.GPS_SecondCnt>=susGpsTimingSendCt){ susGpsTimingSendCt=sutGpsInfo.GPS_SecondCnt+sutGpsInfo.GPS_UploadTime; sprintf(buf,"TSGpsTimingSendPos %d",sutGpsInfo.GPS_UploadTime); SlwTrace(INF,buf,1); TSGpsTimingSendPos(); } }else {//没定位,不发位置包,则发心跳 if(sutGpsInfo.GPS_SecondCnt >= heartTickCt) { heartTickCt = sutGpsInfo.GPS_SecondCnt+60; SlwTrace(INF, "HeartTick",1); TS_SendHeartTick(); } } #endif 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 STATUE sta=CLOSE; unsigned char thisSocket; thisSocket = atoi(&msg[11]); if(msg[13] == '1') sta = OPEN; if(thisSocket == socketNum) return sta; else return CLOSE; }