NetTask.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. /********************************************************************************
  2. * File Name: NetTask.c
  3. * Function Describe:The NetTask for the system
  4. * Relate Module:
  5. * Explain: Hardware version is HS110C
  6. * Writer: ShiLiangWen
  7. * Date: 2015.4.12
  8. *******************************************************************************/
  9. #include "includes.h"
  10. typedef enum {INVALID=0,OPEN=1,CLOSE=2} STATUE;
  11. SUT_NET_PARA sutNetPara;
  12. OS_EVENT *ModemQ;
  13. void *ModemMsg[MODEM_Q_NUM];
  14. char ModemMsgBuf[MODEM_Q_NUM][MODEM_MSG_BUF_LEN];
  15. int ModemMsgBufIndex=0;
  16. OS_EVENT *GpsQ;
  17. void *GpsMsg[GPS_Q_NUM];
  18. unsigned char GpsMsgBuf[GPS_Q_NUM][GPS_MSG_BUF_LEN];
  19. int GpsMsgBufIndex=0;
  20. #define MODEM_SEND_BUF_LEN 100
  21. char ModemSendBuf[MODEM_SEND_BUF_LEN];
  22. //======================================
  23. #define APP_TASK_NET_STK_SIZE 500
  24. static OS_STK AppNetTaskStk[APP_TASK_NET_STK_SIZE];
  25. int g_iCSQ=-1;
  26. unsigned char g_ucNetTaskDisable=0;
  27. int g_iModemVer=0;
  28. static STATUE GpsServerStatus=CLOSE;
  29. unsigned char g_ucSecFlag=0; //秒标志 为1标示1秒到,需要对其清零,以便下个1秒准确到达
  30. /*******************************************************************************
  31. 校验
  32. *******************************************************************************/
  33. unsigned char GetCheck(unsigned char *data, unsigned short datalen)
  34. {
  35. unsigned char ck=0;
  36. int i;
  37. for(i=0;i<datalen;i++){
  38. ck^=data[i];
  39. }
  40. return ck;
  41. }
  42. int GetModemVer(void)
  43. {
  44. int timerout=300;
  45. int i,ver=0;
  46. char *msg;
  47. INT8U err;
  48. int ct=100;
  49. while(timerout){
  50. timerout--;
  51. if(++ct>100){
  52. ct=0;
  53. ModemSendAT("AT+ZINVER\r\n");
  54. OSQFlush(ModemQ);
  55. }
  56. msg = (char *)OSQPend(ModemQ, 1, &err);
  57. if(err==OS_ERR_NONE){
  58. if(ModemCheckRecv(msg,"+ZINVER :")){ //+ZINVER : MC8332_MM8A1107_R01 1 [May 04 2015 22:30:38]
  59. ver=(msg[23]-0x30)*100+(msg[24]-0x30)*10+(msg[25]-0x30);
  60. }
  61. }
  62. }
  63. return ver;
  64. }
  65. /*****************************************************************************
  66. *发送数据封包
  67. format: 0x29 0x29 CMD Len PSN[4] Data Check 0x0D
  68. Len=DataLen+6
  69. ******************************************************************************/
  70. void SendBufPack(unsigned char cmd,unsigned short DataLen,unsigned char *data)
  71. {
  72. SUTDS ds;
  73. SUTDL dl;
  74. int i,j;
  75. if(DataLen>MODEM_SEND_BUF_LEN)return;
  76. //包头
  77. ModemSendBuf[0]=0x29;//Head
  78. ModemSendBuf[1]=0x29;//Head
  79. ModemSendBuf[2]=cmd;//CMD
  80. //DataLen
  81. ds.Data.usData=DataLen+6;
  82. TxBuffer3[3]=ds.Data.ucData.b2;
  83. TxBuffer3[4]=ds.Data.ucData.b1;
  84. //PSN
  85. dl.Data.ulData=sutNetPara.PSN;
  86. TxBuffer3[5]=dl.Data.ucData.b4;
  87. TxBuffer3[6]=dl.Data.ucData.b3;
  88. TxBuffer3[7]=dl.Data.ucData.b2;
  89. TxBuffer3[8]=dl.Data.ucData.b1;
  90. //Data
  91. j=9;
  92. for(i=0;i<DataLen;i++){
  93. TxBuffer3[j++]=data[i];
  94. }
  95. //check
  96. TxBuffer3[j++]= GetCheck(TxBuffer3,(DataLen+6));
  97. TxBuffer3[j++]=0x0D;
  98. g_ucUart3Sending=j;
  99. }
  100. /********************************************************************************************************
  101. *SendTick 发送心跳包
  102. *********************************************************************************************************/
  103. void SendTick(void)
  104. {
  105. char AT[100];
  106. SendBufPack(0,0,NULL);
  107. sprintf(AT,"AT+ZIPSEND=1,%d\r",g_ucUart3Sending);
  108. ModemSendAT(AT);
  109. ModemSendData(TxBuffer3,g_ucUart3Sending);
  110. }
  111. /*******************************************************************
  112. *GetCSQ
  113. ********************************************************************/
  114. int GetCSQ(char* msg)
  115. {
  116. int CSQ;
  117. if( msg[1]!='C' || msg[2]!='S' || msg[3]!='Q' || msg[4]!=':')return -1;
  118. CSQ=CSQ2Num(&msg[5]);
  119. return CSQ;
  120. }
  121. /*******************************************************************
  122. *GetPPPStatus
  123. ********************************************************************/
  124. STATUE GetPPPStatus(char *msg)
  125. {
  126. if(ModemCheckRecv(msg,"+ZPPPSTATUS:")){ //+ZPPPSTATUS: OPENED
  127. if(msg[13]=='O' && msg[15]=='E' && msg[18]=='D'){ //OPENED
  128. return OPEN;
  129. }else{
  130. return CLOSE;
  131. }
  132. } else return INVALID;
  133. }
  134. STATUE GetGpsServerStatus(char *msg){
  135. if(ModemCheckRecv(msg,"+RECV:")){
  136. if(msg[13]=='O' && msg[15]=='E' && msg[18]=='D'){ //OPENED
  137. return OPEN;
  138. }else{
  139. return CLOSE;
  140. }
  141. } else return INVALID;
  142. }
  143. /*******************************************************************
  144. *NetRecvMsgHandle
  145. ********************************************************************/
  146. int NetRecvMsgHandle(char *msg)
  147. {
  148. if(!ModemCheckRecv(msg,"+ZIPRECV:0,"))//+ZIPRECV:0,10,XXXX
  149. return 0;
  150. }
  151. /*******************************************************************
  152. *GetIPStatus
  153. ********************************************************************/
  154. STATUE GetIPStatus(char *msg)
  155. {
  156. if(ModemCheckRecv(msg,"+ZIPSTATUS:")){ //+ZIPSTATUS: ESTABLISHED
  157. if(msg[12]=='E' && msg[14]=='T' && msg[22]=='D'){
  158. return OPEN;
  159. }else{
  160. return CLOSE;
  161. }
  162. }else return INVALID;
  163. }
  164. /*******************************************************************
  165. *GetIPStatus
  166. ********************************************************************/
  167. STATUE GetIPStatusu(char *msg)
  168. {
  169. if(ModemCheckRecv(msg,"+ZIPSTATUSU:")){ //+ZIPSTATUSU: ESTABLISHED
  170. if(msg[13]=='E' && msg[15]=='T' && msg[23]=='D'){
  171. return OPEN;
  172. }else{
  173. return CLOSE;
  174. }
  175. }else return INVALID;
  176. }
  177. /*******************************************************************
  178. *GetIPStatus
  179. 返回:0--未获取 1--获取成功
  180. ********************************************************************/
  181. int GetMEID(void)
  182. {
  183. int timerout=500;
  184. int i,len;
  185. char *msg;
  186. INT8U err;
  187. int ct=100;
  188. while(timerout){
  189. timerout--;
  190. if(++ct>100){
  191. ct=0;
  192. ModemSendAT("AT+ZMEID\r\n");
  193. OSQFlush(ModemQ);
  194. }
  195. msg = (char *)OSQPend(ModemQ, 1, &err);
  196. if(err==OS_ERR_NONE){
  197. if(ModemCheckRecv(msg,"+ZMEID")){ //+ZMEID: 0xA000004E15F1CE0
  198. len=strlen(&msg[10]);
  199. if(16==len){
  200. for(i=0;i<14;i++)sutNetPara.MEID[i]=msg[10+i];
  201. sutNetPara.MEID[14]=0;
  202. return 1;
  203. }else if(17==len){
  204. for(i=0;i<15;i++)sutNetPara.MEID[i]=msg[10+i];
  205. sutNetPara.MEID[15]=0;
  206. return 1;
  207. }
  208. }
  209. }
  210. }
  211. return 0;
  212. }
  213. /*******************************************************************
  214. *GetIPStatus
  215. 返回:0--未获取 1--获取成功
  216. ********************************************************************/
  217. int GetCNUM(void)
  218. {
  219. int timerout=300;
  220. int i,len;
  221. char *msg;
  222. INT8U err;
  223. int ct=100;
  224. while(timerout){
  225. timerout--;
  226. if(++ct>100){
  227. ct=0;
  228. ModemSendAT("AT+CNUM?\r\n");
  229. OSQFlush(ModemQ);
  230. }
  231. msg = (char *)OSQPend(ModemQ, 1, &err);
  232. if(err==OS_ERR_NONE){
  233. if(ModemCheckRecv(msg,"+CNUM:")){ //+CNUM:1064910139657
  234. len=strlen(&msg[6]);
  235. if(15==len){
  236. for(i=0;i<13;i++)sutNetPara.CNUM[i]=msg[6+i];
  237. sutNetPara.CNUM[13]=0;
  238. return 1;
  239. }
  240. }
  241. }
  242. }
  243. return 0;
  244. }
  245. /*******************************************************************
  246. *GetIPStatus
  247. 返回:0--未获取 1--获取成功
  248. ********************************************************************/
  249. int GetUIMID(void)
  250. {
  251. int timerout=300;
  252. int i,len;
  253. char *msg;
  254. INT8U err;
  255. int ct=100;
  256. while(timerout){
  257. timerout--;
  258. if(++ct>100){
  259. ct=0;
  260. ModemSendAT("AT+CIMI\r\n");
  261. OSQFlush(ModemQ);
  262. }
  263. msg = (char *)OSQPend(ModemQ, 1, &err);
  264. if(err==OS_ERR_NONE){
  265. if(ModemCheckRecv(msg,"+CIMI:")){ //+CIMI: 460037590079119
  266. len=strlen(&msg[7]);
  267. if(17==len){
  268. for(i=0;i<15;i++)sutNetPara.UIMID[i]=msg[7+i];
  269. sutNetPara.UIMID[15]=0;
  270. return 1;
  271. }
  272. }
  273. }
  274. }
  275. return 0;
  276. }
  277. /*************************************************************
  278. *
  279. *************************************************************/
  280. void RecvModemData(unsigned char *msg)
  281. {
  282. int i;
  283. unsigned char *pData;
  284. unsigned short DataLen;
  285. unsigned char cmd;
  286. char tmp[5];
  287. char buf[100];
  288. if(!ModemCheckRecv(msg,"+ZIPRECV:"))return;
  289. SlwTrace(INF,"\r\nRECV");
  290. DataLen=String2Number(&msg[11]);
  291. //printf("\r\nl=%d\r\n",DataLen);
  292. if(DataLen<10){ //+ZIPRECV:1,8,xxx
  293. pData=msg+13;
  294. }else if(DataLen<100){
  295. pData=msg+14;
  296. }else if(DataLen<(MODEM_MSG_BUF_LEN-17)){
  297. pData=msg+15;
  298. }else{//非法
  299. return;
  300. }
  301. buf[0]=0;
  302. sprintf(buf,"[%d]",DataLen);
  303. for(i=0;i<DataLen;i++){
  304. sprintf(tmp,"%02x,",pData[i]);
  305. strcat(buf,tmp);
  306. }
  307. strcat(buf,"\r\n");
  308. SlwTrace(INF,buf);
  309. //处理
  310. GpsServerProcess(pData,DataLen);
  311. }
  312. //void TestTick(void)
  313. //{
  314. // char buf[30];
  315. // static unsigned long sulTick=0;
  316. // if(sulTick!=g_ulTickCt){
  317. // sulTick = g_ulTickCt;
  318. // }else return;
  319. // if(0 ==(g_ulTickCt%100)){
  320. // sprintf(buf,"T=%u\r\n",g_ulTickCt);
  321. // SlwTrace(INF,buf);
  322. // }
  323. //}
  324. /*******************************************************************
  325. *MainTask
  326. *主任务
  327. ********************************************************************/
  328. static void NetTask(void *pdata)
  329. {
  330. static STATUE PPPStatus=CLOSE;
  331. static STATUE IPStatus=CLOSE;
  332. static unsigned char sucNetStatusCt=0;
  333. static unsigned short susGpsTimingSendCt=0;
  334. STATUE status;
  335. int csq;
  336. char *msg;
  337. INT8U err;
  338. char buf[20];
  339. GpsDataInit();
  340. //创建消息队列,用于与UART3与Modem通讯
  341. ModemQ=OSQCreate(&ModemMsg[0], MODEM_Q_NUM);
  342. OSQFlush(ModemQ);
  343. //创建消息队列,用于与UART2与GPS通讯
  344. GpsQ=OSQCreate(&GpsMsg[0], GPS_Q_NUM);
  345. OSQFlush(GpsQ);
  346. //Get MEID
  347. SlwTrace(INF,"Net task running...\r\n");
  348. if(GetMEID()){
  349. SlwTrace(INF,"MEID:0x");
  350. SlwTrace(INF,sutNetPara.MEID);
  351. SlwTrace(INF,"\r\n");
  352. }else SlwTrace(INF,"Get MEID fail!\r\n");
  353. //Get NUM
  354. if(GetCNUM()){
  355. SlwTrace(INF,"CNUM:");
  356. SlwTrace(INF,sutNetPara.CNUM);
  357. SlwTrace(INF,"\r\n");
  358. }else SlwTrace(INF,"Get CNUM fail!\r\n");
  359. //Get UIMID (CIMI)
  360. if(GetUIMID()){
  361. SlwTrace(INF,"UIMID:");
  362. SlwTrace(INF,sutNetPara.UIMID);
  363. SlwTrace(INF,"\r\n");
  364. }else SlwTrace(INF,"Get UIMID fail!\r\n");
  365. //Get Ver
  366. g_iModemVer=GetModemVer();
  367. sprintf(buf,"MVer=%d\r\n",g_iModemVer);
  368. SlwTrace(INF,buf);
  369. PPPStatus=INVALID;
  370. IPStatus=INVALID;
  371. GpsServerStatus=INVALID;
  372. //
  373. OSTimeDlyHMSM(0, 0, 1, 0);
  374. GPSInit();
  375. while(1)
  376. {
  377. //喂狗
  378. IWDG_ReloadCounter();
  379. //进程关闭
  380. if(g_ucNetTaskDisable){
  381. OSTaskDel( OS_PRIO_SELF );
  382. OSTimeDly(10000);
  383. continue;
  384. }
  385. //Modem Uart消息处理 每次大约等待10ms
  386. msg = (char *)OSQPend(ModemQ, 1, &err);
  387. if(err==OS_ERR_NONE){//收到Modem发过来的消息,处理之
  388. // SlwTrace(INF,msg);
  389. csq=GetCSQ(msg);
  390. if(csq!=-1)g_iCSQ=csq;
  391. status=GetPPPStatus(msg);
  392. if(status!=INVALID){
  393. PPPStatus=status;
  394. }
  395. status=GetIPStatus(msg);
  396. if(status!=INVALID)IPStatus=status;
  397. RecvModemData(msg);
  398. }
  399. //GPS Uart消息处理 每次大约等待10ms
  400. msg=(char *)OSQPend(GpsQ, 1, &err);
  401. if(err==OS_ERR_NONE){//收到GPS发过来的消息,处理之
  402. // SlwTrace(INF,msg);
  403. process_nema(msg);
  404. }
  405. //=======控制大概每1秒往下执行=========
  406. if(g_ucSecFlag)g_ucSecFlag=0; //g_ucSecFlag在SysTick_Handler中置1
  407. else continue;
  408. //---控制定时发送GPS数据 ---
  409. if(IPStatus==OPEN && sutGpsInfo.isServerLogin){
  410. if(++susGpsTimingSendCt>sutGpsInfo.SendTime){
  411. susGpsTimingSendCt=0;
  412. GpsTimingSendPos();
  413. }
  414. }else{
  415. susGpsTimingSendCt=0;
  416. }
  417. //--------------------
  418. if(++sucNetStatusCt>4)sucNetStatusCt=0;
  419. switch(sucNetStatusCt)
  420. {
  421. case 0:
  422. ModemSendAT("AT+CSQ?\r");
  423. break;
  424. case 1:
  425. ModemSendAT("AT+ZPPPSTATUS\r");
  426. break;
  427. case 2:
  428. if(PPPStatus==OPEN){
  429. SlwTrace(INF,"AT+ZIPSTATUS=0\r\n");
  430. ModemSendAT("AT+ZIPSTATUS=0\r");
  431. }else{
  432. SlwTrace(INF,"AT+ZPPPOPEN\r\n");
  433. ModemSendAT("AT+ZPPPOPEN\r");
  434. }
  435. break;
  436. case 3:
  437. if(IPStatus!=OPEN && PPPStatus==OPEN){
  438. sutGpsInfo.isServerLogin=0;
  439. SlwTrace(INF,"AT+ZIPSETUP=0,183.131.13.6,1391\r\n");
  440. ModemSendAT("AT+ZIPSETUP=0,183.131.13.6,1391\r");
  441. }
  442. break;
  443. case 4:
  444. if(IPStatus==OPEN && 0==sutGpsInfo.isServerLogin){
  445. if(sutGpsInfo.isGpsWork)GpsServerConect();
  446. }
  447. break;
  448. }
  449. }
  450. }
  451. /*********************************************************************
  452. *NetTaskCreate
  453. **********************************************************************/
  454. void NetTaskCreate(void)
  455. {
  456. CPU_INT08U os_err;
  457. os_err = os_err; /* prevent warning... */
  458. os_err = OSTaskCreate((void (*)(void *)) NetTask,
  459. (void * ) 0,
  460. (OS_STK * )&AppNetTaskStk[APP_TASK_NET_STK_SIZE - 1],
  461. (INT8U ) APP_TASK_NET_PRIO );
  462. #if OS_TASK_NAME_EN > 0
  463. OSTaskNameSet(APP_TASK_NET_PRIO, "NetTask", &os_err);
  464. #endif
  465. }