Huyi 5 月之前
父节点
当前提交
c5df423aed

+ 2 - 2
Drivers/CONFIG.h

@@ -6,9 +6,9 @@
 #define DEBUG 1 // Debug开关 1是开,0是关
 
 // 测试环境
-//#define TEST_ENV 1
+#define TEST_ENV 1
 // 生产环境
-#define PROD_ENV 1
+//#define PROD_ENV 1
 
 
 

+ 13 - 4
Drivers/Modules/Tuoreniot.c

@@ -14,6 +14,7 @@
 #include "FlashSetup.h"
 #include "Timer_Module.h"
 #include "CoAP_Util.h"
+#include "esp32.h"
 
 // 泵号
 extern uint8_t mcu_id[8];
@@ -116,7 +117,9 @@ uint8_t TUORENIOT_AnalysisRegistData(uint8_t * regist_data, uint16_t regist_data
 		strcpy(regist_response.deviceSecret, cJSON_GetObjectItem(json, "deviceSecret")->valuestring);
 		strcpy(regist_response.remoteAddress, cJSON_GetObjectItem(json, "remoteAddress")->valuestring);
 		regist_response.remotePort = cJSON_GetObjectItem(json, "remotePort")->valueint;
-		
+		strcpy(regist_response.ipAddress, cJSON_GetObjectItem(json, "ipAddress")->valuestring);
+		strcpy(regist_response.gateWay, cJSON_GetObjectItem(json, "gateWay")->valuestring);
+		strcpy(regist_response.netMask, cJSON_GetObjectItem(json, "netMask")->valuestring);
 		if(regist_response.platform == 1)
 		{
 			strcpy(regist_response.productKey, cJSON_GetObjectItem(json, "productKey")->valuestring);
@@ -230,7 +233,7 @@ void TUORENIOT_PackAuthMessage(uint8_t * coap_message, uint16_t * coap_message_l
 	// 待签名数据
 	// 签名相关
 	memset(StrForSignature, 0, sizeof(StrForSignature));
-	sprintf(StrForSignature, "clientId%sdeviceName%sproductKey%sseq%d", ClientID, regist_response.deviceId,regist_response.productKey, SeqOffset);
+	sprintf(StrForSignature, "clientId%sdeviceName%sproductKey%sseq%d", ClientID, regist_response.deviceId,regist_response.productId, SeqOffset);
 //	Log_Printf_Debug("认证报文StrForSignature:\r\n%s\r\n", StrForSignature);
 	// 签名
 	memset(sign, 0, sizeof(sign));
@@ -240,12 +243,14 @@ void TUORENIOT_PackAuthMessage(uint8_t * coap_message, uint16_t * coap_message_l
 
 	// payload
 	memset(payload, 0, sizeof(payload));
-	sprintf((char * )payload, "{\"clientId\":\"%s\",\"signmethod\":\"hmacsha1\",\"sign\":\"%s\",\"productKey\":\"%s\",\"deviceName\":\"%s\",\"seq\":\"%d\"}", ClientID, sign, regist_response.productKey, regist_response.deviceId, SeqOffset);
+	sprintf((char * )payload, "{\"clientId\":\"%s\",\"signmethod\":\"hmacsha1\",\"sign\":\"%s\",\"productKey\":\"%s\",\"deviceName\":\"%s\",\"seq\":\"%d\"}", ClientID, sign, regist_response.productId, regist_response.deviceId, SeqOffset);
+	
+
 	// 设置payload
 	CoAP_Set_Payload_Str((char *)payload);
 	
 	
-//	Log_Printf_Debug("payload:\r\n%s\r\n", payload);
+	Log_Printf_Debug("payload:\r\n%s\r\n", payload);
 	
 	// 生成报文
 	* coap_message_length = CoAP_Get_Length();
@@ -426,6 +431,7 @@ void TUORENIOT_PrintfRegistRequestStruct(struct TUORENIOT_RegistRequestStruct *
 	Log_Printf("deviceId=%s\r\n", regist_params_struct->deviceId);
 	Log_Printf("userId=%s\r\n", regist_params_struct->userId);
 	Log_Printf("sim=%s\r\n", regist_params_struct->sim);
+	Log_Printf("netMac=%s\r\n", regist_params_struct->netMac);
 	Log_Printf("------print regist params end------\r\n");
 }
 
@@ -445,6 +451,9 @@ void TUORENIOT_PrintfRegistResponseStruct(void)
 	Log_Printf("remoteAddress=%s\r\n", regist_response.remoteAddress);
 	Log_Printf("remotePort=%d\r\n", regist_response.remotePort);
 	Log_Printf("wifiNumber=%d\r\n", regist_response.wifiNumber);
+	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);
 	Log_Printf("------print regist result end------\r\n");
 }
 

+ 3 - 0
Drivers/Modules/Tuoreniot.h

@@ -46,6 +46,9 @@ struct TUORENIOT_RegistResponseStruct
 	uint16_t remotePort;
 	uint8_t wifiNumber;
 	struct Wifi_Struct wifi[10];
+	char ipAddress[20];
+	char gateWay[20];
+	char netMask[20];
 };
 
 // ³õʼ»¯

+ 57 - 3
Drivers/Modules/esp32/Esp32.Regist.c

@@ -34,7 +34,7 @@
 //系统初始的WiFi连接参数 
 char INITIAL_WIFI_ID[10]="tuoren";
 char INITIAL_WIFI_PASSWORD[10]="123456789";
-char MAC_ADDRESS[20];	//MAC地址
+
 
 
 // 注册参数
@@ -74,10 +74,13 @@ enum Step{
 	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, // 失败
@@ -261,13 +264,24 @@ static void REGIST_Process()
 						result = esp32.set_mode(1);
 						if(result == Result_Success)
 						{
-							PCTRL_GotoStep(&pctrl, STEP_CONNECT_AP, "连接AP");
+							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)
@@ -317,7 +331,25 @@ static void REGIST_Process()
 							uint8_t res = TUORENIOT_AnalysisRegistData(regist_data, regist_data_length);
 							if(res == 1) // 成功
 							{
-								goto_success();
+//								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 // 失败
 							{
@@ -329,6 +361,28 @@ static void REGIST_Process()
 							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;				

+ 1 - 1
Drivers/Modules/esp32/Esp32_UDP_Client5.c

@@ -454,7 +454,7 @@ static void UDPCLIENT_Process(void)
 						PCTRL_Wait(&pctrl);
 						break;
 		case STEP_RESET: 			// 发送流程重置
-						PCTRL_GotoStep(&pctrl, STEP_SELECT_AP, "数据发送流程重置>>>>>>选择AP");
+						PCTRL_GotoStep(&pctrl, STEP_SET_MODE, "数据发送流程重置>>>>>>设置WiFi工作模式");
 						break;
 		case STEP_SUCCESS: 			// 成功
 						PCTRL_GotoStep(&pctrl, STEP_ENTER_DEEP_SLEEP, "泵数据发送成功,进入深休眠");

+ 149 - 1
Drivers/Modules/esp32/esp32.c

@@ -11,7 +11,7 @@
 #include "Common_Util.h"
 #include "Log_Module.h"
 #include "At_Module.h"
-
+#include "Tuoreniot.h"
 
 /******************************************* 基于ESP32_C3模组的相关方法声明 *******************************************/
 
@@ -58,6 +58,10 @@ enum Result esp32_set_mode(uint8_t mode);					//32.
 enum Result esp32_set_mode_sync(uint8_t mode);				//33.设置WiFi模式-同步
 
 enum Result esp32_query_mac_address(char * MAC_address);	//34.查询WiFi模块的MAC地址
+enum Result esp32_set_ip_address(char *IP_address);			//35.设置WiFi模块的IP地址
+enum Result esp32_set_dhcp(uint8_t operate,uint8_t mode);	//36.设置启用DHCP模式
+enum Result esp32_set_gateway(char *IP_address, char *Gateway, char *Netmask);	//37.设置WiFi模块的IP地址、网关、掩码
+
 
 /*************************************************** AT指令相关函数 ***************************************************/
 
@@ -1279,6 +1283,146 @@ enum Result esp32_query_mac_address(char * MAC_address)
 	return result;
 }
 
+/******************************************************************************
+* 35.设置WiFi模块的IP地址
+* param1: IP_address		IP地址
+*
+*******************************************************************************/
+enum Result esp32_set_ip_address(char *IP_address)
+{
+	enum Result result = Result_None;
+	int activeID = 35, time=500; 		// 活动ID, 超时时间
+
+	// 校验ID
+	if(!verifyActiveID(activeID)){ return Result_Failed; }
+	// 判断状态
+	if(getStatus() == Status_None) 		// 空闲状态
+	{
+		sprintf(AT_CMD, "AT+CIPSTA=\"%s\"\r\n", IP_address); 	// 拼接AT指令
+		result = send_at(AT_CMD, activeID);
+	}
+	else if(getStatus() != Status_Sending) 		  		// 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
+	{
+		Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
+		result = failed(1);		// 失败
+	}
+	else if(getTimerMs() > time) 						// 正在发送状态。判断超时
+	{
+		Log_Printf_Debug("AT指令返回超时\r\n"); 			// 打印日志
+		result = overtime(); 	// 超时
+	}
+	else if(strstr((char * )AT_result(), "OK\r\n") != NULL) 	// 查询是否返回
+	{
+			// 发送日志
+			Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
+			Log_SendArray_Debug(AT_result(), AT_result_length());
+			result = success(); // 成功
+		
+	}
+	else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) 	// 查询是否返回
+	{
+		// 发送日志
+		Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
+		Log_SendArray_Debug(AT_result(), AT_result_length());
+		result = failed(2); // 失败
+	}
+	return result;
+}
+
+/*************************************************************************************
+* 36.设置DHCP模式
+* param1: operate(0:禁用DHCP模式  1:启用DHCP模式)
+* param2: mode(Bit0: Station 的 DHCP,Bit1: SoftAP 的 DHCP)
+*
+**************************************************************************************/
+enum Result esp32_set_dhcp(uint8_t operate,uint8_t mode)
+{
+	enum Result result = Result_None;
+	int activeID = 36, time=500; 		// 活动ID, 超时时间
+	// 校验ID
+	if(!verifyActiveID(activeID)){ return Result_Failed; }
+	// 判断状态
+	if(getStatus() == Status_None) 		// 空闲状态
+	{
+		sprintf(AT_CMD, "AT+CWDHCP=%d,%d\r\n",operate, mode); 	// 拼接AT指令
+		result = send_at(AT_CMD, activeID);
+	}
+	else if(getStatus() != Status_Sending) 		  		// 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
+	{
+		Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
+		result = failed(1);		// 失败
+	}
+	else if(getTimerMs() > time) 						// 正在发送状态。判断超时
+	{
+		Log_Printf_Debug("AT指令返回超时\r\n"); 			// 打印日志
+		result = overtime(); 	// 超时
+	}
+	else if(strstr((char * )AT_result(), "OK\r\n") != NULL) 	// 查询是否返回
+	{
+			// 发送日志
+			Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
+			Log_SendArray_Debug(AT_result(), AT_result_length());
+			result = success(); // 成功
+		
+	}
+	else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) 	// 查询是否返回
+	{
+		// 发送日志
+		Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
+		Log_SendArray_Debug(AT_result(), AT_result_length());
+		result = failed(2); // 失败
+	}
+	return result;
+	
+}
+
+/******************************************************************************
+* 37.设置WiFi模块的IP地址、网关、掩码
+* param1: IP_address		IP地址
+* param2: Gateway			网关
+* param3: Netmask			子网掩码
+*******************************************************************************/
+
+enum Result esp32_set_gateway(char *IP_address, char *Gateway, char *Netmask)
+{
+	enum Result result = Result_None;
+	int activeID = 37, time=500; 		// 活动ID, 超时时间
+
+	// 校验ID
+	if(!verifyActiveID(activeID)){ return Result_Failed; }
+	// 判断状态
+	if(getStatus() == Status_None) 		// 空闲状态
+	{
+		sprintf(AT_CMD, "AT+CIPSTA=\"%s\",\"%s\",\"%s\"\r\n", IP_address,Gateway,Netmask); 	// 拼接AT指令
+		result = send_at(AT_CMD, activeID);
+	}
+	else if(getStatus() != Status_Sending) 		  		// 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
+	{
+		Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
+		result = failed(1);		// 失败
+	}
+	else if(getTimerMs() > time) 						// 正在发送状态。判断超时
+	{
+		Log_Printf_Debug("AT指令返回超时\r\n"); 			// 打印日志
+		result = overtime(); 	// 超时
+	}
+	else if(strstr((char * )AT_result(), "OK\r\n") != NULL) 	// 查询是否返回
+	{
+			// 发送日志
+			Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
+			Log_SendArray_Debug(AT_result(), AT_result_length());
+			result = success(); // 成功
+		
+	}
+	else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) 	// 查询是否返回
+	{
+		// 发送日志
+		Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
+		Log_SendArray_Debug(AT_result(), AT_result_length());
+		result = failed(2); // 失败
+	}
+	return result;
+}
 
 /***************************************** 基于ESP32_C3模组的相关结构体声明 *****************************************/
 
