/******************************************************************************** * File Name: MC8332GpsTask.h * Function Describe: Header file for MC8332GpsTask.c * Explain: * Writer: * Date: 2016-3-11 *******************************************************************************/ #include "includes.h" unsigned int Mododrex_Net; unsigned int netshowvalue; //FOTA_UPDATE fota_update; void MC8332_GPS_RecvHandle(unsigned char *pMsg,unsigned short tempLen) { char buf[20]; char buf2[50]; char result[10]; unsigned short cmd,ackCmd,smsLen; unsigned char Result,i,buBiaoResponsed; short targetIndex; SUTDS ds; PrintBufferData(pMsg,tempLen); //////////处理布标类型指令 cmd = (pMsg[1]<<8) | (pMsg[2]&0xff); buBiaoResponsed=1; snprintf(buf2, sizeof(buf2), "\r\ncmd=%04x", cmd); SlwTrace(INF, buf2,1); switch(cmd) {//布标命令返回 case TS_TERMINAL_REGISTRATION_REPLY://终端注册应答 //7E 8100 000A 000166000016 0250 0100 00 20161118165030 E07E 成功 //7E 8100 0003 000166000016 0251 0100 01 A07E 已注册 Result = pMsg[15]; snprintf(buf2, sizeof(buf2), "\r\nresult=%02x", Result); SlwTrace(INF, buf2,1); switch(Result) { case 0://00注册成功 if(0 != memcmp(newPara.authPara.authCode, pMsg+16, 7)){ memcpy(newPara.authPara.authCode, pMsg+16,7); //save sys ModifyConfigureFile(0); } snprintf(result, sizeof(result), "Ok"); break; case 1://01 车辆已注册 snprintf(result, sizeof(result), "Car Exist");break; case 2://02 无此车辆 snprintf(result, sizeof(Result), "No car");break; case 3://03 终端已经被注册 snprintf(result, sizeof(result), "Device Exist");break; case 4://04 数据库无此终端 snprintf(result, sizeof(result), "No Record");break; default://无效值 //统称失败 snprintf(result, sizeof(result), "Faile"); break; } snprintf(buf2, sizeof(buf2), "\r\n[Register]%d %s", Result,result); SlwTrace(INF, buf2,1); //注册应答后直接进行一次鉴权 Authentication(); break; case TS_TEXT_INFORMATION_ISSUED://文本下发 //7E83000005000166000009000001 31323334ED7E smsLen = pMsg[3]; smsLen <<= 8; smsLen &= 0xff00; smsLen |= pMsg[4]; smsLen -= 1;//去掉后面较验码 if(SMS_SIGNAL_LEN <= smsLen) smsLen = SMS_SIGNAL_LEN; memset(sutMess.GBKMess1, 0, sizeof(sutMess.GBKMess1)); memcpy(sutMess.GBKMess1, pMsg+14, smsLen); sutMess.len = smsLen; ////////////////////////// sutFeed.feedID=TS_SETTING_TERMINAL_PARAMETERS; ds.Data.ucData.b1=pMsg[11]; ds.Data.ucData.b2=pMsg[12]; sutFeed.feedliushuiID=ds.Data.usData; sutFeed.result=2; ////////////////////////// if(sutMess.len > 0) SetGotNewMessage(); break; case TS_EVENT_SETTINGS: ////事件设置 Result = pMsg[13]; switch(Result){ case 5://点名 UISetNextStatus(UIS_CALL_THE_ROLL); break; } break; case TS_PLATFORM_UNIVERSAL_ANSWER://通用平台应答 //7E8001000500016600001602400000010201B57E //buf[0]=0x7e; //if(-1 != (targetIndex=FindTargetIndex((char *)pMsg, '\r', buf, 1,2))) targetIndex = tempLen;//这个长度是去掉了两个7E的长度 { ackCmd=(pMsg[targetIndex-3]<<8) | (pMsg[targetIndex-2]&0xff); Result = pMsg[targetIndex-1]; snprintf(buf2, sizeof(buf2), "\r\nLen=%d,ackCmd=%04x,result=%02x", tempLen,ackCmd,Result); SlwTrace(INF, buf2,1); switch(ackCmd) { case TS_TERMINAL_AUTHENTICATION://终端鉴权应答 if(Result == 0) {//鉴权成功 sutGpsInfo.isGpsAuthOk=1; snprintf(buf2, sizeof(buf2), "\r\n[ATH]Ok"); enableDataSend(); //TSGpsServerConect();//鉴权成功后发一包终端应答包即可以支持文本接收了 }else { sutGpsInfo.isGpsAuthOk=0; snprintf(buf2, sizeof(buf2), "\r\n[ATH]Faile"); } SlwTrace(INF, buf2,1); break; case TS_LOCATION_INFORMATION_REPORTING://位置包应答 SlwTrace(INF, "\r\nLocation ACK",1); break; case TS_TERMINAL_HEARTBEAT://心跳应答 SlwTrace(INF, "\r\nHearTick ACK",1); break; case TS_SEND_SOS_SMS://SOS应答 SlwTrace(INF, "\r\nSOS ACK",1); sutPocStatus.SOS_Flag++; break; case TS_TERMINAL_ATTRIBUTEINFO_ANSWER: if(!Result) { TeminalInfoRevOK=1; SlwTrace(INF, "TerminalInfo Send OK\r\n",1); } break; } } break; case TS_PLATFORM_ATTRIBUTEINFO_ANSWER: TeminalInfoRevOK=0; break; case TS_TERMINAL_REQTIME://时间ACK //7e0f020007001899000022003a e20704130e2f02 427e SlwTrace(INF, "\r\nTimeAck",1); ds.Data.ucData.b1=pMsg[13]; ds.Data.ucData.b2=pMsg[14]; g_usModeYTime=ds.Data.usData-2000; g_usModemTime=pMsg[15]; g_usModeDTime=pMsg[16]; g_usModeHTime=pMsg[17]; g_usModeMTime=pMsg[18]; g_usModeSTime=pMsg[19]; SetTime(g_usModeHTime, g_usModeMTime, g_usModeSTime);//保存下来,以便下次启动,没登陆前可以使用本地时间显示 break; default: buBiaoResponsed=0; break; } if(buBiaoResponsed) g_ucModemSentTcpCt=0; /////////////处理其它类型指令 } void chekPipGip(char *src,char type) { char buf[40]; char *p; p=src+6; if(!type)snprintf(buf,sizeof(buf),"+GPIP:%s\r\n",showPIP); else snprintf(buf,sizeof(buf),"+GGIP:%s\r\n",showGIP); if(strlen(src)<9||(0==ModemStrCmp(src, "+GGIP:0.0.0.0"))||(0==strcmp(src,buf))||(0==ModemStrCmp(src, "+GPIP:0.0.0.0")))return ; if(!type){ memcpy(showPIP,p,strlen(p)-2); showPIP[strlen(p)-2]=0; printf("get new PIP====%s\r\n",showPIP); }else{ memcpy(showGIP,p,strlen(p)-2); showGIP[strlen(p)-2]=0; printf("get new GIP====%s\r\n",showGIP); //strcpy(gSocket.socketList[0].Ip,showGIP); } } void AtHandle(char *pMsg) { int csq; short targetIndex; unsigned char tempSocket,i,temp; unsigned short tempLen; char buf[80]="\r\n"; char bufTemp[3]; char buf3[40];////////////////////////// STATUE ipStatus; // if(0==ModemStrCmp(pMsg,"+POC:UPDATE")) //{ // fota_update.NewPocFlag=1; //}else if(0==ModemStrCmp(pMsg,"+POC:DONE")) //{ // fota_update.NewPocOver=1; //} if(0==ModemStrCmp(pMsg,"^SYSINFO:")) { if(pMsg[15]!=','){ netshowvalue=atoi(&pMsg[15]); }else{ netshowvalue=atoi(&pMsg[16]); } } if(0==ModemStrCmp(pMsg,"+CCSQ:")) { UpdateCsqValue(GetCCSQ(pMsg)); }else if(0==ModemStrCmp(pMsg,"+CSQ:")) { UpdateCsqValue(GetCSQ(pMsg)); }else if(0==ModemStrCmp(pMsg,"+MODODREX:")){ Mododrex_Net=atoi(&pMsg[11]); snprintf(buf3,sizeof(buf3),"Mododrex_Netvalue=%d\r\n",Mododrex_Net); SlwTrace(INF, buf3,1); }else if(0==ModemStrCmp(pMsg,"+POC_PPP:")){ sutGpsStatus.PPPStatus=GetPPPStatus(pMsg); if(sutGpsStatus.PPPStatus == CLOSE){ sutGpsStatus.IPStatus=0; ColonyParaReset(); } }else if(0==ModemStrCmp(pMsg,"+TCPSTATUS:")) {//查询指令返回状态 IPStatusAna((char *)pMsg, &tempSocket,&ipStatus); switch(tempSocket) { case GPS_DATA_SOCKET: sutGpsStatus.IPStatus = ipStatus; if(sutGpsStatus.IPStatus == CLOSE) sutGpsInfo.isGpsAuthOk=0;//鉴权清掉,再次连接后要重新鉴权 break; case COLONY_SER_SOCKET: ColonyTcpStatus(ipStatus); break; } }else if(0==ModemStrCmp(pMsg,"+TCPRECV:")){//+TCPRECV:0,2,31 if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ":", 1,1))) { tempSocket = atoi(&pMsg[targetIndex]);//找到socket if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ",",1,1))) { tempLen = atoi(&pMsg[targetIndex]); if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ",",1,2))) { switch(tempSocket) { case GPS_DATA_SOCKET: //走布标判断 if(pMsg[targetIndex] == 0x7e && pMsg[targetIndex+tempLen-1] == 0x7e) {//是布标协议,进行转义 tempLen=reduce((unsigned char *)&pMsg[targetIndex+1], tempLen-1); MC8332_GPS_RecvHandle((unsigned char *)&pMsg[targetIndex],tempLen); }else { SlwTrace(INF, "Unknown Protocol",1); } break; case COLONY_SER_SOCKET: SlwTrace(INF,"colony coming..........",1); Colony_RecvHandle(&pMsg[targetIndex],tempLen); break; } } } } }else if(0==ModemStrCmp(pMsg,"+TCPOPEN:"))//连接指令返回状态 { //+TCPOPEN:OK //+TCPOPEN:Already connected #if 0 //这条指令不具备socket号回来,不处理,直接通过查询方式来检测连接结果 if((pMsg[9] == 'O' && pMsg[10] == 'K') || (pMsg[9] == 'A' && pMsg[14] == 'd' && pMsg[23] =='t')) { if(tcpControl == 0) { HgsConnetStatus=1; HigosSendFlag=0; }else if(tcpControl== 1) { sutGpsStatus.IPStatus = OPEN; }else if(tcpControl == 2) { #if(USE_CONFIG_FUN==1) sutConfig.g_ubConfigTcpStatus=1; #endif } } #endif }else if(0==ModemStrCmp(pMsg, "+TCPCLOSE:OK")) { }else if(0==ModemStrCmp(pMsg, "+TCPCLOSE:")) {//主动关掉或者服务器关掉都是这样 tempSocket=pMsg[10]-0x30; switch(tempSocket) { case GPS_DATA_SOCKET: sutGpsStatus.IPStatus=CLOSE; break; case COLONY_SER_SOCKET: ColonyParaReset(); break; } }else if(0==ModemStrCmp(pMsg, "+CCLK:")) {//+CCLK: "17/09/28,04:48:35" //+CCLK: "80/01/06,00:10:44" //+CCLK: "17/10/19,07:22:35" g_usModeYTime=atoi(&pMsg[8]); g_usModemTime=atoi(&pMsg[11]); g_usModeDTime=atoi(&pMsg[14]); g_usModeHTime=atoi(&pMsg[17])+8; if(g_usModeHTime >= 24) g_usModeHTime -= 24; g_usModeMTime=atoi(&pMsg[20]); g_usModeSTime=atoi(&pMsg[23]); SetTime(g_usModeHTime, g_usModeMTime, g_usModeSTime);//保存下来,以便下次启动,没登陆前可以使用本地时间显示 SlwTrace(INF, "UpdateTime",1); }else if(0==ModemStrCmp(pMsg, "^MODE:")) {//^MODE: 9 与下面位置不一,模块问题 //^MODE:2 与上面位置不一,模块问题 if(pMsg[6] == ' ') bufTemp[0]=pMsg[7]; else bufTemp[0]=pMsg[6]; snprintf(buf, sizeof(buf), "[Mode %c]", bufTemp[0]); switch(bufTemp[0]) { case 0x30:strcat(buf, "No server");break; case 0x32:strcat(buf, "CDMA Mode");break; case 0x33:strcat(buf, "GSM");break; case 0x34:strcat(buf, "TD-SCDMA/EVDO");break; case 0x35:strcat(buf, "WCDMA");break; case 0x39:strcat(buf, "LTE");break; default:strcat(buf, "Unknow");break; } SlwTrace(INF, buf, 1); }else if(0==ModemStrCmp(pMsg, "^MSG:")) { if(0==ModemStrCmp(&pMsg[5], "Ready")) {//升级应用程序已开启 UpdateStatus(MODEM_STATUS_READY); }else if(0==ModemStrCmp(&pMsg[5], "http:err")) {//指令执行失败 UpdateStatus(MODEM_STATUS_CMD_VER_ERR); }else if(0==ModemStrCmp(&pMsg[5], "VerErr")) {//请求版本号有非数字数据 UpdateStatus(MODEM_STATUS_CMD_VER_ERR); }else if(0==ModemStrCmp(&pMsg[5], "ver:err")) {//检查版本错误 UpdateStatus(MODEM_STATUS_CMD_VER_ERR); }else if(0==ModemStrCmp(&pMsg[5], "nonewver")) {//没有更新版本 UpdateStatus(MODEM_STATUS_NO_NEWVER); }else if(0==ModemStrCmp(&pMsg[5], "loading")) {//开始下载 m_process=0; UpdateStatus(MODEM_STATUS_LOADING); }else if(0==ModemStrCmp(&pMsg[5], "HBD:")) {//正在下在百分比 m_process=atoi(pMsg+9); UpdateStatus(MODEM_STATUS_LOADING); }else if(0==ModemStrCmp(&pMsg[5], "Done")) {//下载完成 UpdateStatus(MODEM_STATUS_DONE); }else if(0==ModemStrCmp(&pMsg[5], "Installed")) {//升级完成 UpdateStatus(MODEM_STATUS_INSTALLED); }else if(0==ModemStrCmp(&pMsg[5], "wget:")) { UpdateStatus(MODEM_STATUS_SER_ERR); } }else if(0==ModemStrCmp(pMsg, "+POC:START")) { sutPocStatus.modemRstFlag=1; sutPocStatus.ModemInactiveCt=0;//当模块重启后重新计数串口通讯异常计数器 } else if(0==ModemStrCmp(pMsg, "+GGIP:")) { //GSPIP返回 //GetDomainIp(&pMsg[6],'g'); if(newPara.serList.defaultuse == SER_IP||newPara.serList.defaultuse == SER_JIQUN) chekPipGip(pMsg,1); }else if(0==ModemStrCmp(pMsg, "+GPIP:")) { //GetDomainIp(&pMsg[6],'p'); if(newPara.serList.defaultuse == SER_IP||newPara.serList.defaultuse == SER_JIQUN)chekPipGip(pMsg,0); } else if(0==ModemStrCmp(pMsg, "+FOTA:")){ FotaStatusProcess(pMsg+6); }else if(0==ModemStrCmp(pMsg, "+POC:WAKEUP")){ enableDataSend(); }else if(0==ModemStrCmp(pMsg, "+UDP:")){ GetPwrMode(pMsg+5); } } static char csqSendFlag=1; void UpdateCsqValue(int csq) { static int tCsq[2]; char validCsq=0,validcsq=0; if(csq == 99 || (csq >=0 && csq <=31)) { tCsq[csqSendFlag]=csq; } if(csqSendFlag==1) {//收到了两组CSQ命令值,对比,如果都有效值,取大的值 if(tCsq[0] >=0 && tCsq[0] <=31) validCsq=1; else if(tCsq[1] >=0 && tCsq[1] <=31) validcsq=1; else g_iCSQ=99; if(validCsq&&validcsq) { if(tCsq[0]>tCsq[1]) g_iCSQ=tCsq[0]; else g_iCSQ=99; }else if(validCsq) g_iCSQ=tCsq[0]; else if(validcsq) g_iCSQ=tCsq[1]; tCsq[0]=99; tCsq[1]=99; } } void CloseGPSSocket(void) { char buf[20]; snprintf(buf, sizeof(buf), "AT+TCPCLOSE=%d\r\n",GPS_DATA_SOCKET); ModemSendAT(buf); sutGpsStatus.IPStatus=CLOSE; } /************************************************ 每10ms处理一次 **************************************************/ void GpsTaskTick(unsigned char reset) { static unsigned int sucSecCt=0; static unsigned char sucSteep=0; static unsigned char sucSynSentCt=0; unsigned char temp[4]; char buf[55]; int i; if(reset){ sucSecCt=0; sucSteep=0; return; } //GPS Uart消息处理 if(g_usUart3RecvLen) { process_nema((char *)RxBuffer3); g_usUart3RecvLen=0; } //===========以下控制每秒执行一次============ if(os_time_get() < sucSecCt) return; sucSecCt=os_time_get()+100; //////////////////20170112//////////////////// GpsCtrlSendPos();//里面涉及到鉴权,所以得跑起来 //TCP发送防护,如果IPSTATUS一直等于SYN_SENT持续达10秒,则关闭TCP链路 if(sutGpsStatus.IPStatus==SYN_SENT) { if(++sucSynSentCt>10){ sucSynSentCt=0; g_ucModemSentTcpCt=0; CloseGPSSocket(); g_ucModemSentTcpCt=0; sutGpsInfo.isServerLogin=0; } }else sucSynSentCt=0; //---以下控制--- if(++sucSteep>4)sucSteep=0; //---- if(sucSteep==0) { if(csqSendFlag==1) {//模块在电信卡的cdma和evdo下使用CCSQ //其它所有情况使用CSQ csqSendFlag=0; ModemSendAT("AT+CSQ\r\n"); }else{ csqSendFlag=1; ModemSendAT("AT+CCSQ\r\n"); } snprintf(buf, sizeof(buf), "[ATH]%d,[GPS]%d,[BAT]%0.2f,[TICK]%d,%d,[CSQ]%d", sutGpsInfo.isGpsAuthOk, sutGpsInfo.isGpsValid, (double)g_iVbat/100, os_time_get(), sutGpsInfo.GPS_SecondCnt, g_iCSQ); SlwTrace(INF,buf,1); } else if(1==sucSteep) { ModemSendAT("AT+POC_PPP\r\n"); }else if(2==sucSteep) { if(99==g_iCSQ)return; if(sutGpsStatus.PPPStatus==OPEN){ snprintf(buf, sizeof(buf), "AT+TCPSTATUS=%d\r\n", GPS_DATA_SOCKET); ModemSendAT(buf); }else{ SlwTrace(INF, "Wait POC_PPP",1); } }else if(3==sucSteep) { if(99==g_iCSQ) return; if(sutGpsInfo.isGpsWork==0) { if(sutGpsStatus.CheckCnt < 50) { if(++sutGpsStatus.CheckCnt >= 2) { sutGpsStatus.CheckCnt = NO_GPS_CHECK_TIMEOUT;//设置为此值时认为是没有GPS机型 } } SlwTrace(INF,"GPS modem not work!",1); } if(sutGpsStatus.IPStatus!=OPEN && sutGpsStatus.PPPStatus==OPEN) { // if(tcpControl == 1) // {//当控制为GPS时才去连接 sutGpsInfo.isServerLogin=0; snprintf(buf, sizeof(buf),"AT+TCPOPEN=%d,%s:%d\r\n",GPS_DATA_SOCKET,showGIP,newPara.gpsPort); SlwTrace(INF,buf,0); ModemSendAT(buf); //} } }else if(4==sucSteep) { if(99==g_iCSQ)return; if(sutGpsStatus.IPStatus==OPEN && 0==sutGpsInfo.isServerLogin) { sutGpsInfo.isServerLogin = OPEN; } } }