#include "CONFIG.h" #if ESP32 /** ****************************************************************************** * 版 本 :V1.0.0 * 作 者 :huyi * 版权所有,盗版必究。 * Copyright(C) All rights reserved ****************************************************************************** * 历史记录 * 序号 版本 变更内容 作者 日期 * 1 V0.0.1 实现WIFI注册 胡一 2024/10/15 * ****************************************************************************** */ #include "stm32f10x.h" #include "Regist.h" #include "esp32.h" #include "FlashSetup.h" #include #include #include #include #include "cJSON.h" #include "mbedtls_util.h" #include "Log_Module.h" #include "At_Module.h" #include "Common_Util.h" #include "Tuoreniot.h" /**************************************** 相关变量定义 ******************************************/ //系统初始的WiFi连接参数 char INITIAL_WIFI_ID[10]="tuoren"; char INITIAL_WIFI_PASSWORD[10]="123456789"; // 注册参数 static struct TUORENIOT_RegistRequestStruct regist_request = { .version = 1, .networkType = 3, .networkProtocol = 1, .productId = "1dbfd476b7nm2", .deviceId = "3431228A1936013C", .userId = "1000", .sim = "", }; /******************************************* 函数声明 *******************************************/ static void REGIST_Process(void); // 注册流程 static void REGIST_SetStatus(enum REGIST_StatusEnum status); // 设置注册状态 static void REGIST_SetResult(enum REGIST_ResultEnum result); // 设置注册结果 static void goto_start(void); // 开始 static void goto_success(void); // 成功 static void goto_failure(char * _info); // 失败 static void goto_finish(void); // 结束 /******************************************* 注册流程 *******************************************/ enum Step{ STEP_NONE, STEP_START, // 开始 STEP_READY, // 模块是否唤醒 STEP_EXIT_DEEP_SLEEP, // 退出深睡眠 STEP_ENTER_DEEP_SLEEP, // 进入深睡眠 STEP_WAIT, // 等待 STEP_CLOSE_AUTOCONNECT, // 关闭自动连接AP STEP_QUERY_MAC, // 查询MAC地址 STEP_SET_MODE, // 设置WIFI工作模式 STEP_CONNECT_AP, // 连接AP STEP_QUERY_SIGNAL, // 查询WiFi信号强度 STEP_SET_CIPMODE, // 设置传输模式 STEP_SET_DHCP, // 设置DHCP模式 STEP_CONNECT_NETWORK, // 连接TCP/UDP网络 STEP_JOIN_REGIST_MESSAGE, //拼接注册数据 STEP_HANDLE, // 处理数据(数据发送+等待发送结果) STEP_SET_IP, // 设置ip地址 STEP_SET_GATEWAY, // 设置网关(同时设置ip及子网掩码) STEP_SUCCESS, // 成功 STEP_FAILURE, // 失败 STEP_FINISH, // 流程结束 }; /******************************************* 注册相关函数 *******************************************/ // 步骤跳转时的监听 static uint16_t goto_step_event(uint16_t ns) { // 重置esp32状态 esp32.reset(); // 流程控制 uint16_t step = ns; // if(ns == STEP_SET_CFUN_1 && STEP_SET_CFUN_1_times++ >= 1) // { // goto_failure("重新联网次数过多"); // step = STEP_FAILURE; // } return step; } // 流程控制 static struct PCTRL_Struct pctrl = { .current_step = STEP_FINISH, .next_step = STEP_FINISH, .step_wait = STEP_WAIT, .goto_step_listener = goto_step_event, }; // 备注 static char info[40]; // 开始 static void goto_start(void) { PCTRL_GotoStep(&pctrl, STEP_START, "开始"); } // 成功 static void goto_success(void) { REGIST_SetResult(REGIST_Result_Success); PCTRL_GotoStep(&pctrl, STEP_SUCCESS, "成功"); } // 失败 static void goto_failure(char * _info) { REGIST_SetResult(REGIST_Result_Failure); memset(info, 0, sizeof(info)); strcpy(info, _info); PCTRL_GotoStep(&pctrl, STEP_FAILURE, "失败"); Log_Printf_Debug("info:%s!\r\n", info); } // 结束 static void goto_finish(void) { REGIST_SetStatus(REGIST_Status_Done); PCTRL_GotoStep(&pctrl, STEP_FINISH, "结束"); } // 注册状态 static enum REGIST_StatusEnum regist_status = REGIST_Status_None; // 注册结果 static enum REGIST_ResultEnum regist_result = REGIST_Result_None; // 设置注册状态 static void REGIST_SetStatus(enum REGIST_StatusEnum status) { regist_status = status; } // 获取注册状态 enum REGIST_StatusEnum REGIST_GetStatus(void) { return regist_status; } // 设置注册结果 static void REGIST_SetResult(enum REGIST_ResultEnum result) { regist_result = result; } // 获取注册结果 enum REGIST_ResultEnum REGIST_GetResult(void) { if(TUORENIOT_GetCodeOfRegistResponse() == 200){ regist_result = REGIST_Result_Success; } else { regist_result = REGIST_Result_None; } return regist_result; } // 重置注册 enum EXECUTE_ResultEnum REGIST_Reset(void) { if(REGIST_GetStatus() == REGIST_Status_Being) { Log_Printf_Debug("注册流程重置错误!\r\n"); return EXECUTE_Result_Failure; } REGIST_SetStatus(REGIST_Status_None); REGIST_SetResult(REGIST_Result_None); return EXECUTE_Result_Success; } // 开始注册 enum EXECUTE_ResultEnum REGIST_Start(void) { REGIST_Reset(); if(REGIST_GetStatus() != REGIST_Status_None) { Log_Printf_Debug("注册流程启动错误!\r\n"); return EXECUTE_Result_Failure; } goto_start(); REGIST_SetStatus(REGIST_Status_Being); return EXECUTE_Result_Success; } // 注册流程处理,放到大循环里 void REGIST_ProcessHandle(void) { if(REGIST_GetStatus() == REGIST_Status_Being) { REGIST_Process(); } } // 注册流程 static enum Result result = Result_None; static void REGIST_Process() { switch(pctrl.current_step) { case STEP_NONE: break; // 空闲 case STEP_START: // 开始 PCTRL_GotoStep(&pctrl, STEP_EXIT_DEEP_SLEEP, "退出休眠"); break; case STEP_EXIT_DEEP_SLEEP: // 退出深休眠 esp32.exit_deepsleep(); PCTRL_GotoStepWait(&pctrl, STEP_READY,5, "判断模块是否启动"); break; case STEP_READY: // 判断模块是否启动 result = esp32.recv_ready_with_time(5000); if(result == Result_Success) { PCTRL_GotoStep(&pctrl, STEP_CLOSE_AUTOCONNECT, "关闭自动连接AP模式"); } else if(result == Result_Failed) { goto_failure("WiFi模块启动失败"); } break; case STEP_CLOSE_AUTOCONNECT: // 关闭自动连接AP模式 result = esp32.autoconnect_ap(0); if(result == Result_Success) { PCTRL_GotoStep(&pctrl, STEP_QUERY_MAC, "查询WiFi模块MAC地址"); } else if(result == Result_Failed) { goto_failure("关闭自动连接AP模式失败"); } break; case STEP_QUERY_MAC: result = esp32.query_mac_address(regist_request.netMac); if(result == Result_Success) { // Log_Printf_Debug("WiFi模块的MAC地址: %s\r\n", regist_request.netMac); PCTRL_GotoStep(&pctrl, STEP_SET_MODE, "设置WiFi为Station工作模式"); } else if(result == Result_Failed) { goto_failure("查询WiFi模块MAC地址失败"); } break; case STEP_SET_MODE: // 设置WiFi为Station模式 result = esp32.set_mode(1); if(result == Result_Success) { PCTRL_GotoStep(&pctrl, STEP_SET_DHCP, "启动DHCP模式"); } else if(result == Result_Failed) { goto_failure("设置工作模式失败"); } break; case STEP_SET_DHCP: result = esp32.set_dhcp(1,1); if(result == Result_Success) { PCTRL_GotoStep(&pctrl, STEP_CONNECT_AP, "连接AP"); } else if(result == Result_Failed) { goto_failure("设置启动DHCP模式失败"); } break; case STEP_CONNECT_AP: // 连接AP result = esp32.connect_ap(INITIAL_WIFI_ID,INITIAL_WIFI_PASSWORD); if(result == Result_Success) { PCTRL_GotoStep(&pctrl, STEP_SET_CIPMODE, "设置普通传输模式"); } else if(result == Result_Failed) { goto_failure("连接AP失败"); } break; case STEP_SET_CIPMODE: //设置普通传输模式 result = esp32.set_cipmode(0); if(result == Result_Success) { PCTRL_GotoStep(&pctrl, STEP_CONNECT_NETWORK, "连接TCP网络"); } else if(result == Result_Failed) { goto_failure("设置传输模式失败"); } break; case STEP_CONNECT_NETWORK: //连接TCP网络 result = esp32.connect_network("TCP", REGIST_SERVER, REGIST_PORT); if(result == Result_Success) { PCTRL_GotoStep(&pctrl, STEP_JOIN_REGIST_MESSAGE, "拼接注册信息"); } else if(result == Result_Failed) { goto_failure("连接TCP网络失败"); } break; case STEP_JOIN_REGIST_MESSAGE: //拼接注册信息 memset(regist_request.deviceId, 0, sizeof(regist_request.deviceId)); memset(regist_data, 0, sizeof(regist_data)); TUORENIOT_PackRegistRequest(regist_data, ®ist_data_length, ®ist_request); TUORENIOT_PrintfRegistRequestStruct(®ist_request); PCTRL_GotoStep(&pctrl, STEP_HANDLE, "处理数据"); break; case STEP_HANDLE: //处理数据 result = esp32.handle_data(regist_data, regist_data_length, ®ist_data_length); if(result == Result_Success) { uint8_t res = TUORENIOT_AnalysisRegistData(regist_data, regist_data_length); if(res == 1) // 成功 { // strcpy(regist_response.ipAddress,"192.168.0.5"); // strcpy(regist_response.gateWay,"192.168.0.6"); // strcpy(regist_response.netMask,"255.255.255.0"); // Log_Printf("ipAddress=%s\r\n", regist_response.ipAddress); // Log_Printf("gateWay=%s\r\n", regist_response.gateWay); // Log_Printf("netMask=%s\r\n", regist_response.netMask); //判断是否需要设置IP地址或同时设置IP、网关、子网掩码 if(strlen(regist_response.ipAddress) == 0) //无需设置IP { goto_success(); } else if(strlen(regist_response.gateWay)==0) //需要设置IP但不设置网关及掩码 { PCTRL_GotoStep(&pctrl, STEP_SET_IP, "设置IP地址"); } else { PCTRL_GotoStep(&pctrl, STEP_SET_GATEWAY, "设置IP、网关及掩码"); } } else // 失败 { goto_failure("解析失败"); } } else if(result == Result_Failed) { goto_failure("注册数据处理失败"); } break; case STEP_SET_IP: //设置IP result = esp32.set_ip_address(regist_response.ipAddress); if(result == Result_Success) { goto_success(); } else if(result == Result_Failed) { goto_failure("设置IP地址失败"); } break; case STEP_SET_GATEWAY: //设置IP、网关及掩码 result = esp32.set_gateway(regist_response.ipAddress,regist_response.gateWay,regist_response.netMask); if(result == Result_Success) { goto_success(); } else if(result == Result_Failed) { goto_failure("设置IP、网关及掩码失败"); } break; case STEP_WAIT: // 等待 PCTRL_Wait(&pctrl); break; case STEP_SUCCESS: // 成功 PCTRL_GotoStep(&pctrl, STEP_ENTER_DEEP_SLEEP, "注册成功,模块进入深休眠"); break; case STEP_FAILURE: // 失败 PCTRL_GotoStep(&pctrl, STEP_ENTER_DEEP_SLEEP, "注册失败,模块进入深休眠"); break; case STEP_ENTER_DEEP_SLEEP: // 模块进入深休眠 esp32.enter_deepsleep(); Log_Printf_Debug("模块进入深休眠模式\r\n"); goto_finish(); break; case STEP_FINISH: // 流程结束 break; default: break; } } #endif