esp32.c 34 KB

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