esp32.c 43 KB

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