@@ -1322,6 +1466,10 @@ struct ESP32_Struct esp32=
 	.set_mode = esp32_set_mode,			
 	.set_mode_sync = esp32_set_mode_sync,
 	.query_mac_address = esp32_query_mac_address,
+	.set_ip_address = esp32_set_ip_address,
+	.set_dhcp = esp32_set_dhcp,
+	.set_gateway = esp32_set_gateway,
+	
 };
 			
 #endif

+ 3 - 2
Drivers/Modules/esp32/esp32.h

@@ -9,8 +9,6 @@
 //系统初始的WiFi连接参数 
 extern char WIFI_ID[50];
 extern char WIFI_PASSWORD[30];
-//WiFi模块MAC地址 
-extern char MAC_ADDRESS[20];
 
 enum Result
 {
@@ -79,6 +77,9 @@ struct ESP32_Struct
 	enum Result (* set_mode_sync)(uint8_t mode);				//33.设置WiFi模式-同步
 	
 	enum Result (* query_mac_address)(char * MAC_address);		//34.查询WiFi模块的MAC地址
+	enum Result (* set_ip_address)(char *IP_address);			//35.设置WiFi模块的IP地址
+	enum Result (* set_dhcp)(uint8_t operate,uint8_t mode);		//36.设置启用DHCP模式
+	enum Result (* set_gateway)(char *IP_address, char *Gateway, char *Netmask);	//37.设置WiFi模块的IP地址、网关、掩码
 };