Esp32.Regist.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. #include "CONFIG.h"
  2. #if ESP32
  3. /**
  4. ******************************************************************************
  5. * 版 本 :V1.0.0
  6. * 作 者 :huyi
  7. * 版权所有,盗版必究。
  8. * Copyright(C) All rights reserved
  9. ******************************************************************************
  10. * 历史记录
  11. * 序号 版本 变更内容 作者 日期
  12. * 1 V0.0.1 实现WIFI注册 胡一 2024/10/15
  13. *
  14. ******************************************************************************
  15. */
  16. #include "stm32f10x.h"
  17. #include "Regist.h"
  18. #include "esp32.h"
  19. #include "FlashSetup.h"
  20. #include <stdio.h>
  21. #include <stdarg.h>
  22. #include <string.h>
  23. #include <stdlib.h>
  24. #include "cJSON.h"
  25. #include "mbedtls_util.h"
  26. #include "Log_Module.h"
  27. #include "At_Module.h"
  28. #include "Common_Util.h"
  29. #include "Tuoreniot.h"
  30. /**************************************** 相关变量定义 ******************************************/
  31. //系统初始的WiFi连接参数
  32. char INITIAL_WIFI_ID[10]="tuoren";
  33. char INITIAL_WIFI_PASSWORD[10]="123456789";
  34. // 注册参数
  35. static struct TUORENIOT_RegistRequestStruct regist_request = {
  36. .version = 1,
  37. .networkType = 3,
  38. .networkProtocol = 1,
  39. .productId = "1dbfd476b7nm2",
  40. .deviceId = "3431228A1936013C",
  41. .userId = "1000",
  42. .sim = "",
  43. };
  44. /******************************************* 函数声明 *******************************************/
  45. static void REGIST_Process(void); // 注册流程
  46. static void REGIST_SetStatus(enum REGIST_StatusEnum status); // 设置注册状态
  47. static void REGIST_SetResult(enum REGIST_ResultEnum result); // 设置注册结果
  48. static void goto_start(void); // 开始
  49. static void goto_success(void); // 成功
  50. static void goto_failure(char * _info); // 失败
  51. static void goto_finish(void); // 结束
  52. /******************************************* 注册流程 *******************************************/
  53. enum Step{
  54. STEP_NONE,
  55. STEP_START, // 开始
  56. STEP_READY, // 模块是否唤醒
  57. STEP_EXIT_DEEP_SLEEP, // 退出深睡眠
  58. STEP_ENTER_DEEP_SLEEP, // 进入深睡眠
  59. STEP_WAIT, // 等待
  60. STEP_CLOSE_AUTOCONNECT, // 关闭自动连接AP
  61. STEP_QUERY_MAC, // 查询MAC地址
  62. STEP_SET_MODE, // 设置WIFI工作模式
  63. STEP_CONNECT_AP, // 连接AP
  64. STEP_QUERY_SIGNAL, // 查询WiFi信号强度
  65. STEP_SET_CIPMODE, // 设置传输模式
  66. STEP_SET_DHCP, // 设置DHCP模式
  67. STEP_CONNECT_NETWORK, // 连接TCP/UDP网络
  68. STEP_JOIN_REGIST_MESSAGE, //拼接注册数据
  69. STEP_HANDLE, // 处理数据(数据发送+等待发送结果)
  70. STEP_SET_IP, // 设置ip地址
  71. STEP_SET_GATEWAY, // 设置网关(同时设置ip及子网掩码)
  72. STEP_SUCCESS, // 成功
  73. STEP_FAILURE, // 失败
  74. STEP_FINISH, // 流程结束
  75. };
  76. /******************************************* 注册相关函数 *******************************************/
  77. // 步骤跳转时的监听
  78. static uint16_t goto_step_event(uint16_t ns)
  79. {
  80. // 重置esp32状态
  81. esp32.reset();
  82. // 流程控制
  83. uint16_t step = ns;
  84. // if(ns == STEP_SET_CFUN_1 && STEP_SET_CFUN_1_times++ >= 1)
  85. // {
  86. // goto_failure("重新联网次数过多");
  87. // step = STEP_FAILURE;
  88. // }
  89. return step;
  90. }
  91. // 流程控制
  92. static struct PCTRL_Struct pctrl = {
  93. .current_step = STEP_FINISH,
  94. .next_step = STEP_FINISH,
  95. .step_wait = STEP_WAIT,
  96. .goto_step_listener = goto_step_event,
  97. };
  98. // 备注
  99. static char info[40];
  100. // 开始
  101. static void goto_start(void)
  102. {
  103. PCTRL_GotoStep(&pctrl, STEP_START, "开始");
  104. }
  105. // 成功
  106. static void goto_success(void)
  107. {
  108. REGIST_SetResult(REGIST_Result_Success);
  109. PCTRL_GotoStep(&pctrl, STEP_SUCCESS, "成功");
  110. }
  111. // 失败
  112. static void goto_failure(char * _info)
  113. {
  114. REGIST_SetResult(REGIST_Result_Failure);
  115. memset(info, 0, sizeof(info));
  116. strcpy(info, _info);
  117. PCTRL_GotoStep(&pctrl, STEP_FAILURE, "失败");
  118. Log_Printf_Debug("info:%s!\r\n", info);
  119. }
  120. // 结束
  121. static void goto_finish(void)
  122. {
  123. REGIST_SetStatus(REGIST_Status_Done);
  124. PCTRL_GotoStep(&pctrl, STEP_FINISH, "结束");
  125. }
  126. // 注册状态
  127. static enum REGIST_StatusEnum regist_status = REGIST_Status_None;
  128. // 注册结果
  129. static enum REGIST_ResultEnum regist_result = REGIST_Result_None;
  130. // 设置注册状态
  131. static void REGIST_SetStatus(enum REGIST_StatusEnum status)
  132. {
  133. regist_status = status;
  134. }
  135. // 获取注册状态
  136. enum REGIST_StatusEnum REGIST_GetStatus(void)
  137. {
  138. return regist_status;
  139. }
  140. // 设置注册结果
  141. static void REGIST_SetResult(enum REGIST_ResultEnum result)
  142. {
  143. regist_result = result;
  144. }
  145. // 获取注册结果
  146. enum REGIST_ResultEnum REGIST_GetResult(void)
  147. {
  148. if(TUORENIOT_GetCodeOfRegistResponse() == 200){
  149. regist_result = REGIST_Result_Success;
  150. }
  151. else
  152. {
  153. regist_result = REGIST_Result_None;
  154. }
  155. return regist_result;
  156. }
  157. // 重置注册
  158. enum EXECUTE_ResultEnum REGIST_Reset(void)
  159. {
  160. if(REGIST_GetStatus() == REGIST_Status_Being)
  161. {
  162. Log_Printf_Debug("注册流程重置错误!\r\n");
  163. return EXECUTE_Result_Failure;
  164. }
  165. REGIST_SetStatus(REGIST_Status_None);
  166. REGIST_SetResult(REGIST_Result_None);
  167. return EXECUTE_Result_Success;
  168. }
  169. // 开始注册
  170. enum EXECUTE_ResultEnum REGIST_Start(void)
  171. {
  172. REGIST_Reset();
  173. if(REGIST_GetStatus() != REGIST_Status_None)
  174. {
  175. Log_Printf_Debug("注册流程启动错误!\r\n");
  176. return EXECUTE_Result_Failure;
  177. }
  178. goto_start();
  179. REGIST_SetStatus(REGIST_Status_Being);
  180. return EXECUTE_Result_Success;
  181. }
  182. // 注册流程处理,放到大循环里
  183. void REGIST_ProcessHandle(void)
  184. {
  185. if(REGIST_GetStatus() == REGIST_Status_Being)
  186. {
  187. REGIST_Process();
  188. }
  189. }
  190. // 注册流程
  191. static enum Result result = Result_None;
  192. static void REGIST_Process()
  193. {
  194. switch(pctrl.current_step)
  195. {
  196. case STEP_NONE: break; // 空闲
  197. case STEP_START: // 开始
  198. PCTRL_GotoStep(&pctrl, STEP_EXIT_DEEP_SLEEP, "退出休眠");
  199. break;
  200. case STEP_EXIT_DEEP_SLEEP: // 退出深休眠
  201. esp32.exit_deepsleep();
  202. PCTRL_GotoStepWait(&pctrl, STEP_READY,5, "判断模块是否启动");
  203. break;
  204. case STEP_READY: // 判断模块是否启动
  205. result = esp32.recv_ready_with_time(5000);
  206. if(result == Result_Success)
  207. {
  208. PCTRL_GotoStep(&pctrl, STEP_CLOSE_AUTOCONNECT, "关闭自动连接AP模式");
  209. }
  210. else if(result == Result_Failed)
  211. {
  212. goto_failure("WiFi模块启动失败");
  213. }
  214. break;
  215. case STEP_CLOSE_AUTOCONNECT: // 关闭自动连接AP模式
  216. result = esp32.autoconnect_ap(0);
  217. if(result == Result_Success)
  218. {
  219. PCTRL_GotoStep(&pctrl, STEP_QUERY_MAC, "查询WiFi模块MAC地址");
  220. }
  221. else if(result == Result_Failed)
  222. {
  223. goto_failure("关闭自动连接AP模式失败");
  224. }
  225. break;
  226. case STEP_QUERY_MAC:
  227. result = esp32.query_mac_address(regist_request.netMac);
  228. if(result == Result_Success)
  229. {
  230. // Log_Printf_Debug("WiFi模块的MAC地址: %s\r\n", regist_request.netMac);
  231. PCTRL_GotoStep(&pctrl, STEP_SET_MODE, "设置WiFi为Station工作模式");
  232. }
  233. else if(result == Result_Failed)
  234. {
  235. goto_failure("查询WiFi模块MAC地址失败");
  236. }
  237. break;
  238. case STEP_SET_MODE: // 设置WiFi为Station模式
  239. result = esp32.set_mode(1);
  240. if(result == Result_Success)
  241. {
  242. PCTRL_GotoStep(&pctrl, STEP_SET_DHCP, "启动DHCP模式");
  243. }
  244. else if(result == Result_Failed)
  245. {
  246. goto_failure("设置工作模式失败");
  247. }
  248. break;
  249. case STEP_SET_DHCP:
  250. result = esp32.set_dhcp(1,1);
  251. if(result == Result_Success)
  252. {
  253. PCTRL_GotoStep(&pctrl, STEP_CONNECT_AP, "连接AP");
  254. }
  255. else if(result == Result_Failed)
  256. {
  257. goto_failure("设置启动DHCP模式失败");
  258. }
  259. break;
  260. case STEP_CONNECT_AP: // 连接AP
  261. result = esp32.connect_ap(INITIAL_WIFI_ID,INITIAL_WIFI_PASSWORD);
  262. if(result == Result_Success)
  263. {
  264. PCTRL_GotoStep(&pctrl, STEP_SET_CIPMODE, "设置普通传输模式");
  265. }
  266. else if(result == Result_Failed)
  267. {
  268. goto_failure("连接AP失败");
  269. }
  270. break;
  271. case STEP_SET_CIPMODE: //设置普通传输模式
  272. result = esp32.set_cipmode(0);
  273. if(result == Result_Success)
  274. {
  275. PCTRL_GotoStep(&pctrl, STEP_CONNECT_NETWORK, "连接TCP网络");
  276. }
  277. else if(result == Result_Failed)
  278. {
  279. goto_failure("设置传输模式失败");
  280. }
  281. break;
  282. case STEP_CONNECT_NETWORK: //连接TCP网络
  283. result = esp32.connect_network("TCP", REGIST_SERVER, REGIST_PORT);
  284. if(result == Result_Success)
  285. {
  286. PCTRL_GotoStep(&pctrl, STEP_JOIN_REGIST_MESSAGE, "拼接注册信息");
  287. }
  288. else if(result == Result_Failed)
  289. {
  290. goto_failure("连接TCP网络失败");
  291. }
  292. break;
  293. case STEP_JOIN_REGIST_MESSAGE: //拼接注册信息
  294. memset(regist_request.deviceId, 0, sizeof(regist_request.deviceId));
  295. memset(regist_data, 0, sizeof(regist_data));
  296. TUORENIOT_PackRegistRequest(regist_data, &regist_data_length, &regist_request);
  297. TUORENIOT_PrintfRegistRequestStruct(&regist_request);
  298. PCTRL_GotoStep(&pctrl, STEP_HANDLE, "处理数据");
  299. break;
  300. case STEP_HANDLE: //处理数据
  301. result = esp32.handle_data(regist_data, regist_data_length, &regist_data_length);
  302. if(result == Result_Success)
  303. {
  304. uint8_t res = TUORENIOT_AnalysisRegistData(regist_data, regist_data_length);
  305. if(res == 1) // 成功
  306. {
  307. // strcpy(regist_response.ipAddress,"192.168.0.5");
  308. // strcpy(regist_response.gateWay,"192.168.0.6");
  309. // strcpy(regist_response.netMask,"255.255.255.0");
  310. // Log_Printf("ipAddress=%s\r\n", regist_response.ipAddress);
  311. // Log_Printf("gateWay=%s\r\n", regist_response.gateWay);
  312. // Log_Printf("netMask=%s\r\n", regist_response.netMask);
  313. //判断是否需要设置IP地址或同时设置IP、网关、子网掩码
  314. if(strlen(regist_response.ipAddress) == 0) //无需设置IP
  315. {
  316. goto_success();
  317. }
  318. else if(strlen(regist_response.gateWay)==0) //需要设置IP但不设置网关及掩码
  319. {
  320. PCTRL_GotoStep(&pctrl, STEP_SET_IP, "设置IP地址");
  321. }
  322. else
  323. {
  324. PCTRL_GotoStep(&pctrl, STEP_SET_GATEWAY, "设置IP、网关及掩码");
  325. }
  326. }
  327. else // 失败
  328. {
  329. goto_failure("解析失败");
  330. }
  331. }
  332. else if(result == Result_Failed)
  333. {
  334. goto_failure("注册数据处理失败");
  335. }
  336. break;
  337. case STEP_SET_IP: //设置IP
  338. result = esp32.set_ip_address(regist_response.ipAddress);
  339. if(result == Result_Success)
  340. {
  341. goto_success();
  342. }
  343. else if(result == Result_Failed)
  344. {
  345. goto_failure("设置IP地址失败");
  346. }
  347. break;
  348. case STEP_SET_GATEWAY: //设置IP、网关及掩码
  349. result = esp32.set_gateway(regist_response.ipAddress,regist_response.gateWay,regist_response.netMask);
  350. if(result == Result_Success)
  351. {
  352. goto_success();
  353. }
  354. else if(result == Result_Failed)
  355. {
  356. goto_failure("设置IP、网关及掩码失败");
  357. }
  358. break;
  359. case STEP_WAIT: // 等待
  360. PCTRL_Wait(&pctrl);
  361. break;
  362. case STEP_SUCCESS: // 成功
  363. PCTRL_GotoStep(&pctrl, STEP_ENTER_DEEP_SLEEP, "注册成功,模块进入深休眠");
  364. break;
  365. case STEP_FAILURE: // 失败
  366. PCTRL_GotoStep(&pctrl, STEP_ENTER_DEEP_SLEEP, "注册失败,模块进入深休眠");
  367. break;
  368. case STEP_ENTER_DEEP_SLEEP: // 模块进入深休眠
  369. esp32.enter_deepsleep();
  370. Log_Printf_Debug("模块进入深休眠模式\r\n");
  371. goto_finish();
  372. break;
  373. case STEP_FINISH: // 流程结束
  374. break;
  375. default: break;
  376. }
  377. }
  378. #endif