esp32.c 34 KB

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