MC8332GpsTask.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. /********************************************************************************
  2. * File Name: MC8332GpsTask.h
  3. * Function Describe: Header file for MC8332GpsTask.c
  4. * Explain:
  5. * Writer:
  6. * Date: 2016-3-11
  7. *******************************************************************************/
  8. #include "includes.h"
  9. void MC8332_GPS_RecvHandle(unsigned char *pMsg,unsigned short tempLen)
  10. {
  11. char buf[20];
  12. char buf2[50];
  13. char result[10];
  14. unsigned short cmd,ackCmd,smsLen;
  15. unsigned char Result,i,buBiaoResponsed;
  16. short targetIndex;
  17. SUTDS ds;
  18. ////////////////////////////////////////////
  19. // char buftest[100];
  20. // char buf22[3];
  21. // for(i=0;i<25;i++)
  22. // {
  23. // sprintf(buf22, "%02x", pMsg[i]);
  24. // strcat(buftest, buf22);
  25. // }
  26. // strcat(buftest, "\r\n");
  27. // SlwTrace(INF, buftest);
  28. ////////////////////////////////////////////
  29. //////////处理布标类型指令
  30. cmd = (pMsg[1]<<8) | (pMsg[2]&0xff);
  31. buBiaoResponsed=1;
  32. sprintf(buf2, "\r\ncmd=%04x", cmd);
  33. SlwTrace(INF, buf2,1);
  34. switch(cmd)
  35. {//布标命令返回
  36. case TS_TERMINAL_REGISTRATION_REPLY://终端注册应答
  37. //7E 8100 000A 000166000016 0250 0100 00 20161118165030 E07E 成功
  38. //7E 8100 0003 000166000016 0251 0100 01 A07E 已注册
  39. Result = pMsg[15];
  40. sprintf(buf2, "\r\nresult=%02x", Result);
  41. SlwTrace(INF, buf2,1);
  42. switch(Result)
  43. {
  44. case 0://00注册成功
  45. for(i =0; i < 7; i++)
  46. sutProductPara.AutH[i]=pMsg[16+i];
  47. SaveProductParaToFlash("AUTH-REC");
  48. sprintf(result, "Ok");
  49. break;
  50. case 1://01 车辆已注册
  51. sprintf(result, "Car Exist");break;
  52. case 2://02 无此车辆
  53. sprintf(result, "No car");break;
  54. case 3://03 终端已经被注册
  55. sprintf(result, "Device Exist");break;
  56. case 4://04 数据库无此终端
  57. sprintf(result, "No Record");break;
  58. default://无效值
  59. //统称失败
  60. sprintf(result, "Faile");
  61. break;
  62. }
  63. sprintf(buf2, "\r\n[Register]%d %s", Result,result);
  64. SlwTrace(INF, buf2,1);
  65. //注册应答后直接进行一次鉴权
  66. Authentication();
  67. break;
  68. case TS_TEXT_INFORMATION_ISSUED://文本下发
  69. //7E83000005000166000009000001 31323334ED7E
  70. smsLen = (pMsg[3] << 8) | (pMsg[4]&0xff);
  71. if(SMS_SIGNAL_LEN <= smsLen)
  72. smsLen = SMS_SIGNAL_LEN;
  73. //memset(sutMess.GBKMess1, 0,sizeof(sutMess.GBKMess1));
  74. //GBKTostr(pMsg+28,sutMess.GBKMess1,smsLen);
  75. memcpy(sutMess.GBKMess1, pMsg+14, smsLen-1);
  76. sutMess.GBKMess1[smsLen-1] = 0;//最后一个补0
  77. sutMess.len = smsLen;
  78. //////////////////////////
  79. sutFeed.feedID=TS_SETTING_TERMINAL_PARAMETERS;
  80. ds.Data.ucData.b1=pMsg[11];
  81. ds.Data.ucData.b2=pMsg[12];
  82. sutFeed.feedliushuiID=ds.Data.usData;
  83. sutFeed.result=2;
  84. //////////////////////////
  85. if(sutMess.len > 0)
  86. SetGotNewMessage();
  87. break;
  88. case TS_PLATFORM_UNIVERSAL_ANSWER://通用平台应答
  89. //7E8001000500016600001602400000010201B57E
  90. //buf[0]=0x7e;
  91. //if(-1 != (targetIndex=FindTargetIndex((char *)pMsg, '\r', buf, 1,2)))
  92. targetIndex = tempLen;//这个长度是去掉了两个7E的长度
  93. {
  94. ackCmd=(pMsg[targetIndex-3]<<8) | (pMsg[targetIndex-2]&0xff);
  95. Result = pMsg[targetIndex-1];
  96. sprintf(buf2, "\r\nLen=%d,ackCmd=%04x,result=%02x", tempLen,ackCmd,Result);
  97. SlwTrace(INF, buf2,1);
  98. switch(ackCmd)
  99. {
  100. case TS_TERMINAL_AUTHENTICATION://终端鉴权应答
  101. if(Result == 0)
  102. {//鉴权成功
  103. sutGpsInfo.isGpsAuthOk=1;
  104. sprintf(buf2, "\r\n[ATH]Ok");
  105. //TSGpsServerConect();//鉴权成功后发一包终端应答包即可以支持文本接收了
  106. }else
  107. {
  108. sutGpsInfo.isGpsAuthOk=0;
  109. sprintf(buf2, "\r\n[ATH]Faile");
  110. }
  111. SlwTrace(INF, buf2,1);
  112. break;
  113. case TS_LOCATION_INFORMATION_REPORTING://位置包应答
  114. SlwTrace(INF, "\r\nLocation ACK",1);
  115. break;
  116. case TS_TERMINAL_HEARTBEAT://心跳应答
  117. SlwTrace(INF, "\r\nHearTick ACK",1);
  118. break;
  119. }
  120. }
  121. break;
  122. default:
  123. buBiaoResponsed=0;
  124. break;
  125. }
  126. if(buBiaoResponsed)
  127. g_ucModemSentTcpCt=0;
  128. /////////////处理其它类型指令
  129. }
  130. void AtHandle(char *pMsg)
  131. {
  132. int csq;
  133. static uint8_t flag =0;
  134. short targetIndex;
  135. unsigned char tempSocket,i,temp;
  136. unsigned short tempLen;
  137. char buf[80]="\r\n";
  138. char bufTemp[3];
  139. if(0==ModemStrCmp(pMsg,"+CSQ:")){
  140. csq=GetCSQ(pMsg);
  141. if(csq>=0 && csq<100)g_iCSQ=csq;
  142. }else if(0==ModemStrCmp(pMsg,"+POC_PPP:")){
  143. sutGpsStatus.PPPStatus=GetPPPStatus(pMsg);
  144. }else if(0==ModemStrCmp(pMsg,"+TCPSTATUS:"))
  145. {//查询指令返回状态
  146. if(tcpControl ==2)//控制配置服务器操作
  147. {
  148. #if(USE_CONFIG_FUN==1)
  149. if(OPEN == GetIPNewStatus(pMsg,CONFIG_SER_SOCKET)) sutConfig.g_ubConfigTcpStatus = 1;
  150. else
  151. {
  152. if(sutConfig.g_ubConfigTcpStatus) sutConfig.g_ucTcpRetryNum=CONFIG_TCP_RETRY_CNT;
  153. sutConfig.g_ubConfigTcpStatus = 0;
  154. }
  155. #endif
  156. }else
  157. {
  158. GetIPNewStatus(pMsg,GPS_DATA_SOCKET);
  159. if(tcpControl == 1)
  160. {
  161. sutGpsStatus.IPStatus=GetIPNewStatus(pMsg,GPS_DATA_SOCKET);
  162. if(sutGpsStatus.IPStatus == CLOSE) sutGpsInfo.isGpsAuthOk=0;//鉴权清掉,再次连接后要重新鉴权
  163. if(0==flag)
  164. {
  165. if(sutPocStatus.Logined && sutGpsStatus.IPStatus == OPEN)
  166. {
  167. flag ++;
  168. Registration();
  169. registerActFlag=1;
  170. }
  171. }
  172. }else if(tcpControl == 0)
  173. {//HGS
  174. if(OPEN == sutGpsStatus.IPStatus)
  175. HgsConnetStatus=1;
  176. }
  177. }
  178. }else if(0==ModemStrCmp(pMsg,"+TCPRECV:")){//+TCPRECV:0,2,31
  179. if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ":", 1,1)))
  180. {
  181. tempSocket = atoi(&pMsg[targetIndex]);//找到socket
  182. if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ",",1,1)))
  183. {
  184. tempLen = atoi(&pMsg[targetIndex]);
  185. if(-1 != (targetIndex=FindTargetIndex(pMsg, '\r', ",",1,2)))
  186. {
  187. // if(changeDataFormat(&pMsg[targetIndex],tempLen))
  188. // {
  189. // SlwTrace(INF, "DataFormat Err",1);
  190. // return;
  191. // }
  192. if(tempSocket == GPS_DATA_SOCKET)
  193. {
  194. if(tcpControl == 0)
  195. {
  196. Hgs_Data_RecvHandle(&pMsg[targetIndex],tempLen);
  197. }else if(tcpControl == 1)
  198. {
  199. //走布标判断
  200. if(pMsg[targetIndex] == 0x7e && pMsg[targetIndex+tempLen-1] == 0x7e)
  201. {//是布标协议,进行转义
  202. tempLen=reduce((unsigned char *)&pMsg[targetIndex+1], tempLen-1);
  203. MC8332_GPS_RecvHandle((unsigned char *)&pMsg[targetIndex],tempLen);
  204. }else
  205. {
  206. SlwTrace(INF, "Unknown Protocol",1);
  207. }
  208. }
  209. /////////////////////////////////////////
  210. #if 0
  211. tempLen += 2;
  212. if(tempLen > 30) tempLen=30;
  213. for(i=0;i<tempLen;i++)
  214. {
  215. sprintf(bufTemp, "%02x", pMsg[targetIndex+i]);
  216. strcat(buf, bufTemp);
  217. }
  218. //strcat(buf, "\r\n");
  219. SlwTrace(INF, buf,1);
  220. #endif
  221. /////////////////////////////////////////
  222. }else if(tempSocket == CONFIG_SER_SOCKET)
  223. {
  224. Hgs_Data_RecvHandle(&pMsg[targetIndex],tempLen);
  225. }
  226. else
  227. {
  228. //if(tempSocket == HGS_SERVER_SOCKET)
  229. //Hgs_Data_RecvHandle(&pMsg[targetIndex]);
  230. }
  231. }
  232. }
  233. }
  234. }else if(0==ModemStrCmp(pMsg,"+TCPOPEN:"))//连接指令返回状态
  235. { //+TCPOPEN:OK
  236. //+TCPOPEN:Already connected
  237. if((pMsg[9] == 'O' && pMsg[10] == 'K') ||
  238. (pMsg[9] == 'A' && pMsg[14] == 'd' && pMsg[23] =='t'))
  239. {
  240. if(tcpControl == 0)
  241. {
  242. HgsConnetStatus=1;
  243. HigosSendFlag=0;
  244. }else if(tcpControl== 1)
  245. {
  246. sutGpsStatus.IPStatus = OPEN;
  247. }else if(tcpControl == 2)
  248. {
  249. #if(USE_CONFIG_FUN==1)
  250. sutConfig.g_ubConfigTcpStatus=1;
  251. #endif
  252. }
  253. }
  254. }else if(0==ModemStrCmp(pMsg, "+TCPCLOSE:OK"))
  255. {
  256. }else if(0==ModemStrCmp(pMsg, "+TCPCLOSE:"))
  257. {//主动关掉或者服务器关掉都是这样
  258. if(tcpControl== 0)
  259. {
  260. if(pMsg[10] == GPS_DATA_SOCKET+0x30)
  261. {
  262. if(HgsConnetStatus != 2)
  263. HgsConnetStatus=0;
  264. }
  265. }else if(tcpControl == 2)
  266. {
  267. #if(USE_CONFIG_FUN==1)
  268. if(sutConfig.g_ubConfigTcpStatus) sutConfig.g_ucTcpRetryNum=CONFIG_TCP_RETRY_CNT;
  269. sutConfig.g_ubConfigTcpStatus = 0;
  270. #endif
  271. }
  272. }else if(0==ModemStrCmp(pMsg, "+CCLK:"))
  273. {//+CCLK: "17/09/28,04:48:35"
  274. //+CCLK: "80/01/06,00:10:44"
  275. //+CCLK: "17/10/19,07:22:35"
  276. g_usModeYTime=atoi(&pMsg[8]);
  277. g_usModemTime=atoi(&pMsg[11]);
  278. g_usModeDTime=atoi(&pMsg[14]);
  279. g_usModeHTime=atoi(&pMsg[17])+8;
  280. if(g_usModeHTime >= 24) g_usModeHTime -= 24;
  281. g_usModeMTime=atoi(&pMsg[20]);
  282. g_usModeSTime=atoi(&pMsg[23]);
  283. SetTime(g_usModeHTime, g_usModeMTime, g_usModeSTime);//保存下来,以便下次启动,没登陆前可以使用本地时间显示
  284. SlwTrace(INF, "UpdateTime",1);
  285. }else if(0==ModemStrCmp(pMsg, "^MODE:"))
  286. {//^MODE: 9 与下面位置不一,模块问题
  287. //^MODE:2 与上面位置不一,模块问题
  288. if(pMsg[6] == ' ') bufTemp[0]=pMsg[7];
  289. else bufTemp[0]=pMsg[6];
  290. sprintf(buf, "[Mode %c]", bufTemp[0]);
  291. switch(bufTemp[0])
  292. {
  293. case 0x30:strcat(buf, "No server");break;
  294. case 0x32:strcat(buf, "CDMA Mode");break;
  295. case 0x33:strcat(buf, "GSM");break;
  296. case 0x34:strcat(buf, "TD-SCDMA/EVDO");break;
  297. case 0x35:strcat(buf, "WCDMA");break;
  298. case 0x39:strcat(buf, "LTE");break;
  299. default:strcat(buf, "Unknow");break;
  300. }
  301. SlwTrace(INF, buf, 1);
  302. }
  303. }
  304. /************************************************
  305. 每10ms处理一次
  306. **************************************************/
  307. void GpsTaskTick(unsigned char reset)
  308. {
  309. static unsigned char sucSecCt=0;
  310. static unsigned char sucSteep=0;
  311. static unsigned char sucSynSentCt=0;
  312. unsigned char temp[4];
  313. char buf[50];
  314. int i;
  315. if(reset){
  316. sucSecCt=0;
  317. sucSteep=0;
  318. return;
  319. }
  320. //GPS Uart消息处理
  321. if(g_usUart3RecvLen)
  322. {
  323. process_nema((char *)RxBuffer3);
  324. g_usUart3RecvLen=0;
  325. }
  326. //===========以下控制每秒执行一次============
  327. if(++sucSecCt>99)sucSecCt=0;
  328. else return;
  329. //////////////////20170112////////////////////
  330. GpsCtrlSendPos();//里面涉及到鉴权,所以得跑起来
  331. //TCP发送防护,如果IPSTATUS一直等于SYN_SENT持续达10秒,则关闭TCP链路
  332. if(sutGpsStatus.IPStatus==SYN_SENT)
  333. {
  334. if(++sucSynSentCt>10){
  335. sucSynSentCt=0;
  336. g_ucModemSentTcpCt=0;
  337. sprintf(buf, "AT+TCPCLOSE=%d\r\n",GPS_DATA_SOCKET);
  338. ModemSendAT(buf);
  339. sutGpsStatus.IPStatus=CLOSE;
  340. g_ucModemSentTcpCt=0;
  341. sutGpsInfo.isServerLogin=0;
  342. }
  343. }else sucSynSentCt=0;
  344. //---以下控制---
  345. if(++sucSteep>4)sucSteep=0;
  346. //----
  347. if(sucSteep==0)
  348. {
  349. ModemSendAT("AT+CSQ\r\n");
  350. sprintf(buf, "[ATH]:%d,[GPS]:%d,[BAT]:%0.2f", sutGpsInfo.isGpsAuthOk,
  351. sutGpsInfo.isGpsValid,
  352. (double)g_iVbat/100);
  353. SlwTrace(INF,buf,1);
  354. }
  355. else if(1==sucSteep)
  356. {
  357. ModemSendAT("AT+POC_PPP\r\n");
  358. }else if(2==sucSteep)
  359. {
  360. if(99==g_iCSQ)return;
  361. if(sutGpsStatus.PPPStatus==OPEN){
  362. sprintf(buf, "AT+TCPSTATUS=%d\r\n", GPS_DATA_SOCKET);
  363. ModemSendAT(buf);
  364. }else{
  365. SlwTrace(INF, "Wait POC_PPP",1);
  366. }
  367. }else if(3==sucSteep)
  368. {
  369. if(99==g_iCSQ) return;
  370. if(sutGpsInfo.isGpsWork==0)
  371. {
  372. if(sutGpsStatus.CheckCnt < 50)
  373. {
  374. if(++sutGpsStatus.CheckCnt >= 2)
  375. {
  376. sutGpsStatus.CheckCnt = NO_GPS_CHECK_TIMEOUT;//设置为此值时认为是没有GPS机型
  377. }
  378. }
  379. SlwTrace(INF,"GPS modem not work!",1);
  380. }
  381. if(sutGpsStatus.IPStatus==CLOSE && sutGpsStatus.PPPStatus==OPEN)
  382. {
  383. if(tcpControl == 1)
  384. {//当控制为GPS时才去连接
  385. sutGpsInfo.isServerLogin=0;
  386. sprintf(buf,"AT+TCPOPEN=%d,%s:%d\r\n",GPS_DATA_SOCKET,sutProductPara.GIP,sutProductPara.GpsPort);
  387. SlwTrace(DEBUG,buf,0);
  388. ModemSendAT(buf);
  389. }
  390. }
  391. }else if(4==sucSteep)
  392. {
  393. if(99==g_iCSQ)return;
  394. if(sutGpsStatus.IPStatus==OPEN && 0==sutGpsInfo.isServerLogin)
  395. {
  396. sutGpsInfo.isServerLogin = OPEN;
  397. if(registerActFlag)
  398. {
  399. sucGpsSentTcpCt=16;//会及时鉴权
  400. //heartTickCt=0;//如果鉴权成功后会及时发心跳或位置包(本来不用的,但TCP断开后再连接上,鉴权成功不发心跳还是收不了文本)
  401. }
  402. }
  403. }
  404. }