123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558 |
- /********************************************************************************
- * 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;
- }
- }
- }
-
-
|