air72x.c 19 KB

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