/******************************************************************************** * 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" SUT_GPS_STATUS sutGpsStatus; int g_iCSQ=-1; unsigned int SendFlag=0; unsigned char sucGpsSentTcpCt=0;//从启动发送到收到计数器 unsigned int heartTickCt=0; //====================================== static STATUE GpsServerStatus=CLOSE; /******************************************************************************* 校验 *******************************************************************************/ unsigned char GetCheck(unsigned char *data, unsigned short datalen) { unsigned char ck=0; int i; for(i=0;i6) sutPocStatus.PPPedCt=8; return OPEN; } else{ if(++sutPocStatus.PPPedCt>6) sutPocStatus.PPPedCt=8; return CLOSE; } } //检测已打开的socket列表,返回要查询的socket状态 //如果newCheck为1,则根据msg重新判断状态 //如果newCheck为0,则根据静态变量返回状态 //checkSocket, 需要检测的socket(1-10) STATUE GetIPNewStatus(char *msg, unsigned char newCheck, unsigned char checkSocket) {//+MIPOPEN:1,2,3,4,5,6,7,8,9,10 static unsigned char socketListStatus[10];//只支持1-10 unsigned char i; unsigned char socket; char *ptr; unsigned char len,size; size=sizeof(socketListStatus); ptr = msg+9; len = strlen(ptr); if(newCheck) { memset(socketListStatus, 1, size);//1默认为在使用 socket = atoi(ptr);//第1个socket值,并不一定是socket1,要检测一下如果都没打开,这指令回来列表是什么 if(socket <= sizeof(socketListStatus)) socketListStatus[socket-1]=0;//有值,则为空闲 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 GetDNSIP(char *msg) { // if(msg[12]!='F' && msg[13]!='a' && msg[14]!='i'){//+ZDNSGETIP: failed // HigosSendFlag =1; // HgsConnetFlag=3; // }else{ // sutGpsStatus.PPPStatus=CLOSE; // ModemSendAT("AT+ZPPPCLOSE\n\r"); // } } 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; //////////////////////////////////////////// // char buftest[100]; // char buf22[3]; // for(i=0;i<25;i++) // { // sprintf(buf22, "%02x", pMsg[i]); // strcat(buftest, buf22); // } // strcat(buftest, "\r\n"); // SlwTrace(INF, buftest); //////////////////////////////////////////// //////////处理布标类型指令 cmd = (pMsg[1]<<8) | (pMsg[2]&0xff); buBiaoResponsed=1; sprintf(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]; sprintf(buf2, "result=%02x", Result); SlwTrace(INF, buf2,1); switch(Result) { case 0://00注册成功 for(i =0; i < 7; i++) sutNewSegmentPara.AutH[i]=pMsg[16+i]; SaveNewSegmentToFlash(); sprintf(result, "Ok"); break; case 1://01 车辆已注册 sprintf(result, "Car Exist");break; case 2://02 无此车辆 sprintf(result, "No car");break; case 3://03 终端已经被注册 sprintf(result, "Device Exist");break; case 4://04 数据库无此终端 sprintf(result, "No Record");break; default://无效值 //统称失败 sprintf(result, "Faile"); break; } sprintf(buf2, "[Register]%d %s", Result,result); SlwTrace(INF, buf2,1); //注册应答后直接进行一次鉴权 Authentication(); break; case TS_TEXT_INFORMATION_ISSUED://文本下发 //7E83000005000166000009000001 31323334ED7E //7e83000005000000000000000001 36323131837e 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; if(sutMess.len > 0) SetGotNewMessage(); 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]; sprintf(buf2, "Len=%d,ackCmd=%04x,result=%02x", tempLen,ackCmd,Result); SlwTrace(INF, buf2,1); switch(ackCmd) { case TS_TERMINAL_AUTHENTICATION://终端鉴权应答 if(Result == 0) {//鉴权成功 sutGpsInfo.isGpsAuthOk=1; sprintf(buf2, "[ATH]Ok"); sutGpsInfo.GPS_SecondCnt=60;//鉴权通过后马上可以发位置或心跳 }else { sutGpsInfo.isGpsAuthOk=0; sprintf(buf2, "[ATH]Faile"); } SlwTrace(INF, buf2,1); break; case TS_LOCATION_INFORMATION_REPORTING://位置包应答 SlwTrace(INF, "Location ACK",1); break; case TS_TERMINAL_HEARTBEAT://心跳应答 SlwTrace(INF, "HearTick ACK",1); break; } } break; case TS_TERMINAL_GPSTIME: //GPS 下发上传时间 sutNewSegmentPara.SendGpsTime=pMsg[13]; printf("sutNewSegmentPara.SendGpsTime=============%d\r\n",sutNewSegmentPara.SendGpsTime); SaveNewSegmentToFlash(); break; default: buBiaoResponsed=0; break; } if(buBiaoResponsed) g_ucModemSentTcpCt=0; /////////////处理其它类型指令 } void AtHandle(char *pMsg) { int csq; short targetIndex; unsigned char tempSocket,i,temp; unsigned short tempLen; char buf[80]="\r\n"; char bufTemp[3]; if(0==ModemStrCmp(pMsg,"+CCSQ:")) { UpdateCsqValue(GetCCSQ(pMsg)); }else if(0==ModemStrCmp(pMsg,"+CSQ:")) { UpdateCsqValue(GetCSQ(pMsg)); }else if(0==ModemStrCmp(pMsg,"+POC_PPP:")){ sutGpsStatus.PPPStatus=GetPPPStatus(pMsg); }else if(0==ModemStrCmp(pMsg,"+TCPSTATUS:")) {//查询指令返回状态 if(tcpControl ==2)//控制配置服务器操作 { #if(USE_CONFIG_FUN==1) if(OPEN == GetIPNewStatus2(pMsg,CONFIG_SER_SOCKET)) sutConfig.g_ubConfigTcpStatus = 1; else { if(sutConfig.g_ubConfigTcpStatus) sutConfig.g_ucTcpRetryNum=CONFIG_TCP_RETRY_CNT; sutConfig.g_ubConfigTcpStatus = 0; } #endif }else { GetIPNewStatus2(pMsg,GPS_DATA_SOCKET); if(tcpControl == 1) { sutGpsStatus.IPStatus=GetIPNewStatus2(pMsg,GPS_DATA_SOCKET); if(sutGpsStatus.IPStatus == CLOSE) sutGpsInfo.isGpsAuthOk=0;//鉴权清掉,再次连接后要重新鉴权 }else if(tcpControl == 0) {//HGS if(OPEN == sutGpsStatus.IPStatus) HgsConnetStatus=1; } } }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))) { // if(changeDataFormat(&pMsg[targetIndex],tempLen)) // { // SlwTrace(INF, "DataFormat Err",1); // return; // } if(tempSocket == GPS_DATA_SOCKET) { if(tcpControl == 0) { Hgs_Data_RecvHandle(&pMsg[targetIndex],tempLen); }else if(tcpControl == 1) { //走布标判断 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); } } ///////////////////////////////////////// #if 0 tempLen += 2; if(tempLen > 30) tempLen=30; for(i=0;i3){ sutGpsInfo.isServerLogin=0; g_ucModemSentTcpCt=0; sprintf(buf, "AT+TCPCLOSE=%d\r\n", 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; /////////////////////////////////////////////// SendTime=15; //----TCP发送后服务器未在时间段内回复,马上再发送 if(sutGpsInfo.isGpsAuthOk==0) { //鉴权失败 if(++sucGpsSentTcpCt>15)//定时鉴权 { sucGpsSentTcpCt=0; susGpsTimingSendCt=0; //如果鉴权3次失败后则做一次注册请求 if(sutPocStatus.Logined) {//登陆了才去鉴权 if(++authTryTime > 3) { authTryTime=0; Registration(); }else Authentication(); } } return;//鉴权未成功的返回 }else{ if(g_ucModemSentTcpCt==0) { sucGpsSentTcpCt=0; g_ucModemSentTcpCt=0; } } sutGpsInfo.GPS_SecondCnt++; if(sutGpsInfo.isGpsValid) {//可以发位置包,检测时间是否到了 if(sutGpsInfo.GPS_SecondCnt>=sutNewSegmentPara.SendGpsTime){ sutGpsInfo.GPS_SecondCnt=0; SlwTrace(INF,"TSGpsTimingSendPos 15",1); TSGpsTimingSendPos(); } }else {//没定位,不发位置包,则发心跳 if(sutGpsInfo.GPS_SecondCnt >= 60) { sutGpsInfo.GPS_SecondCnt=0; SlwTrace(INF, "HeartTick",1); TS_SendHeartTick(); } } } static char csqSendFlag=1; void UpdateCsqValue(int csq) { static char updateCSQ_ct=0;//兼容移动联通版本无法查CCSQ。 static int tCsq[2]; if(csq == 99 || (csq >=0 && csq <=31)) { tCsq[csqSendFlag]=csq; } updateCSQ_ct++; if(csqSendFlag==1 || updateCSQ_ct==2) {//收到了两组CSQ命令值,对比,如果有有效值 if(tCsq[0] >=0 && tCsq[0] <=31) g_iCSQ=tCsq[0];//优先使用第一组 else if(tCsq[1] >=0 && tCsq[1] <=31) g_iCSQ=tCsq[1]; else g_iCSQ=99; tCsq[0]=99; tCsq[1]=99; updateCSQ_ct=0; } } /************************************************ 每10ms处理一次 **************************************************/ void GpsTaskTick(unsigned char reset) { static unsigned int sucSecCt=0; static unsigned char sucSteep=0; static unsigned char sucSynSentCt=0; static unsigned char dly=0; char buf[50]; if(reset){ sucSecCt=0; sucSteep=0; return; } if(g_usRx3Len>0) { process_nema((char *)RxBuffer3); g_usRx3Len=0; } //===========以下控制每秒执行一次============ if(os_time_get() < sucSecCt) return; sucSecCt=os_time_get()+100; GpsCtrlSendPos(); //TCP发送防护,如果IPSTATUS一直等于SYN_SENT持续达10秒,则关闭TCP链路 if(sutGpsStatus.IPStatus==SYN_SENT) { if(++sucSynSentCt>10) { sucSynSentCt=0; sutGpsInfo.isServerLogin=0; g_ucModemSentTcpCt=0; sprintf(buf, "AT+TCPCLOSE=%d\r\n",GPS_DATA_SOCKET); ModemSendAT(buf); sutGpsStatus.IPStatus=CLOSE; 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"); } sprintf(buf, "[ATH]%d,[GPS]%d,[BAT]%0.2f,[CSQ]%d", sutGpsInfo.isGpsAuthOk, sutGpsInfo.isGpsValid, (double)g_iVbat/100, 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){ sprintf(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; sprintf(buf,"AT+TCPOPEN=%d,%d.%d.%d.%d:%d\r\n",GPS_DATA_SOCKET,sutNewSegmentPara.GIP[0],sutNewSegmentPara.GIP[1],sutNewSegmentPara.GIP[2],sutNewSegmentPara.GIP[3], sutNewSegmentPara.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; } } } void VolumeSet(void) { char i,t; int Volume; SUT_MODEM_AT_MSG *pMsg=&sutAtmPro; //先配置一次,再查,因为默认就查有可能是没有返回的 ModemSendAT("at+syscmd=start_pcm volume 6 7\r\n"); //7 5 for(i=0;i<10;i++) { t=100; REGO: ModemSendAT("at+syscmd=start_pcm volume\r\n"); while(t--) { if((pMsg->MsgLen = MsgQueueAccept(pMsg->MsgData,sizeof(pMsg->MsgData)))) { if(0==ModemStrCmp((char *)pMsg->MsgData,"6 7")) { SlwTrace(INF, "[07]Set Volume ok",1); return; }else{ if(t==0) ModemSendAT("at+syscmd=start_pcm volume 6 7\r\n"); } }else os_dly_wait(1); } } SlwTrace(INF, "[07]Set Volume failed",1); }