air780e.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. #include "air780e.h"
  2. FIFO_T g_4Grxfifo; // 4G的接收缓冲区
  3. FIFO_T g_4Gtxfifo; // 4G的发送缓冲区
  4. _4GMsgInfo g_4gMsg;
  5. MqttMsg g_mqttMsg;
  6. MqttCHmsg g_mqttCHmsg;
  7. extern volatile uint32_t g_tick;
  8. static uint8_t _tempbuff[256] = {'\0'};
  9. static uint8_t _temp4Gbuff[640];
  10. static uint8_t buff[256];
  11. uint8_t AT_GET_Data_2Param(char * buff1,uint8_t get_data[],char*head,char*tail)
  12. {
  13. uint16_t i;
  14. uint16_t len1,len2;
  15. char *t = NULL;
  16. char *h=strstr(buff1,head);
  17. if(strstr(buff1,head)&&strstr(buff1,tail)) {
  18. len1=strlen(h); /*剩余长度*/
  19. len2=strlen(head); /*头子串长度*/
  20. t=strstr(h+len2,tail);
  21. if(len1>len2){
  22. for(i=0;h+i+len2!=t;i++){
  23. get_data[i]=h[i+len2];
  24. }
  25. get_data[i]='\0';//加上结束符
  26. }
  27. else{
  28. printf("\r\n字串长度错误\r\n");
  29. return 0;
  30. }
  31. }
  32. else {
  33. if(!strstr(buff1,head))printf("\r\n未能检索到头字串\r\n");
  34. if(!strstr(buff1,tail))printf("\r\n未能检索到尾字串\r\n");
  35. printf("\r\n请检查你的数据原文:\r\n");
  36. printf("%s", buff1);
  37. return 0;
  38. }
  39. return 1;
  40. }
  41. void send_cmd_to_mqtt(char *str,uint8_t cmd)
  42. {
  43. if(g_uart1Info.bSdFinish == 1){
  44. //printf("发送:%d, %s",g_uart1Info.bSdFinish, str);
  45. g_uart1Info.cmd = cmd;
  46. memset(g_uart1Info.txfifo,0,USART1_TX_SIZE);
  47. strcpy((char*)g_uart1Info.txfifo,str);
  48. usart_tx_dma_send(USART1,g_uart1Info.txfifo,strlen((char*)g_uart1Info.txfifo));
  49. }
  50. else printf("上次发送未完成\r\n");
  51. }
  52. uint8_t send_data_to_mqtt(uint8_t type, uint8_t *data, uint8_t len)
  53. {
  54. uint16_t i,ret;
  55. uint16_t send_len = 0;
  56. memset(g_uart1Info.txfifo,0,USART1_TX_SIZE);
  57. memset(_temp4Gbuff,0,640);
  58. for(i=0;i<len;i++){
  59. send_len += snprintf((char*)_temp4Gbuff+send_len,sizeof(_temp4Gbuff),"%02x",data[i]);
  60. }
  61. sprintf((char*)g_uart1Info.txfifo,"AT+MPUB=\"%s\",0,0,\"%s\"\r\n",g_4gMsg.upTopic,_temp4Gbuff);
  62. usart_tx_dma_send(USART1,g_uart1Info.txfifo,strlen((char*)g_uart1Info.txfifo));
  63. ret = waiting_uart_return(300,"OK",NULL);
  64. if(ret == 1){
  65. g_4gMsg.noreturnNum = 0;
  66. }
  67. else {
  68. g_4gMsg.noreturnNum++;
  69. }
  70. if(g_4gMsg.noreturnNum >5){
  71. g_4gMsg.bconnect = 0;
  72. g_4gMsg.noreturnNum = 0;
  73. }
  74. return ret;
  75. }
  76. void close_mqtt(void)
  77. {
  78. //uint8_t val;
  79. send_cmd_to_mqtt("AT+MDISCONNECT\r\n",AT_MDISCONNECT);
  80. waiting_uart_return(500,"OK",NULL);
  81. //if(ret==0) goto MQTT_ERROR;
  82. send_cmd_to_mqtt("AT+MIPCLOSE\r\n",AT_MIPCLOSE);
  83. waiting_uart_return(500,"OK",NULL);
  84. //if(ret==0) goto MQTT_ERROR;
  85. }
  86. void read_mqtt_power_up_msg(void)
  87. {
  88. while(U1CB.URxDataOUT != U1CB.URxDataIN){
  89. //memset(buff,0,256);
  90. memcpy(buff,U1CB.URxDataOUT->start,U1CB.URxDataOUT->end-U1CB.URxDataOUT->start+1);
  91. printf("%s",buff);
  92. U1CB.URxDataOUT++;
  93. if(U1CB.URxDataOUT == U1CB.URxDataEND){
  94. U1CB.URxDataOUT = &U1CB.URxDataPtr[0];
  95. }
  96. }
  97. }
  98. unsigned char HexToChar(unsigned char bChar)
  99. {
  100. if((bChar>=0x30)&&(bChar<=0x39))
  101. {
  102. bChar -= 0x30;
  103. }
  104. else if((bChar>=0x41)&&(bChar<=0x46)) // Capital
  105. {
  106. bChar -= 0x37;
  107. }
  108. else if((bChar>=0x61)&&(bChar<=0x66)) //littlecase
  109. {
  110. bChar -= 0x57;
  111. }
  112. else
  113. {
  114. bChar = 0xff;
  115. }
  116. return bChar;
  117. }
  118. int net_rcvdata_ch(char *data, uint8_t *out_data, int len)
  119. {
  120. int i,slen=0;
  121. uint8_t temp1,temp2;
  122. for(i = 0; i < len; i+=2)
  123. {
  124. temp1 = HexToChar(data[i]);
  125. temp2 = HexToChar(data[i+1]);
  126. out_data[slen] = (temp1<<4) | temp2;
  127. slen++;
  128. }
  129. return slen;
  130. }
  131. void read_mqtt_work_msg(void)
  132. {
  133. uint8_t srclen;
  134. uint16_t len;
  135. char *str = NULL;
  136. if(U1CB.URxDataOUT == U1CB.URxDataIN) return; // fifo为空
  137. do{
  138. memset(buff,0,256);
  139. if((U1CB.URxDataOUT == U1CB.URxDataIN)) break;
  140. len = U1CB.URxDataOUT->end - U1CB.URxDataOUT->start +1;
  141. str = strstr((char*)U1CB.URxDataOUT->start,(char*)"byte");
  142. if(str != NULL){
  143. AT_GET_Data_2Param((char*)U1CB.URxDataOUT->start,buff,",","byte");
  144. srclen = atoi((char*)buff);
  145. memset(buff,0,256);
  146. srclen = net_rcvdata_ch(str+5,buff,srclen*2);
  147. data_dump("NET_RCB",buff,srclen);
  148. fifo_write(&g_4Grxfifo,buff,srclen); // 将数据写入到4G 接收fifo中
  149. memset(U1CB.URxDataOUT->start,0, len);
  150. }
  151. else if(strstr((char*)U1CB.URxDataOUT->start,"+CSQ")){
  152. printf("+++++CSQ\r\n");
  153. }
  154. else if(strstr((char*)U1CB.URxDataOUT->start,"+CESQ")){
  155. printf("+++++CESQ\r\n");
  156. }
  157. else if(strstr((char*)U1CB.URxDataOUT->start,"+CREG:") \
  158. || strstr((char*)U1CB.URxDataOUT->start,"+NO Service")){
  159. printf("+++++CREG\r\n");
  160. str = strstr((char*)U1CB.URxDataOUT->start,"+CREG:");
  161. g_4gMsg.cregStatus = atoi((char*)(str+6)); // 是否已经注册网络 1:已经注册,非1:没有注册成功
  162. g_4gMsg.bconnect = (g_4gMsg.cregStatus==1? 1: 0);
  163. printf("网络连接状态 cregStatus = :%d\r\n",g_4gMsg.cregStatus);
  164. }
  165. U1CB.URxDataOUT++;
  166. if(U1CB.URxDataOUT == U1CB.URxDataEND){
  167. U1CB.URxDataOUT = &U1CB.URxDataPtr[0];
  168. }
  169. }while(1);
  170. }
  171. static uint8_t waiting_uart_return(uint32_t timeout,char*str,uint32_t *value)
  172. {
  173. uint8_t ret;//, buff[256];
  174. char *str1=NULL;
  175. int dBm,dbvl;
  176. uint8_t srclen;
  177. memset(g_uart1Info.waitMsg,0,16);
  178. strcpy((char*)g_uart1Info.waitMsg,str);
  179. start_delay_ms(timeout);
  180. memset(buff,0,256);
  181. do{
  182. if(U1CB.URxDataOUT != U1CB.URxDataIN){
  183. strncat((char*)buff,(char*)U1CB.URxDataOUT->start,U1CB.URxDataOUT->end - U1CB.URxDataOUT->start +1);
  184. U1CB.URxDataOUT++;
  185. if(U1CB.URxDataOUT == U1CB.URxDataEND){
  186. U1CB.URxDataOUT = &U1CB.URxDataPtr[0];
  187. }
  188. if(strstr((char*)buff,(char*)g_uart1Info.waitMsg)){
  189. ret = 1;
  190. break;
  191. }
  192. }
  193. }while(!g_iDelayfinish);
  194. stop_delay_ms();
  195. if(ret == 1)
  196. {
  197. memset((char*)_tempbuff,0,32);
  198. switch(g_uart1Info.cmd){
  199. case AT_MQTTSTATUS:
  200. printf("收到:%s\r\n",buff);
  201. str1 = strstr((char*)buff,"+MQTTSTATU :");
  202. *value = atoi(str1+12);
  203. break;
  204. case AT_CPIN:
  205. printf("收到:%s\r\n",buff);
  206. AT_GET_Data_2Param((char*)buff,_tempbuff,"+CPIN: ","\r\nOK");
  207. printf("---CPIN:%s\r\n",_tempbuff);
  208. //if(strstr(_tempbuff,"READY")) ret = 1;
  209. //else ret = 2;
  210. break;
  211. case AT_CGATT: // 查询是否附着上数据网络
  212. printf("收到:%s\r\n",buff);
  213. AT_GET_Data_2Param((char*)buff,_tempbuff,"+CGATT: ","\r\nOK");
  214. printf("---CGATT:%s\r\n",_tempbuff);
  215. *value = atoi(_tempbuff);
  216. break;
  217. case AT_SAPRB_GPRS: //
  218. printf("收到:%s\r\n",buff);
  219. break;
  220. case AT_SAPRB_APN: //
  221. printf("收到:%s\r\n",buff);
  222. break;
  223. case AT_SAPRB_11: //
  224. printf("收到:%s\r\n",buff);
  225. break;
  226. case AT_SAPRB_21: //
  227. printf("收到:%s\r\n",buff);
  228. break;
  229. case AT_CREG:
  230. printf("收到:%s\r\n",buff);
  231. AT_GET_Data_2Param((char*)buff,_tempbuff,",","\r\nOK");
  232. g_4gMsg.cregStatus = atoi((char*)_tempbuff);
  233. printf("网络连接状态 cregStatus = :%d\r\n",g_4gMsg.cregStatus);
  234. break;
  235. case AT_ICCID:
  236. printf("收到:%s\r\n",buff);
  237. AT_GET_Data_2Param((char*)buff,_tempbuff,"+ICCID: ","\r\n");
  238. //printf("ICCID: %s\r\n",_tempbuff);
  239. memcpy(g_4gMsg.iccid,_tempbuff,20);
  240. //printf("ICCID: %s\r\n",g_4gMsg.iccid);
  241. break;
  242. case AT_CGSN:
  243. printf("收到:%s\r\n",buff);
  244. AT_GET_Data_2Param((char*)buff,_tempbuff,"AT+CGSN\r\n","\r\nOK");
  245. //printf("IMEI: %s\r\n",_tempbuff);
  246. memcpy(g_4gMsg.imei,_tempbuff+2,15);
  247. break;
  248. case AT_ATI:
  249. printf("收到:%s\r\n",buff);
  250. break;
  251. case AT_CSQ:
  252. AT_GET_Data_2Param((char*)buff,_tempbuff,"+CSQ: ",",");
  253. dbvl = (uint32_t)atoi((char*)_tempbuff);
  254. if(dbvl==99) {dBm = 0; printf("signal intensity:there is no signal\r\n");}
  255. else if(dbvl>=31&&dbvl<=99) {dBm = dbvl*2-113; printf("signal intensity:-51dBm or higher\r\n");}
  256. else if(dbvl>=2&&dbvl<31) {dBm = dbvl*2-113; printf("signal intensity:-109dBm ~ -53dBm\r\n");}
  257. else if(dbvl==1) {dBm = -111; printf("signal intensity:-111dBm\r\n");}
  258. else {dBm = dbvl*2-113; printf("signal intensity:-111dBm or less\r\n");}
  259. g_4gMsg.dBm = dBm;
  260. printf("~~~~~~~~~~4g-rssi-dbm: %d\r\n",g_4gMsg.dBm);
  261. case AT_MCONNECT:
  262. printf("MQTT CONNECT SUCCESS\r\n");
  263. g_4gMsg.bconnect = 1;
  264. g_devMsg.baskIdentity = 1;
  265. break;
  266. case AT_HTTPACTION:
  267. str = strstr((char*)buff, "," );
  268. if(str) {
  269. printf("%s\r\n", str);
  270. str += 1;
  271. str = strstr(str, "," );
  272. if(str) {
  273. printf("%s\r\n", str);
  274. str += 1;
  275. *value = atoi(str);//获取接收长度
  276. }
  277. }
  278. break;
  279. default:
  280. str = strstr((char*)buff,(char*)"byte");
  281. if(str != NULL){
  282. AT_GET_Data_2Param((char*)buff,_tempbuff,",","byte");
  283. srclen = atoi((char*)_tempbuff);
  284. memset(_tempbuff,0,256);
  285. srclen = net_rcvdata_ch(str+5,_tempbuff,srclen*2);
  286. data_dump("NET_RCB",_tempbuff,srclen);
  287. fifo_write(&g_4Grxfifo,_tempbuff,srclen); // 将数据写入到4G 接收fifo中
  288. //memset(U1CB.URxDataOUT->start,0,srclen);
  289. }
  290. break;
  291. }
  292. }
  293. else {
  294. printf("超时,4G模块没有返回\r\n");
  295. ret = 0;
  296. }
  297. return ret;
  298. }
  299. void AIR_HTTP_GET(const char *url, uint32_t *pLen)
  300. {
  301. char buff[128]={0};
  302. send_cmd_to_mqtt("AT+CIPCLOSE\r\n",AT_NULL); //关闭UDP或TCP
  303. waiting_uart_return(200,"CLOSE OK", NULL);
  304. send_cmd_to_mqtt("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n",AT_NULL); //设置HTTP功能的承载类型
  305. waiting_uart_return(200,"OK", NULL);
  306. send_cmd_to_mqtt("AT+SAPBR=3,1,\"APN\",\"\"\r\n",AT_NULL);//设置pdp承载参数之APN
  307. waiting_uart_return(200,"OK", NULL);
  308. send_cmd_to_mqtt("AT+SAPBR=1,1\r\n",AT_NULL);//激活该承载的GPRS PDP上下文
  309. waiting_uart_return(200,"OK", NULL);
  310. send_cmd_to_mqtt("AT+SAPBR=2,1\r\n",AT_NULL);//查询下承载的状态
  311. waiting_uart_return(200,"OK", NULL);
  312. send_cmd_to_mqtt("AT+HTTPINIT\r\n",AT_NULL);//HTTP协议栈初始化
  313. waiting_uart_return(200,"OK", NULL);
  314. memset(buff,0,128);
  315. sprintf(buff,"AT+HTTPPARA=\"URL\",\"%s\"\r\n", url);
  316. send_cmd_to_mqtt(buff,AT_NULL);//建立http链接
  317. waiting_uart_return(300,"OK", NULL);
  318. send_cmd_to_mqtt("AT+HTTPACTION=0\r\n",AT_HTTPACTION); // 得到文件的大小
  319. waiting_uart_return(6000,"+HTTPACTION:", pLen);
  320. return;
  321. }
  322. uint8_t rxfifo[1024];
  323. uint8_t * AIR_HTTP_READ(uint32_t start_addr, uint32_t data_len)
  324. {
  325. uint8_t *p_buf = NULL;
  326. char *str=NULL;
  327. uint32_t read_len;
  328. uint8_t temp[32];
  329. uint16_t rxlen = 0,len=0;
  330. memset(temp,0,32);
  331. sprintf((char*)temp,"AT+HTTPREAD=%d,%d\r\n", start_addr, data_len);
  332. send_cmd_to_mqtt((char*)temp,AT_NULL);//AT+HTTPREAD=<start_address>,<byte_size>
  333. strcpy((char*)g_uart1Info.waitMsg,"+HTTPREAD: ");
  334. memset(rxfifo,0,1024);
  335. rxlen = 0;
  336. start_delay_ms(300);
  337. // while(!g_iDelayfinish);
  338. // stop_delay_ms();
  339. do{
  340. if(U1CB.URxDataOUT != U1CB.URxDataIN){
  341. len = U1CB.URxDataOUT->end - U1CB.URxDataOUT->start + 1;
  342. memcpy(rxfifo+rxlen,U1CB.URxDataOUT->start,len);
  343. rxlen = rxlen + len;
  344. U1CB.URxDataOUT++;
  345. if(U1CB.URxDataOUT == U1CB.URxDataEND){
  346. U1CB.URxDataOUT = &U1CB.URxDataPtr[0];
  347. }
  348. str = strstr((char*)rxfifo,"+HTTPREAD: ");
  349. if(str && ((rxlen-(str-(char*)rxfifo))>=17)){
  350. memset(temp,0,32);
  351. if(AT_GET_Data_2Param((char*)rxfifo,(uint8_t*)temp, "+HTTPREAD: ", "\r\n")){
  352. read_len = atoi((char*)temp);
  353. }
  354. if(((char*)rxfifo+rxlen-str)>= (read_len+10))
  355. break;
  356. }
  357. }
  358. }while(!g_iDelayfinish);
  359. stop_delay_ms();
  360. //if(1 == ret){
  361. memset(temp,0,32);
  362. if(AT_GET_Data_2Param((char*)rxfifo,(uint8_t*)temp, "+HTTPREAD: ", "\r\n")) { /*头尾提取方法*/
  363. read_len = atoi((char*)temp);
  364. if(data_len == read_len) {
  365. p_buf = (uint8_t *)strstr((char*)rxfifo, "+HTTPREAD: ");
  366. p_buf = (uint8_t *)strstr((char *)p_buf, "\r\n");
  367. p_buf += 2;/* data position. */
  368. }
  369. // if(data_len <512){
  370. // printf("data_len = %d, read_len= %d\r\n",data_len,read_len);
  371. // data_dump("Update Data", p_buf,read_len);
  372. // }
  373. }
  374. // }
  375. return p_buf;
  376. }
  377. /*----------------------------------------------------------------
  378. * 激活pdp
  379. * ---------------------------------------------------------------*/
  380. uint8_t activation_pdp(void)
  381. {
  382. uint8_t ret;
  383. uint8_t count = 0,repeat = 0;
  384. uint32_t val;
  385. REPEAT_PDP:
  386. send_cmd_to_mqtt("AT+CPIN?\r\n",AT_CPIN); // 查询SIM卡是否正常
  387. ret = waiting_uart_return(500,"OK",NULL);
  388. if(ret==0){
  389. count++;
  390. printf("cpin repeat %d\r\n",count);
  391. if(count <4) goto REPEAT_PDP;
  392. else goto END_PDP;
  393. }
  394. count = 0;
  395. AT_CGATT:
  396. send_cmd_to_mqtt("AT+CGATT?\r\n",AT_CGATT); // 查询是否附着上数据网络
  397. ret = waiting_uart_return(500,"OK",&val);
  398. if((ret==0) || (val==0)){
  399. count++;
  400. if(count <4) goto AT_CGATT;
  401. else goto END_PDP;
  402. }
  403. count = 0;
  404. send_cmd_to_mqtt("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n",AT_SAPRB_GPRS); // 设置PDP
  405. ret = waiting_uart_return(500,"OK",NULL);
  406. if(ret==0) {
  407. send_cmd_to_mqtt("AT+SAPBR=0,1\r\n\r\n",AT_SAPRB_01); // 设置PDP
  408. ret = waiting_uart_return(500,"OK",NULL);
  409. delay_ms(2000);
  410. if(ret == 0){
  411. if(repeat++ < 3)goto REPEAT_PDP;
  412. else goto END_PDP;
  413. }
  414. else repeat = 0;
  415. }
  416. send_cmd_to_mqtt("AT+SAPBR=3,1,\"APN\",\"\"\r\n",AT_SAPRB_APN); // 设置PDP
  417. ret = waiting_uart_return(500,"OK",NULL);
  418. if(ret==0) {
  419. send_cmd_to_mqtt("AT+SAPBR=0,1\r\n\r\n",AT_SAPRB_01); // 设置PDP
  420. ret = waiting_uart_return(500,"OK",NULL);
  421. delay_ms(2000);
  422. if(ret == 0){
  423. if(repeat++ < 3)goto REPEAT_PDP;
  424. else goto END_PDP;
  425. }
  426. else repeat = 0;
  427. }
  428. send_cmd_to_mqtt("AT+SAPBR=1,1\r\n",AT_SAPRB_11); // 设置PDP
  429. ret = waiting_uart_return(500,"OK",NULL);
  430. if(ret==0) {
  431. send_cmd_to_mqtt("AT+SAPBR=0,1\r\n\r\n",AT_SAPRB_01); // 设置PDP
  432. ret = waiting_uart_return(500,"OK",NULL);
  433. delay_ms(2000);
  434. if(ret == 0){
  435. if(repeat++ < 3)goto REPEAT_PDP;
  436. else goto END_PDP;
  437. }
  438. else repeat = 0;
  439. }
  440. send_cmd_to_mqtt("AT+SAPBR=2,1\r\n",AT_SAPRB_21); // 设置PDP
  441. ret = waiting_uart_return(500,"OK",NULL);
  442. if(ret==0) {
  443. send_cmd_to_mqtt("AT+SAPBR=0,1\r\n\r\n",AT_SAPRB_01); // 设置PDP
  444. ret = waiting_uart_return(500,"OK",NULL);
  445. delay_ms(2000);
  446. if(ret == 0){
  447. if(repeat++ < 3)goto REPEAT_PDP;
  448. else goto END_PDP;
  449. }
  450. else repeat = 0;
  451. }
  452. return 1;
  453. END_PDP:
  454. return 0;
  455. }
  456. uint8_t init_mqtt_power_up(void)
  457. {
  458. uint8_t ret,count = 0;
  459. uint32_t val;
  460. char topic[64],sub_topic[64];
  461. if(B4G_NOHAVE == g_devMsg.bHave4G) return 0;
  462. if(g_4gMsg.delay == 0) g_4gMsg.delay = 1;
  463. timeout_setValue(&g_4gMsg.timer,g_4gMsg.delay*TIMER_4G);
  464. printf("timer \r\n");
  465. start_delay_ms(6000);
  466. while(!g_iDelayfinish);
  467. stop_delay_ms();
  468. read_mqtt_power_up_msg();
  469. start_delay_ms(6000);
  470. while(!g_iDelayfinish);
  471. stop_delay_ms();
  472. start_delay_ms(2000);
  473. while(!g_iDelayfinish);
  474. stop_delay_ms();
  475. printf("timer1111 \r\n");
  476. read_mqtt_power_up_msg();
  477. memset(g_4gMsg.upTopic,0,64);
  478. sprintf(g_4gMsg.upTopic,"cpyypt/up/%04x/%010u",g_devMsg.devType, g_devMsg.devSn);
  479. eeprom_read_mqtt_msg();
  480. if(1 == g_mqttMsg.flag){ // 产测时配置了mqtt
  481. if(1 == g_mqttCHmsg.bChangeMqtt){ //切换mqtt服务器地址
  482. memset(topic,0,64);
  483. sprintf(topic,"AT+MCONFIG=%04x-%010u,%s,%s\r\n",g_devMsg.devType,g_devMsg.devSn,g_mqttCHmsg.mqttMsg.admin,g_mqttCHmsg.mqttMsg.password);
  484. memset(sub_topic,0,64);
  485. sprintf(sub_topic,"AT+MIPSTART=\"%s\",\"%s\"\r\n",g_mqttCHmsg.mqttMsg.ip,g_mqttCHmsg.mqttMsg.port);
  486. }
  487. else { // 不切换mqtt服务器地址
  488. memset(topic,0,64);
  489. sprintf(topic,"AT+MCONFIG=%04x-%010u,%s,%s\r\n",g_devMsg.devType,g_devMsg.devSn,g_mqttMsg.admin,g_mqttMsg.password);
  490. memset(sub_topic,0,64);
  491. sprintf(sub_topic,"AT+MIPSTART=\"%s\",\"%s\"\r\n",g_mqttMsg.ip,g_mqttMsg.port);
  492. }
  493. }
  494. else {// 未配置mqtt服务器地址
  495. sprintf(g_mqttMsg.admin,"%s","admin");
  496. sprintf(g_mqttMsg.port,"%s","9000");
  497. sprintf(g_mqttMsg.ip,"%s","test-mqtt.cpyypt.cn");
  498. sprintf(g_mqttMsg.password,"%s","houjianwei");
  499. eeprom_write_mqtt_msg((uint8_t*)&g_mqttMsg,sizeof(MqttMsg));
  500. memset(topic,0,64);
  501. sprintf(topic,"AT+MCONFIG=%04x-%010u,%s,%s\r\n",g_devMsg.devType,g_devMsg.devSn,"admin","houjianwei");
  502. memset(sub_topic,0,64);
  503. sprintf(sub_topic,"AT+MIPSTART=\"%s\",\"%s\"\r\n","test-mqtt.cpyypt.cn","9000");
  504. }
  505. send_cmd_to_mqtt("AT+MQTTSTATU\r\n",AT_MQTTSTATUS);
  506. ret = waiting_uart_return(500,"OK",&val);
  507. if(ret==0) goto MQTT_ERROR;
  508. if(val != 0){
  509. send_cmd_to_mqtt("AT+MIPCLOSE\r\n",AT_MIPCLOSE);
  510. ret = waiting_uart_return(500,"OK",NULL);
  511. if(ret==0) goto MQTT_ERROR;
  512. }
  513. send_cmd_to_mqtt("AT\r\n",AT_AT);
  514. ret = waiting_uart_return(500,"OK",NULL);
  515. if(ret==0) goto MQTT_ERROR;
  516. send_cmd_to_mqtt("AT\r\n",AT_AT);
  517. ret = waiting_uart_return(500,"OK",NULL);
  518. if(ret==0) goto MQTT_ERROR;
  519. ret = activation_pdp();
  520. if(ret == 0) goto MQTT_ERROR;
  521. send_cmd_to_mqtt("AT+CREG=1\r\n",AT_CREGSET);
  522. ret = waiting_uart_return(500,"OK",NULL);
  523. if(ret==0) goto MQTT_ERROR;
  524. send_cmd_to_mqtt("AT+CREG?\r\n",AT_CREG);
  525. ret = waiting_uart_return(500,"OK",NULL);
  526. if(ret==0) goto MQTT_ERROR;
  527. send_cmd_to_mqtt("ATI\r\n",AT_ATI); // 回显示模式关闭
  528. ret = waiting_uart_return(500,"OK",NULL);
  529. if(ret==0) goto MQTT_ERROR;
  530. send_cmd_to_mqtt("AT+ICCID\r\n",AT_ICCID);
  531. ret = waiting_uart_return(500,"OK",NULL);
  532. if(ret==0) goto MQTT_ERROR;
  533. send_cmd_to_mqtt("AT+CGSN\r\n",AT_CGSN);
  534. ret = waiting_uart_return(500,"OK",NULL);
  535. if(ret==0) goto MQTT_ERROR;
  536. send_cmd_to_mqtt("AT+CSQ\r\n",AT_CSQ);
  537. ret = waiting_uart_return(500,"OK",NULL);
  538. if(ret==0) goto MQTT_ERROR;
  539. REPEAT_MCONFIG:
  540. send_cmd_to_mqtt(topic,AT_MCONFIG);//"AT+MCONFIG=123,admin,houjianwei\r\n"
  541. ret = waiting_uart_return(500,"OK",NULL);
  542. if(ret==0){
  543. count++;
  544. if(count <4) goto REPEAT_MCONFIG;
  545. else goto MQTT_ERROR;
  546. }
  547. count = 0;
  548. REPEAT_MIPSTART:
  549. send_cmd_to_mqtt(sub_topic,AT_MIPSTART);//"AT+MIPSTART=\"test-mqtt.cpyypt.cn\",\"9000\"\r\n"
  550. ret = waiting_uart_return(500,"CONNECT OK",NULL);
  551. if(ret==0){
  552. count++;
  553. if(count <4) goto REPEAT_MIPSTART;
  554. else goto MQTT_ERROR;
  555. }
  556. count = 0;
  557. REPEAT_MCONNECT:
  558. send_cmd_to_mqtt("AT+MCONNECT=1,60\r\n",AT_MCONNECT);
  559. ret = waiting_uart_return(500,"CONNACK OK",NULL);
  560. if(ret==0){
  561. count++;
  562. if(count <4) goto REPEAT_MCONNECT;
  563. else goto MQTT_ERROR;
  564. }
  565. count = 0;
  566. send_cmd_to_mqtt("AT+MQTTMODE=1\r\n",AT_MQTTMODE);
  567. ret = waiting_uart_return(500,"OK",NULL);
  568. if(ret==0) goto MQTT_ERROR;
  569. send_cmd_to_mqtt("ATE0\r\n",AT_ATE); // 回显示模式关闭
  570. ret = waiting_uart_return(500,"OK",NULL);
  571. if(ret==0) goto MQTT_ERROR;
  572. REPEAT_MSUB_01:
  573. memset(topic,0,sizeof(topic));
  574. sprintf((char*)topic,"%s%04x/%s",(char*)MQTT_DNLINK_TOPIC_CASE,g_devMsg.devType, (char*)"broadcast");
  575. memset(sub_topic,0,sizeof(sub_topic));
  576. sprintf((char*)sub_topic,"AT+MSUB=\"%s\", 0\r\n",(char*)topic);
  577. send_cmd_to_mqtt((char*)sub_topic,AT_SUB); // 订阅主题
  578. ret = waiting_uart_return(500,"SUBACK",NULL);
  579. if(ret==0){
  580. count++;
  581. if(count <4) goto REPEAT_MSUB_01;
  582. else goto MQTT_ERROR;
  583. }
  584. else printf("MQTT SUB01 SUCCESS\r\n");
  585. count = 0;
  586. REPEAT_MSUB_02:
  587. memset(topic,0,sizeof(topic));
  588. sprintf((char*)topic,"%s%04x/%010u",(char*)MQTT_DNLINK_TOPIC,g_devMsg.devType, g_devMsg.devSn);
  589. memset(sub_topic,0,sizeof(sub_topic));
  590. sprintf((char*)sub_topic,"AT+MSUB=\"%s\", 0\r\n",(char*)topic);
  591. send_cmd_to_mqtt((char*)sub_topic,AT_SUB); // 订阅主题
  592. ret = waiting_uart_return(500,"SUBACK",NULL);
  593. if(ret==0){
  594. count++;
  595. if(count <4) goto REPEAT_MSUB_02;
  596. else goto MQTT_ERROR;
  597. }
  598. else printf("MQTT SUB02 SUCCESS\r\n");
  599. count = 0;
  600. strcpy((char*)g_uart1Info.waitMsg,"+MSUB");
  601. timeout_stop(&g_4gMsg.timer);
  602. g_4gMsg.delay = 1;
  603. if(1 == g_mqttCHmsg.bChangeMqtt){
  604. eeprom_write_mqtt_msg((uint8_t*)&g_mqttCHmsg.mqttMsg,sizeof(MqttMsg));
  605. g_mqttCHmsg.bChangeMqtt = 0;
  606. }
  607. //dma_config_mode_work();
  608. return ret;
  609. MQTT_ERROR:
  610. g_4gMsg.bconnect = 0;
  611. g_devMsg.baskIdentity = 0x00;
  612. if(g_4gMsg.delay == 61){ // 一个小时没有连接上网络,则重新启动
  613. NVIC_SystemReset();
  614. }
  615. timeout_start(&g_4gMsg.timer);
  616. if(1 == g_4gMsg.delay) g_4gMsg.delay = 3;
  617. else if(3 == g_4gMsg.delay) g_4gMsg.delay = 5;
  618. else if(5 == g_4gMsg.delay) g_4gMsg.delay = 10;
  619. else if(10 == g_4gMsg.delay) g_4gMsg.delay = 60;
  620. else g_4gMsg.delay = 61;
  621. printf("--------------mqtt error,delay = %d\r\n",g_4gMsg.delay);
  622. if(g_4gMsg.delay == 10){
  623. if(1 == g_mqttCHmsg.bChangeMqtt){ // 切换到原来的服务器上
  624. g_mqttCHmsg.bChangeMqtt = 0;
  625. g_4gMsg.delay = 1;
  626. timeout_stop(&g_4gMsg.timer);
  627. timeout_setValue(&g_4gMsg.timer,g_4gMsg.delay*TIMER_4G);
  628. printf("切换服务器失败,切换到原来的服务器\r\n");
  629. }
  630. }
  631. return ret;
  632. }
  633. /*----------------------------------------------------------------------------------
  634. * 将需要发送的数据放到4G的发送fifo中
  635. * 1: 操作成功 0:操作失败
  636. * ---------------------------------------------------------------------------------*/
  637. uint8_t add_data_to_4G_txfifo(uint8_t *txdata,uint8_t len,uint8_t msgType1,uint16_t msgType2)
  638. {
  639. //uint8_t buff[256]= {0};
  640. static uint32_t seq_num = 0;
  641. uint16_t crc;
  642. netMsgFormat *p_msg = (netMsgFormat*)buff;
  643. if(len > 256-12) return 0;
  644. memset(buff,0,256);
  645. p_msg->start = 0xfefe;
  646. p_msg->proVer = 0x02;
  647. p_msg->msgId = (seq_num++)%0xFFFFFFFF;
  648. p_msg->msgType1 = msgType1;
  649. p_msg->msgType2 = msgType2;
  650. p_msg->palen = len + 2;
  651. memcpy(p_msg->info, txdata, len);
  652. crc = _crc16_get((uint8_t *)p_msg,len+12);
  653. p_msg->info[len] = crc&0xff;
  654. p_msg->info[len+1] = (crc>>8)&0xff;
  655. return (fifo_write(&g_4Gtxfifo,buff,len+NET_HEAD_LEN+2));
  656. }