esp32.c 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528
  1. #include "CONFIG.h"
  2. #if ESP32
  3. #include "stm32f10x.h"
  4. #include <stdio.h>
  5. #include <stdarg.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include "esp32.h"
  9. #include "Common_Util.h"
  10. #include "Log_Module.h"
  11. #include "At_Module.h"
  12. #include "Tuoreniot.h"
  13. /******************************************* 基于ESP32_C3模组的相关方法声明 *******************************************/
  14. void esp32_reset(void); //1.重置状态。该文件中的方法共用状态,在使用下面的方法前需要重置一下状态。
  15. void esp32_exit_deepsleep(void); //2.退出深休眠
  16. void esp32_enter_deepsleep(void); //3.进入深休眠
  17. void esp32_exit_lightsleep(void); //4.退出浅休眠
  18. void esp32_enter_lightsleep(void); //5.进入浅休眠
  19. enum Result esp32_set_lightsleep_wakeup(uint8_t source, uint8_t gpio, uint8_t mode); //6.设置浅睡眠唤醒源
  20. enum Result esp32_set_lightsleep_wakeup_sync(uint8_t source, uint8_t gpio, uint8_t mode); //7.设置浅睡眠唤醒源-同步
  21. enum Result esp32_set_sleep(uint8_t mode); //8.设置睡眠模式
  22. enum Result esp32_set_sleep_sync(uint8_t mode); //9.设置睡眠模式-同步
  23. enum Result esp32_connect_ap(char * id, char * password); //10.连接AP
  24. enum Result esp32_connect_ap_sync(char * id, char * password); //11.连接AP-同步
  25. enum Result esp32_set_cipmode(uint8_t mode); //12.设置传输模式
  26. enum Result esp32_set_cipmode_sync(uint8_t mode); //13.设置传输模式-同步
  27. enum Result esp32_connect_network(char * service_type, char * IP_address, uint16_t remote_port); //14.连接TCP/UDP服务器
  28. enum Result esp32_connect_network_sync(char * service_type, char * IP_address, uint16_t remote_port); //15.连接TCP/UDP服务器-同步
  29. enum Result esp32_query_id_signal(char * ID, int * RSSI); //16.查询指定ID的WiFi信号强度
  30. enum Result esp32_query_id_signal_sync(char * ID, int * RSSI); //17.查询指定ID的WiFi信号强度-同步
  31. enum Result esp32_close_network(void); //18.关闭TCP/UDP连接
  32. enum Result esp32_close_network_sync(void); //19.关闭TCP/UDP连接-同步
  33. enum Result esp32_autoconnect_ap(uint8_t mode); //20.是否自动连接AP
  34. enum Result esp32_autoconnect_ap_sync(uint8_t mode); //21.是否自动连接AP-同步
  35. enum Result esp32_close_ap(void); //22.关闭AP连接
  36. enum Result esp32_close_ap_sync(void); //23.关闭AP连接-同步
  37. enum Result esp32_query_signal(int * RSSI); //24.查询已连接WiFi的信号强度
  38. enum Result esp32_query_signal_sync(int * RSSI); //25.查询已连接WiFi的信号强度-同步
  39. enum Result esp32_ready(void); //26.模块是否启动-初始化处理专用
  40. enum Result esp32_ready_sync(void); //27.模块是否启动-同步
  41. enum Result esp32_handle_data(uint8_t * data, uint16_t send_data_length, uint16_t *recv_data_length); //28.处理数据(数据发送+等待发送结果)
  42. enum Result esp32_handle_data_sync(uint8_t * data, uint16_t send_data_length, uint16_t *recv_data_length); //29.处理数据(数据发送+等待发送结果)-同步
  43. enum Result esp32_recv_ready(void); //30.判断模块是否正常启动
  44. enum Result esp32_recv_ready_with_time(uint32_t time_out); //31.判断模块是否正常启动+等待时间
  45. enum Result esp32_set_mode(uint8_t mode); //32.设置WiFi模式
  46. enum Result esp32_set_mode_sync(uint8_t mode); //33.设置WiFi模式-同步
  47. enum Result esp32_query_mac_address(char * MAC_address); //34.查询WiFi模块的MAC地址
  48. enum Result esp32_set_ip_address(char *IP_address); //35.设置WiFi模块的IP地址
  49. enum Result esp32_set_dhcp(uint8_t operate,uint8_t mode); //36.设置启用DHCP模式
  50. enum Result esp32_set_gateway(char *IP_address, char *Gateway, char *Netmask); //37.设置WiFi模块的IP地址、网关、掩码
  51. enum Result esp32_rst(void); //38.重启WiFi模块
  52. /*************************************************** AT指令相关函数 ***************************************************/
  53. //AT指令数组
  54. static char AT_CMD[256];
  55. //发送AT指令 二进制
  56. static void send_data(uint8_t * data, uint16_t length)
  57. {
  58. AT_Send_Bytes(data, length);
  59. }
  60. // 发送AT指令 字符串
  61. static uint8_t send_at_string(char * cmd)
  62. {
  63. uint8_t state = 0;
  64. if(AT_Get_Status() == AT_Status_None)
  65. {
  66. // 发送AT指令
  67. AT_Send_String(cmd);
  68. state = 1;
  69. }
  70. return state;
  71. }
  72. /******************************************* 基于ESP32_C3模组的相关执行函数 *********************************************/
  73. // 获取状态
  74. static enum STATUS getStatus(void)
  75. {
  76. return esp32.status;
  77. }
  78. // 设置状态
  79. static void setStatus(enum STATUS status)
  80. {
  81. esp32.status = status;
  82. }
  83. // 获取定时
  84. static uint32_t getTimerMs(void)
  85. {
  86. return time_get_delay(&esp32.timer);
  87. }
  88. // 清除定时
  89. static void clearTimer(void)
  90. {
  91. time_clear(&esp32.timer);
  92. }
  93. // 设置定时
  94. //static void setTimerMs(uint32_t time)
  95. //{
  96. // esp32.timer_ms = time;
  97. //}
  98. // 获取ID
  99. static uint8_t getActiveID(void)
  100. {
  101. return esp32.activeID;
  102. }
  103. //设置ID
  104. static void setActiveID(uint8_t activeID)
  105. {
  106. esp32.activeID = activeID;
  107. }
  108. // 验证ID
  109. static uint8_t verifyActiveID(uint8_t activeID)
  110. {
  111. if(getActiveID() == 0 || getActiveID() == activeID){ return 1; }
  112. else
  113. {
  114. Log_Printf_Debug("activeID repetition!\r\n");
  115. return 0;
  116. }
  117. }
  118. // 返回超时结果
  119. static enum Result overtime(void)
  120. {
  121. setStatus(Status_Overtime); // 超时
  122. return Result_Failed; // 结果
  123. }
  124. // 返回成功结果
  125. static enum Result success(void)
  126. {
  127. setStatus(Status_Success); //成功
  128. return Result_Success; //结果
  129. }
  130. // 返回成功结果
  131. static enum Result success_no_log(void)
  132. {
  133. // 成功
  134. setStatus(Status_Success);
  135. // 结果
  136. return Result_Success;
  137. }
  138. //// 返回失败结果
  139. //static enum Result failed(void)
  140. //{
  141. // setStatus(Status_Failed); //失败
  142. // return Result_Failed; //结果
  143. //}
  144. // 返回失败结果
  145. static enum Result failed(int type)
  146. {
  147. // 失败
  148. setStatus(Status_Failed);
  149. if(type == 1)
  150. {
  151. Log_Printf_Debug("activeID: %d, error: 接收结果过期,请重置状态\r\n", esp32.activeID); // 打印日志
  152. }
  153. else if(type == 2)
  154. {
  155. // 发送日志
  156. Log_Printf_Debug("activeID: %d, AT接收失败: %d\r\n", esp32.activeID, AT_result_length());
  157. Log_SendArray_Debug(AT_result(), AT_result_length());
  158. }
  159. else if(type == 3)
  160. {
  161. Log_Printf_Debug("当前WiFi无信号\r\n");
  162. }
  163. else
  164. {
  165. Log_Printf_Debug("activeID: %d, error: 未知错误类型\r\n", esp32.activeID); // 打印日志
  166. }
  167. // 失败结果
  168. return Result_Failed;
  169. }
  170. // 发送指令并改变状态
  171. enum Result send_at(char * cmd, uint8_t activeID)
  172. {
  173. Log_Printf_Debug(cmd); // 打印AT指令
  174. if(send_at_string(cmd)) // 发送AT指令
  175. {
  176. setActiveID(activeID); // 活动ID
  177. setStatus(Status_Sending); // 设置已发送
  178. clearTimer(); // 重置计时
  179. return Result_None; // 未知结果
  180. }
  181. else
  182. {
  183. Log_Printf_Debug("AT指令发送失败\r\n"); // 打印日志
  184. return Result_Failed; // 失败结果
  185. }
  186. }
  187. // 1.重置状态
  188. void esp32_reset(void)
  189. {
  190. setStatus(Status_None); // 重置状态
  191. setActiveID(0); // 重置ID
  192. clearTimer(); // 重置计时
  193. AT_Clear(); // 清除AT指令
  194. }
  195. //2.退出深休眠
  196. void esp32_exit_deepsleep(void)
  197. {
  198. GPIO_SetBits(WAKE_GPIO, WAKE_GPIO_Pin); // 拉高IO口,使能ESP32_C3模组
  199. }
  200. //3.进入深休眠
  201. void esp32_enter_deepsleep(void)
  202. {
  203. GPIO_ResetBits(WAKE_GPIO, WAKE_GPIO_Pin); // 拉低IO口,使ESP32_C3模组失能
  204. }
  205. //4.退出浅休眠 (使用此功能需先配置浅休眠模式)
  206. void esp32_exit_lightsleep(void)
  207. {
  208. // GPIO_SetBits(WAKE_GPIO, LIGHT_SLEEP_GPIO_Pin); // 拉高IO口,使ESP32_C3模组退出浅休眠
  209. }
  210. //5.进入浅休眠 (使用此功能需先配置浅休眠模式)
  211. void esp32_enter_lightsleep(void)
  212. {
  213. // GPIO_ResetBits(WAKE_GPIO, LIGHT_SLEEP_GPIO_Pin);// 拉低IO口,使ESP32_C3模组进入浅休眠
  214. }
  215. /******************************************************************************
  216. * 6.设置浅睡眠唤醒源
  217. * param1: source 代表唤醒源 (0:保留配置 1:保留配置 2:GPIO唤醒)
  218. * param2: gpio (唤醒源为GPIO时,代表GPIO管脚)
  219. * param3: mode (唤醒源为GPIO时,该参数表示唤醒电平。 0:低电平唤醒 1:高电平唤醒)
  220. *
  221. *******************************************************************************/
  222. enum Result esp32_set_lightsleep_wakeup(uint8_t source, uint8_t gpio, uint8_t mode)
  223. {
  224. enum Result result = Result_None;
  225. int activeID = 6, time=500; // 活动ID, 超时时间
  226. //校验参数
  227. if(source != 2) //本模块浅休眠唤醒模式采用GPIO唤醒
  228. {
  229. Log_Printf_Debug("set lightsleep wakeup error!\r\n");
  230. return Result_Failed;
  231. }
  232. // 校验ID
  233. if(!verifyActiveID(activeID)){ return Result_Failed; }
  234. // 判断状态
  235. if(getStatus() == Status_None) // 空闲状态
  236. {
  237. sprintf(AT_CMD, "AT+SLEEPWKCFG=%d,%d,%d\r\n",source,gpio,mode); // 拼接AT指令
  238. result = send_at(AT_CMD, activeID);
  239. }
  240. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  241. {
  242. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  243. result = failed(1); // 失败
  244. }
  245. else if(getTimerMs() > time) // 正在发送状态。判断超时
  246. {
  247. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  248. result = overtime(); // 超时
  249. }
  250. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  251. {
  252. // 发送日志
  253. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  254. Log_SendArray_Debug(AT_result(), AT_result_length());
  255. result = success(); // 成功
  256. }
  257. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  258. {
  259. // 发送日志
  260. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  261. Log_SendArray_Debug(AT_result(), AT_result_length());
  262. result = failed(2); // 失败
  263. }
  264. return result;
  265. }
  266. //7.设置浅睡眠唤醒源-同步
  267. enum Result esp32_set_lightsleep_wakeup_sync(uint8_t source, uint8_t gpio, uint8_t mode)
  268. {
  269. enum Result result = Result_None;
  270. while(1)
  271. {
  272. result = esp32_set_lightsleep_wakeup(source, gpio, mode);
  273. if(result != Result_None)
  274. {
  275. // 重置
  276. esp32.reset();
  277. break;
  278. }
  279. }
  280. return result;
  281. }
  282. /******************************************************************************
  283. * 8.设置睡眠模式
  284. * param1: mode 代表睡眠模式 (0:禁用睡眠模式 1:Modem-sleep模式
  285. * 2:Light-sleep模式 3:Modem-sleep listen interval模式)
  286. *
  287. *******************************************************************************/
  288. enum Result esp32_set_sleep(uint8_t mode)
  289. {
  290. enum Result result = Result_None;
  291. int activeID = 8, time=500; // 活动ID, 超时时间
  292. //校验参数
  293. if(mode != 2) //本模块采用浅休眠模式
  294. {
  295. Log_Printf_Debug("set sleep mode error!\r\n");
  296. return Result_Failed;
  297. }
  298. // 校验ID
  299. if(!verifyActiveID(activeID)){ return Result_Failed; }
  300. // 判断状态
  301. if(getStatus() == Status_None) // 空闲状态
  302. {
  303. sprintf(AT_CMD, "AT+SLEEP=%d\r\n",mode); // 拼接AT指令
  304. result = send_at(AT_CMD, activeID);
  305. }
  306. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  307. {
  308. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  309. result = failed(1); // 失败
  310. }
  311. else if(getTimerMs() > time) // 正在发送状态。判断超时
  312. {
  313. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  314. result = overtime(); // 超时
  315. }
  316. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  317. {
  318. // 发送日志
  319. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  320. Log_SendArray_Debug(AT_result(), AT_result_length());
  321. result = success(); // 成功
  322. }
  323. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  324. {
  325. // 发送日志
  326. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  327. Log_SendArray_Debug(AT_result(), AT_result_length());
  328. result = failed(2); // 失败
  329. }
  330. return result;
  331. }
  332. //9.设置睡眠模式-同步
  333. enum Result esp32_set_sleep_sync(uint8_t mode)
  334. {
  335. enum Result result = Result_None;
  336. while(1)
  337. {
  338. result = esp32_set_sleep(mode);
  339. if(result != Result_None)
  340. {
  341. // 重置
  342. esp32.reset();
  343. break;
  344. }
  345. }
  346. return result;
  347. }
  348. /******************************************************************************
  349. * 10.连接AP
  350. * param1: id 目标名称
  351. * param2: password 密码
  352. *
  353. *******************************************************************************/
  354. enum Result esp32_connect_ap(char * id, char * password)
  355. {
  356. enum Result result = Result_None;
  357. int activeID = 10, time=35000; // 活动ID, 超时时间
  358. // 校验ID
  359. if(!verifyActiveID(activeID)){ return Result_Failed; }
  360. // 判断状态
  361. if(getStatus() == Status_None) // 空闲状态
  362. {
  363. // sprintf(AT_CMD, "AT+CWJAP=\"%s\",\"%s\"\r\n", id, password); // 拼接AT指令
  364. //连接AP且连接时间为30s
  365. sprintf(AT_CMD, "AT+CWJAP=\"%s\",\"%s\",,,,,,30\r\n", id, password); // 拼接AT指令
  366. result = send_at(AT_CMD, activeID);
  367. }
  368. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  369. {
  370. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  371. result = failed(1); // 失败
  372. }
  373. else if(getTimerMs() > time) // 正在发送状态。判断超时
  374. {
  375. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  376. result = overtime(); // 超时
  377. }
  378. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  379. {
  380. // 发送日志
  381. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  382. Log_SendArray_Debug(AT_result(), AT_result_length());
  383. result = success(); // 成功
  384. }
  385. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  386. {
  387. // 发送日志
  388. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  389. Log_SendArray_Debug(AT_result(), AT_result_length());
  390. result = failed(2); // 失败
  391. }
  392. return result;
  393. }
  394. //11.连接AP-同步
  395. enum Result esp32_connect_ap_sync(char * id, char * password)
  396. {
  397. enum Result result = Result_None;
  398. while(1)
  399. {
  400. result = esp32_connect_ap(id, password);
  401. if(result != Result_None)
  402. {
  403. // 重置
  404. esp32.reset();
  405. break;
  406. }
  407. }
  408. return result;
  409. }
  410. /*************************************************************************************
  411. * 12.设置数据传输模式
  412. * param1: mode(0:普通传输模式 1:WiFi透传接收模式,支持TCP单连接、UDP固定通信对端的情况)
  413. *
  414. **************************************************************************************/
  415. enum Result esp32_set_cipmode(uint8_t mode)
  416. {
  417. enum Result result = Result_None;
  418. int activeID = 12, time=500; // 活动ID, 超时时间
  419. //校验参数
  420. if(mode != 0) //本模块采用普通模式
  421. {
  422. Log_Printf_Debug("set cipmode error!\r\n");
  423. return Result_Failed;
  424. }
  425. // 校验ID
  426. if(!verifyActiveID(activeID)){ return Result_Failed; }
  427. // 判断状态
  428. if(getStatus() == Status_None) // 空闲状态
  429. {
  430. sprintf(AT_CMD, "AT+CIPMODE=%d\r\n", mode); // 拼接AT指令
  431. result = send_at(AT_CMD, activeID);
  432. }
  433. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  434. {
  435. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  436. result = failed(1); // 失败
  437. }
  438. else if(getTimerMs() > time) // 正在发送状态。判断超时
  439. {
  440. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  441. result = overtime(); // 超时
  442. }
  443. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  444. {
  445. // 发送日志
  446. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  447. Log_SendArray_Debug(AT_result(), AT_result_length());
  448. result = success(); // 成功
  449. }
  450. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  451. {
  452. // 发送日志
  453. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  454. Log_SendArray_Debug(AT_result(), AT_result_length());
  455. result = failed(2); // 失败
  456. }
  457. return result;
  458. }
  459. //13.设置传输模式-同步
  460. enum Result esp32_set_cipmode_sync(uint8_t mode)
  461. {
  462. enum Result result = Result_None;
  463. while(1)
  464. {
  465. result = esp32_set_cipmode(mode);
  466. if(result != Result_None)
  467. {
  468. // 重置
  469. esp32.reset();
  470. break;
  471. }
  472. }
  473. return result;
  474. }
  475. /******************************************************************************
  476. * 14.连接TCP/UDP服务器
  477. * param1: host远程地址
  478. * param2: port远程端口
  479. *
  480. *******************************************************************************/
  481. enum Result esp32_connect_network(char * service_type, char * IP_address, uint16_t remote_port)
  482. {
  483. enum Result result = Result_None;
  484. int activeID = 14, time=10000; // 活动ID, 超时时间
  485. // 校验ID
  486. if(!verifyActiveID(activeID)){ return Result_Failed; }
  487. // 判断状态
  488. if(getStatus() == Status_None) // 空闲状态
  489. {
  490. sprintf(AT_CMD, "AT+CIPSTART=\"%s\",\"%s\",%d\r\n", service_type, IP_address, remote_port); // 拼接AT指令
  491. result = send_at(AT_CMD, activeID);
  492. }
  493. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  494. {
  495. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  496. result = failed(1); // 失败
  497. }
  498. else if(getTimerMs() > time) // 正在发送状态。判断超时
  499. {
  500. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  501. result = overtime(); // 超时
  502. }
  503. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  504. {
  505. // 发送日志
  506. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  507. Log_SendArray_Debug(AT_result(), AT_result_length());
  508. result = success(); // 成功
  509. }
  510. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  511. {
  512. // 发送日志
  513. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  514. Log_SendArray_Debug(AT_result(), AT_result_length());
  515. result = failed(2); // 失败
  516. }
  517. return result;
  518. }
  519. //15.连接TCP/UDP服务器服务器-同步
  520. enum Result esp32_connect_network_sync(char * service_type, char * IP_address, uint16_t remote_port)
  521. {
  522. enum Result result = Result_None;
  523. while(1)
  524. {
  525. result = esp32_connect_network(service_type, IP_address, remote_port);
  526. if(result != Result_None)
  527. {
  528. // 重置
  529. esp32.reset();
  530. break;
  531. }
  532. }
  533. return result;
  534. }
  535. /******************************************************************************
  536. * 16.查询指定ID的WiFi信号强度
  537. * param1: ID 指定的WIFI名称
  538. *
  539. *******************************************************************************/
  540. enum Result esp32_query_id_signal(char * ID, int * RSSI)
  541. {
  542. enum Result result = Result_None;
  543. int activeID = 16, time=5000; // 活动ID, 超时时间
  544. // 校验ID
  545. if(!verifyActiveID(activeID)){ return Result_Failed; }
  546. // 判断状态
  547. if(getStatus() == Status_None) // 空闲状态
  548. {
  549. sprintf(AT_CMD, "AT+CWLAP=\"%s\"\r\n",ID); // 拼接AT指令
  550. result = send_at(AT_CMD, activeID);
  551. }
  552. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  553. {
  554. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  555. result = failed(1); // 失败
  556. }
  557. else if(getTimerMs() > time) // 正在发送状态。判断超时
  558. {
  559. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  560. result = overtime(); // 超时
  561. }
  562. else if(strstr((char * )AT_result(), "OK") != NULL) // 查询是否返回
  563. {
  564. if(strstr((char * )AT_result(), "+CWLAP:") != NULL)
  565. {
  566. // 发送日志
  567. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  568. Log_SendArray_Debug(AT_result(), AT_result_length());
  569. // 处理返回结果
  570. char * saveptr = NULL;
  571. char * split = ",";
  572. strtok_r((char * )AT_result(), split, &saveptr);
  573. strtok_r(NULL, split, &saveptr);
  574. * RSSI = atoi(strtok_r(NULL, split, &saveptr));
  575. //打印信号强度值
  576. Log_Printf_Debug("指定ID的WiFi强度值:%d\r\n", * RSSI);
  577. result = success(); // 成功
  578. }
  579. else
  580. {
  581. * RSSI = 0;
  582. // 发送日志
  583. Log_Printf_Debug("返回: %d\r\n", AT_result_length());
  584. Log_SendArray_Debug(AT_result(), AT_result_length());
  585. result = failed(3); // 失败
  586. }
  587. }
  588. return result;
  589. }
  590. //17.查询指定ID的WiFi信号强度-同步
  591. enum Result esp32_query_id_signal_sync(char * ID, int * RSSI)
  592. {
  593. enum Result result = Result_None;
  594. while(1)
  595. {
  596. result = esp32_query_id_signal(ID, RSSI);
  597. if(result != Result_None)
  598. {
  599. // 重置
  600. esp32.reset();
  601. break;
  602. }
  603. }
  604. return result;
  605. }
  606. /******************************************************************************
  607. * 18.关闭TCP/UDP链接
  608. *
  609. *******************************************************************************/
  610. enum Result esp32_close_network(void)
  611. {
  612. enum Result result = Result_None;
  613. int activeID = 18, time=1000; // 活动ID, 超时时间
  614. // 校验ID
  615. if(!verifyActiveID(activeID)){ return Result_Failed; }
  616. // 判断状态
  617. if(getStatus() == Status_None) // 空闲状态
  618. {
  619. sprintf(AT_CMD, "AT+CIPCLOSE\r\n"); // 拼接AT指令
  620. result = send_at(AT_CMD, activeID);
  621. }
  622. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  623. {
  624. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  625. result = failed(1); // 失败
  626. }
  627. else if(getTimerMs() > time) // 正在发送状态。判断超时
  628. {
  629. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  630. result = overtime(); // 超时
  631. }
  632. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  633. {
  634. // 发送日志
  635. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  636. Log_SendArray_Debug(AT_result(), AT_result_length());
  637. result = success(); // 成功
  638. }
  639. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  640. {
  641. // 发送日志
  642. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  643. Log_SendArray_Debug(AT_result(), AT_result_length());
  644. Log_Printf_Debug("当前无UDP网络连接\r\n");
  645. result = success(); // 同样返回成功
  646. }
  647. return result;
  648. }
  649. //19.关闭TCP/UDP连接-同步
  650. enum Result esp32_close_network_sync(void)
  651. {
  652. enum Result result = Result_None;
  653. while(1)
  654. {
  655. result = esp32_close_network();
  656. if(result != Result_None)
  657. {
  658. // 重置
  659. esp32.reset();
  660. break;
  661. }
  662. }
  663. return result;
  664. }
  665. /******************************************************************************
  666. * 20.是否自动连接AP
  667. * param1: mode(0:上电不自动连接AP 1:上电自动连接 AP) 本设置保存到NVS区域
  668. *
  669. *******************************************************************************/
  670. enum Result esp32_autoconnect_ap(uint8_t mode)
  671. {
  672. enum Result result = Result_None;
  673. int activeID = 20, time=500; // 活动ID, 超时时间
  674. //校验参数
  675. if(mode != 0) //本系统关闭自动连接AP模式
  676. {
  677. Log_Printf_Debug("set autoconnect mode error!\r\n");
  678. return Result_Failed;
  679. }
  680. // 校验ID
  681. if(!verifyActiveID(activeID)){ return Result_Failed; }
  682. // 判断状态
  683. if(getStatus() == Status_None) // 空闲状态
  684. {
  685. sprintf(AT_CMD, "AT+CWAUTOCONN=%d\r\n", mode); // 拼接AT指令
  686. result = send_at(AT_CMD, activeID);
  687. }
  688. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  689. {
  690. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  691. result = failed(1); // 失败
  692. }
  693. else if(getTimerMs() > time) // 正在发送状态。判断超时
  694. {
  695. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  696. result = overtime(); // 超时
  697. }
  698. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  699. {
  700. // 发送日志
  701. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  702. Log_SendArray_Debug(AT_result(), AT_result_length());
  703. result = success(); // 成功
  704. }
  705. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  706. {
  707. // 发送日志
  708. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  709. Log_SendArray_Debug(AT_result(), AT_result_length());
  710. result = failed(2); // 失败
  711. }
  712. return result;
  713. }
  714. //21.是否自动连接AP-同步
  715. enum Result esp32_autoconnect_ap_sync(uint8_t mode)
  716. {
  717. enum Result result = Result_None;
  718. while(1)
  719. {
  720. result = esp32_autoconnect_ap(mode);
  721. if(result != Result_None)
  722. {
  723. // 重置
  724. esp32.reset();
  725. break;
  726. }
  727. }
  728. return result;
  729. }
  730. /******************************************************************************
  731. * 22.关闭AP连接
  732. *
  733. *******************************************************************************/
  734. enum Result esp32_close_ap(void)
  735. {
  736. enum Result result = Result_None;
  737. int activeID = 22, time=500; // 活动ID, 超时时间
  738. // 校验ID
  739. if(!verifyActiveID(activeID)){ return Result_Failed; }
  740. // 判断状态
  741. if(getStatus() == Status_None) // 空闲状态
  742. {
  743. sprintf(AT_CMD, "AT+CWQAP\r\n"); // 拼接AT指令
  744. result = send_at(AT_CMD, activeID);
  745. }
  746. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  747. {
  748. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  749. result = failed(1); // 失败
  750. }
  751. else if(getTimerMs() > time) // 正在发送状态。判断超时
  752. {
  753. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  754. result = overtime(); // 超时
  755. }
  756. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  757. {
  758. // 发送日志
  759. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  760. Log_SendArray_Debug(AT_result(), AT_result_length());
  761. result = success(); // 成功
  762. }
  763. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  764. {
  765. // 发送日志
  766. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  767. Log_SendArray_Debug(AT_result(), AT_result_length());
  768. result = failed(2); // 失败
  769. }
  770. return result;
  771. }
  772. //23.关闭AP连接-同步
  773. enum Result esp32_close_ap_sync(void)
  774. {
  775. enum Result result = Result_None;
  776. while(1)
  777. {
  778. result = esp32_close_ap();
  779. if(result != Result_None)
  780. {
  781. // 重置
  782. esp32.reset();
  783. break;
  784. }
  785. }
  786. return result;
  787. }
  788. /******************************************************************************
  789. * 24.查询WiFi信号强度
  790. * param1: RSSI信号强度值
  791. *
  792. *******************************************************************************/
  793. enum Result esp32_query_signal(int * RSSI)
  794. {
  795. enum Result result = Result_None;
  796. int activeID = 24, time=5000; // 活动ID, 超时时间
  797. // 校验ID
  798. if(!verifyActiveID(activeID)){ return Result_Failed; }
  799. // 判断状态
  800. if(getStatus() == Status_None) // 空闲状态
  801. {
  802. sprintf(AT_CMD, "AT+CWJAP?\r\n"); // 拼接AT指令
  803. result = send_at(AT_CMD, activeID);
  804. }
  805. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  806. {
  807. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  808. result = failed(1); // 失败
  809. }
  810. else if(getTimerMs() > time) // 正在发送状态。判断超时
  811. {
  812. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  813. result = overtime(); // 超时
  814. }
  815. else if(strstr((char * )AT_result(), "OK") != NULL) // 查询是否返回
  816. {
  817. if(strstr((char * )AT_result(), "CWJAP") != NULL)
  818. {
  819. // 发送日志
  820. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  821. Log_SendArray_Debug(AT_result(), AT_result_length());
  822. // 处理返回结果
  823. char * saveptr = NULL;
  824. char * split = ",";
  825. strtok_r((char * )AT_result(), split, &saveptr);
  826. strtok_r(NULL, split, &saveptr);
  827. strtok_r(NULL, split, &saveptr);
  828. * RSSI = atoi(strtok_r(NULL, split, &saveptr));
  829. //打印信号强度值
  830. Log_Printf_Debug("WiFi信号强度RSSI值: %d\r\n", * RSSI);
  831. result = success(); // 成功
  832. }
  833. else
  834. {
  835. // 发送日志
  836. Log_Printf_Debug("返回: %d\r\n", AT_result_length());
  837. Log_SendArray_Debug(AT_result(), AT_result_length());
  838. result = failed(2); // 失败
  839. }
  840. }
  841. else if(strstr((char * )AT_result(), "ERROR") != NULL)
  842. {
  843. // 发送日志
  844. Log_Printf_Debug("返回: %d\r\n", AT_result_length());
  845. Log_SendArray_Debug(AT_result(), AT_result_length());
  846. result = failed(2); // 失败
  847. }
  848. return result;
  849. }
  850. //25.查询WiFi信号强度-同步
  851. enum Result esp32_query_signal_sync(int * RSSI)
  852. {
  853. enum Result result = Result_None;
  854. while(1)
  855. {
  856. result = esp32_query_signal(RSSI);
  857. if(result != Result_None)
  858. {
  859. // 重置
  860. esp32.reset();
  861. break;
  862. }
  863. }
  864. return result;
  865. }
  866. /******************************************************************************
  867. * 26.模块是否重启
  868. *
  869. *******************************************************************************/
  870. enum Result esp32_ready(void)
  871. {
  872. if(AT_Get_Status() != AT_Status_None)
  873. {
  874. return Result_None;
  875. }
  876. enum Result result = Result_None;
  877. // 判断是否接收到
  878. if(strstr((char *)AT_result(),"ready") != 0)
  879. {
  880. // 发送日志
  881. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  882. Log_SendArray_Debug(AT_result(), AT_result_length());
  883. // 成功结果
  884. result = Result_Success;
  885. // 清理一下AT返回结果缓存
  886. AT_Clear_Result();
  887. }
  888. return result;
  889. }
  890. // 27.模块是否重启
  891. enum Result esp32_ready_sync(void)
  892. {
  893. enum Result result = Result_None;
  894. while(1)
  895. {
  896. result = esp32_ready();
  897. if(result != Result_None)
  898. {
  899. // 重置
  900. esp32.reset();
  901. break;
  902. }
  903. }
  904. return result;
  905. }
  906. /******************************************************************************
  907. * 28.数据处理
  908. *
  909. *******************************************************************************/
  910. enum Result esp32_handle_data(uint8_t * data, uint16_t send_data_length, uint16_t *recv_data_length)
  911. {
  912. enum Result result = Result_None;
  913. int activeID = 28, time=5000; // 活动ID, 超时时间
  914. // 校验ID
  915. if(!verifyActiveID(activeID)){ return Result_Failed; }
  916. // 判断状态
  917. if(getStatus() == Status_None) // 空闲状态
  918. {
  919. sprintf(AT_CMD, "AT+CIPSEND=%d\r\n",send_data_length); // 拼接AT指令
  920. result = send_at(AT_CMD, activeID);
  921. }
  922. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  923. {
  924. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  925. result = failed(1); // 失败
  926. }
  927. else if(getTimerMs() > time) // 正在发送状态。判断超时
  928. {
  929. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  930. result = overtime(); // 超时
  931. }
  932. else if(strstr((char * )AT_result(), "OK\r\n\r\n>") != NULL) // 有响应
  933. {
  934. // 发送日志
  935. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  936. Log_SendArray_Debug(AT_result(), AT_result_length());
  937. //发送数据
  938. send_data(data, send_data_length);
  939. // 清理一下AT返回结果缓存
  940. AT_Clear_Result();
  941. // memset(data, 0, send_data_length);
  942. }
  943. else if(strstr((char * )AT_result(), "+IPD") != NULL)
  944. {
  945. // 防止接收不完整
  946. uint32_t last_time = AT_wait_time();
  947. if(last_time > 20) // 过10ms之后再取数据,避免数据截断。
  948. {
  949. // 发送日志
  950. Log_Printf_Debug("\r\nAT返回: %d, time_diff: %d\r\n", AT_result_length(), last_time);
  951. // Log_SendHex(AT_result(), AT_result_length());
  952. char * saveptr1 = NULL;
  953. char * saveptr2 = NULL;
  954. char * split1 = ",";
  955. char * split2 = ":";
  956. char * line1 = strtok_r((char * )AT_result(), split2, &saveptr1);
  957. uint8_t Line1_Len = strlen(line1);
  958. strtok_r(line1, split1, &saveptr2);
  959. char * length = strtok_r(NULL, split1, &saveptr2);
  960. * recv_data_length = strtoul(length, NULL, 10);
  961. //判断数据是否完整接收
  962. if(* recv_data_length > AT_result_length())
  963. {
  964. Log_Printf_Debug("数据接收出错!!!\r\n");
  965. // 失败
  966. result = Result_Failed;
  967. // 清理一下AT返回结果缓存
  968. AT_Clear_Result();
  969. return result;
  970. }
  971. uint16_t line_length = Line1_Len+1;
  972. // 内存拷贝
  973. memcpy(data, AT_result() + line_length, * recv_data_length);
  974. // 成功
  975. result = Result_Success;
  976. // 清理一下AT返回结果缓存
  977. AT_Clear_Result();
  978. }
  979. }
  980. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  981. {
  982. // 发送日志
  983. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  984. Log_SendArray_Debug(AT_result(), AT_result_length());
  985. result = failed(2); // 失败
  986. }
  987. return result;
  988. }
  989. //29.数据处理-同步
  990. enum Result esp32_handle_data_sync(uint8_t * data, uint16_t send_data_length, uint16_t *recv_data_length)
  991. {
  992. enum Result result = Result_None;
  993. while(1)
  994. {
  995. result = esp32_handle_data( data, send_data_length, recv_data_length);
  996. if(result != Result_None)
  997. {
  998. // 重置
  999. esp32.reset();
  1000. break;
  1001. }
  1002. }
  1003. return result;
  1004. }
  1005. /******************************************************************************
  1006. * 30.判断模块是否正常启动
  1007. *
  1008. *******************************************************************************/
  1009. enum Result esp32_recv_ready(void)
  1010. {
  1011. // 设置AT为使用中,防止被其他程序占用
  1012. AT_Set_Status(AT_Status_Using);
  1013. enum Result result = Result_None;
  1014. // 校验参数
  1015. char cmp[20];
  1016. sprintf(cmp, "ready"); // 拼接AT指令
  1017. // 判断是否接收到
  1018. if(strstr((char * )AT_result(), cmp) != NULL)
  1019. {
  1020. // 发送日志
  1021. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1022. Log_SendArray_Debug(AT_result(), AT_result_length());
  1023. // 成功
  1024. result = Result_Success;
  1025. // 清理一下AT返回结果缓存
  1026. AT_Clear_Result();
  1027. }
  1028. return result;
  1029. }
  1030. //31.判断模块是否正常启动+等待时间
  1031. enum Result esp32_recv_ready_with_time(uint32_t time_out)
  1032. {
  1033. enum Result result = Result_None;
  1034. int activeID = 31, time = time_out; // 活动ID, 超时时间
  1035. // 校验ID
  1036. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1037. // 判断状态
  1038. if(getStatus() == Status_None) // 空闲状态
  1039. {
  1040. setStatus(Status_Sending);
  1041. }
  1042. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1043. {
  1044. result = failed(1); // 失败
  1045. }
  1046. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1047. {
  1048. result = overtime(); // 超时
  1049. }
  1050. else
  1051. {
  1052. // 接收数据
  1053. result = esp32.recv_ready();
  1054. if(result == Result_Success)
  1055. {
  1056. result = success_no_log(); // 成功
  1057. }
  1058. }
  1059. return result;
  1060. }
  1061. /*************************************************************************************
  1062. * 32.设置WiFi工作模式
  1063. * param1: mode(0:无WiFi模式 1:Station模式 2:SoftAP模式 3:SoftAP+Station模式)
  1064. *
  1065. **************************************************************************************/
  1066. enum Result esp32_set_mode(uint8_t mode)
  1067. {
  1068. enum Result result = Result_None;
  1069. int activeID = 32, time=500; // 活动ID, 超时时间
  1070. //校验参数
  1071. if(mode != 1) //本模块采用Station模式
  1072. {
  1073. Log_Printf_Debug("set mode error!\r\n");
  1074. return Result_Failed;
  1075. }
  1076. // 校验ID
  1077. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1078. // 判断状态
  1079. if(getStatus() == Status_None) // 空闲状态
  1080. {
  1081. sprintf(AT_CMD, "AT+CWMODE=%d\r\n", mode); // 拼接AT指令
  1082. result = send_at(AT_CMD, activeID);
  1083. }
  1084. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1085. {
  1086. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  1087. result = failed(1); // 失败
  1088. }
  1089. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1090. {
  1091. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1092. result = overtime(); // 超时
  1093. }
  1094. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  1095. {
  1096. // 发送日志
  1097. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1098. Log_SendArray_Debug(AT_result(), AT_result_length());
  1099. result = success(); // 成功
  1100. }
  1101. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1102. {
  1103. // 发送日志
  1104. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1105. Log_SendArray_Debug(AT_result(), AT_result_length());
  1106. result = failed(2); // 失败
  1107. }
  1108. return result;
  1109. }
  1110. //33.设置WiFi工作模式
  1111. enum Result esp32_set_mode_sync(uint8_t mode)
  1112. {
  1113. enum Result result = Result_None;
  1114. while(1)
  1115. {
  1116. result = esp32_set_mode(mode);
  1117. if(result != Result_None)
  1118. {
  1119. // 重置
  1120. esp32.reset();
  1121. break;
  1122. }
  1123. }
  1124. return result;
  1125. }
  1126. /*************************************************************************************
  1127. * 34.查询WiFi模块的MAC地址
  1128. * param1: MAC_address(模块的MAC地址)
  1129. *
  1130. **************************************************************************************/
  1131. enum Result esp32_query_mac_address(char * MAC_address)
  1132. {
  1133. enum Result result = Result_None;
  1134. int activeID = 34, time=500; // 活动ID, 超时时间
  1135. // 校验ID
  1136. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1137. // 判断状态
  1138. if(getStatus() == Status_None) // 空闲状态
  1139. {
  1140. sprintf(AT_CMD, "AT+CIPSTAMAC?\r\n"); // 拼接AT指令
  1141. result = send_at(AT_CMD, activeID);
  1142. }
  1143. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1144. {
  1145. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  1146. result = failed(1); // 失败
  1147. }
  1148. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1149. {
  1150. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1151. result = overtime(); // 超时
  1152. }
  1153. else if(strstr((char * )AT_result(), "OK") != NULL) // 查询是否返回
  1154. {
  1155. // 发送日志
  1156. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1157. Log_SendArray_Debug(AT_result(), AT_result_length());
  1158. // 处理返回结果
  1159. char * saveptr = NULL;
  1160. char * split = "\"";
  1161. strtok_r((char * )AT_result(), split, &saveptr);
  1162. char * wifi_mac_address = strtok_r(NULL, split, &saveptr);
  1163. //校验获取到的MAC地址长度
  1164. if(strlen(wifi_mac_address) == 17)
  1165. {
  1166. //存储、打印WiFi模块的MAC地址
  1167. memcpy(MAC_address,wifi_mac_address,strlen(wifi_mac_address));
  1168. Log_Printf_Debug("WiFi模块的MAC地址: %s\r\n", MAC_address);
  1169. result = success(); // 成功
  1170. }
  1171. else
  1172. {
  1173. // 发送日志
  1174. Log_Printf_Debug("返回: %d\r\n", AT_result_length());
  1175. Log_SendArray_Debug(AT_result(), AT_result_length());
  1176. result = failed(2); // 失败
  1177. }
  1178. }
  1179. return result;
  1180. }
  1181. /******************************************************************************
  1182. * 35.设置WiFi模块的IP地址
  1183. * param1: IP_address IP地址
  1184. *
  1185. *******************************************************************************/
  1186. enum Result esp32_set_ip_address(char *IP_address)
  1187. {
  1188. enum Result result = Result_None;
  1189. int activeID = 35, time=500; // 活动ID, 超时时间
  1190. // 校验ID
  1191. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1192. // 判断状态
  1193. if(getStatus() == Status_None) // 空闲状态
  1194. {
  1195. sprintf(AT_CMD, "AT+CIPSTA=\"%s\"\r\n", IP_address); // 拼接AT指令
  1196. result = send_at(AT_CMD, activeID);
  1197. }
  1198. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1199. {
  1200. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  1201. result = failed(1); // 失败
  1202. }
  1203. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1204. {
  1205. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1206. result = overtime(); // 超时
  1207. }
  1208. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  1209. {
  1210. // 发送日志
  1211. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1212. Log_SendArray_Debug(AT_result(), AT_result_length());
  1213. result = success(); // 成功
  1214. }
  1215. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1216. {
  1217. // 发送日志
  1218. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1219. Log_SendArray_Debug(AT_result(), AT_result_length());
  1220. result = failed(2); // 失败
  1221. }
  1222. return result;
  1223. }
  1224. /*************************************************************************************
  1225. * 36.设置DHCP模式
  1226. * param1: operate(0:禁用DHCP模式 1:启用DHCP模式)
  1227. * param2: mode(Bit0: Station 的 DHCP,Bit1: SoftAP 的 DHCP)
  1228. *
  1229. **************************************************************************************/
  1230. enum Result esp32_set_dhcp(uint8_t operate,uint8_t mode)
  1231. {
  1232. enum Result result = Result_None;
  1233. int activeID = 36, time=500; // 活动ID, 超时时间
  1234. // 校验ID
  1235. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1236. // 判断状态
  1237. if(getStatus() == Status_None) // 空闲状态
  1238. {
  1239. sprintf(AT_CMD, "AT+CWDHCP=%d,%d\r\n",operate, mode); // 拼接AT指令
  1240. result = send_at(AT_CMD, activeID);
  1241. }
  1242. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1243. {
  1244. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  1245. result = failed(1); // 失败
  1246. }
  1247. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1248. {
  1249. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1250. result = overtime(); // 超时
  1251. }
  1252. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  1253. {
  1254. // 发送日志
  1255. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1256. Log_SendArray_Debug(AT_result(), AT_result_length());
  1257. result = success(); // 成功
  1258. }
  1259. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1260. {
  1261. // 发送日志
  1262. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1263. Log_SendArray_Debug(AT_result(), AT_result_length());
  1264. result = failed(2); // 失败
  1265. }
  1266. return result;
  1267. }
  1268. /******************************************************************************
  1269. * 37.设置WiFi模块的IP地址、网关、掩码
  1270. * param1: IP_address IP地址
  1271. * param2: Gateway 网关
  1272. * param3: Netmask 子网掩码
  1273. *******************************************************************************/
  1274. enum Result esp32_set_gateway(char *IP_address, char *Gateway, char *Netmask)
  1275. {
  1276. enum Result result = Result_None;
  1277. int activeID = 37, time=500; // 活动ID, 超时时间
  1278. // 校验ID
  1279. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1280. // 判断状态
  1281. if(getStatus() == Status_None) // 空闲状态
  1282. {
  1283. sprintf(AT_CMD, "AT+CIPSTA=\"%s\",\"%s\",\"%s\"\r\n", IP_address,Gateway,Netmask); // 拼接AT指令
  1284. result = send_at(AT_CMD, activeID);
  1285. }
  1286. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1287. {
  1288. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  1289. result = failed(1); // 失败
  1290. }
  1291. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1292. {
  1293. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1294. result = overtime(); // 超时
  1295. }
  1296. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  1297. {
  1298. // 发送日志
  1299. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1300. Log_SendArray_Debug(AT_result(), AT_result_length());
  1301. result = success(); // 成功
  1302. }
  1303. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1304. {
  1305. // 发送日志
  1306. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1307. Log_SendArray_Debug(AT_result(), AT_result_length());
  1308. result = failed(2); // 失败
  1309. }
  1310. return result;
  1311. }
  1312. /******************************************************************************
  1313. * 38.重启WiFi模块
  1314. *
  1315. *******************************************************************************/
  1316. enum Result esp32_rst(void)
  1317. {
  1318. enum Result result = Result_None;
  1319. int activeID = 38, time=5000; // 活动ID, 超时时间
  1320. // 校验ID
  1321. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1322. // 判断状态
  1323. if(getStatus() == Status_None) // 空闲状态
  1324. {
  1325. sprintf(AT_CMD, "AT+RST\r\n"); // 拼接AT指令
  1326. result = send_at(AT_CMD, activeID);
  1327. }
  1328. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1329. {
  1330. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  1331. result = failed(1); // 失败
  1332. }
  1333. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1334. {
  1335. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1336. result = overtime(); // 超时
  1337. }
  1338. else if(strstr((char * )AT_result(), "OK") != NULL) // 查询是否返回
  1339. {
  1340. if(strstr((char * )AT_result(), "ready") != NULL)
  1341. {
  1342. // 发送日志
  1343. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1344. Log_SendArray_Debug(AT_result(), AT_result_length());
  1345. result = success(); // 成功
  1346. }
  1347. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1348. {
  1349. Log_Printf_Debug("返回: %d\r\n", AT_result_length());
  1350. Log_SendArray_Debug(AT_result(), AT_result_length());
  1351. result = failed(2); // 失败
  1352. }
  1353. }
  1354. return result;
  1355. }
  1356. /***************************************** 基于ESP32_C3模组的相关结构体声明 *****************************************/
  1357. struct ESP32_Struct esp32=
  1358. {
  1359. .timer = {
  1360. .time = 0,
  1361. .flag = 0
  1362. },
  1363. .reset = esp32_reset,
  1364. .exit_deepsleep = esp32_exit_deepsleep,
  1365. .enter_deepsleep = esp32_enter_deepsleep,
  1366. .exit_lightsleep = esp32_exit_lightsleep,
  1367. .enter_lightsleep = esp32_enter_lightsleep,
  1368. .set_lightsleep_wakeup = esp32_set_lightsleep_wakeup,
  1369. .set_lightsleep_wakeup_sync = esp32_set_lightsleep_wakeup_sync,
  1370. .set_sleep = esp32_set_sleep,
  1371. .set_sleep_sync = esp32_set_sleep_sync,
  1372. .connect_ap = esp32_connect_ap,
  1373. .connect_ap_sync = esp32_connect_ap_sync,
  1374. .set_cipmode = esp32_set_cipmode,
  1375. .set_cipmode_sync = esp32_set_cipmode_sync,
  1376. .connect_network = esp32_connect_network,
  1377. .connect_network_sync = esp32_connect_network_sync,
  1378. .close_network = esp32_close_network,
  1379. .close_network_sync = esp32_close_network_sync,
  1380. .query_id_signal = esp32_query_id_signal,
  1381. .query_id_signal_sync = esp32_query_id_signal_sync,
  1382. .autoconnect_ap = esp32_autoconnect_ap,
  1383. .autoconnect_ap_sync = esp32_autoconnect_ap_sync,
  1384. .close_ap = esp32_close_ap,
  1385. .close_ap_sync = esp32_close_ap_sync,
  1386. .query_signal = esp32_query_signal,
  1387. .query_signal_sync = esp32_query_signal_sync,
  1388. .ready = esp32_ready,
  1389. .ready_sync = esp32_ready_sync,
  1390. .handle_data = esp32_handle_data,
  1391. .handle_data_sync = esp32_handle_data_sync,
  1392. .recv_ready = esp32_recv_ready,
  1393. .recv_ready_with_time = esp32_recv_ready_with_time,
  1394. .set_mode = esp32_set_mode,
  1395. .set_mode_sync = esp32_set_mode_sync,
  1396. .query_mac_address = esp32_query_mac_address,
  1397. .set_ip_address = esp32_set_ip_address,
  1398. .set_dhcp = esp32_set_dhcp,
  1399. .set_gateway = esp32_set_gateway,
  1400. .rst = esp32_rst,
  1401. };
  1402. #endif