Esp32.Regist.c 8.3 KB

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