me3616.c 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345
  1. /** ******************************************************************************
  2. * @file ME3616.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 <stdarg.h>
  21. #include <string.h>
  22. #include <stdlib.h>
  23. #include <stdio.h>
  24. /********************************************************************************/
  25. /*
  26. 测试了strstr和kmp的性能,最终用strstr。
  27. */
  28. /* me3616类的句柄,该句柄会默认调用 */
  29. ME3616 me3616;
  30. /*发送的指令组,需要校验的响应组,校验组数量,校验等级,重发次数,跳转位置,超时时间*/
  31. /**
  32. * @brief ME3616句柄的构造函数
  33. * @param 该函数会对本文件核心全局句柄进行函数构造
  34. */
  35. ME3616 * ME3616_Init()
  36. {
  37. ME3616 * me=&me3616;
  38. #if(config_MQTT_Enable)
  39. MQTT mqtt;
  40. me->MQTT=mqtt;
  41. me->MQTT.SetNet=MQTT_Set_Net;
  42. me->MQTT.Connect=MQTT_Connet;
  43. me->MQTT.Sub=MQTT_SUB;
  44. me->MQTT.Pub=MQTT_PUB;
  45. #endif
  46. me->imei_iccid_get = ME3616_IMEI_ICCID_INFO_GET;
  47. #if(config_TCP_Enable)
  48. TCP tcp; /*创建实体*/
  49. me->TCP=tcp;
  50. me->TCP.CreateChannel=ME3616_Connect_TCP;
  51. me->TCP.CloseChannel=Close_TCP_Socket;
  52. me->TCP.SendStr=ME3616_TCP_SEND_String;
  53. me->TCP.SendHex=ME3616_TCP_SEND_Hex;
  54. me->TCP.GetData=ME3616_TCP_DATA_purification;
  55. #endif
  56. me->PowerOn=ME3616_Power_On;
  57. #if(Hvertion_data)
  58. me->HardRest=ME3616_HARD_Rest;
  59. #endif
  60. #if(SoftRest_fun)
  61. me->SoftRest=ME3616_SOFT_Rest;
  62. #endif
  63. #if(GetEPS_fun)
  64. me->GetEPS=ME3616_READ_EPS;
  65. #endif
  66. #if(GetCSQ_fun)
  67. me->GetCSQ=ME3616_READ_CSQ;
  68. #endif
  69. me->GetCESQ=ME3616_READ_CESQ;
  70. #if(GetCCID_fun)
  71. me->GetCCID=ME3616_READ_CCID;
  72. #endif
  73. me->GetPIN=ME3616_READ_PIN;
  74. #if(IMEI_ME3616_INFOrmation)
  75. me->GetIMEI=ME3616_READ_IMEI;
  76. #endif
  77. #if(Svertion_data)
  78. me->Version=ME3616_READ_Revision;
  79. #endif
  80. #if(ICCID_ME3616_INFOrmation)
  81. memset(me->State.iccid,0,50);
  82. #endif
  83. #if(IMEI_ME3616_INFOrmation)
  84. memset(me->State.imei,0,50);
  85. #endif
  86. memset(me->State.imsi,0,50);
  87. #if(MAC_ME3616_INFOrmation)
  88. memset(me->State.mac,0,50);
  89. #endif
  90. #if(Hvertion_data)
  91. memset(me->State.Hvertion,0,50);
  92. #endif
  93. #if(Svertion_data)
  94. memset(me->State.Svertion,0,50);
  95. #endif
  96. #if(config_LMW2M_Enable)
  97. memset(me->State.msgid,0,20);
  98. #endif
  99. #if(ICCID_ME3616_INFOrmation)
  100. me->flug.iccid=0;
  101. #endif
  102. #if(IMEI_ME3616_INFOrmation)
  103. me->flug.imei=0;
  104. #endif
  105. me->flug.imsi=0;
  106. #if(MAC_ME3616_INFOrmation)
  107. me->flug.mac=0;
  108. #endif
  109. #if(Hvertion_data)
  110. me->flug.Hvertion=0;
  111. #endif
  112. #if(Svertion_data)
  113. me->flug.Svertion=0;
  114. #endif
  115. me->flug.pwr=0;
  116. me->flug.rssi=0;
  117. me->flug.ber=0;
  118. me->flug.eps=0;
  119. me->flug.pin=0;
  120. me->flug.rest=0;
  121. #if defined (config_TCP_Enable_Disconnection_reconnection)
  122. me->flug.tcp_recon=0;
  123. #endif
  124. #if(config_LMW2M_Enable)
  125. me->flug.msgid=0;
  126. #endif
  127. // UartModuleInit();
  128. return me;
  129. }
  130. uint8_t ME3616_Check_State()
  131. {
  132. #if (config_TCP_Enable_heart) /*心跳*/
  133. if(me3616.State.TCP_State==1)
  134. {
  135. debug_printf("\r\n开始心跳\r\n");
  136. char temp[256]={0};
  137. Chaoyou_package("01","",temp);
  138. Check_Package(temp);
  139. me3616.TCP.send_Str(temp);
  140. }
  141. #endif
  142. #if (config_CEREG) /*网络检查*/
  143. if(me3616.State.TCP_State==1)
  144. {
  145. }
  146. #endif
  147. #if (config_TCP_Enable_Disconnection_reconnection) /*重连检查*/
  148. if(me3616.flug.tcp_recon)
  149. {
  150. if(me3616.State.TCP_State==0)
  151. {
  152. /*检查到掉线*/
  153. me3616.flug.rest=1;
  154. }
  155. else
  156. {
  157. debug_printf("TCP连接正常");
  158. }
  159. }
  160. #endif
  161. return 1;
  162. }
  163. /**
  164. * @brief ME3616硬件开机
  165. * @param flug = 1,阻塞开机,会直到开机成功,且读取完全部开机信息后才会退出
  166. * @param flug = 0,操作完硬件开机后立即返回
  167. * @param [Antiphase_flug]额外参数 : 以宏形式的标志,1为反相,0为不反相
  168. * 【是否反相根据硬件电路决定,如果mcu拉低,模组也被拉低,则不需要反相,否则给反相位置1即可】
  169. * 如果在计时器启动前调用了,建议选择直接返回[针对RTOS]
  170. */
  171. uint8_t ME3616_Power_On(uint8_t flug)
  172. {
  173. OS_ERR err;
  174. #if(config_CHINESE_LOG)
  175. ME3616_INFO("ME3616 硬件开机");
  176. #else
  177. ME3616_INFO("ME3616 Hardware Power On");
  178. #endif
  179. if(AT_CMD_Polling("AT\r\n","OK",100,300))
  180. {
  181. me3616.State.pwr=1;
  182. #if(config_CHINESE_LOG)
  183. ME3616_INFO("ME3616 完成开机");
  184. #else
  185. ME3616_INFO("ME3616 Power On");
  186. #endif
  187. return 1;
  188. }
  189. #if 0
  190. if(config_Antiphase_flug)
  191. {
  192. PWR_IO_PORT->ODR|=PWR_IO_PIN;/*拉低PWR引脚*/
  193. OSTimeDlyHMSM(0, 0, 2, 0, OS_OPT_TIME_DLY, &err);
  194. //HAL_Delay(2000); /*延时两秒*/
  195. PWR_IO_PORT->ODR&=!PWR_IO_PIN; /*拉高PWR引脚*/
  196. }
  197. else
  198. {
  199. PWR_IO_PORT->ODR&=!PWR_IO_PIN;/*拉低PWR引脚*/
  200. OSTimeDlyHMSM(0, 0, 2, 0, OS_OPT_TIME_DLY, &err);
  201. //HAL_Delay(2000); /*延时两秒*/
  202. PWR_IO_PORT->ODR|=PWR_IO_PIN; /*拉高PWR引脚*/
  203. }
  204. #endif
  205. if(flug)
  206. {
  207. char buff[MODULE_RDA_MAXlen]={0};
  208. /*这里是为了吃掉三条开机信息,如果直接开始往下运行,开就信息可能会干扰*/
  209. if(Module_Blocking_Read(buff,20000))
  210. {
  211. me3616.State.pwr=1;
  212. if(strstr(buff,"*MATREADY:"))
  213. {
  214. memset(buff,0,MODULE_RDA_MAXlen);
  215. if(Module_Blocking_Read(buff,6000))
  216. {
  217. if(strstr(buff,"+CPIN:"))
  218. {
  219. memset(buff,0,MODULE_RDA_MAXlen);
  220. if(Module_Blocking_Read(buff,60000))
  221. {
  222. if(strstr(buff,"+IP:"))
  223. {
  224. /*完整开机需要的时常很长*/
  225. AT_CMD_Polling("AT\r\n","OK",200,15000);
  226. AT_CMD_Polling("AT\r\n","OK",200,15000);
  227. AT_CMD_Polling("AT\r\n","OK",200,15000);
  228. ME3616_INFO("ME3616 Hardware Power On OK!");
  229. return 1;
  230. }
  231. }
  232. }
  233. }
  234. }
  235. }
  236. }
  237. return 0;
  238. }
  239. /**
  240. * @brief ME3616硬件复位
  241. * @param flug:复位标志,1,阻塞复位,会直到开机成功才退出,开机时间较长,2,立即返回*/
  242. uint8_t ME3616_HARD_Rest(uint8_t flug)
  243. {
  244. OS_ERR err;
  245. #if(config_CHINESE_LOG)
  246. ME3616_INFO("ME3616开始硬件复位");
  247. #else
  248. ME3616_INFO("ME3616 Hardware Reset");
  249. #endif
  250. if(config_Antiphase_flug)
  251. {
  252. RST_IO_PORT->ODR|=RST_IO_PIN;/*拉低PWR引脚*/
  253. OSTimeDlyHMSM(0, 0, 2, 0, OS_OPT_TIME_DLY, &err);
  254. //HAL_Delay(2000); /*延时两秒*/
  255. RST_IO_PORT->ODR&=!RST_IO_PIN; /*拉高PWR引脚*/
  256. }
  257. else
  258. {
  259. RST_IO_PORT->ODR&=!RST_IO_PIN;/*拉低PWR引脚*/
  260. OSTimeDlyHMSM(0, 0, 2, 0, OS_OPT_TIME_DLY, &err);
  261. //HAL_Delay(2000); /*延时两秒*/
  262. RST_IO_PORT->ODR|=RST_IO_PIN; /*拉高PWR引脚*/
  263. }
  264. if(flug)
  265. {
  266. /*这里是为了吃掉三条开机信息,如果直接开始往下运行,开就信息可能会干扰*/
  267. char buff[MODULE_RDA_MAXlen]={0};
  268. if(Module_Blocking_Read(buff,20000))
  269. {
  270. me3616.State.pwr=1;
  271. if(strstr(buff,"*MATREADY:"))
  272. {
  273. memset(buff,0,MODULE_RDA_MAXlen);
  274. if(Module_Blocking_Read(buff,6000))
  275. {
  276. if(strstr(buff,"+CPIN:"))
  277. {
  278. memset(buff,0,MODULE_RDA_MAXlen);
  279. if(Module_Blocking_Read(buff,6000))
  280. {
  281. if(strstr(buff,"+IP:"))
  282. {
  283. /*完整开机需要的时常很长*/
  284. AT_CMD_Polling("AT\r\n","OK",200,15000);
  285. AT_CMD_Polling("AT\r\n","OK",200,15000);
  286. AT_CMD_Polling("AT\r\n","OK",200,15000);
  287. ME3616_INFO("ME3616 Hardware Reset OK!");
  288. return 1;
  289. }
  290. }
  291. }
  292. }
  293. }
  294. }
  295. }
  296. return 1;
  297. }
  298. /**
  299. * @brief ME3616软件复位
  300. * @param flug:复位标志,1,阻塞复位,会直到开机成功才退出,软复位很快,2,立即返回*/
  301. uint8_t ME3616_SOFT_Rest(uint8_t flug)
  302. {
  303. #if(config_CHINESE_LOG)
  304. ME3616_INFO("ME3616开始软件复位");
  305. #else
  306. ME3616_INFO("ME3616 Software Reset");
  307. #endif
  308. Module_SEND_CRC("AT+ZRST\r\n","OK",500);
  309. if(flug)
  310. {
  311. /*这里是为了吃掉三条开机信息,如果直接开始往下运行,开就信息可能会干扰*/
  312. char buff[MODULE_RDA_MAXlen]={0};
  313. if(Module_Blocking_Read(buff,20000))
  314. {
  315. me3616.State.pwr=1;
  316. if(strstr(buff,"*MATREADY:"))
  317. {
  318. memset(buff,0,MODULE_RDA_MAXlen);
  319. if(Module_Blocking_Read(buff,6000))
  320. {
  321. if(strstr(buff,"+CPIN:"))
  322. {
  323. memset(buff,0,MODULE_RDA_MAXlen);
  324. if(Module_Blocking_Read(buff,6000))
  325. {
  326. if(strstr(buff,"+IP:"))
  327. {
  328. /*完整开机需要的时常很长*/
  329. AT_CMD_Polling("AT\r\n","OK",200,15000);
  330. AT_CMD_Polling("AT\r\n","OK",200,15000);
  331. AT_CMD_Polling("AT\r\n","OK",200,15000);
  332. ME3616_INFO("ME3616 Software Reset OK!");
  333. return 1;
  334. }
  335. }
  336. }
  337. }
  338. }
  339. }
  340. }
  341. return 1;
  342. }
  343. /**
  344. * @brief ME3616读取网络状态并打印数据
  345. **/
  346. uint8_t ME3616_READ_EPS()
  347. {
  348. char buff[MODULE_RDA_MAXlen]={0};
  349. char get_buff[100];
  350. int log;
  351. ME3616_INFO("Start to query network registration status");
  352. module_printf("AT+CEREG?\r\n");
  353. if(Module_Blocking_Read(buff,1000))
  354. {
  355. if(strstr(buff,"+CEREG:"))
  356. {
  357. AT_GET_Data_2Param(buff,(uint8_t*)get_buff,",","OK");
  358. log=atoi(get_buff);
  359. me3616.State.eps=log; /*装载标数据*/
  360. me3616.flug.eps=1; /*装载成功标志*/
  361. switch(log)
  362. {
  363. case 0: ME3616_INFO("You are not logged on to the network. You are not searching the network at present"); break;
  364. case 1: ME3616_INFO("Local network already logged in"); break;
  365. case 2: ME3616_INFO("\r\nYou are not logged on to the network. You are currently searching the network\r\n"); break;
  366. case 3: ME3616_INFO("\r\nRegistration denied\r\n"); break;
  367. case 4: ME3616_INFO("\r\nUnknown state\r\n"); break;
  368. case 5: ME3616_INFO("\r\nYou have logged in to the network and are roaming\r\n"); break;
  369. default:
  370. {
  371. ME3616_ERROR("Response ME3616_ERROR:%s",buff);
  372. return 33;//设定的错误码
  373. }
  374. }
  375. return log+1;
  376. }
  377. {
  378. ME3616_ERROR("%s",buff);
  379. return 0;
  380. }
  381. }
  382. ME3616_INFO("Response timeout");
  383. return 0;
  384. }
  385. /**
  386. * @brief ME3616读取网络信号强度
  387. * @param rssi:用来装载的参数,会装载信号强度原文[弃用]
  388. * @param ber:用来装载的参数, 会装载错码率原文[弃用]
  389. * */
  390. uint8_t ME3616_READ_CSQ()
  391. {
  392. char buff[MODULE_RDA_MAXlen]={0};
  393. char get_buff[32]={0};
  394. int log;
  395. #if(config_CHINESE_LOG)
  396. ME3616_INFO("开始查询网络信号强度");
  397. #else
  398. ME3616_INFO("Start querying network signal strength");
  399. #endif
  400. module_printf("AT+CSQ\r\n");
  401. if(Module_Blocking_Read(buff,1000))
  402. {
  403. if(strstr(buff,"+CSQ:"))
  404. {
  405. AT_GET_Data_2Param(buff,(uint8_t*)get_buff,"+CSQ:",",");
  406. log=atoi(get_buff);
  407. me3616.State.rssi=log;
  408. me3616.flug.rssi=1; /*装载成功标志*/
  409. if(log==99) {ME3616_INFO("signal intensity:there is no signal");}
  410. else if(log>=31&&log<=99) {ME3616_INFO("signal intensity:-51dBm or higher");}
  411. else if(log>=2&&log<31) {ME3616_INFO("signal intensity:-109dBm ~ -53dBm");}
  412. else if(log==1) {ME3616_INFO("signal intensity:-111dBm");}
  413. else {ME3616_INFO("signal intensity:-111dBm or less");}
  414. AT_GET_Data_2Param(buff,(uint8_t*)get_buff,",","OK");
  415. log=atoi(get_buff);
  416. me3616.State.ber=log;
  417. me3616.flug.ber=1; /*装载成功标志*/
  418. //*ber=log;
  419. switch(log)
  420. {
  421. case 0: ME3616_INFO("Bit error rate:<0.01%"); break;
  422. case 1: ME3616_INFO("Bit error rate:0.01% --- 0.1%"); break;
  423. case 2: ME3616_INFO("Bit error rate:0.1% --- 0.5%"); break;
  424. case 3: ME3616_INFO("Bit error rate:0.5% --- 1.0%"); break;
  425. case 4: ME3616_INFO("Bit error rate:1.0% --- 2.0%"); break;
  426. case 5: ME3616_INFO("Bit error rate:2.0% --- 4.0%"); break;
  427. case 6: ME3616_INFO("Bit error rate:4.0% --- 8.0%"); break;
  428. case 7: ME3616_INFO("Bit error rate:> 8.0%"); break;
  429. case 8: ME3616_INFO("Bit error rate:So far or not measurable");break;
  430. default:
  431. {
  432. ME3616_ERROR("So far or not measurable");
  433. return 33;//设定的错误码
  434. }
  435. }
  436. return log+1;
  437. }
  438. {
  439. ME3616_ERROR("%s",buff);
  440. return 0;
  441. }
  442. }
  443. ME3616_INFO("Response timeout");
  444. return 0;
  445. }
  446. /**
  447. * @brief ME3616读取精确的网络信号强度
  448. * */
  449. int ME3616_READ_CESQ()
  450. {
  451. char buff[MODULE_RDA_MAXlen]={0};
  452. char get_buff[100]={0};
  453. int log;
  454. ME3616_INFO("Start querying network signal strength");
  455. module_printf("AT+CESQ\r\n");
  456. if(Module_Blocking_Read(buff,1000))
  457. {
  458. if(strstr(buff,"+CESQ:"))
  459. {
  460. AT_GET_Data_2Param(buff,(uint8_t*)get_buff,"+CESQ: ",",");
  461. log=atoi(get_buff);
  462. //me3616.State.rssi=log;
  463. me3616.flug.dBm=1; /*装载成功标志*/
  464. log=atoi(get_buff);
  465. log+=-110;/*转化成dBm*/
  466. me3616.State.dBm=log;
  467. ME3616_INFO("signal intensity:%ddBm");
  468. return log+1;
  469. }
  470. {
  471. ME3616_ERROR("%s",buff);
  472. return 0;
  473. }
  474. }
  475. ME3616_INFO("Response timeout");
  476. return 0;
  477. }
  478. /**
  479. * @brief ME3616读取SIM卡的CCID
  480. * @param rssi:用来装载的参数,会装载信号强度原文
  481. * @param ber:用来装载的参数, 会装载错码率原文
  482. * */
  483. uint8_t ME3616_READ_CCID()
  484. {
  485. char buff[MODULE_RDA_MAXlen]={0};
  486. char get_buff[32]={'\0'};
  487. ME3616_INFO("Start to query SIM card iccid");
  488. module_printf("AT*MICCID\r\n");
  489. if(Module_Blocking_Read(buff,1000))
  490. {
  491. if(strstr(buff,"*MICCID:"))
  492. {
  493. if(AT_GET_Data_2Param(buff,(uint8_t*)get_buff,"*MICCID: ","\n\r"))//0d0a
  494. {
  495. #if(IMEI_ME3616_INFOrmation)
  496. strcpy(me3616.State.iccid,get_buff);
  497. me3616.flug.iccid=1; /*装载成功标志*/
  498. #endif
  499. debug_printf("\r\nICCID:");
  500. debug_printf("%s\r\n", get_buff);
  501. }
  502. else
  503. {
  504. ME3616_ERROR("%s",buff);
  505. ME3616_INFO("%s",buff);
  506. return 0;
  507. }
  508. return 1;
  509. }
  510. else{
  511. if(strstr(buff,"SIM not inserted"))
  512. {
  513. ME3616_INFO("SIM card not inserted,Please check the SIM card");
  514. return 0;
  515. }
  516. else
  517. {
  518. ME3616_ERROR("%s",buff);
  519. return 0;
  520. }
  521. }
  522. }
  523. ME3616_INFO("Response timeout");
  524. return 0;
  525. }
  526. /**
  527. * @brief ME3616查询pin状态
  528. * @param return 1 为ready,0 其他
  529. * */
  530. uint8_t ME3616_READ_PIN()
  531. {
  532. char buff[256]={0};
  533. #if(config_CHINESE_LOG)
  534. ME3616_INFO("开始查询PIN状态");
  535. #else
  536. ME3616_INFO("Start to query pin status");
  537. #endif
  538. module_printf("AT+CPIN?\r\n");
  539. if(Module_Blocking_Read(buff,1000))
  540. {
  541. if(strstr(buff,"+CPIN:"))
  542. {
  543. me3616.State.pin=1;
  544. me3616.flug.pin=1; /*装载成功标志*/
  545. #if(config_CHINESE_LOG)
  546. if(strstr(buff,"READY")) {ME3616_INFO("PIN状态: READY,已准备好");return 1;}
  547. else if(strstr(buff,"SIM PIN")) {ME3616_INFO("PIN状态: 需要pin码");return 1;}
  548. else if(strstr(buff,"SIM PUK")) {ME3616_INFO("PIN状态: PIN 码解锁密码");return 1;}
  549. else if(strstr(buff,"PH-SIM PIN")) {ME3616_INFO("PIN状态: SIM 卡绑定密码");return 1;}
  550. else if(strstr(buff,"SIM PIN2")) {ME3616_INFO("PIN状态: PIN2 码密码");return 1;}
  551. else if(strstr(buff,"SIM PUK2")) {ME3616_INFO("PIN状态: PIN2 码解锁密码");return 1;}
  552. else if(strstr(buff,"PH-NET PIN")) {ME3616_INFO("PIN状态: 网络密码");return 1;}
  553. #else
  554. if(strstr(buff,"READY")) {ME3616_INFO("Pin status: READY");return 1;}
  555. else if(strstr(buff,"SIM PIN")) {ME3616_INFO("Pin status: need pin");return 1;}
  556. else if(strstr(buff,"SIM PUK")) {ME3616_INFO("Pin status: Pin code unlock password");return 1;}
  557. else if(strstr(buff,"PH-SIM PIN")) {ME3616_INFO("Pin status: SIM card binding password");return 1;}
  558. else if(strstr(buff,"SIM PIN2")) {ME3616_INFO("Pin status: Pin2 code");return 1;}
  559. else if(strstr(buff,"SIM PUK2")) {ME3616_INFO("Pin status: Pin2 code unlock password");return 1;}
  560. else if(strstr(buff,"PH-NET PIN")) {ME3616_INFO("Pin status: Network password");return 1;}
  561. #endif
  562. }
  563. else{
  564. ME3616_ERROR("%s",buff);
  565. return 0;
  566. }
  567. }
  568. ME3616_INFO("Response timeout");
  569. return 0;
  570. }
  571. /**
  572. * @brief ME3616查询CIMI状态
  573. * */
  574. uint8_t ME3616_READ_CIMI()
  575. {
  576. char buff[MODULE_RDA_MAXlen]={0};
  577. #if(config_CHINESE_LOG)
  578. ME3616_INFO("开始查询PIN状态");
  579. #else
  580. ME3616_INFO("Start to query pin status");
  581. #endif
  582. module_printf("AT+CPIN?\r\n");
  583. if(Module_Blocking_Read(buff,1000))
  584. {
  585. if(strstr(buff,"+CPIN:"))
  586. {
  587. #if(config_CHINESE_LOG)
  588. if(strstr(buff,"READY")) {ME3616_INFO("PIN状态: READY,已准备好");return 1;}
  589. else if(strstr(buff,"SIM PIN")) {ME3616_INFO("PIN状态: 需要pin码");return 1;}
  590. else if(strstr(buff,"SIM PUK")) {ME3616_INFO("PIN状态: PIN 码解锁密码");return 1;}
  591. else if(strstr(buff,"PH-SIM PIN")) {ME3616_INFO("PIN状态: SIM 卡绑定密码");return 1;}
  592. else if(strstr(buff,"SIM PIN2")) {ME3616_INFO("PIN状态: PIN2 码密码");return 1;}
  593. else if(strstr(buff,"SIM PUK2")) {ME3616_INFO("PIN状态: PIN2 码解锁密码");return 1;}
  594. else if(strstr(buff,"PH-NET PIN")) {ME3616_INFO("PIN状态: 网络密码");return 1;}
  595. #else
  596. if(strstr(buff,"READY")) {ME3616_INFO("Pin status: READY");return 1;}
  597. else if(strstr(buff,"SIM PIN")) {ME3616_INFO("Pin status: need pin");return 1;}
  598. else if(strstr(buff,"SIM PUK")) {ME3616_INFO("Pin status: Pin code unlock password");return 1;}
  599. else if(strstr(buff,"PH-SIM PIN")) {ME3616_INFO("Pin status: SIM card binding password");return 1;}
  600. else if(strstr(buff,"SIM PIN2")) {ME3616_INFO("Pin status: Pin2 code");return 1;}
  601. else if(strstr(buff,"SIM PUK2")) {ME3616_INFO("Pin status: Pin2 code unlock password");return 1;}
  602. else if(strstr(buff,"PH-NET PIN")) {ME3616_INFO("Pin status: Network password");return 1;}
  603. #endif
  604. }
  605. else{
  606. ME3616_ERROR("%s",buff);
  607. return 0;
  608. }
  609. }
  610. ME3616_INFO("Response timeout");
  611. return 0;
  612. }
  613. #if(IMEI_ME3616_INFOrmation)
  614. /**
  615. * @brief ME3616查询IMEI并装载至寄存器
  616. * @param
  617. * */
  618. uint8_t ME3616_READ_IMEI()
  619. {
  620. rxbuff(buff);
  621. clear(buff);
  622. ME3616_INFO("Start query IMEI");
  623. module_printf("ATI\r\n");
  624. if(Module_Blocking_Read(buff,6000))
  625. {
  626. if(strstr(buff,"IMEI"))
  627. {
  628. #if 0
  629. char temp[32]={0};
  630. memset(temp, 0 , sizeof(temp));
  631. AT_GET_Data_2Param(buff,(uint8_t*)temp,"IMEI: ","OK"); /*头尾提取方法*/
  632. AT_Extract_numbers(temp); /*提纯数字*/
  633. strcat(me3616.State.imei,temp);
  634. ME3616_INFO("IMEI:%s\r\n",temp);
  635. #else
  636. AT_GET_Data_2Param(buff,me3616.State.imei,"IMEI: ","OK"); /*头尾提取方法*/
  637. #endif
  638. me3616.flug.imei=1;
  639. ME3616_INFO("IMEI:%s\r\n",me3616.State.imei);
  640. return 1;
  641. }
  642. else{
  643. ME3616_ERROR("%s",buff);
  644. return 0;
  645. }
  646. }
  647. ME3616_INFO("Response timeout");
  648. return 0;
  649. }
  650. #endif
  651. #if(Hvertion_data)
  652. /**
  653. * @brief ME3616查询IMEI并装载至寄存器
  654. * @param
  655. * */
  656. uint8_t ME3616_READ_Revision()
  657. {
  658. char buff[MODULE_RDA_MAXlen]={0};
  659. debug_printf("\r\n开始查询软硬件环境\r\n");
  660. module_printf("ATI\r\n");
  661. if(Module_Blocking_Read(buff,2000))
  662. {
  663. if(strstr(buff,"SwRevision: "))
  664. {
  665. char temp[256]={0};
  666. AT_GET_Data_2Param(buff,(uint8_t*)temp,"SwRevision: ","HwR"); /*头尾提取方法*/
  667. AT_Extract_numbers_letters(temp); /*提纯数字*/
  668. strcat(me3616.State.Svertion,temp);
  669. me3616.flug.Svertion=1;
  670. AT_GET_Data_2Param(buff,(uint8_t*)temp,"HwRevision: ","SVN"); /*头尾提取方法*/
  671. AT_Extract_numbers_letters(temp); /*提纯数字*/
  672. strcat(me3616.State.Hvertion,temp);
  673. me3616.flug.Hvertion=1;
  674. debug_printf("\r\nSvertion:%s",me3616.State.Svertion);
  675. debug_printf("Hvertion:%s\r\n",me3616.State.Hvertion);
  676. return 1;
  677. }
  678. else{
  679. debug_printf("原文:");
  680. debug_printf(buff);
  681. return 0;
  682. }
  683. }
  684. ME3616_INFO("Response timeout");
  685. return 0;
  686. }
  687. #endif
  688. void ME3616_IMEI_ICCID_INFO_GET(char *imei, char *iccid)
  689. {
  690. memcpy(imei, me3616.State.imei, strlen(me3616.State.imei));
  691. memcpy(iccid, me3616.State.iccid, strlen(me3616.State.iccid));
  692. }
  693. #if(config_TCP_Enable)
  694. /**
  695. * @brief ME3616关闭一个套接字
  696. * @param socket:套接字的句柄编号
  697. * */
  698. uint8_t ME3616_Close_Socket(uint8_t socket)
  699. {
  700. char buff[MODULE_RDA_MAXlen]={0};
  701. module_printf("AT+ESOCL=%d\r\n",socket);//printf的重映射有问题,正在修改
  702. if(Module_Blocking_Read(buff,1000))
  703. {
  704. if(strstr(buff,"OK"))
  705. {
  706. ME3616_INFO("socket:%d Close OK!",socket);
  707. return 1;
  708. }
  709. else if(strstr(buff,"ERROR")){
  710. //debug_printf("\r\n关闭失败\r\n");
  711. return 0;
  712. }else
  713. {
  714. // debug_printf("\r\nunknow\r\n");
  715. }
  716. }else
  717. {
  718. ME3616_INFO("Response timeout");
  719. }
  720. return 99;
  721. }
  722. /**
  723. * @brief ME3616关闭一个套接字[内部调用]
  724. * */
  725. uint8_t Close_TCP_Socket()
  726. {
  727. char buff[MODULE_RDA_MAXlen]={0};
  728. module_printf("AT+ESOCL=%d\r\n",me3616.State.TCP_Socket);//printf的重映射有问题,正在修改
  729. if(Module_Blocking_Read(buff,1000))
  730. {
  731. if(strstr(buff,"OK"))
  732. {
  733. ME3616_INFO("socket:%d Close OK!",me3616.State.TCP_Socket);
  734. return 1;
  735. }
  736. else if(strstr(buff,"ERROR")){
  737. ME3616_INFO("Closing failed");
  738. return 0;
  739. }else
  740. {
  741. ME3616_ERROR("%s",buff);
  742. }
  743. }
  744. else
  745. {
  746. ME3616_INFO("Response timeout");
  747. }
  748. return 0;
  749. }
  750. /**
  751. * @brief ME3616创建一个Socket
  752. * @param IPvX : 1 - IPv4 ,2 - IPv6
  753. * @param TCP_UDP : 1 - TCP ,2 - UDP ,3 - RAW
  754. * @param protocol: 1 - IP ,2 - ICMP
  755. * 【创建失败返回99,创建成功返回socket的句柄编号,范围0-4】
  756. */
  757. uint8_t ME3616_Create_Socket(int IPvX,int TCP_UDP,int protocol)
  758. {
  759. char buff[MODULE_RDA_MAXlen]={'\0'};
  760. char get_buff[100]={'\0'};
  761. uint8_t socket=99;
  762. module_printf("AT+ESOC=%d,%d,%d\r\n",IPvX,TCP_UDP,protocol);
  763. if(Module_Blocking_Read(buff,1000))
  764. {
  765. if(strstr(buff,"ERROR"))
  766. {
  767. if(strstr(buff,"too much socket instance"))
  768. {
  769. ME3616_INFO("There is no socket channel left. Please close the socket channel");
  770. return 88;
  771. }
  772. else
  773. {
  774. ME3616_ERROR("%s",buff);
  775. }
  776. }
  777. else if(strstr(buff,"+ESOC="))
  778. {
  779. char *p;
  780. // ME3616_ERROR("\r\n原文:");
  781. // ME3616_ERROR((char*)buff);
  782. if(strlen(buff)>15) p=buff+13;
  783. else p=buff;
  784. if(AT_GET_Data_2Param(p,(uint8_t*)get_buff,"OC=","OK"))
  785. {
  786. socket=atoi(get_buff);
  787. me3616.State.TCP_Socket=socket;
  788. ME3616_INFO("Socket created successfully, No.:%d",socket);
  789. return socket;
  790. }
  791. else
  792. {
  793. ME3616_INFO("Socket creation failed :%d",socket);
  794. ME3616_ERROR("%s",buff);
  795. return 99;
  796. }
  797. }
  798. else{
  799. ME3616_ERROR("%s",buff);
  800. return 99;
  801. }
  802. }else
  803. {
  804. ME3616_INFO("Response timeout");
  805. return 99;
  806. }
  807. return 99;
  808. }
  809. /**
  810. * @brief ME3616连接到一个Socket
  811. * @param socket : socket创建好的socket通道句柄编号
  812. * @param port : 端口
  813. * @param ip : ip地址,或者域名支持域名解析
  814. * 【创建失败返回99,创建成功返回socket的句柄编号,范围0-5】
  815. */
  816. int ME3616_Connect_Socket(uint8_t socket,char *port,char *ip)
  817. {
  818. char buff[MODULE_RDA_MAXlen]={0};
  819. char get_buff[100]={'\0'};
  820. char send_data[256]={0};
  821. char data_crc[256]={0};
  822. /*导入句柄编号*/
  823. sprintf(send_data,"AT+ESOCON=%d,",socket);
  824. /*导入端口号*/
  825. strcat(send_data,port);
  826. strcat(send_data,",\"");
  827. /*导入ip地址或域名*/
  828. strcat(send_data,ip);
  829. strcpy(data_crc,send_data);
  830. strcat(data_crc,"\"");
  831. strcat(send_data,"\"\r\n");
  832. //debug_printf("\r\nSEND TO ME3616\r\n");
  833. //debug_printf(send_data);
  834. //debug_printf("\r\nCRC FIFO\r\n");
  835. //debug_printf(data_crc);
  836. /*发送指令*/
  837. module_printf(send_data);
  838. if(Module_Blocking_Read(buff,8000))
  839. {
  840. if(strstr(buff,"ERROR"))
  841. {
  842. ME3616_INFO("Socket connection error");
  843. return 0;
  844. }
  845. else if(strstr(buff,"OK"))
  846. {
  847. ME3616_INFO("Socket connection successful");
  848. return 1;
  849. }
  850. else if(strstr(buff,data_crc))
  851. {
  852. memset(buff,0,MODULE_RDA_MAXlen);
  853. if(Module_Blocking_Read(buff,10000))
  854. {
  855. /*注册成功*/
  856. if(strstr(buff,"OK"))
  857. {
  858. ME3616_INFO("Socket connection successful");
  859. return 1;
  860. }
  861. else if(strstr(buff,"ERROR"))
  862. {
  863. ME3616_INFO("Socket connection error");
  864. //ME3616_ERROR("%s",buff);
  865. return 0;
  866. }
  867. }
  868. else
  869. {
  870. ME3616_INFO("Response timeout");
  871. }
  872. }
  873. else if(strstr(buff,"+ESOERR"))
  874. {
  875. int code=0;
  876. /*套接字错误指示器*/
  877. if(AT_GET_Data_2Param(buff,(uint8_t*)get_buff,",","\n\r"))
  878. {
  879. code=atoi(get_buff);
  880. ESOERR_PRINT(code);
  881. return code+10;
  882. }
  883. }
  884. else {
  885. ME3616_ERROR("%s",buff);
  886. }
  887. }
  888. else
  889. {
  890. ME3616_INFO("Response timeout");
  891. return 99;
  892. }
  893. return 0;
  894. }
  895. /**
  896. * @brief ME3616创建一个TCP连接
  897. * @param port : 端口
  898. * @param ip : ip地址,或者域名支持域名解析
  899. * 【创建失败返回99,创建成功返回socket的句柄编号,范围0-5】
  900. */
  901. uint8_t ME3616_Connect_TCP(char *port,char *ip)
  902. {
  903. OS_ERR err;
  904. ME3616_Close_Socket(0);
  905. ME3616_Close_Socket(1);
  906. ME3616_Close_Socket(2);
  907. ME3616_Close_Socket(3);
  908. ME3616_Close_Socket(4);
  909. /*静态的Socket句柄*/
  910. static int TCP_Socket;
  911. uint8_t Try_count=0;
  912. create:
  913. Try_count++;/*尝试次数*/
  914. /*创建一个套接字,并返回一个句柄*/
  915. TCP_Socket=ME3616_Create_Socket(1,1,1);
  916. if(TCP_Socket>=0&&TCP_Socket<=4)
  917. {/*创套接字编号满足要求则继续*/
  918. ME3616_INFO("Start Connection TCP");
  919. //me3616.State.TCP_Socket=TCP_Socket;
  920. }
  921. else if(TCP_Socket==88)
  922. {
  923. /*88是套接字通道用尽标志*/
  924. ME3616_INFO("Socket Channel has no more left,Start clear");
  925. ME3616_Close_Socket(0);
  926. ME3616_Close_Socket(1);
  927. ME3616_Close_Socket(2);
  928. ME3616_Close_Socket(3);
  929. ME3616_Close_Socket(4);
  930. if(Try_count<3) goto create;
  931. else return 0;
  932. }
  933. else if(TCP_Socket==99)
  934. {
  935. /*99是其他error,暂未处理*/
  936. ME3616_INFO("Socket creation failed");
  937. ME3616_INFO("Try again");
  938. ME3616_Close_Socket(0);
  939. ME3616_Close_Socket(1);
  940. ME3616_Close_Socket(2);
  941. ME3616_Close_Socket(3);
  942. ME3616_Close_Socket(4);
  943. if(Try_count<3) goto create;
  944. else return 0;
  945. }
  946. OSTimeDlyHMSM(0, 0, 500, 0, OS_OPT_TIME_DLY, &err);
  947. //HAL_Delay(500);
  948. /*创建一个TCP通道*/
  949. int code=ME3616_Connect_Socket(TCP_Socket,port,ip);
  950. if(code!=1)
  951. {
  952. ME3616_INFO("TCP creation failed:%d",code);
  953. ME3616_INFO("Try again");
  954. ME3616_Close_Socket(0);
  955. ME3616_Close_Socket(1);
  956. ME3616_Close_Socket(2);
  957. ME3616_Close_Socket(3);
  958. ME3616_Close_Socket(4);
  959. if(Try_count<3) goto create;
  960. if(code==99)
  961. {
  962. return 0;
  963. }
  964. else if(code>=9&&code<=11)
  965. {
  966. /*带错误码返回的套接字错误*/
  967. return 0;
  968. }
  969. else return 0;
  970. }else if(code==1)
  971. {
  972. /*装载参数*/
  973. me3616.State.TCP_State=1;
  974. #if defined (config_TCP_Enable_Disconnection_reconnection)
  975. me3616.flug.tcp_recon=1;
  976. #endif
  977. ME3616_INFO("TCP connection successful (*^▽^*) ");
  978. ME3616_INFO("IP Address:%s\r\n>> Port:%s\r\n>> Socket:%d ",ip,port,TCP_Socket);
  979. return 1;
  980. } /*code==1是唯一正确的返回*/
  981. else
  982. {
  983. ME3616_INFO("TCP creation failed ");
  984. return 0;
  985. }
  986. }
  987. uint8_t ME3616_TCP_SEND_String(char *str)
  988. {
  989. if(me3616.State.TCP_State==1)
  990. {
  991. uint16_t len=strlen(str);
  992. if(len>0&&len<512)
  993. {
  994. char str_arry[strlen(str)+1];
  995. memset(str_arry,0,strlen(str)+1);
  996. AsciiStr_2_HexStr(str,str_arry);
  997. module_printf("AT+ESOSEND=%d,%d,%s\r\n",me3616.State.TCP_Socket,strlen(str),str_arry);
  998. //ME3616_INFO("\r\nAT+ESOSEND=%d,%d,%s\r\n",me3616.State.TCP_Socket,strlen(str),str_arry);
  999. char rxbuf[MODULE_RDA_MAXlen]={0};
  1000. if(Module_Blocking_Read(rxbuf,5000))
  1001. {
  1002. //debug_printf(rxbuf);
  1003. if(strstr(rxbuf,"+ESONMI")||strstr(rxbuf,"OK"))
  1004. {
  1005. ME3616_INFO("Send:%s",str);
  1006. ME3616_INFO("Sent successfully");
  1007. }
  1008. else if(strstr(rxbuf,"ERROR"))
  1009. {
  1010. ME3616_ERROR("%s",rxbuf);
  1011. }
  1012. }else
  1013. {
  1014. ME3616_INFO("Response timeout");
  1015. return 99;
  1016. }
  1017. }
  1018. else
  1019. {
  1020. ME3616_INFO("Data length violation");
  1021. return 0;
  1022. }
  1023. }
  1024. else{
  1025. ME3616_INFO("Send failed, TCP channel not open");
  1026. return 0;
  1027. }
  1028. return 0;
  1029. }
  1030. uint8_t ME3616_TCP_SEND_Hex(char *str)
  1031. {
  1032. if(me3616.State.TCP_State==1)
  1033. {
  1034. uint16_t len=strlen(str);
  1035. if(len%2!=0)
  1036. {
  1037. ME3616_INFO("hex data不符合规范");
  1038. return 0;
  1039. }
  1040. if(len>0&&len<512)
  1041. {
  1042. module_printf("AT+ESOSEND=%d,%d,%s\r\n",me3616.State.TCP_Socket,len/2,str);
  1043. //debug_printf("AT+ESOSEND=%d,%d,%s\r\n",me3616.State.TCP_Socket,len/2,str);
  1044. char rxbuf[MODULE_RDA_MAXlen];
  1045. if(Module_Blocking_Read(rxbuf,3000))
  1046. {
  1047. //debug_printf(rxbuf);
  1048. if(strstr(rxbuf,"+ESONMI")||strstr(rxbuf,"OK"))
  1049. {
  1050. ME3616_INFO("发送成功");
  1051. }
  1052. else if(strstr(rxbuf,"ERROR"))
  1053. {
  1054. ME3616_INFO("发送失败");
  1055. }
  1056. }else
  1057. {
  1058. ME3616_INFO("响应超时");
  1059. return 99;
  1060. }
  1061. }
  1062. else
  1063. {
  1064. ME3616_INFO("数据长度违规");
  1065. return 0;
  1066. }
  1067. }
  1068. else{
  1069. ME3616_INFO("\r\nTCP通道未打开\r\n");
  1070. return 0;
  1071. }
  1072. return 0;
  1073. }
  1074. uint8_t ME3616_TCP_DATA_purification(uint8_t data[])
  1075. {
  1076. /**/
  1077. if(me3616.State.TCP_State)
  1078. {
  1079. char temp[15]={0};
  1080. sprintf(temp,"+ESONMI=%d",me3616.State.TCP_Socket);
  1081. if(strstr((char*)data,temp))/*校验数据是否来自指定的socket*/
  1082. {
  1083. /*读取数据长度*/
  1084. char temp[10]={0};
  1085. AT_GET_Data((char*)data,(uint8_t*)temp,",",1);
  1086. int i=atoi(temp);
  1087. //debug_printf("\r\nlen:%d\r\n",i);
  1088. int loc=0;
  1089. for(int n=0;loc<50;loc++)
  1090. {
  1091. if(*(data+loc)==',') n++;
  1092. if(n==2) break;
  1093. }
  1094. Shift_left((char*)data,loc+1);
  1095. //Str.convert.R_CUT((char*)data,i*2+2);/*因为数据还包括odoa,所以额外+2*/
  1096. return 1;
  1097. }
  1098. else return 0;
  1099. }
  1100. return 0;
  1101. }
  1102. #endif
  1103. /**
  1104. * @brief ME3616打印套接字错误码
  1105. */
  1106. void ESOERR_PRINT(int code)
  1107. {
  1108. switch(code)
  1109. {
  1110. case -1:debug_printf("\r\n错误:通用错误\r\n"); break;
  1111. case 1:debug_printf("\r\n错误:没有找到路由信息,一般是掉网的情况下会出现\r\n"); break;
  1112. case 2:debug_printf("\r\n错误:TCP 链接被动断开,一般掉网的情况下会出现\r\n"); break;
  1113. case 3:debug_printf("\r\n错误:TCP 链接被 server 断连,一般是 device 收到 server 的 reset 数据包\r\n"); break;
  1114. case 4:debug_printf("\r\n错误:TCP 连接错误\r\n"); break;
  1115. case 5:debug_printf("\r\n错误:非法值\r\n"); break;
  1116. case 6:debug_printf("\r\n错误:socket 阻塞\r\n"); break;
  1117. case 7:debug_printf("\r\n错误:地址已经被使用\r\n"); break;
  1118. case 8:debug_printf("\r\n错误:正在连接中\r\n"); break;
  1119. case 9:debug_printf("\r\n错误:已经建立连接\r\n"); break;
  1120. case 10:debug_printf("\r\n错误:网络接口错误\r\n"); break;
  1121. default: debug_printf("\r\n错误:通用错误\r\n"); break;
  1122. }
  1123. }
  1124. /*--------------------------------MQTT------------------------------------------------------*/
  1125. #if(config_MQTT_Enable)
  1126. uint8_t MQTT_Set_Net(char *ip,char *port)
  1127. {
  1128. if(strcpy(me3616.State.mqtt_ip,ip))
  1129. if(strcpy(me3616.State.mqtt_port,port))
  1130. {
  1131. me3616.flug.mqtt_ip=1;
  1132. me3616.flug.mqtt_port=1;
  1133. ME3616_INFO("Net Set OK!");
  1134. return 1;
  1135. }
  1136. return 0;
  1137. }
  1138. uint8_t MQTT_Connet(char *_productID,char *_deviceID,char *_secret)
  1139. {
  1140. int mqttid;
  1141. /*申请一个接收缓存*/
  1142. rxbuff(buff);
  1143. if(!(me3616.flug.mqtt_ip&&me3616.flug.mqtt_port))
  1144. {
  1145. ME3616_INFO("The network port has not been configured");
  1146. return 0;
  1147. }
  1148. module_printf("AT+EMQNEW=\"%s\",\"%s\",12000,512\r\n",me3616.State.mqtt_ip,me3616.State.mqtt_port);
  1149. /*conenet的地址*/
  1150. //module_printf("AT+EMQNEW=\"183.230.40.39\",\"6002\",12000,100\r\n");
  1151. clear(buff);
  1152. if(Module_Blocking_Read(buff,5000))
  1153. {
  1154. if(strstr(buff,"+EMQNEW:")&&strstr(buff,"OK"))
  1155. {
  1156. uint8_t getid[5]={0};
  1157. AT_GET_Data_2Param(buff,getid,":","OK");
  1158. AT_Remove_spaces((char*)getid);
  1159. mqttid=atoi((char*)getid);
  1160. ME3616_INFO("NEW mqtt server ok! Start Connect...");
  1161. module_printf("AT+EMQCON=%d,4,\"%s\",1000,1,0\r\n",mqttid,_deviceID);
  1162. clear(buff);
  1163. if(Module_Blocking_Read(buff,5000))
  1164. {
  1165. if(strstr(buff,"OK"))
  1166. {
  1167. me3616.State.mqtt_id=mqttid;
  1168. me3616.State.MQTT_State=1;
  1169. ME3616_INFO("Connect MQTT Successful,MQTT id:%d",mqttid);
  1170. return 1;
  1171. }
  1172. }
  1173. }else {
  1174. ME3616_ERROR("%s",buff);
  1175. }
  1176. } else {
  1177. ME3616_INFO("Response timeout");
  1178. }
  1179. return 0;
  1180. }
  1181. uint8_t MQTT_SUB(char * topic)
  1182. {
  1183. if(!me3616.State.MQTT_State)
  1184. {
  1185. ME3616_INFO("Cannot Connect MQTT");
  1186. return 0;
  1187. }
  1188. /*往模组打印*/
  1189. module_printf("AT+EMQSUB=%d,\"%s\",1\r\n",me3616.State.mqtt_id,topic);
  1190. Module_Read_A_CRC("AT+EMQSUB=",5000);
  1191. if(Module_Read_A_CRC("OK",15000))
  1192. {
  1193. ME3616_INFO("Sub \"%s\" Successful",topic);
  1194. return 1;
  1195. }else
  1196. {
  1197. ME3616_INFO("Sub ERROR");
  1198. return 0;
  1199. }
  1200. }
  1201. uint8_t MQTT_PUB(char * topic,char *data, uint32_t len)
  1202. {
  1203. if(!me3616.State.MQTT_State)
  1204. {
  1205. ME3616_INFO("Cannot Connect MQTT");
  1206. return 0;
  1207. }
  1208. /*往模组打印*/
  1209. module_printf("AT+EMQPUB=%d,\"%s\",1,0,0,%d,\"%s\"\r\n",me3616.State.mqtt_id,topic,strlen(data)/2,data);
  1210. //Module_Read_A_CRC("AT+EMQPUB=",5000);
  1211. if(Module_Read_A_CRC("OK",3000))
  1212. {
  1213. /*
  1214. if(Module_Read_A_CRC("+EMQPUB:",15000))
  1215. {
  1216. ME3616_INFO("Pub Successful \r\n[%s]<-[%s]",topic,data);
  1217. return 1;
  1218. } */
  1219. ME3616_INFO("Pub Successful \r\n[%s]<-[%s]",topic,data);
  1220. return 1;
  1221. }else
  1222. {
  1223. ME3616_INFO("Pub ERROR");
  1224. return 0;
  1225. }
  1226. }
  1227. #endif