浏览代码

Merge branch 'master' of http://192.168.100.32:3000/longsanlang/Network-Modules

# Conflicts:
#	Drivers/CONFIG.h
龙三郎 4 月之前
父节点
当前提交
4f858d7871

+ 48 - 0
Drivers/CONFIG.h

@@ -0,0 +1,48 @@
+#ifndef __CONFIG_H
+#define __CONFIG_H
+#include <stdint.h>
+
+
+#define DEBUG 1 // Debug开关 1是开,0是关
+
+// 测试环境
+//#define TEST_ENV 1
+// 生产环境
+#define PROD_ENV 1
+
+
+
+#define EC800M 1 //4G开关,不能数字开头
+//#define BC260Y 1  // NB
+//#define ESP32 1		//WiFi
+//#define AIWB2	1	//WIFI_AIWB2-32S
+
+
+// 数据发送内容配置
+#define SEND_SIM_FLAG 1 // 发送的数据中有sim卡号
+
+
+
+
+// 何龙祥的配置
+//睡眠相关IO配置 
+#define WAKE_GPIO_RCC RCC_APB2Periph_GPIOA
+#define WAKE_GPIO GPIOA
+#define WAKE_GPIO_Pin GPIO_Pin_6 // 睡眠的引脚
+//flash相关配置
+#define FLASH_SIZE 64
+#define FLASH_SAVE_ADDR 0X0800F800
+
+
+
+// 刘艳斌的配置
+//睡眠相关IO配置
+//#define WAKE_GPIO_RCC RCC_APB2Periph_GPIOE
+//#define WAKE_GPIO GPIOE
+//#define WAKE_GPIO_Pin GPIO_Pin_5 // 睡眠的引脚
+////flash相关配置
+//#define FLASH_SIZE 512
+//#define SAVE_ADDR 0X0807E000
+
+
+#endif

+ 21 - 8
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];
@@ -29,12 +30,16 @@ uint16_t regist_data_length;
 // 生产环境
 char * REGIST_SERVER = "iot.tuoren.com" ; //注册服务器地址
 uint16_t REGIST_PORT = 8888; //端口号
+
 #endif
 
 #if TEST_ENV
 
-char * REGIST_SERVER = "18017zi0ec26.vicp.fun" ; //注册服务器地址
-uint16_t REGIST_PORT = 58562; //端口号
+//char * REGIST_SERVER = "18017zi0ec26.vicp.fun" ; //注册服务器地址
+//uint16_t REGIST_PORT = 58562; //端口号
+
+char * REGIST_SERVER = "z18z017026.51vip.biz" ; //注册服务器地址
+uint16_t REGIST_PORT = 10029; //端口号
 
 #endif
 
@@ -68,8 +73,8 @@ void TUORENIOT_PackRegistRequest(uint8_t * pack_data, uint16_t * pack_data_lengt
 	Log_Printf_Debug("mcu_id: %s\r\n", mcu_id);
 	byteToHexStr(mcu_id, registParams->deviceId, sizeof(mcu_id));
 
-	sprintf((char *)(pack_data + 2), "{\"version\":\"%d\",\"networkType\":\"%d\",\"networkProtocol\":\"%d\",\"productId\":\"%s\",\"deviceId\":\"%s\",\"userId\":\"%s\",\"sim\":\"%s\"}", 
-	registParams->version, registParams->networkType, registParams->networkProtocol, registParams->productId, registParams->deviceId, registParams->userId, registParams->sim); // 拼接AT指令
+	sprintf((char *)(pack_data + 2), "{\"version\":\"%d\",\"networkType\":\"%d\",\"networkProtocol\":\"%d\",\"productId\":\"%s\",\"deviceId\":\"%s\",\"userId\":\"%s\",\"sim\":\"%s\",\"netMac\":\"%s\"}", 
+	registParams->version, registParams->networkType, registParams->networkProtocol, registParams->productId, registParams->deviceId, registParams->userId, registParams->sim, registParams->netMac); // 拼接AT指令
 	Log_Printf_Debug("%s\r\n", (char *)(pack_data + 2));
 	
 	uint16_t datalen = utils_aes128_ECB_base64_enc_with_length(regist_key, (pack_data + 2));
@@ -112,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);
@@ -226,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));
@@ -236,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();
@@ -422,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");
 }
 
@@ -441,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");
 }
 

+ 4 - 0
Drivers/Modules/Tuoreniot.h

@@ -22,6 +22,7 @@ struct TUORENIOT_RegistRequestStruct
 	char deviceId[20];
 	char userId[20];
 	char sim[30];
+	char netMac[20];
 };
 
 struct Wifi_Struct
@@ -45,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];
 };
 
 // ³õʼ»¯

+ 59 - 5
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, // 失败
@@ -246,10 +249,10 @@ static void REGIST_Process()
 						}
 						break;
 		case STEP_QUERY_MAC:
-						result = esp32.query_mac_address(MAC_ADDRESS);
+						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)
@@ -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, "泵数据发送成功,进入深休眠");

+ 153 - 4
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指令相关函数 ***************************************************/
 
@@ -1258,11 +1262,12 @@ enum Result esp32_query_mac_address(char * MAC_address)
 				char * split = "\"";
 				
 				strtok_r((char * )AT_result(), split, &saveptr);
-				MAC_address = strtok_r(NULL, split, &saveptr);
+				char * wifi_mac_address = strtok_r(NULL, split, &saveptr);
 				//校验获取到的MAC地址长度
-				if(strlen( MAC_address) == 17)
+				if(strlen(wifi_mac_address) == 17)
 				{
-					//打印信号强度值
+					//存储、打印WiFi模块的MAC地址
+					memcpy(MAC_address,wifi_mac_address,strlen(wifi_mac_address));
 					Log_Printf_Debug("WiFi模块的MAC地址: %s\r\n", MAC_address);
 					result = success(); // 成功
 				}
@@ -1278,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模组的相关结构体声明 *****************************************/
 
@@ -1321,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地址、网关、掩码
 };