GpsTask.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. /********************************************************************************
  2. * File Name: GpsTask.c
  3. * Function Describe:The GpsTask for the system
  4. * Relate Module:
  5. * Explain: Hardware version is HS110C
  6. * Writer: ShiLiangWen
  7. * Date: 2015.4.12
  8. *******************************************************************************/
  9. #define THIS_FILE_ID 16
  10. //--------------------------------------------------------------------------------
  11. #include "includes.h"
  12. //OS_TID idGpsTask=0;
  13. //U64 stkGpsTask[GPS_TASK_STK_SIZE];
  14. SUT_GPS_STATUS sutGpsStatus;
  15. SUT_MESS sutMess;
  16. int g_iCSQ=-1;
  17. const unsigned short GPS_TimeTable[GPS_TABLE_NUM]={0,5,10,15,30,60,120,300};
  18. //const unsigned char GPS_TimeTable[]={5,10,15,30,60};
  19. //======================================
  20. static STATUE GpsServerStatus=CLOSE;
  21. unsigned char TimeFlag=1;//获取服务器时间标记
  22. unsigned char sucGpsSentTcpCt=0;//从启动发送到收到计数器
  23. unsigned char TeminalInfoRevOK=0;
  24. /*******************************************************************************
  25. 校验
  26. *******************************************************************************/
  27. unsigned char GetCheck(unsigned char *data, unsigned short datalen)
  28. {
  29. unsigned char ck=0;
  30. int i;
  31. for(i=0;i<datalen;i++){
  32. ck^=data[i];
  33. }
  34. return ck;
  35. }
  36. /*****************************************************************************
  37. *发送数据封包
  38. format: 0x29 0x29 CMD Len PSN[4] Data Check 0x0D
  39. Len=DataLen+6
  40. ******************************************************************************/
  41. int SendBufPack(char *pBuf,unsigned char cmd,unsigned short DataLen,unsigned char *data)
  42. {
  43. SUTDS ds;
  44. SUTDL dl;
  45. int i,j;
  46. if(DataLen>UART3_TX_BUFFER_SIZE)return 0;
  47. //包头
  48. pBuf[0]=0x29;//Head
  49. pBuf[1]=0x29;//Head
  50. pBuf[2]=cmd;//CMD
  51. //DataLen
  52. ds.Data.usData=DataLen+6;
  53. pBuf[3]=ds.Data.ucData.b2;
  54. pBuf[4]=ds.Data.ucData.b1;
  55. //PSN
  56. dl.Data.ulData=sutProductPara.PSN;
  57. pBuf[5]=dl.Data.ucData.b4;
  58. pBuf[6]=dl.Data.ucData.b3;
  59. pBuf[7]=dl.Data.ucData.b2;
  60. pBuf[8]=dl.Data.ucData.b1;
  61. //Data
  62. j=9;
  63. for(i=0;i<DataLen;i++){
  64. pBuf[j++]=data[i];
  65. }
  66. //check
  67. pBuf[j++]= GetCheck(TxBuffer3,(DataLen+6));
  68. pBuf[j++]=0x0D;
  69. return j;
  70. }
  71. /********************************************************************************************************
  72. *SendTick 发送心跳包
  73. *********************************************************************************************************/
  74. void SendTick(void)
  75. {
  76. int len;
  77. char AT[100];
  78. len=SendBufPack((char *)TxBuffer3,0,0,NULL);
  79. snprintf(AT, sizeof(AT),"AT+ZIPSEND=1,%d\r",len);
  80. ModemSendAT(AT);
  81. ModemSendData(TxBuffer3,len);
  82. }
  83. /*******************************************************************
  84. *GetCSQ
  85. ********************************************************************/
  86. int GetCSQ(char* msg)
  87. {//+CSQ: 29,56
  88. return atoi(&msg[6]);
  89. }
  90. int GetCCSQ(char* msg)
  91. {//+CCSQ: 29,56
  92. return atoi(&msg[7]);
  93. }
  94. /*******************************************************************
  95. *GetPPPStatus
  96. ********************************************************************/
  97. STATUE GetPPPStatus(char *msg)
  98. {//+POC_PPP:0
  99. //+POC_PPP:1
  100. if(msg[9]=='1')return OPEN;
  101. else return CLOSE;
  102. }
  103. STATUE GetGpsServerStatus(char *msg){
  104. if(ModemStrCmp(msg,"+RECV:")){
  105. if(msg[13]=='O' && msg[15]=='E' && msg[18]=='D'){ //OPENED
  106. return OPEN;
  107. }else{
  108. return CLOSE;
  109. }
  110. } else return INVALID;
  111. }
  112. /*******************************************************************
  113. *NetRecvMsgHandle
  114. ********************************************************************/
  115. int NetRecvMsgHandle(char *msg)
  116. {
  117. if(!ModemStrCmp(msg,"+ZIPRECV:0,"))//+ZIPRECV:0,10,XXXX
  118. return 0;
  119. }
  120. /*******************************************************************
  121. *GetIPStatus
  122. ********************************************************************/
  123. STATUE GetIPStatus(char *msg)
  124. {
  125. //if(ModemStrCmp(msg,"+ZIPSTATUS:")){ //+ZIPSTATUS: xxxx
  126. if(msg[12]=='E' && msg[14]=='T' && msg[22]=='D'){//+ZIPSTATUS: ESTABLISHED
  127. // if(TimeFlag==0){
  128. // ModeGetTime();//获取时间 文工说只有IP通了 才正确
  129. // TimeFlag+=1;
  130. // }
  131. return OPEN;
  132. }else if(msg[12]=='S' && msg[14]=='N' && msg[19]=='T'){//+ZIPSTATUS: SYN_SENT
  133. return SYN_SENT;
  134. }else{
  135. return CLOSE;
  136. }
  137. //}else return INVALID;
  138. }
  139. /*******************************************************************
  140. *GetIPStatusu
  141. ********************************************************************/
  142. STATUE GetIPStatusu(char *msg)
  143. {
  144. //if(ModemStrCmp(msg,"+ZIPSTATUSU:")){ //+ZIPSTATUSU: ESTABLISHED
  145. if(msg[13]=='E' && msg[15]=='T' && msg[23]=='D'){
  146. return OPEN;
  147. }else if(msg[13]=='S' && msg[15]=='N' && msg[20]=='T'){
  148. return SYN_SENT;
  149. }else{
  150. return CLOSE;
  151. }
  152. //}else return INVALID;
  153. }
  154. /*******************************************************************
  155. *GetCNUM
  156. 返回:0--未获取 1--获取成功
  157. ********************************************************************/
  158. int GetCNUM(void)
  159. {
  160. /*
  161. int timerout=300;
  162. int i,len;
  163. char *msg;
  164. INT8U err;
  165. int ct=100;
  166. while(timerout){
  167. timerout--;
  168. if(++ct>100){
  169. ct=0;
  170. ModemSendAT("AT+CNUM?\r\n");
  171. OSQFlush(ModemQ);
  172. }
  173. msg = (char *)OSQPend(ModemQ, 1, &err);
  174. if(err==OS_ERR_NONE){
  175. if(ModemStrCmp(msg,"+CNUM:")){ //+CNUM:1064910139657
  176. len=strlen(&msg[6]);
  177. if(15==len){
  178. for(i=0;i<13;i++)sutProductPara.CNUM[i]=msg[6+i];
  179. sutNetPara.CNUM[13]=0;
  180. return 1;
  181. }
  182. }
  183. }
  184. }*/
  185. return 0;
  186. }
  187. /*******************************************************************
  188. *GetIPStatus
  189. 返回:0--未获取 1--获取成功
  190. ********************************************************************/
  191. int GetUIMID(void)
  192. {
  193. /*
  194. int timerout=300;
  195. int i,len;
  196. char *msg;
  197. INT8U err;
  198. int ct=100;
  199. while(timerout){
  200. timerout--;
  201. if(++ct>100){
  202. ct=0;
  203. ModemSendAT("AT+CIMI\r\n");
  204. OSQFlush(ModemQ);
  205. }
  206. msg = (char *)OSQPend(ModemQ, 1, &err);
  207. if(err==OS_ERR_NONE){
  208. if(ModemStrCmp(msg,"+CIMI:")){ //+CIMI: 460037590079119
  209. len=strlen(&msg[7]);
  210. if(17==len){
  211. for(i=0;i<15;i++)sutNetPara.UIMID[i]=msg[7+i];
  212. sutNetPara.UIMID[15]=0;
  213. return 1;
  214. }
  215. }
  216. }
  217. }
  218. */
  219. return 0;
  220. }
  221. void StartFeedBack(void)
  222. {
  223. if(sutFeed.feedBackStart==0) return;
  224. TSGpsServerConect();
  225. sutFeed.feedBackStart=0;
  226. }
  227. /*************************************************************
  228. *^IPRECV:1,端口,IP域名,远程服务端口,五socket 1--UDP 0--TCP
  229. *************************************************************/
  230. //+ZIPRECV:1,xxx,"7e8300 000c 000009771810000001 4130313233343536373839 b87e"
  231. void RecvModemData(char *msg)
  232. {
  233. int i;
  234. char *pData;
  235. unsigned short DataLen,temLen;
  236. unsigned char cmd;
  237. char tmp[5];
  238. char buf[100];
  239. DataLen=atoi((char *)&msg[11]);
  240. if(DataLen<10){ //+ZIPRECV:1,8,xxx
  241. pData=msg+13;
  242. }else if(DataLen<100){
  243. pData=msg+14;
  244. }else if(DataLen<1000){
  245. pData=msg+15;
  246. }else{//非法
  247. pData=msg+16;
  248. }
  249. snprintf(buf, sizeof(buf),"\r\nTcpRecv[%d]",DataLen);
  250. SlwTrace(INF,buf,1);
  251. #if 0 //0
  252. temLen = DataLen;
  253. if(temLen>30)temLen=30;
  254. buf[0]='<';buf[1]='<';buf[2]=0;
  255. for(i=0;i<temLen;i++){
  256. snprintf(tmp, sizeof(tmp),"%02x,",pData[i]);
  257. strcat(buf,tmp);
  258. }
  259. strcat(buf,"\r\n");
  260. SlwTrace(DEBUG,buf);
  261. #endif
  262. //处理
  263. cmd=TSGpsServerProcess((unsigned char *)pData,DataLen);
  264. g_ucModemSentTcpCt=0;
  265. }
  266. SUT_AUTHCTL sutGpsCtl;
  267. /***********************************************************
  268. *控制发送位置信息
  269. 此函数每秒执行一次
  270. ************************************************************/
  271. void GpsCtrlSendPos(void)
  272. {
  273. static unsigned char authTryTime=0;//发起鉴权次数,也代表连续失败多少次
  274. static unsigned short SendTime=0;
  275. static unsigned char IccidTick=60;
  276. static unsigned char EventTick=15;
  277. static unsigned char suctt;
  278. static unsigned short realTimeSecond=0xff00;
  279. char packetHadSend=0;
  280. static unsigned char sendLocation=0;
  281. uint32_t AvgSpeed;
  282. int i;
  283. static unsigned int susGpsTimingSendCt=0;//控制按时间发送
  284. char buf[30];
  285. //连续发3次未见成功,则断开链接并重启链接
  286. if(g_ucModemSentTcpCt>3){
  287. sutGpsInfo.isServerLogin=0;
  288. g_ucModemSentTcpCt=0;
  289. snprintf(buf, sizeof(buf), "AT+TCPCLOSE=%d\r", GPS_DATA_SOCKET);
  290. ModemSendAT(buf);
  291. sutGpsStatus.IPStatus=CLOSE;
  292. g_ucModemSentTcpCt=0;
  293. sutGpsInfo.isServerLogin=0;
  294. }
  295. //
  296. if(g_iCSQ==99 || sutGpsStatus.IPStatus!=OPEN || 0==sutGpsInfo.isServerLogin)
  297. {
  298. susGpsTimingSendCt=0;
  299. sucGpsSentTcpCt=15;//这里能让条件达到后,及时去注册或鉴权
  300. return;
  301. }
  302. //计算平均速度
  303. sutGpsInfo.speedbuf[4]=sutGpsInfo.speedbuf[3];
  304. sutGpsInfo.speedbuf[3]=sutGpsInfo.speedbuf[2];
  305. sutGpsInfo.speedbuf[2]=sutGpsInfo.speedbuf[1];
  306. sutGpsInfo.speedbuf[1]=sutGpsInfo.speedbuf[0];
  307. sutGpsInfo.speedbuf[0]=sutGpsInfo.speed;
  308. for(i=0;i<5;i++){
  309. AvgSpeed=sutGpsInfo.speedbuf[i];
  310. }
  311. AvgSpeed/=5;
  312. sutGpsInfo.AvgSpeed=AvgSpeed;
  313. ////////////////////////////////////////////////
  314. if(sutGpsInfo.isGpsAuthOk==0)
  315. {//鉴权失败
  316. if(++sucGpsSentTcpCt>=sutGpsCtl.reTryPerSeconds)//定时再去鉴权
  317. {//15秒
  318. sucGpsSentTcpCt=0;
  319. susGpsTimingSendCt=0;
  320. ///////////////////////////////
  321. //如果鉴权3次失败后则做一次注册请求
  322. if(sutPocStatus.Logined)
  323. {
  324. if(++authTryTime >= sutGpsCtl.reTryAuthTimes)
  325. {
  326. authTryTime=0;
  327. sutGpsCtl.reTryAuthTimes=3;
  328. sutGpsCtl.reTryPerSeconds=15;
  329. Registration();
  330. }else
  331. Authentication();
  332. }
  333. }
  334. return;//鉴权未成功的返回
  335. }else
  336. {
  337. if(g_ucModemSentTcpCt==0)
  338. {
  339. sucGpsSentTcpCt=0;
  340. g_ucModemSentTcpCt=0;
  341. }
  342. }
  343. //发送终端信息给服务器
  344. if(++IccidTick>60&&TeminalInfoRevOK==0)
  345. {
  346. IccidTick=0;
  347. buBiaoICCID(GPS_DATA_SOCKET);
  348. }
  349. if(EventTick++>15&&sutGpsInfo.Ts_Event_Chek==1){
  350. buSendEvent(GPS_DATA_SOCKET);
  351. sutGpsInfo.Ts_Event_Chek=0;
  352. }
  353. //鉴权成功并且定位上则定时发送位置包
  354. //---控制按时间间隔发送GPS位置
  355. sutGpsInfo.GPS_SecondCnt++;
  356. if(sutGpsInfo.isGpsValid && g_uiGpsStat)
  357. {//可以发位置包,检测时间是否到了
  358. if(sutGpsInfo.GPS_SecondCnt>=GPS_TimeTable[newPara.gpsTimeIndex])
  359. {
  360. sutGpsInfo.GPS_SecondCnt=0;
  361. sendLocation=1;
  362. }
  363. if(isSendDataEnable() && sendLocation != 0){
  364. sendLocation=0;
  365. TSGpsTimingSendPos();
  366. packetHadSend=1;//已发了数据包
  367. }
  368. }else
  369. {//没定位,不发位置包,则发心跳
  370. if(sutGpsInfo.GPS_SecondCnt >= 60)
  371. {
  372. if(isSendDataEnable()){
  373. sutGpsInfo.GPS_SecondCnt=0;
  374. TS_SendHeartTick();
  375. packetHadSend=1;//已发了数据包
  376. }
  377. }
  378. }
  379. if(++realTimeSecond > 180 && packetHadSend==0)
  380. {//180秒获取一次时间
  381. if(isSendDataEnable()){
  382. TS_ReqRealTime();
  383. realTimeSecond=0;
  384. }
  385. }
  386. if(++suctt >= 30)
  387. {
  388. suctt = 0;
  389. if(!g_uiGpsStat) SlwTrace(INF, "GPS close",1);
  390. }
  391. }
  392. STATUE GetIPNewStatus(char *msg, unsigned char socketNum)
  393. {//+TCPSTATUS:x:s [socket: status]
  394. //+TCPSTATUS:1:1
  395. //+TCPSTATUS:ERROR!
  396. STATUE sta=CLOSE;
  397. unsigned char thisSocket;
  398. thisSocket = atoi(&msg[11]);
  399. if(msg[13] == '1') sta = OPEN;
  400. else if(msg[13] == '0')sta = CLOSE;
  401. if(thisSocket == socketNum) return sta;
  402. else return INVALID;
  403. }
  404. void IPStatusAna(char *msg, unsigned char *socket, STATUE *status)
  405. {//+TCPSTATUS:x:s [socket: status]
  406. //+TCPSTATUS:1:1
  407. //+TCPSTATUS:ERROR!
  408. unsigned char thisSocket;
  409. STATUE sta=CLOSE;
  410. thisSocket=(unsigned char )atoi(&msg[11]);
  411. if('1'==msg[13]) sta=OPEN;
  412. else if('0' == msg[13]) sta=CLOSE;
  413. *socket=thisSocket;
  414. *status=sta;
  415. }