GpsTask.c 10 KB

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