Esp32.Regist.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  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. .deviceId = "3431228A1936013C",
  40. .userId = "1000"
  41. };
  42. /******************************************* 函数声明 *******************************************/
  43. static void REGIST_Process(void); // 注册流程
  44. static void REGIST_SetStatus(enum REGIST_StatusEnum status); // 设置注册状态
  45. static void REGIST_SetResult(enum REGIST_ResultEnum result); // 设置注册结果
  46. static void goto_start(void); // 开始
  47. static void goto_success(void); // 成功
  48. static void goto_failure(char * _info); // 失败
  49. static void goto_finish(void); // 结束
  50. /******************************************* 注册流程 *******************************************/
  51. enum Step{
  52. STEP_NONE,
  53. STEP_START, // 开始
  54. STEP_READY, // 模块是否唤醒
  55. STEP_EXIT_DEEP_SLEEP, // 退出深睡眠
  56. STEP_ENTER_DEEP_SLEEP, // 进入深睡眠
  57. STEP_WAIT, // 等待
  58. STEP_SET_MODE, // 设置WIFI工作模式
  59. STEP_CLOSE_AUTOCONNECT, // 关闭自动连接AP
  60. STEP_CONNECT_AP, // 连接AP
  61. STEP_QUERY_SIGNAL, // 查询WiFi信号强度
  62. STEP_SET_CIPMODE, // 设置传输模式
  63. STEP_CONNECT_NETWORK, // 连接TCP/UDP网络
  64. STEP_JOIN_REGIST_MESSAGE, //拼接注册数据
  65. STEP_HANDLE, // 处理数据(数据发送+等待发送结果)
  66. STEP_SUCCESS, // 成功
  67. STEP_FAILURE, // 失败
  68. STEP_FINISH, // 流程结束
  69. };
  70. /******************************************* 注册相关函数 *******************************************/
  71. // 步骤跳转时的监听
  72. static uint16_t goto_step_event(uint16_t ns)
  73. {
  74. // 重置esp32状态
  75. esp32.reset();
  76. // 流程控制
  77. uint16_t step = ns;
  78. // if(ns == STEP_SET_CFUN_1 && STEP_SET_CFUN_1_times++ >= 1)
  79. // {
  80. // goto_failure("重新联网次数过多");
  81. // step = STEP_FAILURE;
  82. // }
  83. return step;
  84. }
  85. // 流程控制
  86. static struct PCTRL_Struct pctrl = {
  87. .current_step = STEP_FINISH,
  88. .next_step = STEP_FINISH,
  89. .step_wait = STEP_WAIT,
  90. .goto_step_listener = goto_step_event,
  91. };
  92. // 备注
  93. static char info[40];
  94. // 开始
  95. static void goto_start(void)
  96. {
  97. PCTRL_GotoStep(&pctrl, STEP_START, "开始");
  98. }
  99. // 成功
  100. static void goto_success(void)
  101. {
  102. REGIST_SetResult(REGIST_Result_Success);
  103. PCTRL_GotoStep(&pctrl, STEP_SUCCESS, "成功");
  104. }
  105. // 失败
  106. static void goto_failure(char * _info)
  107. {
  108. REGIST_SetResult(REGIST_Result_Failure);
  109. memset(info, 0, sizeof(info));
  110. strcpy(info, _info);
  111. PCTRL_GotoStep(&pctrl, STEP_FAILURE, "失败");
  112. Log_Printf_Debug("info:%s!\r\n", info);
  113. }
  114. // 结束
  115. static void goto_finish(void)
  116. {
  117. REGIST_SetStatus(REGIST_Status_Done);
  118. PCTRL_GotoStep(&pctrl, STEP_FINISH, "结束");
  119. }
  120. // 注册状态
  121. static enum REGIST_StatusEnum regist_status = REGIST_Status_None;
  122. // 注册结果
  123. static enum REGIST_ResultEnum regist_result = REGIST_Result_None;
  124. // 设置注册状态
  125. static void REGIST_SetStatus(enum REGIST_StatusEnum status)
  126. {
  127. regist_status = status;
  128. }
  129. // 获取注册状态
  130. enum REGIST_StatusEnum REGIST_GetStatus(void)
  131. {
  132. return regist_status;
  133. }
  134. // 设置注册结果
  135. static void REGIST_SetResult(enum REGIST_ResultEnum result)
  136. {
  137. regist_result = result;
  138. }
  139. // 获取注册结果
  140. enum REGIST_ResultEnum REGIST_GetResult(void)
  141. {
  142. if(TUORENIOT_GetCodeOfRegistResponse() == 200){
  143. regist_result = REGIST_Result_Success;
  144. }
  145. else
  146. {
  147. regist_result = REGIST_Result_None;
  148. }
  149. return regist_result;
  150. }
  151. // 重置注册
  152. enum EXECUTE_ResultEnum REGIST_Reset(void)
  153. {
  154. if(REGIST_GetStatus() == REGIST_Status_Being)
  155. {
  156. Log_Printf_Debug("注册流程重置错误!\r\n");
  157. return EXECUTE_Result_Failure;
  158. }
  159. REGIST_SetStatus(REGIST_Status_None);
  160. REGIST_SetResult(REGIST_Result_None);
  161. return EXECUTE_Result_Success;
  162. }
  163. // 开始注册
  164. enum EXECUTE_ResultEnum REGIST_Start(void)
  165. {
  166. REGIST_Reset();
  167. if(REGIST_GetStatus() != REGIST_Status_None)
  168. {
  169. Log_Printf_Debug("注册流程启动错误!\r\n");
  170. return EXECUTE_Result_Failure;
  171. }
  172. goto_start();
  173. REGIST_SetStatus(REGIST_Status_Being);
  174. return EXECUTE_Result_Success;
  175. }
  176. // 注册流程处理,放到大循环里
  177. void REGIST_ProcessHandle(void)
  178. {
  179. if(REGIST_GetStatus() == REGIST_Status_Being)
  180. {
  181. REGIST_Process();
  182. }
  183. }
  184. // 注册流程
  185. static enum Result result = Result_None;
  186. static void REGIST_Process()
  187. {
  188. switch(pctrl.current_step)
  189. {
  190. case STEP_NONE: break; // 空闲
  191. case STEP_START: // 开始
  192. PCTRL_GotoStep(&pctrl, STEP_EXIT_DEEP_SLEEP, "退出休眠");
  193. break;
  194. case STEP_EXIT_DEEP_SLEEP: // 退出深休眠
  195. esp32.exit_deepsleep();
  196. PCTRL_GotoStepWait(&pctrl, STEP_READY,5, "判断模块是否启动");
  197. break;
  198. case STEP_READY: // 判断模块是否启动
  199. result = esp32.recv_ready_with_time(5000);
  200. if(result == Result_Success)
  201. {
  202. PCTRL_GotoStep(&pctrl, STEP_CLOSE_AUTOCONNECT, "关闭自动连接AP模式");
  203. }
  204. else if(result == Result_Failed)
  205. {
  206. goto_failure("WiFi模块启动失败");
  207. }
  208. break;
  209. case STEP_CLOSE_AUTOCONNECT: // 关闭自动连接AP模式
  210. result = esp32.autoconnect_ap(0);
  211. if(result == Result_Success)
  212. {
  213. PCTRL_GotoStep(&pctrl, STEP_SET_MODE, "设置WiFi为Station工作模式");
  214. }
  215. else if(result == Result_Failed)
  216. {
  217. goto_failure("关闭自动连接AP模式失败");
  218. }
  219. break;
  220. case STEP_SET_MODE: // 设置WiFi为Station模式
  221. result = esp32.set_mode(1);
  222. if(result == Result_Success)
  223. {
  224. PCTRL_GotoStep(&pctrl, STEP_CONNECT_AP, "连接AP");
  225. }
  226. else if(result == Result_Failed)
  227. {
  228. goto_failure("设置工作模式失败");
  229. }
  230. break;
  231. case STEP_CONNECT_AP: // 连接AP
  232. result = esp32.connect_ap(INITIAL_WIFI_ID,INITIAL_WIFI_PASSWORD);
  233. if(result == Result_Success)
  234. {
  235. PCTRL_GotoStep(&pctrl, STEP_SET_CIPMODE, "设置普通传输模式");
  236. }
  237. else if(result == Result_Failed)
  238. {
  239. goto_failure("连接AP失败");
  240. }
  241. break;
  242. case STEP_SET_CIPMODE: //设置普通传输模式
  243. result = esp32.set_cipmode(0);
  244. if(result == Result_Success)
  245. {
  246. PCTRL_GotoStep(&pctrl, STEP_CONNECT_NETWORK, "连接TCP网络");
  247. }
  248. else if(result == Result_Failed)
  249. {
  250. goto_failure("设置传输模式失败");
  251. }
  252. break;
  253. case STEP_CONNECT_NETWORK: //连接TCP网络
  254. result = esp32.connect_network("TCP", REGIST_SERVER, REGIST_PORT);
  255. if(result == Result_Success)
  256. {
  257. PCTRL_GotoStep(&pctrl, STEP_JOIN_REGIST_MESSAGE, "拼接注册信息");
  258. }
  259. else if(result == Result_Failed)
  260. {
  261. goto_failure("连接TCP网络失败");
  262. }
  263. break;
  264. case STEP_JOIN_REGIST_MESSAGE: //拼接注册信息
  265. memset(regist_request.deviceId, 0, sizeof(regist_request.deviceId));
  266. memset(regist_data, 0, sizeof(regist_data));
  267. TUORENIOT_PackRegistRequest(regist_data, &regist_data_length, &regist_request);
  268. TUORENIOT_PrintfRegistRequestStruct(&regist_request);
  269. PCTRL_GotoStep(&pctrl, STEP_HANDLE, "处理数据");
  270. break;
  271. case STEP_HANDLE: //处理数据
  272. result = esp32.handle_data(regist_data, regist_data_length, &regist_data_length);
  273. if(result == Result_Success)
  274. {
  275. uint8_t res = TUORENIOT_AnalysisRegistData(regist_data, regist_data_length);
  276. if(res == 1) // 成功
  277. {
  278. goto_success();
  279. }
  280. else // 失败
  281. {
  282. goto_failure("解析失败");
  283. }
  284. }
  285. else if(result == Result_Failed)
  286. {
  287. goto_failure("注册数据处理失败");
  288. }
  289. break;
  290. case STEP_WAIT: // 等待
  291. PCTRL_Wait(&pctrl);
  292. break;
  293. case STEP_SUCCESS: // 成功
  294. PCTRL_GotoStep(&pctrl, STEP_ENTER_DEEP_SLEEP, "注册成功,模块进入深休眠");
  295. break;
  296. case STEP_FAILURE: // 失败
  297. PCTRL_GotoStep(&pctrl, STEP_ENTER_DEEP_SLEEP, "注册失败,模块进入深休眠");
  298. break;
  299. case STEP_ENTER_DEEP_SLEEP: // 模块进入深休眠
  300. esp32.enter_deepsleep();
  301. Log_Printf_Debug("模块进入深休眠模式\r\n");
  302. goto_finish();
  303. break;
  304. case STEP_FINISH: // 流程结束
  305. break;
  306. default: break;
  307. }
  308. }
  309. #endif