air72x.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765
  1. /** ******************************************************************************
  2. * @file AIR.c
  3. * @author 度云未来 DOIOT
  4. * @brief EC20模块AT指令简易串口驱动
  5. ******************************************************************************
  6. * @attention
  7. * <h2><center>&copy; Copyright (c) 2019 成都度云未来
  8. * All rights reserved.</center></h2>
  9. * 注意:本程序针对cubemx 生成的hal库快速开发
  10. * 环境:keil5.0
  11. * 描述:
  12. * 文件版本:1.3 更新时间2020/10/15 已支持TCP,LWM2M的连接
  13. ********************************************************************************/
  14. /*必备依赖*/
  15. #include "includes.h"
  16. #include "trace.h"
  17. #include "me3616.h" /*文件的头文件*/
  18. #include "at_module.h" /*AT指令相关的头文件*/
  19. #include "string_fuc.h"
  20. #include "bsp.h"
  21. #include <stdarg.h>
  22. #include <string.h>
  23. #include <stdlib.h>
  24. #include <stdio.h>
  25. /********************************************************************************/
  26. /*
  27. 测试了strstr和kmp的性能,最终用strstr。
  28. */
  29. /* AIR类的句柄,该句柄会默认调用 */
  30. ME3616 air;
  31. /**
  32. * @brief AIR硬件开机
  33. * @param flug = 1,阻塞开机,会直到开机成功,且读取完全部开机信息后才会退出
  34. * @param flug = 0,操作完硬件开机后立即返回
  35. * @param [Antiphase_flug]额外参数 : 以宏形式的标志,1为反相,0为不反相
  36. * 【是否反相根据硬件电路决定,如果mcu拉低,模组也被拉低,则不需要反相,否则给反相位置1即可】
  37. * 如果在计时器启动前调用了,建议选择直接返回[针对RTOS]
  38. */
  39. uint8_t AIR_Power_On(uint8_t flug)
  40. {
  41. OS_ERR err;
  42. char buff[200]={0};
  43. OSTimeDlyHMSM(0, 0, 0, 500, OS_OPT_TIME_DLY, &err);
  44. GPIO_SetBits(GPIOC, GPIO_Pin_3);
  45. GPIO_ResetBits(GPIOD, GPIO_Pin_14);
  46. OSTimeDlyHMSM(0, 0, 2, 0, OS_OPT_TIME_DLY, &err);
  47. GPIO_SetBits(GPIOD, GPIO_Pin_14);
  48. OSTimeDlyHMSM(0, 0, 2, 0, OS_OPT_TIME_DLY, &err);
  49. if(flug)
  50. {
  51. /*这里是为了吃掉三条开机信息,如果直接开始往下运行,开就信息可能会干扰*/
  52. memset(buff,0,200);
  53. if(Module_Blocking_Read(buff,10000))
  54. {
  55. printf("Power on info : %s\r\n", buff);
  56. air.State.pwr=1;
  57. if(strstr(buff,"*CGEV:"))
  58. {
  59. /*完整开机需要的时常很长*/
  60. AT_CMD_Polling("AT\r\n","OK",200,15000);
  61. AT_CMD_Polling("AT\r\n","OK",200,15000);
  62. AT_CMD_Polling("AT\r\n","OK",200,15000);
  63. ME3616_INFO("AIR Hardware Power On OK!");
  64. module_printf("AT+CREG=1\r\n");
  65. if(Module_Read_A_CRC("OK\r\n", 300)){
  66. printf("\r\n set AT+CREG = OK \r\n");
  67. }
  68. module_printf("AT+CREG=?\r\n"); // 查询网络注册状态
  69. return 1;
  70. }
  71. }
  72. }
  73. return 0;
  74. }
  75. /**
  76. * @brief AIR硬件复位
  77. * @param flug:复位标志,1,阻塞复位,会直到开机成功才退出,开机时间较长,2,立即返回*/
  78. uint8_t AIR_HARD_Rest(uint8_t flug)
  79. {
  80. return 0;
  81. }
  82. /**
  83. * @brief AIR软件复位
  84. * @param flug:复位标志,1,阻塞复位,会直到开机成功才退出,软复位很快,2,立即返回*/
  85. uint8_t AIR_SOFT_Rest(uint8_t flug)
  86. {
  87. return 0;
  88. }
  89. /**
  90. * @brief AIR读取网络状态并打印数据
  91. **/
  92. uint8_t AIR_READ_EPS()
  93. {
  94. char buff[MODULE_RDA_MAXlen]={0};
  95. char get_buff[100];
  96. int log;
  97. ME3616_INFO("Start to query network registration status");
  98. module_printf("AT+CEREG?\r\n");
  99. if(Module_Blocking_Read(buff,1000))
  100. {
  101. if(strstr(buff,"+CEREG:"))
  102. {
  103. AT_GET_Data_2Param(buff,(uint8_t*)get_buff,",","OK");
  104. log=atoi(get_buff);
  105. air.State.eps=log; /*装载标数据*/
  106. air.flug.eps=1; /*装载成功标志*/
  107. switch(log)
  108. {
  109. case 0: ME3616_INFO("You are not logged on to the network. You are not searching the network at present"); break;
  110. case 1: ME3616_INFO("Local network already logged in"); break;
  111. case 2: ME3616_INFO("\r\nYou are not logged on to the network. You are currently searching the network\r\n"); break;
  112. case 3: ME3616_INFO("\r\nRegistration denied\r\n"); break;
  113. case 4: ME3616_INFO("\r\nUnknown state\r\n"); break;
  114. case 5: ME3616_INFO("\r\nYou have logged in to the network and are roaming\r\n"); break;
  115. default:
  116. {
  117. ME3616_ERROR("Response ME3616_ERROR:%s",buff);
  118. return 33;//设定的错误码
  119. }
  120. }
  121. return log+1;
  122. }else {
  123. ME3616_ERROR("%s",buff);
  124. return 0;
  125. }
  126. }
  127. ME3616_INFO("Response timeout");
  128. return 0;
  129. }
  130. /**
  131. * @brief AIR读取网络信号强度
  132. * @param rssi:用来装载的参数,会装载信号强度原文[弃用]
  133. * @param ber:用来装载的参数, 会装载错码率原文[弃用]
  134. * */
  135. uint8_t AIR_READ_CSQ()
  136. {
  137. char buff[MODULE_RDA_MAXlen]={0};
  138. char get_buff[100]={0};
  139. int log;
  140. #if(config_CHINESE_LOG)
  141. ME3616_INFO("开始查询网络信号强度");
  142. #else
  143. ME3616_INFO("Start querying network signal strength");
  144. #endif
  145. module_printf("AT+CSQ\r\n");
  146. if(Module_Blocking_Read(buff,1000))
  147. {
  148. if(strstr(buff,"+CSQ:"))
  149. {
  150. AT_GET_Data_2Param(buff,(uint8_t*)get_buff,"+CSQ:",",");
  151. log=atoi(get_buff);
  152. air.State.rssi=log;
  153. air.flug.rssi=1; /*装载成功标志*/
  154. if(log==99) {air.State.dBm = 0; ME3616_INFO("signal intensity:there is no signal");}
  155. else if(log>=31&&log<=99) {air.State.dBm = log*2-113; ME3616_INFO("signal intensity:-51dBm or higher");}
  156. else if(log>=2&&log<31) {air.State.dBm = log*2-113; ME3616_INFO("signal intensity:-109dBm ~ -53dBm");}
  157. else if(log==1) {air.State.dBm = -111; ME3616_INFO("signal intensity:-111dBm");}
  158. else {air.State.dBm = log*2-113; ME3616_INFO("signal intensity:-111dBm or less");}
  159. AT_GET_Data_2Param(buff,(uint8_t*)get_buff,",","OK");
  160. log=atoi(get_buff);
  161. air.State.ber=log;
  162. air.flug.ber=1; /*装载成功标志*/
  163. //*ber=log;
  164. switch(log)
  165. {
  166. case 0: ME3616_INFO("Bit error rate:<0.01%"); break;
  167. case 1: ME3616_INFO("Bit error rate:0.01% --- 0.1%"); break;
  168. case 2: ME3616_INFO("Bit error rate:0.1% --- 0.5%"); break;
  169. case 3: ME3616_INFO("Bit error rate:0.5% --- 1.0%"); break;
  170. case 4: ME3616_INFO("Bit error rate:1.0% --- 2.0%"); break;
  171. case 5: ME3616_INFO("Bit error rate:2.0% --- 4.0%"); break;
  172. case 6: ME3616_INFO("Bit error rate:4.0% --- 8.0%"); break;
  173. case 7: ME3616_INFO("Bit error rate:> 8.0%"); break;
  174. case 8: ME3616_INFO("Bit error rate:So far or not measurable");break;
  175. default:
  176. {
  177. ME3616_ERROR("So far or not measurable");
  178. return 33;//设定的错误码
  179. }
  180. }
  181. return log+1;
  182. }
  183. {
  184. ME3616_ERROR("%s",buff);
  185. return 0;
  186. }
  187. }
  188. ME3616_INFO("Response timeout");
  189. return 0;
  190. }
  191. /**
  192. * @brief AIR读取精确的网络信号强度
  193. * */
  194. int AIR_READ_CESQ()
  195. {
  196. char buff[MODULE_RDA_MAXlen]={0};
  197. char get_buff[100]={0};
  198. int log;
  199. ME3616_INFO("Start querying network signal strength");
  200. module_printf("AT+CESQ\r\n");
  201. if(Module_Blocking_Read(buff,1000))
  202. {
  203. if(strstr(buff,"+CESQ:"))
  204. {
  205. AT_GET_Data_2Param(buff,(uint8_t*)get_buff,"+CESQ: ",",");
  206. log=atoi(get_buff);
  207. //me3616.State.rssi=log;
  208. air.flug.dBm=1; /*装载成功标志*/
  209. log=atoi(get_buff);
  210. log+=-110;/*转化成dBm*/
  211. air.State.dBm=log;
  212. ME3616_INFO("signal intensity:%ddBm");
  213. return log+1;
  214. }
  215. {
  216. ME3616_ERROR("%s",buff);
  217. return 0;
  218. }
  219. }
  220. ME3616_INFO("Response timeout");
  221. return 0;
  222. }
  223. /**
  224. * @brief AIR读取SIM卡的CCID
  225. * @param rssi:用来装载的参数,会装载信号强度原文
  226. * @param ber:用来装载的参数, 会装载错码率原文
  227. * */
  228. uint8_t AIR_READ_CCID()
  229. {
  230. char buff[MODULE_RDA_MAXlen]={0};
  231. char get_buff[32]={'\0'};
  232. ME3616_INFO("Start to query SIM card iccid");
  233. module_printf("AT+ICCID\r\n");
  234. if(Module_Blocking_Read(buff,3000))
  235. {
  236. if(strstr(buff,"+ICCID:"))
  237. {
  238. if(AT_GET_Data_2Param(buff,(uint8_t*)get_buff, "+ICCID: ", "\r\n"))//0d0a
  239. {
  240. strcpy(air.State.iccid,get_buff);
  241. air.flug.iccid=1; /*装载成功标志*/
  242. debug_printf("\r\nICCID:%s\r\n", get_buff);
  243. }
  244. else
  245. {
  246. ME3616_ERROR("%s",buff);
  247. return 0;
  248. }
  249. return 1;
  250. } else {
  251. if(strstr(buff,"SIM not inserted"))
  252. {
  253. ME3616_ERROR("SIM card not inserted,Please check the SIM card");
  254. return 0;
  255. }
  256. else
  257. {
  258. ME3616_ERROR("%s",buff);
  259. return 0;
  260. }
  261. }
  262. }
  263. ME3616_ERROR("Response timeout");
  264. return 0;
  265. }
  266. /**
  267. * @brief AIR查询pin状态
  268. * @param return 1 为ready,0 其他
  269. * */
  270. uint8_t AIR_READ_PIN()
  271. {
  272. char buff[256]={0};
  273. #if(config_CHINESE_LOG)
  274. ME3616_INFO("开始查询PIN状态");
  275. #else
  276. ME3616_INFO("Start to query pin status");
  277. #endif
  278. module_printf("AT+CPIN?\r\n");
  279. if(Module_Blocking_Read(buff,1000))
  280. {
  281. if(strstr(buff,"+CPIN:"))
  282. {
  283. air.State.pin=1;
  284. air.flug.pin=1; /*装载成功标志*/
  285. #if(config_CHINESE_LOG)
  286. if(strstr(buff,"READY")) {ME3616_INFO("PIN状态: READY,已准备好");return 1;}
  287. else if(strstr(buff,"SIM PIN")) {ME3616_INFO("PIN状态: 需要pin码");return 1;}
  288. else if(strstr(buff,"SIM PUK")) {ME3616_INFO("PIN状态: PIN 码解锁密码");return 1;}
  289. else if(strstr(buff,"PH-SIM PIN")) {ME3616_INFO("PIN状态: SIM 卡绑定密码");return 1;}
  290. else if(strstr(buff,"SIM PIN2")) {ME3616_INFO("PIN状态: PIN2 码密码");return 1;}
  291. else if(strstr(buff,"SIM PUK2")) {ME3616_INFO("PIN状态: PIN2 码解锁密码");return 1;}
  292. else if(strstr(buff,"PH-NET PIN")) {ME3616_INFO("PIN状态: 网络密码");return 1;}
  293. #else
  294. if(strstr(buff,"READY")) {ME3616_INFO("Pin status: READY");return 1;}
  295. else if(strstr(buff,"SIM PIN")) {ME3616_INFO("Pin status: need pin");return 1;}
  296. else if(strstr(buff,"SIM PUK")) {ME3616_INFO("Pin status: Pin code unlock password");return 1;}
  297. else if(strstr(buff,"PH-SIM PIN")) {ME3616_INFO("Pin status: SIM card binding password");return 1;}
  298. else if(strstr(buff,"SIM PIN2")) {ME3616_INFO("Pin status: Pin2 code");return 1;}
  299. else if(strstr(buff,"SIM PUK2")) {ME3616_INFO("Pin status: Pin2 code unlock password");return 1;}
  300. else if(strstr(buff,"PH-NET PIN")) {ME3616_INFO("Pin status: Network password");return 1;}
  301. #endif
  302. }
  303. else{
  304. ME3616_ERROR("%s",buff);
  305. return 0;
  306. }
  307. }
  308. ME3616_INFO("Response timeout");
  309. return 0;
  310. }
  311. /**
  312. * @brief AIR查询CIMI状态
  313. * */
  314. uint8_t AIR_READ_CIMI()
  315. {
  316. char buff[MODULE_RDA_MAXlen]={0};
  317. #if(config_CHINESE_LOG)
  318. ME3616_INFO("开始查询PIN状态");
  319. #else
  320. ME3616_INFO("Start to query pin status");
  321. #endif
  322. module_printf("AT+CIMI\r\n");
  323. if(Module_Blocking_Read(buff,1000))
  324. {
  325. if(strstr(buff,"OK"))
  326. {
  327. AT_Extract_numbers(buff); /*提纯数字*/
  328. strcat(air.State.imsi,buff);
  329. air.flug.imsi=1;
  330. ME3616_INFO("CIMI:%s",buff);
  331. return 1;
  332. }
  333. else{
  334. ME3616_ERROR("%s",buff);
  335. return 0;
  336. }
  337. }
  338. ME3616_INFO("Response timeout");
  339. return 0;
  340. }
  341. /**
  342. * @brief AIR查询IMEI并装载至寄存器
  343. * @param
  344. * */
  345. uint8_t AIR_READ_IMEI()
  346. {
  347. char buff[MODULE_RDA_MAXlen]={0};
  348. ME3616_INFO("Start query IMEI");
  349. module_printf("AT+CGSN\r\n");
  350. if(Module_Blocking_Read(buff,3000))
  351. {
  352. if(strstr(buff,"OK"))
  353. {
  354. char temp[32]={0};
  355. AT_GET_Data_2Param(buff,(uint8_t*)temp, "", "OK"); /*头尾提取方法*/
  356. AT_Extract_numbers(temp); /*提纯数字*/
  357. strcpy(air.State.imei,temp);
  358. air.flug.imei=1;
  359. debug_printf("\r\nIMEI:%s\r\n", temp);
  360. return 1;
  361. } else {
  362. ME3616_ERROR("%s",buff);
  363. return 0;
  364. }
  365. }
  366. ME3616_ERROR("Response timeout");
  367. return 0;
  368. }
  369. /**
  370. * @brief AIR查询IMEI并装载至寄存器
  371. * @param
  372. * */
  373. uint8_t AIR_READ_Revision()
  374. {
  375. return 0;
  376. }
  377. int AIR_HTTP_GET(const char *url, uint32_t len, uint32_t *pLen)
  378. {
  379. int ret = 0;
  380. char buff[MODULE_RDA_MAXlen]={0};
  381. //关闭UDP或TCP
  382. module_printf("AT+CIPCLOSE\r\n");
  383. Module_Read_A_CRC("CLOSE OK", 200);
  384. //设置HTTP功能的承载类型
  385. module_printf("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n");
  386. Module_Read_A_CRC("OK", 200);
  387. //设置pdp承载参数之APN
  388. module_printf("AT+SAPBR=3,1,\"APN\",\"\"\r\n");
  389. Module_Read_A_CRC("OK", 200);
  390. //激活该承载的GPRS PDP上下文
  391. module_printf("AT+SAPBR=1,1\r\n");
  392. Module_Read_A_CRC("OK", 200);
  393. //查询下承载的状态
  394. module_printf("AT+SAPBR=2,1\r\n");
  395. Module_Read_A_CRC("OK", 200);
  396. //HTTP协议栈初始化
  397. module_printf("AT+HTTPINIT\r\n");
  398. Module_Read_A_CRC("OK", 200);
  399. //建立http链接
  400. module_printf("AT+HTTPPARA=\"URL\",\"%s\"\r\n", url);
  401. Module_Read_A_CRC("OK", 300);
  402. //设置HTTP会话参数:CID
  403. //module_printf("AT+HTTPPARA=\"CID\",1", url);
  404. //Module_Read_A_CRC("OK", 300);
  405. //发送的命令, 提取数据 AT+HTTPACTION=<method>
  406. module_printf("AT+HTTPACTION=0\r\n");
  407. /* OK
  408. +HTTPACTION: <Method>,<StatusCode>,<DataLen>
  409. +HTTPACTION: <Method>,<StatusCode>,<DataLen>
  410. +HTTPACTION: <Method>,<StatusCode>,<DataLen>
  411. */
  412. Module_Read_A_CRC("OK", 300);
  413. //TODO 提取数据长度
  414. if(Module_Blocking_Read(buff,6000)) {
  415. char *strx;
  416. printf("%s\r\n", buff);
  417. //+HTTPACTION: 0,200,55420
  418. strx = strstr(buff, "," );
  419. if(strx) {
  420. printf("%s\r\n", strx);
  421. strx += 1;
  422. strx = strstr(strx, "," );
  423. if(strx) {
  424. printf("%s\r\n", strx);
  425. strx += 1;
  426. *pLen = atoi(strx);//获取接收长度
  427. }
  428. }
  429. //sscanf(buff, "+HTTPACTION: %d,%d,%d", &method, &status_code, pLen);
  430. //printf("%d, %d, %d\r\n", method, status_code, *pLen);
  431. ret = 1;
  432. }
  433. return ret;
  434. }
  435. char http_buffer[1024];
  436. uint8_t * AIR_HTTP_READ(uint32_t start_addr, uint32_t data_len)
  437. {
  438. uint8_t *p_buf = NULL;
  439. uint32_t read_len;
  440. //AT+HTTPREAD=<start_address>,<byte_size>
  441. module_printf("AT+HTTPREAD=%d,%d\r\n", start_addr, data_len);
  442. /* +HTTPREAD:<date_len>
  443. <data>
  444. OK
  445. */
  446. memset(http_buffer, 0, sizeof(http_buffer));
  447. if(Module_Blocking_Read(http_buffer, 300)) {
  448. char temp[32]={0};
  449. if(AT_GET_Data_2Param(http_buffer,(uint8_t*)temp, "+HTTPREAD: ", "\r\n")) { /*头尾提取方法*/
  450. read_len = atoi(temp);
  451. if(data_len == read_len) {
  452. //printf("%s", http_buffer);
  453. p_buf = (uint8_t *)strstr(http_buffer, "+HTTPREAD: ");
  454. p_buf = (uint8_t *)strstr((char *)p_buf, "\r\n");
  455. p_buf += 2;/* data position. */
  456. }
  457. }
  458. }
  459. return p_buf;
  460. }
  461. /*--------------------------------MQTT------------------------------------------------------*/
  462. uint8_t AIR_MQTT_Set_Net(char *ip,char *port)
  463. {
  464. if(strcpy(air.State.mqtt_ip,ip)) {
  465. if(strcpy(air.State.mqtt_port,port)) {
  466. air.flug.mqtt_ip=1;
  467. air.flug.mqtt_port=1;
  468. ME3616_INFO("Net Set OK!");
  469. return 1;
  470. }
  471. }
  472. return 0;
  473. }
  474. uint8_t AIR_MQTT_Connet(char *_productID,char *_deviceID,char *_secret)
  475. {
  476. int mqttid;
  477. if(!(air.flug.mqtt_ip&&air.flug.mqtt_port)) {
  478. ME3616_INFO("The network port has not been configured");
  479. return 0;
  480. }
  481. //AT+MCONFIG=<clientid>, XXXX, $$$$
  482. module_printf("AT+MCONFIG=%s,%s,%s\r\n",_deviceID,_productID,_secret);
  483. //printf("AT+MCONFIG=%s,%s,%s\r\n",_deviceID,_productID,_secret);
  484. if(Module_Read_A_CRC("OK", 300)) {
  485. //AT+MIPSTART=”ip或域名”,”port”
  486. module_printf("AT+MIPSTART=\"%s\",\"%s\"\r\n",air.State.mqtt_ip,air.State.mqtt_port);
  487. // module_printf("AT+MIPSTART=\"%s\",\"%s\"\r\n","mqtt.cpyypt.cn","9000");
  488. if(Module_Read_A_CRC("CONNECT OK", 1000)) {
  489. module_printf("AT+MCONNECT=1,60\r\n");
  490. if(Module_Read_A_CRC("CONNACK OK", 300)) {
  491. air.State.mqtt_id=mqttid;
  492. air.State.MQTT_State=1;
  493. ME3616_INFO("Connect MQTT Successful,MQTT id");
  494. /***********************************/
  495. module_printf("AT+MQTTMODE=1\r\n");
  496. if(Module_Read_A_CRC("OK", 300))
  497. {
  498. ME3616_INFO("MQTTMODE Successful,MQTT MODE 1");
  499. }
  500. else
  501. {
  502. ME3616_ERROR("AT+MQTTMODE error");
  503. }
  504. /***********************************/
  505. module_printf("ATE0\r\n");
  506. if(Module_Read_A_CRC("OK", 300)){
  507. ME3616_ERROR("ATE success\r\n");
  508. }
  509. else {
  510. ME3616_ERROR("ATE error\r\n");
  511. }
  512. return 1;
  513. } else {
  514. ME3616_ERROR("AT+MCONNECT error");
  515. }
  516. } else {
  517. ME3616_ERROR("AT+MCONFIG error");
  518. }
  519. } else {
  520. ME3616_INFO("Response timeout");
  521. }
  522. return 0;
  523. }
  524. uint8_t AIR_MQTT_SUB(char * topic)
  525. {
  526. if(!air.State.MQTT_State) {
  527. ME3616_INFO("Cannot Connect MQTT_02");
  528. return 0;
  529. }
  530. //AT+MSUB=<topic>,<qos>
  531. module_printf("AT+MSUB=\"%s\", 0\r\n", topic);
  532. if(Module_Read_A_CRC("SUBACK", 300)) {
  533. //ME3616_INFO("Sub \"%s\" Successful", topic);
  534. ME3616_INFO("Sub topic Successful");
  535. return 1;
  536. } else {
  537. ME3616_INFO("Sub ERROR");
  538. return 0;
  539. }
  540. }
  541. /*-----------------------------------------------------------------
  542. * 返回值 : 0:没有连接上
  543. * 1: 连接上mqtt
  544. * ---------------------------------------------------------------*/
  545. uint8_t AIR_MQTT_PUB(char * topic, char *data, uint32_t len)
  546. {
  547. if(!air.State.MQTT_State) {
  548. ME3616_INFO("Cannot Connect MQTT_03");
  549. return 0;
  550. }
  551. #if ( 1 )
  552. // printf("test %s\n",data);
  553. //AT+MPUB=<topic>,<qos>,<retain>,<message>
  554. module_printf("AT+MPUB=\"%s\",0,0,\"%s\"\r\n",topic,data);
  555. if(Module_Read_A_CRC("OK", 300)) {
  556. //ME3616_INFO("Pub Successful \r\n[%s]<-[%s]",topic,data);
  557. return 1;
  558. } else {
  559. ME3616_INFO("Pub ERROR");
  560. return 0;
  561. }
  562. #else
  563. module_printf("AT+MPUBEX=\"%s\",2,0,%d\r\n",topic,len);
  564. if(Module_Read_A_CRC(">", 300)) {
  565. //ME3616_INFO("return >\r\n");
  566. //module_printf(data);
  567. uart_msg_send(UART3_ID,data,len);
  568. //data_dump("net sendx", (uint8_t *)data, len);
  569. if(Module_Read_A_CRC_DA("OK","FEFE",len, 300)){
  570. // ME3616_INFO("return success\r\n");
  571. return 1;
  572. }
  573. else {
  574. ME3616_INFO("return failed\r\n");
  575. return 0;
  576. }
  577. } else {
  578. ME3616_INFO("Pub ERROR");
  579. return 0;
  580. }
  581. #endif
  582. }
  583. void AIR_IMEI_ICCID_INFO_GET(char *imei, char *iccid)
  584. {
  585. memcpy(imei, air.State.imei, strlen(air.State.imei));
  586. memcpy(iccid, air.State.iccid, strlen(air.State.iccid));
  587. }
  588. /*发送的指令组,需要校验的响应组,校验组数量,校验等级,重发次数,跳转位置,超时时间*/
  589. /**
  590. * @brief AIR句柄的构造函数
  591. * @param 该函数会对本文件核心全局句柄进行函数构造
  592. */
  593. ME3616 * AIR_Init(void)
  594. {
  595. ME3616 * me=&air;
  596. memset(me, 0, sizeof(ME3616));
  597. #if(config_MQTT_Enable)
  598. me->MQTT.SetNet=AIR_MQTT_Set_Net;
  599. me->MQTT.Connect=AIR_MQTT_Connet;
  600. me->MQTT.Sub=AIR_MQTT_SUB;
  601. me->MQTT.Pub=AIR_MQTT_PUB;
  602. #endif
  603. me->imei_iccid_get = AIR_IMEI_ICCID_INFO_GET;
  604. me->PowerOn=AIR_Power_On;
  605. #if(Hvertion_data)
  606. me->HardRest=AIR_HARD_Rest;
  607. #endif
  608. #if(SoftRest_fun)
  609. me->SoftRest=AIR_SOFT_Rest;
  610. #endif
  611. #if(GetEPS_fun)
  612. me->GetEPS=AIR_READ_EPS;
  613. #endif
  614. #if(GetCSQ_fun)
  615. me->GetCSQ=AIR_READ_CSQ;
  616. #endif
  617. me->GetCESQ=AIR_READ_CESQ;
  618. #if(GetCCID_fun)
  619. me->GetCCID=AIR_READ_CCID;
  620. #endif
  621. me->GetPIN=AIR_READ_PIN;
  622. me->GetIMEI=AIR_READ_IMEI;
  623. #if(Svertion_data)
  624. me->Version=AIR_READ_Revision;
  625. #endif
  626. #if 0
  627. me->flug.iccid=0;
  628. memset(me->State.iccid,0,50);
  629. me->flug.imei=0;
  630. memset(me->State.imei,0,50);
  631. me->flug.imsi=0;
  632. memset(me->State.imsi,0,50);
  633. #if(Hvertion_data)
  634. me->flug.Hvertion=0;
  635. memset(me->State.Hvertion,0,50);
  636. #endif
  637. #if(Svertion_data)
  638. me->flug.Svertion=0;
  639. memset(me->State.Svertion,0,50);
  640. #endif
  641. me->flug.pwr=0;
  642. me->flug.rssi=0;
  643. me->flug.ber=0;
  644. me->flug.eps=0;
  645. me->flug.pin=0;
  646. me->flug.rest=0;
  647. #endif
  648. return me;
  649. }
  650. void AIR_CLOSE_TCP(void)
  651. {
  652. module_printf("AT+MDISCONNECT\r\n"); // 先关闭mqtt连接
  653. if(Module_Read_A_CRC("OK", 300)){
  654. printf("mqtt connect close");
  655. }
  656. module_printf("AT+MDISCONNECT\r\n"); // 再关闭TCP连接
  657. if(Module_Read_A_CRC("OK", 300)){
  658. printf("tcp connect close");
  659. }
  660. // maqtt_check_connect_status(1);
  661. }
  662. int maqtt_check_connect_status(uint8_t type)
  663. {
  664. char buff[64]={0};
  665. // char get_buff[32]={'\0'};
  666. switch(type){
  667. case 0x01: // 查询MQTT连接状态
  668. module_printf("AT+MQTTSTATU\r\n");
  669. if(Module_Read_A_CRC("OK", 300)){
  670. printf("mqtt connect ok");
  671. }
  672. if(Module_Blocking_Read(buff,5000))
  673. {
  674. if(strstr(buff,"+MQTTSTATU:"))
  675. {
  676. printf("mqtt status : %s\r\n",buff);
  677. }
  678. else {
  679. printf("\r\n mqtt opt \r\n");
  680. }
  681. }
  682. else {
  683. printf("\r\n mqtt connect failed \r\n");
  684. }
  685. break;
  686. }
  687. return 0;
  688. }