esp32.c 32 KB

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