Browse Source

全新代码

YunZhiNeng 1 year ago
parent
commit
40a67a0718

+ 1 - 1
Drivers/AT.c

@@ -219,8 +219,8 @@ void my_timer()
 	bc260y.timer_ms++;
 	#endif
     #if  _4GFLAG
-	
 	ec800m.timer_ms++;
+	Restart_time_ms++;
 	#endif
 }
 

+ 2 - 2
Drivers/AT.h

@@ -1,8 +1,8 @@
 #ifndef __AT_H
 #define __AT_H
 #include <stdint.h>
-#define NBFLAG 200
-//#define _4GFLAG 100 //4G开关,不能数字开头
+//#define NBFLAG 200
+#define _4GFLAG 100 //4G开关,不能数字开头
 
 // AT指令状态
 enum AT_Status

+ 16 - 224
Drivers/BC260_UDP_Client5.c

@@ -32,6 +32,7 @@
 #include "pump_dicts.h"
 #include "INflash.h"
 #include "PumpBusiness.h"
+#include "aliyuniot.h"
 #if  NBFLAG
 
 
@@ -89,40 +90,20 @@ extern Coefficient_Data flashdata;
 static uint8_t connectID = 1;
 
 
-/** 阿里云连接参数 **/
-static char ProductKey[20] = "a1t3qlUNDcP";
-static char DeviceName[20] = "LTEcat1ceshi001";
-static char DeviceSecret[40] = "4929a78860f663ec72e2c313a4eee7ac";
-
-static char ClientID[60];
-static char Seq[10] = "666";
-
-static uint16_t Port = 5682;
-static char Host[60];
-
-static uint32_t SeqOffset;
-static char Random[20];
-static char Token[50];
-
-// payload缓存
-//static uint8_t payload[256];
-//static uint16_t payload_length;
 // coap报文
 static uint8_t coap_message[512]; 
 static uint16_t coap_message_length = 0;
-// aes cbc
-static uint8_t aes_key[16] = {0};
-static char iv[] = "543yhjy97ae7fyfg";
+
 
 // 泵参数
 extern struct Pump_Params pump_params;
 // 待发送数据的地址和长度
-static uint8_t data[128];
+static uint8_t databuff[128];
 static uint16_t data_length;
 
 static uint8_t test_flag=0;
 
-
+extern struct AT_Struct AT;
 // 计时相关的变量
 uint8_t Client5_time_flag = 0;
 uint32_t Client5_timer_ms = 0;
@@ -152,20 +133,10 @@ void Query_Signal(int * RSRP, int * RSRQ, int * RSSI, int * SINR)
 // 初始化
 void UDP_Client5_Init(void)
 {
-	// 赋值三元组
-	strcpy(ProductKey, flashdata.productKey);
-	strcpy(DeviceName, flashdata.deviceName);
-	strcpy(DeviceSecret, flashdata.deviceSecret);
-	
+
+	aliyuniot_set_device_params(flashdata.productKey,flashdata.deviceName,flashdata.deviceSecret);
 	// 设置host
-	memset(Host, '\0', sizeof(Host));
-	strcat(Host, ProductKey);
-	strcat(Host, ".coap.cn-shanghai.link.aliyuncs.com");
-	// 设置clientid
-	memset(ClientID, '\0', sizeof(ClientID));
-	strcat(ClientID, ProductKey);
-	strcat(ClientID, "&");
-	strcat(ClientID, DeviceName);
+ 
 }
 // 声明函数。步骤跳转
 void goto_step(enum Step ns);
@@ -177,8 +148,6 @@ void UDP_Client5_Send(struct Pump_Params params,uint8_t test_switch)
 	test_flag=test_switch;
 	if(step == STEP_NONE)
 	{
-		// 待发送数据的地址和长度
-//		pump_params = params;
 		// 初始化
 		UDP_Client5_Init();
 		// 正在发送
@@ -267,183 +236,7 @@ static void wait(void)
 	}
 }
 
-// 判断认证还是发送
-static uint8_t judge_auth_or_data(void)
-{
-	if(strlen(Token) > 0) // 已认证
-	{
-		return 1;
-	}
-	else
-	{
-		return 0;
-	}
-}
-// 拼接认证报文
-static void join_auth_message(uint8_t * coap_message, uint16_t * coap_message_length)
-{
-	SeqOffset=65535;
-	Log_Printf_Debug("STEP: 拼接认证报文,seqOffset=%d\r\n", SeqOffset);
-	// 先清除
-//	memset(coap_message, 0, sizeof(coap_message));
-//	coap_message_length = 0;
-	
-	// CoAP协议
-	CoAP_Init();
-	CoAP_Set_T(0);
-	CoAP_Set_Code(2);
-	CoAP_Set_MessageID(SeqOffset);
-	// option
-	// host
-	CoAP_Set_Option_Str(3, Host);
-	// port
-	CoAP_Set_Option_Short(7, Port);
-	// path
-	CoAP_Set_Option_Str(11, "auth");
-	// content-format
-	CoAP_Set_Option_Short(12, 50);
-	// accept
-	CoAP_Set_Option_Short(17, 50);
-	
-	// 待签名数据
-	// 签名相关
-	static char StrForSignature[100];
-	static char sign[50];
-	memset(StrForSignature, '\0', sizeof(StrForSignature));
-	sprintf((char * )StrForSignature, "clientId%sdeviceName%sproductKey%sseq%s", ClientID, DeviceName, ProductKey, Seq);
-	// 签名
-	memset(sign, '\0', sizeof(sign));
-	utils_hmac_sha1_str(StrForSignature, strlen((char * )StrForSignature), sign, DeviceSecret, strlen(DeviceSecret));
-
-	// payload
-//	memset(payload, '\0', sizeof(payload));
-	char payload[256] = {0};
-	sprintf((char * )payload, "{\"clientId\":\"%s\",\"signmethod\":\"hmacsha1\",\"sign\":\"%s\",\"productKey\":\"%s\",\"deviceName\":\"%s\",\"seq\":\"%s\"}", ClientID, sign, ProductKey, DeviceName, Seq);
-	// 设置payload
-	CoAP_Set_Payload_Str(payload);
-	
-	// 生成报文
-	* coap_message_length = CoAP_Get_Length();
-	memcpy(coap_message, CoAP_Get_Message(), * coap_message_length);
-}
-
-// 拼接数据报文
-static void join_data_message(uint8_t * data, uint8_t data_length, uint8_t * coap_message, uint16_t * coap_message_length)
-{
-	SeqOffset++;
-	Log_Printf_Debug("STEP: 拼接数据报文,seqOffset=%d\r\n", SeqOffset);
-	
-	// 先清除
-//	memset(coap_message, 0, sizeof(coap_message));
-//	coap_message_length = 0;
-	
-	char out[80]={0};
-	char sha256_source[100] = {0};
-	snprintf(sha256_source, sizeof(sha256_source), "%s,%s" ,DeviceSecret ,Random);
-	Log_Printf_Debug("sha256_source: %s\r\n", sha256_source);
-	utils_sha256(sha256_source, strlen(sha256_source), out);
-	memset(aes_key, 0, sizeof(aes_key));
-	memcpy(aes_key, out+8, 16); //获取key
-	
-	// CoAP协议
-	CoAP_Init();
-	CoAP_Set_T(0);
-	CoAP_Set_Code(2);
-	CoAP_Set_MessageID(SeqOffset);
-	// option
-	// host
-	CoAP_Set_Option_Str(3, Host);
-	// port
-	CoAP_Set_Option_Short(7, Port);
-	// path
-	CoAP_Set_Option_Str(11, "topic");
-	CoAP_Set_Option_Str(11, "sys");
-	CoAP_Set_Option_Str(11, ProductKey);
-	CoAP_Set_Option_Str(11, DeviceName);
-	CoAP_Set_Option_Str(11, "thing");
-	CoAP_Set_Option_Str(11, "model");
-	CoAP_Set_Option_Str(11, "up_raw");
-	// content-format
-	CoAP_Set_Option_Short(12, 50);
-	// accept
-	CoAP_Set_Option_Short(17, 50);
-	// 2088
-	CoAP_Set_Option_Str(2088, Token);
-	// 2089
-	char Rand2089[10] = {'\0'};
-	char Opt2089[20] = {'\0'};
-	my_itoa(SeqOffset, Rand2089, 10);
-	int Opt2089_Length = utils_aes128_cbc_enc((char * )aes_key, iv, Rand2089, Opt2089);
-	CoAP_Set_Option_Str(2089, Opt2089);
-	
-	// payload
-//	memset(payload, '\0', sizeof(payload));
-	uint8_t payload[256] = {0};
-	
-	// 
-	int payload_length = utils_aes128_cbc_enc_with_length((char * )aes_key, iv, data, data_length, payload);
-//		payload_length = utils_aes128_cbc_enc((char * )aes_key, iv, (char * )Data_Buffer, (char * )payload);
-	Log_Printf_Debug("payload_length: %d\r\n", payload_length);
-	
-	CoAP_Set_Payload(payload, payload_length);
-	
-	// 生成报文
-	* coap_message_length = CoAP_Get_Length();
-	memcpy(coap_message, CoAP_Get_Message(), * coap_message_length);
-}
-
-// 等待数据返回
-static uint8_t recv_data_handle(uint8_t * coap_message, uint16_t coap_message_length)
-{
-	uint16_t payload_length = CoAP_Get_Payload_Length(coap_message, coap_message_length);
-	uint8_t payload[256] = {0};
-	CoAP_Get_Payload(coap_message, coap_message_length, payload);
-	
-	Log_Printf_Debug("payload长度: %d\r\n", payload_length);
-	
-	// 判断是认证返回,还是数据发送返回
-	if(payload_length == 0) // 无返回
-	{
-		// 清空Token,重新认证
-		memset(Token, '\0', sizeof(Token));
-		return 0;
-	}
-	else if(payload[0] == '{' && payload[payload_length-1] == '}') // 认证返回
-	{
-		// 解析json
-		cJSON * cjson = cJSON_Parse((char * )payload);
-		Log_Printf_Debug("plaintext(%d): %s\r\n",payload_length, payload);
-		memset(Random, '\0', sizeof(Random));
-		memset(Token, '\0', sizeof(Token));
-		if(cJSON_HasObjectItem(cjson, "random"))
-		{
-			char * random = cJSON_GetObjectItem(cjson, "random")->valuestring;
-			strcpy(Random, random);
-		}
-		if(cJSON_HasObjectItem(cjson, "seqOffset"))
-		{
-			uint16_t seqOffset = cJSON_GetObjectItem(cjson, "seqOffset")->valueint;
-			SeqOffset = seqOffset;
-		}
-		if(cJSON_HasObjectItem(cjson, "token"))
-		{
-			char * token = cJSON_GetObjectItem(cjson, "token")->valuestring;
-			strcpy(Token, token);
-		}
-		Log_Printf_Debug("\r\n(%s, %s, %d)\r\n", Random, Token, SeqOffset);
-		cJSON_Delete(cjson);//清除结构体 
-		return 1;
-	}
-	else
-	{
-		// 数据发送成功返回
-		uint8_t plaintext[256] = {0}; // 明文
-		uint16_t plaintext_length = utils_aes128_cbc_dec((char * )aes_key, iv, (char * )payload, payload_length, (char * )plaintext);
-		Log_Printf_Debug("\r\nplaintext(%d): %s\r\n",plaintext_length, (char *)plaintext);
-		return 2;
-	}
-}
-// 发送数据的逻辑
+//// 发送数据的逻辑
 static enum Result result = Result_None;
 static uint8_t cgreg_n; 
 static uint8_t cgreg_stat; 
@@ -519,7 +312,6 @@ void UDP_Client5_Handle(void)
 					pump_params.lac = cgreg_lac;
 					pump_params.ci = cgreg_ci;
 					// 编码
-					business_protocol_encode(pump_params, data, &data_length);
 						// 下一步
 					if(test_flag == 0)
 					{
@@ -579,7 +371,7 @@ void UDP_Client5_Handle(void)
 			}
 		   break;
 		case STEP_OPEN: // 打开客户端
-			result = bc260y.open_socket(connectID, "UDP", Host, Port, 1, &socket_err);
+			result = bc260y.open_socket(connectID, "UDP",aliyuniot_get_host(), aliyuniot_get_port(), 1, &socket_err);
 			if(result == Result_Success)
 			{
 				if(socket_err == 0)
@@ -597,7 +389,7 @@ void UDP_Client5_Handle(void)
 			}
 			break;
 		case STEP_JUDGE_AUTH_OR_DATA: // 判断认证还是发送
-			auth_or_data = judge_auth_or_data();
+			auth_or_data = aliyuniot_is_authentication();
 			if(auth_or_data == 1) // 已认证
 			{
 				goto_step(STEP_JOIN_DATA_MESSAGE);
@@ -614,7 +406,7 @@ void UDP_Client5_Handle(void)
 			}
 			else 
 			{
-				join_auth_message(coap_message, &coap_message_length);
+				aliyuniot_get_auth_message(coap_message, &coap_message_length);
 				goto_step(STEP_SEND);
 				auth_times++;
 			}
@@ -624,13 +416,13 @@ void UDP_Client5_Handle(void)
 			pump_params.ci = cgreg_ci;
 			Pump_Params_Refresh();
 					// 编码
-			business_protocol_encode(pump_params, data, &data_length);
-			join_data_message(data, data_length, coap_message, &coap_message_length);
+			business_protocol_encode(pump_params, databuff, &data_length);
+			aliyuniot_get_data_message(databuff, data_length, coap_message, &coap_message_length);
 			goto_step(STEP_SEND);
 			break;
-
+ 
 		case STEP_SEND: // 发送send
-			result = bc260y.send_rai(connectID, coap_message, coap_message_length,2);
+			result = bc260y.send(connectID, coap_message, coap_message_length);
 			if(result == Result_Success)
 			{
 				goto_step(STEP_RECV);
@@ -644,7 +436,7 @@ void UDP_Client5_Handle(void)
 			result = bc260y.recv_with_time(connectID, coap_message, &coap_message_length, 10000);
 			if(result == Result_Success)
 			{
-				uint8_t res = recv_data_handle(coap_message, coap_message_length);
+				uint8_t res = aliyuniot_recv_data_handle(coap_message, coap_message_length);
 				if(res == 0) // 发送失败
 				{
 					goto_step(STEP_JUDGE_AUTH_OR_DATA); // 重新认证

+ 10 - 18
Drivers/Business/PumpBusiness.c

@@ -22,10 +22,10 @@ uint8_t Business_time_flag = 0;
 uint32_t Business_timer_ms = 0;
 uint32_t Business_wait_time = 1200; // 秒
 uint8_t resend_counter = 0;//nb失败重发标志
-uint8_t send_data_switch = 0; // 发送数据的开关,0表示发送数据
+uint8_t send_data_switch = 1; // 发送数据的开关,0表示发送数据
 uint8_t networkTest_Flag=0;//开机判断是否有信号,0是未知默认状态,1是失败状态,2是成功状态。
 struct Pump_Params pump_params; // 泵参数
-uint8_t test_switch=1; //0代表正常流程,1代表测试流程
+uint8_t test_switch=0; //0代表正常流程,1代表测试流程
 static uint16_t Data_Number = 0; // 数据编号
 static uint16_t Data_success_Number = 0; // 成功包
 static uint16_t Data_fail_Number = 0; // 失败包
@@ -33,7 +33,7 @@ extern Coefficient_Data flashdata;
 
 int RSRP1=0;
 int RSRQ2=0; 
-int RSSI3=0; 
+int RSSI3=0;                      
 int SINR4=0;
 
 // 泵参数初始化
@@ -73,7 +73,7 @@ void Pump_Params_Refresh(void)
 	pump_params.pumpType = 1;
 	pump_params.infusionId = 234;
 	
-	pump_params.dataNumber = Data_Number+2;
+	pump_params.dataNumber = Data_Number;
 	pump_params.electricity=99;
 	pump_params.validTimes=10;
 	pump_params.appendDose=3;
@@ -113,34 +113,23 @@ void PumpBusines_Handle(void)
 	
 	
 	
-	#if  NBFLAG
-	if(send_data_switch == 1)
-	{
-	#endif
-	#if  _4GFLAG
+
 	// 发送数据的逻辑
 	if(send_data_switch == 1 && set_mincfun_flag ==1)
 	{
-	#endif
-//		Pump_Data_Refresh(); // 刷新数据
+
 		if(UDP_Client5_Status() == Client_Status_None)
 		{
 			if(test_switch==1&&Data_Number>=100)
 			{
 			   send_data_switch=0;
 				
-//				Data_Number =0;
-//				Data_success_Number=0;
-//				Data_fail_Number=0;
 				return ;
 			}
 			Data_Number++; // 数据编号加1
 			Business_time_flag = 0; // 继续定时
 			// 初始化参数
 			Pump_Params_Init();
-			// 更新参数
-//			Pump_Params_Refresh();
-			
 			
 			// 发送参数
 			UDP_Client5_Send(pump_params,test_switch);
@@ -191,8 +180,11 @@ void PumpBusines_Handle(void)
 // 循环执行
 void pump_business_loop_execution()
 {
+	
 	Power_Handle();
 	#if  _4GFLAG
+	if(module_switch==1) return;
+	#endif
 	
 	if(networkTest_Flag==2)
 	{
@@ -202,7 +194,7 @@ void pump_business_loop_execution()
 	{
 	 //信号显示关
 	}
-	#endif
+	
 	if(flashdata.read_flag==0)return;//注册失败或flash存储失败
 	//if(network_switch==1)return;//关闭网络状态
 	// 业务处理

+ 3 - 3
Drivers/CONFIG.h

@@ -2,9 +2,9 @@
 #define __CONFIG_H
 
 // 睡眠相关IO配置
-#define WAKE_GPIO_RCC RCC_APB2Periph_GPIOC
-#define WAKE_GPIO GPIOC
-#define WAKE_GPIO_Pin GPIO_Pin_4 // 睡眠的引脚
+#define WAKE_GPIO_RCC RCC_APB2Periph_GPIOE
+#define WAKE_GPIO GPIOE
+#define WAKE_GPIO_Pin GPIO_Pin_5 // 睡眠的引脚
 
 
 

+ 9 - 218
Drivers/EC800M_UDP_Client5.c

@@ -16,6 +16,7 @@
 #include "pump_dicts.h"
 #include "INflash.h"
 #include "PumpBusiness.h"
+#include "aliyuniot.h"
 
 #if  _4GFLAG
 
@@ -74,35 +75,14 @@ extern Coefficient_Data flashdata;
 static uint8_t connectID = 5;
 
 
-/** 阿里云连接参数 **/
-static char ProductKey[20] = "a1t3qlUNDcP";
-static char DeviceName[20] = "LTEcat1ceshi001";
-static char DeviceSecret[40] = "4929a78860f663ec72e2c313a4eee7ac";
 
-static char ClientID[60];
-static char Seq[10] = "666";
-
-static uint16_t Port = 5682;
-static char Host[60];
-
-static uint32_t SeqOffset;
-static char Random[20];
-static char Token[50];
-
-// payload缓存
-//static uint8_t payload[256];
-//static uint16_t payload_length;
-// coap报文
 static uint8_t coap_message[512]; 
 static uint16_t coap_message_length = 0;
-// aes cbc
-static uint8_t aes_key[16] = {0};
-static char iv[] = "543yhjy97ae7fyfg";
 
 // 泵参数
 extern struct Pump_Params pump_params;
 // 待发送数据的地址和长度
-static uint8_t data[128];
+static uint8_t databuff[128];
 static uint16_t data_length;
 
 static uint8_t test_flag=0;
@@ -138,20 +118,7 @@ void Query_Signal(int * RSRP, int * RSRQ, int * RSSI, int * SINR)
 // 初始化
 void UDP_Client5_Init(void)
 {
-	// 赋值三元组
-	strcpy(ProductKey, flashdata.productKey);
-	strcpy(DeviceName, flashdata.deviceName);
-	strcpy(DeviceSecret, flashdata.deviceSecret);
-	
-	// 设置host
-	memset(Host, '\0', sizeof(Host));
-	strcat(Host, ProductKey);
-	strcat(Host, ".coap.cn-shanghai.link.aliyuncs.com");
-	// 设置clientid
-	memset(ClientID, '\0', sizeof(ClientID));
-	strcat(ClientID, ProductKey);
-	strcat(ClientID, "&");
-	strcat(ClientID, DeviceName);
+	aliyuniot_set_device_params(flashdata.productKey,flashdata.deviceName,flashdata.deviceSecret);
 }
 // 声明函数。步骤跳转
 void goto_step(enum Step ns);
@@ -253,182 +220,6 @@ static void wait(void)
 	}
 }
 
-// 判断认证还是发送
-static uint8_t judge_auth_or_data(void)
-{
-	if(strlen(Token) > 0) // 已认证
-	{
-		return 1;
-	}
-	else
-	{
-		return 0;
-	}
-}
-// 拼接认证报文
-static void join_auth_message(uint8_t * coap_message, uint16_t * coap_message_length)
-{
-	SeqOffset=65535;
-	Log_Printf_Debug("STEP: 拼接认证报文,seqOffset=%d\r\n", SeqOffset);
-	// 先清除
-//	memset(coap_message, 0, sizeof(coap_message));
-//	coap_message_length = 0;
-	
-	// CoAP协议
-	CoAP_Init();
-	CoAP_Set_T(0);
-	CoAP_Set_Code(2);
-	CoAP_Set_MessageID(SeqOffset);
-	// option
-	// host
-	CoAP_Set_Option_Str(3, Host);
-	// port
-	CoAP_Set_Option_Short(7, Port);
-	// path
-	CoAP_Set_Option_Str(11, "auth");
-	// content-format
-	CoAP_Set_Option_Short(12, 50);
-	// accept
-	CoAP_Set_Option_Short(17, 50);
-	
-	// 待签名数据
-	// 签名相关
-	static char StrForSignature[100];
-	static char sign[50];
-	memset(StrForSignature, '\0', sizeof(StrForSignature));
-	sprintf((char * )StrForSignature, "clientId%sdeviceName%sproductKey%sseq%s", ClientID, DeviceName, ProductKey, Seq);
-	// 签名
-	memset(sign, '\0', sizeof(sign));
-	utils_hmac_sha1_str(StrForSignature, strlen((char * )StrForSignature), sign, DeviceSecret, strlen(DeviceSecret));
-
-	// payload
-//	memset(payload, '\0', sizeof(payload));
-	char payload[256] = {0};
-	sprintf((char * )payload, "{\"clientId\":\"%s\",\"signmethod\":\"hmacsha1\",\"sign\":\"%s\",\"productKey\":\"%s\",\"deviceName\":\"%s\",\"seq\":\"%s\"}", ClientID, sign, ProductKey, DeviceName, Seq);
-	// 设置payload
-	CoAP_Set_Payload_Str(payload);
-	
-	// 生成报文
-	* coap_message_length = CoAP_Get_Length();
-	memcpy(coap_message, CoAP_Get_Message(), * coap_message_length);
-}
-
-// 拼接数据报文
-static void join_data_message(uint8_t * data, uint8_t data_length, uint8_t * coap_message, uint16_t * coap_message_length)
-{
-	SeqOffset++;
-	Log_Printf_Debug("STEP: 拼接数据报文,seqOffset=%d\r\n", SeqOffset);
-	
-	// 先清除
-//	memset(coap_message, 0, sizeof(coap_message));
-//	coap_message_length = 0;
-	
-	char out[80]={0};
-	char sha256_source[100] = {0};
-	snprintf(sha256_source, sizeof(sha256_source), "%s,%s" ,DeviceSecret ,Random);
-	Log_Printf_Debug("sha256_source: %s\r\n", sha256_source);
-	utils_sha256(sha256_source, strlen(sha256_source), out);
-	memset(aes_key, 0, sizeof(aes_key));
-	memcpy(aes_key, out+8, 16); //获取key
-	
-	// CoAP协议
-	CoAP_Init();
-	CoAP_Set_T(0);
-	CoAP_Set_Code(2);
-	CoAP_Set_MessageID(SeqOffset);
-	// option
-	// host
-	CoAP_Set_Option_Str(3, Host);
-	// port
-	CoAP_Set_Option_Short(7, Port);
-	// path
-	CoAP_Set_Option_Str(11, "topic");
-	CoAP_Set_Option_Str(11, "sys");
-	CoAP_Set_Option_Str(11, ProductKey);
-	CoAP_Set_Option_Str(11, DeviceName);
-	CoAP_Set_Option_Str(11, "thing");
-	CoAP_Set_Option_Str(11, "model");
-	CoAP_Set_Option_Str(11, "up_raw");
-	// content-format
-	CoAP_Set_Option_Short(12, 50);
-	// accept
-	CoAP_Set_Option_Short(17, 50);
-	// 2088
-	CoAP_Set_Option_Str(2088, Token);
-	// 2089
-	char Rand2089[10] = {'\0'};
-	char Opt2089[20] = {'\0'};
-	my_itoa(SeqOffset, Rand2089, 10);
-	int Opt2089_Length = utils_aes128_cbc_enc((char * )aes_key, iv, Rand2089, Opt2089);
-	CoAP_Set_Option_Str(2089, Opt2089);
-	
-	// payload
-//	memset(payload, '\0', sizeof(payload));
-	uint8_t payload[256] = {0};
-	
-	// 
-	int payload_length = utils_aes128_cbc_enc_with_length((char * )aes_key, iv, data, data_length, payload);
-//		payload_length = utils_aes128_cbc_enc((char * )aes_key, iv, (char * )Data_Buffer, (char * )payload);
-	Log_Printf_Debug("payload_length: %d\r\n", payload_length);
-	
-	CoAP_Set_Payload(payload, payload_length);
-	
-	// 生成报文
-	* coap_message_length = CoAP_Get_Length();
-	memcpy(coap_message, CoAP_Get_Message(), * coap_message_length);
-}
-
-// 等待数据返回
-static uint8_t recv_data_handle(uint8_t * coap_message, uint16_t coap_message_length)
-{
-	uint16_t payload_length = CoAP_Get_Payload_Length(coap_message, coap_message_length);
-	uint8_t payload[256] = {0};
-	CoAP_Get_Payload(coap_message, coap_message_length, payload);
-	
-	Log_Printf_Debug("payload长度: %d\r\n", payload_length);
-	
-	// 判断是认证返回,还是数据发送返回
-	if(payload_length == 0) // 无返回
-	{
-		// 清空Token,重新认证
-		memset(Token, '\0', sizeof(Token));
-		return 0;
-	}
-	else if(payload[0] == '{' && payload[payload_length-1] == '}') // 认证返回
-	{
-		// 解析json
-		cJSON * cjson = cJSON_Parse((char * )payload);
-		Log_Printf_Debug("plaintext(%d): %s\r\n",payload_length, payload);
-		memset(Random, '\0', sizeof(Random));
-		memset(Token, '\0', sizeof(Token));
-		if(cJSON_HasObjectItem(cjson, "random"))
-		{
-			char * random = cJSON_GetObjectItem(cjson, "random")->valuestring;
-			strcpy(Random, random);
-		}
-		if(cJSON_HasObjectItem(cjson, "seqOffset"))
-		{
-			uint16_t seqOffset = cJSON_GetObjectItem(cjson, "seqOffset")->valueint;
-			SeqOffset = seqOffset;
-		}
-		if(cJSON_HasObjectItem(cjson, "token"))
-		{
-			char * token = cJSON_GetObjectItem(cjson, "token")->valuestring;
-			strcpy(Token, token);
-		}
-		Log_Printf_Debug("\r\n(%s, %s, %d)\r\n", Random, Token, SeqOffset);
-		cJSON_Delete(cjson);//清除结构体 
-		return 1;
-	}
-	else
-	{
-		// 数据发送成功返回
-		uint8_t plaintext[256] = {0}; // 明文
-		uint16_t plaintext_length = utils_aes128_cbc_dec((char * )aes_key, iv, (char * )payload, payload_length, (char * )plaintext);
-		Log_Printf_Debug("\r\nplaintext(%d): %s\r\n",plaintext_length, (char *)plaintext);
-		return 2;
-	}
-}
 // 发送数据的逻辑
 static enum Result result = Result_None;
 static uint8_t cgreg_n; 
@@ -532,7 +323,7 @@ void UDP_Client5_Handle(void)
 			}
 			break;
 		case STEP_OPEN: // 打开客户端
-			result = ec800m.open_socket(connectID, "UDP", Host, Port, 1, &socket_err);
+			result = ec800m.open_socket(connectID, "UDP",aliyuniot_get_host(), aliyuniot_get_port(), 1, &socket_err);
 			if(result == Result_Success)
 			{
 				if(socket_err == 0)
@@ -550,7 +341,7 @@ void UDP_Client5_Handle(void)
 			}
 			break;
 		case STEP_JUDGE_AUTH_OR_DATA: // 判断认证还是发送
-			auth_or_data = judge_auth_or_data();
+			auth_or_data = aliyuniot_is_authentication();
 			if(auth_or_data == 1) // 已认证
 			{
 				goto_step(STEP_JOIN_DATA_MESSAGE);
@@ -567,7 +358,7 @@ void UDP_Client5_Handle(void)
 			}
 			else 
 			{
-				join_auth_message(coap_message, &coap_message_length);
+				aliyuniot_get_auth_message(coap_message, &coap_message_length);
 				goto_step(STEP_SET_QISDE_0);
 				auth_times++;
 			}
@@ -577,8 +368,8 @@ void UDP_Client5_Handle(void)
 			pump_params.ci = cgreg_ci;
 			Pump_Params_Refresh();
 					// 编码
-			business_protocol_encode(pump_params, data, &data_length);
-			join_data_message(data, data_length, coap_message, &coap_message_length);
+			business_protocol_encode(pump_params, databuff, &data_length);
+			aliyuniot_get_data_message(databuff, data_length, coap_message, &coap_message_length);
 			goto_step(STEP_SET_QISDE_0);
 			break;
 		case STEP_SET_QISDE_0: // 关闭发送回显
@@ -607,7 +398,7 @@ void UDP_Client5_Handle(void)
 			result = ec800m.recv_with_time(connectID, coap_message, &coap_message_length, 10000);
 			if(result == Result_Success)
 			{
-				uint8_t res = recv_data_handle(coap_message, coap_message_length);
+				uint8_t res = aliyuniot_recv_data_handle(coap_message, coap_message_length);
 				if(res == 0) // 发送失败
 				{
 					goto_step(STEP_JUDGE_AUTH_OR_DATA); // 重新认证

+ 0 - 414
Drivers/Encrypt/AES.c

@@ -1,414 +0,0 @@
-/**
-* author wulianwei
-* title AES加密功能
-*/
-#define  _CRT_SECURE_NO_WARNINGS
-#include "AES.h"
-#include <stdio.h>
-#include "string.h"
-/*aes_small.c*/
-//辅助矩阵
-/*s盒矩阵:The AES Substitution Table*/// 256 位的密匙256 位支持长度为32 个字符
-static const unsigned char sbox[256] = {	//static:内部变量  const:只读,不可变常量
-	0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,
-	0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,
-	0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,
-	0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,
-	0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,
-	0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,
-	0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,
-	0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,
-	0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,
-	0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,
-	0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,
-	0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,
-	0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,
-	0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,
-	0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,
-	0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,
-	0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,
-	0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,
-	0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,
-	0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,
-	0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,
-	0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,
-	0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,
-	0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,
-	0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,
-	0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,
-	0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,
-	0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,
-	0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,
-	0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,
-	0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,
-	0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16,
-};
-//逆向S 盒矩阵
-static const unsigned char contrary_sbox[256] = {
-	0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,
-	0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb,
-	0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87,
-	0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb,
-	0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d,
-	0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e,//0x4e
-	0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2,
-	0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25,
-	0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16,
-	0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92,
-	0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda,
-	0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84,
-	0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a,
-	0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06,
-	0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02,
-	0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b,
-	0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea,
-	0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73,
-	0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85,
-	0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e,
-	0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89,
-	0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b,
-	0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20,
-	0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4,
-	0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31,
-	0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f,
-	0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d,
-	0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef,
-	0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0,
-	0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61,
-	0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26,
-	0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d,
-};
-/*轮常量表 The key schedule rcon table*/
-static const unsigned char Rcon[10] = {
-	0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36 };
-
-//辅助函数
-/*有限域*2乘法 The x2time() function */
-static unsigned char x2time(unsigned char x)
-{
-	if (x & 0x80)
-	{
-		return (((x << 1) ^ 0x1B) & 0xFF);
-	}
-	return x << 1;
-}
-/*有限域*3乘法 The x2time() function */
-static unsigned char x3time(unsigned char x)
-{
-	return (x2time(x) ^ x);
-}
-/*有限域*4乘法 The x4time() function */
-static unsigned char x4time(unsigned char x)
-{
-	return (x2time(x2time(x)));
-}
-/*有限域*8乘法 The x8time() function */
-static unsigned char x8time(unsigned char x)
-{
-	return (x2time(x2time(x2time(x))));
-}
-/*有限域9乘法 The x9time() function */
-static unsigned char x9time(unsigned char x)	//9:1001
-{
-	return (x8time(x) ^ x);
-}
-/*有限域*B乘法 The xBtime() function */
-static unsigned char xBtime(unsigned char x)	//B:1011
-{
-	return (x8time(x) ^ x2time(x) ^ x);
-}
-/*有限域*D乘法 The xDtime() function */
-static unsigned char xDtime(unsigned char x)	//D:1101
-{
-	return (x8time(x) ^ x4time(x) ^ x);
-}
-/*有限域*E乘法 The xEtime() function */
-static unsigned char xEtime(unsigned char x)	//E:1110
-{
-	return (x8time(x) ^ x4time(x) ^ x2time(x));
-}
-
-/****************************************************************************************************************/
-/*第三类操作:列混合操作 MixColumns: Process the entire block*/
-static void MixColumns(unsigned char *col)//列混合
-{
-	unsigned char tmp[4];
-	int i;
-	for (i = 0; i < 4; i++, col += 4)  //col代表一列的基地址,col+4:下一列的基地址
-	{
-		/*
-		xt[0]=x2time(col[0]);
-		xt[1]=x2time(col[1]);
-		xt[2]=x2time(col[2]);
-		xt[3]=x2time(col[3]);
-		//xt[n]代表*2   xt[n]^col[n]代表*3   col[n]代表*1
-		tmp[0]=(xt[0])^(xt[1]^col[1])^col[2]^col[3];	//2 3 1 1
-		tmp[1]=col[0]^(xt[1])^(xt[2]^col[2])^col[3];	//1 2 3 1
-		tmp[2]=col[0]^col[1]^(xt[2])^(xt[3]^col[3]);	//1 1 2 3
-		tmp[3]=(xt[0]^col[0])^col[1]^col[2]^(xt[3]);	//3 1 1 2
-		*/
-		tmp[0] = x2time(col[0]) ^ x3time(col[1]) ^ col[2] ^ col[3];	//2 3 1 1
-		tmp[1] = col[0] ^ x2time(col[1]) ^ x3time(col[2]) ^ col[3];	//1 2 3 1
-		tmp[2] = col[0] ^ col[1] ^ x2time(col[2]) ^ x3time(col[3]);	//1 1 2 3
-		tmp[3] = x3time(col[0]) ^ col[1] ^ col[2] ^ x2time(col[3]);	//3 1 1 2
-		//修改后的值 直接在原矩阵上修改
-		col[0] = tmp[0];
-		col[1] = tmp[1];
-		col[2] = tmp[2];
-		col[3] = tmp[3];
-	}
-}
-//逆向列混淆
-static void Contrary_MixColumns(unsigned char *col)
-{
-	unsigned char tmp[4];
-	int x;
-	for (x = 0; x < 4; x++, col += 4)
-	{
-		/*
-		xt2[0]=x2time(col[0]);
-		xt2[1]=x2time(col[1]);
-		xt2[2]=x2time(col[2]);
-		xt2[3]=x2time(col[3]);
-		xt4[0]=x2time(xt2[0]);
-		xt4[1]=x2time(xt2[1]);
-		xt4[2]=x2time(xt2[2]);
-		xt4[3]=x2time(xt2[3]);
-		xt8[0]=x2time(xt4[0]);
-		xt8[1]=x2time(xt4[1]);
-		xt8[2]=x2time(xt4[2]);
-		xt8[3]=x2time(xt4[3]);
-		tmp[0]=xt8[0]^xt4[0]^xt2[0]^xt8[1]^xt2[1]^col[1]^xt8[2]^xt4[2]^col[2]^xt8[3]^col[3];
-		tmp[1]=xt8[0]^col[0]^xt8[1]^xt4[1]^xt2[1]^xt8[2]^xt2[2]^col[2]^xt8[3]^xt4[3]^col[3];
-		tmp[2]=xt8[0]^xt4[0]^col[0]^xt8[1]^col[1]^xt8[2]^xt4[2]^xt2[2]^xt8[3]^xt2[3]^col[3];
-		tmp[3]=xt8[0]^xt2[0]^col[0]^xt8[1]^xt4[1]^col[1]^xt8[2]^col[2]^xt8[3]^xt4[3]^xt2[3];
-		*/
-		tmp[0] = xEtime(col[0]) ^ xBtime(col[1]) ^ xDtime(col[2]) ^ x9time(col[3]);
-		tmp[1] = x9time(col[0]) ^ xEtime(col[1]) ^ xBtime(col[2]) ^ xDtime(col[3]);
-		tmp[2] = xDtime(col[0]) ^ x9time(col[1]) ^ xEtime(col[2]) ^ xBtime(col[3]);
-		tmp[3] = xBtime(col[0]) ^ xDtime(col[1]) ^ x9time(col[2]) ^ xEtime(col[3]);
-		col[0] = tmp[0];
-		col[1] = tmp[1];
-		col[2] = tmp[2];
-		col[3] = tmp[3];
-	}
-}
-/*第二类操作:行移位:行左循环移位 ShiftRows:Shifts the entire block*/
-static void ShiftRows(unsigned char *col)//正向行移位
-{
-	/*
-		1 5  9 13				5  9 13 1
-		2 6 10 14				10 14 2 6
-		3 7 11 15				15 3 7 11
-		4 8 12 16				16 4 8 12
-	*/
-	unsigned char t;
-	/*1nd row*///左移1位
-	t = col[1]; col[1] = col[5]; col[5] = col[9]; col[9] = col[13]; col[13] = t;
-	/*2rd row*///左移2位,交换2次数字来实现
-	t = col[2]; col[2] = col[10]; col[10] = t;
-	t = col[6]; col[6] = col[14]; col[14] = t;
-	/*3th row*///左移3位,相当于右移1次
-	t = col[15]; col[15] = col[11]; col[11] = col[7]; col[7] = col[3]; col[3] = t;
-	/*4th row*/	//第4行不移位
-}
-//逆向行移位
-static void Contrary_ShiftRows(unsigned char *col)
-{
-	unsigned char t;
-	/*1nd row*/
-	t = col[13]; col[13] = col[9]; col[9] = col[5]; col[5] = col[1]; col[1] = t;
-	/*2rd row*/
-	t = col[2]; col[2] = col[10]; col[10] = t;
-	t = col[6]; col[6] = col[14]; col[14] = t;
-	/*3th row*/
-	t = col[3]; col[3] = col[7]; col[7] = col[11]; col[11] = col[15]; col[15] = t;
-	/*4th row*/	//第4行不移位
-}
-/*第一类操作:s盒字节代换替换 SubBytes*/
-static void SubBytes(unsigned char *col)//字节代换
-{
-	int x;
-	for (x = 0; x < 16; x++)
-	{
-		col[x] = sbox[col[x]];
-	}
-}
-//逆向字节代换
-static void Contrary_SubBytes(unsigned char *col)
-{
-	int x;
-	for (x = 0; x < 16; x++)
-	{
-		col[x] = contrary_sbox[col[x]];
-	}
-}
-/*第四类操作:轮密钥加 AddRoundKey*/
-static void AddRoundKey(unsigned char *col, unsigned char *expansionkey, int round)//密匙加
-{
-	//扩展密钥:44*32bit =11*4* 4*8 =  16字节*11轮,每轮用16字节密钥
-	//第0轮,只进行一次轮密钥加
-	//第1-10轮,轮密钥加
-	int x;
-	for (x = 0; x < 16; x++)	//每1轮操作:4*32bit密钥 = 16个字节密钥
-	{
-		col[x] ^= expansionkey[(round << 4) + x];
-	}
-}
-/* AES加密总函数 10轮4类操作 Encrypt a single block with Nr Rounds(10,12,14)*/
-void AesEncrypt(unsigned char *blk, unsigned char *expansionkey, int Nr)//加密一个区块
-{
-	//输入blk原文,直接在上面修改,输出blk密文
-	//输入skey:
-	//输入Nr = 10轮
-	int round;
-	//第1轮之前:轮密钥加
-	AddRoundKey(blk, expansionkey, 0);
-	//第1-9轮:4类操作:字节代换、行移位、列混合、轮密钥加
-	for (round = 1; round <= (Nr - 1); round++)
-	{
-		SubBytes(blk);		//输入16字节数组,直接在原数组上修改
-		ShiftRows(blk);		//输入16字节数组,直接在原数组上修改
-		MixColumns(blk);	//输入16字节数组,直接在原数组上修改
-		AddRoundKey(blk, expansionkey, round);
-	}
-	//第10轮:不进行列混合
-	SubBytes(blk);
-	ShiftRows(blk);
-	AddRoundKey(blk, expansionkey, Nr);
-}
-//AES 解密总函数
-void AesDecrypt(unsigned char *blk, unsigned char *expansionkey, int Nr)
-{
-	int x;
-	/* unsigned char *contrary_key=key;
-	for(x=0;x<11;x++,key+=16)
-	Contrary_MixColumns(key);*/
-	AddRoundKey(blk, expansionkey, Nr);
-	Contrary_ShiftRows(blk);
-	Contrary_SubBytes(blk);
-	for (x = (Nr - 1); x >= 1; x--)
-	{
-		AddRoundKey(blk, expansionkey, x);
-		Contrary_MixColumns(blk);
-		Contrary_ShiftRows(blk);
-		Contrary_SubBytes(blk);
-	}
-	AddRoundKey(blk, expansionkey, 0);
-}
-/*//密钥编排,16字节--->44列32bit密钥生成--> 11组16字节:分别用于11轮 轮密钥加运算
-Schedule a secret key for use.
-*outkey[] must be 16*15 bytes in size
-*Nk==number of 32 bit words in the key,e.g.,4,6,8
-*Nr==number of rounds,e.g.,10,12,14
-*/
-void ScheduleKey(unsigned char *inkey, unsigned char *outkey, int Nk, int Nr)//安排一个保密密钥使用
-{
-	//inkey:初始16字节密钥key
-	//outkey:11组*16字节扩展密钥expansionkey
-	//Nk:4列
-	//Nr:10轮round
-	unsigned char temp[4], t;
-	int x, i;
-	/*copy the key*/
-	//第0组:[0-3]直接拷贝
-	for (i = 0; i < (4 * Nk); i++)
-	{
-		outkey[i] = inkey[i];
-	}
-	//第1-10组:[4-43]
-	i = Nk;
-	while (i < (4 * (Nr + 1))) //i=4~43 WORD 32bit的首字节地址,每一个4字节
-	{//1次循环生成1个字节扩展密钥,4次循环生成一个WORD
-		//temp:4字节数组:代表一个WORD密钥
-		/*temp=w[i-1]*/
-		//i不是4的倍数的时候
-		//每个temp = 每个outkey32bit = 4字节
-		for (x = 0; x < 4; x++)
-			temp[x] = outkey[(4 * (i - 1)) + x];	//i:32bit的首字节地址
-		//i是4的倍数的时候
-		if (i%Nk == 0)
-		{
-			/*字循环:循环左移1字节 RotWord()*/
-			t = temp[0]; temp[0] = temp[1]; temp[1] = temp[2]; temp[2] = temp[3]; temp[3] = t;
-			/*字节代换:SubWord()*/
-			for (x = 0; x < 4; x++)
-			{
-				temp[x] = sbox[temp[x]];
-			}
-			/*轮常量异或:Rcon[j]*/
-			temp[0] ^= Rcon[(i / Nk) - 1];
-		}
-		//else if(Nk>6 && (i%Nk)==4)	//Nk>6的算法不同,暂时用不到
-		//{
-		//	/*SubWord*/
-		//	for(x=0;x<4;x++)
-		//	{
-		//		temp[x]=sbox[temp[x]];
-		//	}
-		//}
-
-		/*w[i] = w[i-4]^w[i-1]*/
-		for (x = 0; x < 4; x++)
-		{
-			outkey[(4 * i) + x] = outkey[(4 * (i - Nk)) + x] ^ temp[x];
-		}
-		++i;
-	}
-}
-
-/**
-* ECB 模式加密, 返回加密长度
-*/
-int ECBAesEncrypt(unsigned char *blk, unsigned char *expansionkey, int Nr)
-{
-	int k=0;
-	int len =fillSrcData((char*)blk);
-	for(k=0;k<len/AES_BLOCK_SIZE;k++)
-	{
-		AesEncrypt(blk+16*k, expansionkey, Nr);		//2、AES 加密
-	}
-	return len;
-}
-
-/**
-* ECB 模式解密
-*/
-void ECBAesDecrypt(unsigned char *blk,int len, unsigned char *expansionkey, int Nr)
-{
-	int k=0;
-	for(k=0;k<len/AES_BLOCK_SIZE;k++)
-	{
-		AesDecrypt(blk+16*k, expansionkey, Nr);		//2、AES 解密
-	}
-	cutSrcData((char*)blk);
-}
-/**
-* 填充源码,返回填充后的数据长度
-*/
-int fillSrcData(char* data)
-{
-	int left= 0;
-	int len = strlen(data);
-	if(len%AES_BLOCK_SIZE != 0)
-	{
-		left = AES_BLOCK_SIZE-strlen(data)%AES_BLOCK_SIZE;
-		memset(data+strlen(data),left,left);
-		len+=left;
-	}
-	return len;
-}
-
-/**
-* 去除源码无效数据
-*/
-void cutSrcData(char* data)
-{
-	int i= 0;
-	int size = strlen(data);
-	for(i=size-1;data[i]>0&&data[i]<AES_BLOCK_SIZE;i--)
-	{
-		data[i]=0;
-	}
-
-}

+ 0 - 29
Drivers/Encrypt/AES.h

@@ -1,29 +0,0 @@
-#ifndef _AES_H_
-#define _AES_H_
-
-typedef struct aes_st{
-				unsigned char data[400];
-				int size;
-} aes_s;
-
-#define AES_BLOCK_SIZE 16
-
-
-/* AES加密总函数 10轮4类操作 Encrypt a single block with Nr Rounds(10,12,14)*/
-void AesEncrypt(unsigned char *blk, unsigned char *expansionkey, int Nr);//加密一个区块
-
-//AES 解密总函数
-void AesDecrypt(unsigned char *blk, unsigned char *expansionkey, int Nr);
-
-void ScheduleKey(unsigned char *inkey, unsigned char *outkey, int Nk, int Nr);//安排一个保密密钥使用
-
-int ECBAesEncrypt(unsigned char *blk, unsigned char *expansionkey, int Nr);
-
-void ECBAesDecrypt(unsigned char *blk,int len, unsigned char *expansionkey, int Nr);
-
-int fillSrcData(char* data);
-
-void cutSrcData(char* data);
-
-#endif
-

+ 120 - 52
Drivers/Encrypt/mbedtls_util.c

@@ -19,7 +19,8 @@
 
 #define AES_BLOCK_SIZE 16
 
-
+//unsigned char buffer[AES_LEN_SIZE*2]={0};
+char plaintextdata[AES_LEN_SIZE]= {0};
 /**
 * 填充源码,返回填充后的数据长度
 */
@@ -59,6 +60,21 @@ static int fillAESPKCS7DataWithLength(uint8_t * data, uint16_t data_length)
 	len += left;
 	return len;
 }
+/**
+* 填充源码,返回填充后的数据长度
+*/
+static int fillSrcData(char* data)
+{
+	int left= 0;
+	int len = strlen(data);
+	if(len%AES_BLOCK_SIZE != 0)
+	{
+		left = AES_BLOCK_SIZE-strlen(data)%AES_BLOCK_SIZE;
+		memset(data+strlen(data),left,left);
+		len+=left;
+	}
+	return len;
+}
 
 /**
 * 去除源码无效数据
@@ -157,17 +173,17 @@ int utils_aes128_cbc_enc(char *aes_key, char *iv, char *plaintext, char *ciphert
 {
 
 		char iv_use[16] = {0};
-		char data[AES_LEN_SIZE]= {0};
+		memset(plaintextdata, '\0', sizeof(plaintextdata));
 		mbedtls_aes_context aes_ctx;
 		if(strlen(plaintext)+16 > AES_LEN_SIZE) return 0;
 		memcpy(iv_use,iv,16);
-		memcpy(data,plaintext,strlen(plaintext));
-    int len = fillAESPKCS7Data(data);
+		memcpy(plaintextdata,(const char *)plaintext,strlen(plaintext));
+    int len = fillAESPKCS7Data(plaintextdata);
     
     mbedtls_aes_init(&aes_ctx);
     //setkey_dec
     mbedtls_aes_setkey_enc(&aes_ctx, (unsigned char * )aes_key, 128);
-		mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT, len, (unsigned char * )iv_use, (unsigned char * )data, (unsigned char * )ciphertext);
+		mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT, len, (unsigned char * )iv_use, (unsigned char * )plaintextdata, (unsigned char * )ciphertext);
     
     mbedtls_aes_free(&aes_ctx);
     return len; //OK
@@ -179,21 +195,73 @@ int utils_aes128_cbc_enc_with_length(char *aes_key, char *iv, uint8_t * plaintex
 {
 
 		char iv_use[16] = {0};
-		uint8_t data[AES_LEN_SIZE]= {0};
+		memset(plaintextdata, '\0', sizeof(plaintextdata));
 		mbedtls_aes_context aes_ctx;
 		if(plaintext_length + 16 > AES_LEN_SIZE) return -1;
 		memcpy(iv_use,iv,16);
-		memcpy(data, plaintext, plaintext_length);
-    int len = fillAESPKCS7DataWithLength(data, plaintext_length);
+		memcpy(plaintextdata, (const char *)plaintext, plaintext_length);
+    int len = fillAESPKCS7DataWithLength((uint8_t *)plaintextdata, plaintext_length);
     
     mbedtls_aes_init(&aes_ctx);
     //setkey_dec
     mbedtls_aes_setkey_enc(&aes_ctx, (unsigned char * )aes_key, 128);
-		mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT, len, (unsigned char * )iv_use, (unsigned char * )data, (unsigned char * )ciphertext);
+		mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT, len, (unsigned char * )iv_use, (unsigned char * )plaintextdata, (unsigned char * )ciphertext);
     
     mbedtls_aes_free(&aes_ctx);
     return len; //OK
 
+}
+/**
+*AES ECB加密 , src:源数据,dataLen:数据长度,ciphertext:加密数据, 返回加密长度
+*/
+int utils_aes128_ECB_base64_enc_with_length(char *aes_key, uint8_t * plaintext)
+{
+	int times=0;
+ 		memset(plaintextdata, 0, sizeof(plaintextdata));
+		mbedtls_aes_context aes_ctx;
+		if(strlen((const char *)plaintext) + 16 > AES_LEN_SIZE) return -1;
+		memcpy(plaintextdata, plaintext, strlen((const char *)plaintext));
+
+    int len = fillSrcData(plaintextdata);
+	
+	mbedtls_aes_init(&aes_ctx);
+	   //setkey_dec
+    mbedtls_aes_setkey_enc(&aes_ctx, (unsigned char * )aes_key, 128);
+	while(times*AES_BLOCK_SIZE<len){
+		
+		mbedtls_aes_crypt_ecb(&aes_ctx, MBEDTLS_AES_ENCRYPT,  (unsigned char * )plaintextdata+times*AES_BLOCK_SIZE, (unsigned char * )plaintext+times*AES_BLOCK_SIZE);
+		++times;
+		
+	}
+	mbedtls_aes_free(&aes_ctx);
+
+		return len;
+		
+}
+
+/**
+*AES ECB解密, src:源数据,dataLen:数据长度,ciphertext:加密数据
+*/
+int utils_aes128_ECB_base64_dec(char *aes_key, uint8_t * plaintext, uint16_t recvdata_length)
+{
+	int times=0;
+ 		memset(plaintextdata, '\0', sizeof(plaintextdata));
+		mbedtls_aes_context aes_ctx;
+		if(strlen((const char *)plaintext) + 16 > AES_LEN_SIZE) return -1;
+		memcpy(plaintextdata, plaintext, strlen((const char *)plaintext));
+
+	mbedtls_aes_init(&aes_ctx);
+	   //setkey_dec
+    mbedtls_aes_setkey_dec(&aes_ctx, (unsigned char * )aes_key, 128);
+	while(times*AES_BLOCK_SIZE<recvdata_length){
+		mbedtls_aes_crypt_ecb(&aes_ctx, MBEDTLS_AES_DECRYPT,  (unsigned char * )plaintextdata+times*AES_BLOCK_SIZE, (unsigned char * )plaintext+times*AES_BLOCK_SIZE);
+		++times;
+	}
+	cutAESPKCS7Data((char *)plaintext);
+	mbedtls_aes_free(&aes_ctx);
+
+		return strlen((const char *)plaintext); 
+		
 }
 
 /**
@@ -210,51 +278,51 @@ int utils_aes128_cbc_dec(char *aes_key, char *iv, char *ciphertext, int len, cha
     //setkey_dec
     mbedtls_aes_setkey_dec(&aes_ctx, (unsigned char * )aes_key, 128);
 		mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_DECRYPT, len, (unsigned char * )iv_use, (unsigned char * )ciphertext, (unsigned char * )plaintext);
-    cutAESPKCS7Data(plaintext);
+    cutAESPKCS7Data((char *)plaintext);
     mbedtls_aes_free(&aes_ctx);
     return strlen(plaintext); //OK
 
 }
 
-/**
-*AES CBC加密 , src:源数据,dataLen:数据长度,ciphertext:加密数据, 返回加密长度
-*/
-int utils_aes128_cbc_base64_enc(char *aes_key, char *iv, uint8_t *src,int dataLen, char *ciphertext)
-{
-
-		size_t len;
-    unsigned char buffer[AES_LEN_SIZE*2]={0};
-		
-		if(dataLen+16 > AES_LEN_SIZE) return 0;
-		
-		int ret = mbedtls_base64_encode( buffer, sizeof( buffer ), &len, src, dataLen );
-		printf("base64_encode:%s\r\n",buffer);
-		if(ret)
-		{
-			printf("base64 encode err:%d",ret);
-			return 0;
-		}
-		return utils_aes128_cbc_enc(aes_key,iv,(char * )buffer,ciphertext);
-		
-}
-
-/**
-*AES CBC解密 ciphertext:加密数据, len:加密数据长度,plaintext:解密到的数据
-*/
-int utils_aes128_cbc_base64_dec(char *aes_key, char *iv, char *ciphertext, int dataLen, char *plaintext,int plainLen)
-{
-		size_t len = 0;
-    unsigned char buffer[AES_LEN_SIZE*2]={0};
-		int retlen = utils_aes128_cbc_dec(aes_key,iv,ciphertext,dataLen,(char * )buffer);
-		if(retlen)
-		{
-			printf("base64_encode2:%s\r\n",buffer);
-			int ret = mbedtls_base64_decode((unsigned char * )plaintext, plainLen, &len, buffer, retlen);
-			if(ret)
-			{
-				printf("base64 decode err:%d,%d",ret,retlen);
-				len = 0;
-			}
-		}
-		return len;
-}
+///**
+//*AES CBC加密 , src:源数据,dataLen:数据长度,ciphertext:加密数据, 返回加密长度
+//*/
+//int utils_aes128_cbc_base64_enc(char *aes_key, char *iv, uint8_t *src,int dataLen, char *ciphertext)
+//{
+
+//		size_t len;
+//    
+//		 memset(buffer, 0, sizeof(buffer));
+//		if(dataLen+16 > AES_LEN_SIZE) return 0;
+//		
+//		int ret = mbedtls_base64_encode( buffer, sizeof( buffer ), &len, src, dataLen );
+//		printf("base64_encode:%s\r\n",buffer);
+//		if(ret)
+//		{
+//			printf("base64 encode err:%d",ret);
+//			return 0;
+//		}
+//		return utils_aes128_cbc_enc(aes_key,iv,(char * )buffer,ciphertext);
+//		
+//}
+
+///**
+//*AES CBC解密 ciphertext:加密数据, len:加密数据长度,plaintext:解密到的数据
+//*/
+//int utils_aes128_cbc_base64_dec(char *aes_key, char *iv, char *ciphertext, int dataLen, char *plaintext,int plainLen)
+//{
+//		size_t len = 0;
+//       memset(buffer, '\0', sizeof(buffer));
+//		int retlen = utils_aes128_cbc_dec(aes_key,iv,ciphertext,dataLen,(char * )buffer);
+//		if(retlen)
+//		{
+//			printf("base64_encode2:%s\r\n",buffer);
+//			int ret = mbedtls_base64_decode((unsigned char * )plaintext, plainLen, &len, buffer, retlen);
+//			if(ret)
+//			{
+//				printf("base64 decode err:%d,%d",ret,retlen);
+//				len = 0;
+//			}
+//		}
+//		return len;
+//}

+ 5 - 0
Drivers/Encrypt/mbedtls_util.h

@@ -17,4 +17,9 @@ int utils_aes128_cbc_base64_enc(char *aes_key, char *iv, uint8_t *src,int dataLe
 
 int utils_aes128_cbc_base64_dec(char *aes_key, char *iv, char *ciphertext, int dataLen, char *buffer,int buflen);
 
+
+int utils_aes128_ECB_base64_enc_with_length(char *aes_key, uint8_t * plaintext);
+int utils_aes128_ECB_base64_dec(char *aes_key, uint8_t * plaintext, uint16_t recvdata_length);
+
+
 #endif

+ 19 - 18
Drivers/INflash.c

@@ -17,12 +17,13 @@
 
 #include "AT.h"
 #include "string.h"
+#include "Delay.h"
 Coefficient_Data flashdata;
 uint8_t register_success;
-u16 STMFLASH_BUF[STM32_SECTOR_SIZE/2];//最多是2K字节
-void write_to_flash(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
+uint16 STMFLASH_BUF[STM32_SECTOR_SIZE/2];//最多是2K字节
+void write_to_flash(uint32 WriteAddr,uint16 *pBuffer,uint16 NumToWrite)
 {
-    u16 i;
+    uint16 i;
 	for(i=0;i<NumToWrite;i++)
 	{
 		FLASH_ProgramHalfWord(WriteAddr,pBuffer[i]);
@@ -33,7 +34,7 @@ void write_to_flash(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
 //读取指定地址的半字(16位数据)
 //faddr:读地址(此地址必须为2的倍数!!)
 //返回值:对应数据.
-u16 STMFLASH_ReadHalfWord(u32 faddr)
+uint16 STMFLASH_ReadHalfWord(uint32 faddr)
 {
 	return *(vu16*)faddr; 
 }
@@ -41,22 +42,22 @@ u16 STMFLASH_ReadHalfWord(u32 faddr)
 //ReadAddr:起始地址
 //pBuffer:数据指针
 //NumToWrite:半字(16位)数
-void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)   	
+void STMFLASH_Read(uint32 ReadAddr,uint16 *pBuffer,uint16 NumToRead)   	
 {
-	u16 i;
+	uint16 i;
 	for(i=0;i<NumToRead;i++)
 	{
 		pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);//读取2个字节.
 		ReadAddr+=2;//偏移2个字节.	
 	}
 }
-void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
+void STMFLASH_Write(uint32 WriteAddr,uint16 *pBuffer,uint16 NumToWrite)
 {
-  	u32 secpos;	   //扇区地址
-	u16 secoff;	   //扇区内偏移地址(16位字计算)
-	u16 secremain; //扇区内剩余地址(16位字计算)	   
- 	u16 i;    
-	u32 offaddr;   //去掉0X08000000后的地址
+  	uint32 secpos;	   //扇区地址
+	uint16 secoff;	   //扇区内偏移地址(16位字计算)
+	uint16 secremain; //扇区内剩余地址(16位字计算)	   
+ 	uint16 i;    
+	uint32 offaddr;   //去掉0X08000000后的地址
 	if(WriteAddr<STM32_FLASH_BASE||(WriteAddr>=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址
 	FLASH_Unlock();	
 	offaddr=WriteAddr-STM32_FLASH_BASE;		//实际偏移地址.
@@ -98,11 +99,11 @@ void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
 //清空flash
 void clearflash(void){
 flashdata.read_flag=0;
-memcpy(flashdata.deviceSecret,"0",Secretsize);
-memcpy(flashdata.productKey,"0",Secretsize);
-memcpy(flashdata.deviceName,"0",Secretsize);
+memcpy(flashdata.deviceSecret,"0",40);
+memcpy(flashdata.productKey,"0",20);
+memcpy(flashdata.deviceName,"0",20);
 delay_ms(10);
-STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)&flashdata,sizeof(flashdata));
+STMFLASH_Write(FLASH_SAVE_ADDR,(uint16*)&flashdata,sizeof(flashdata));
 }
 void storedata(void){
 
@@ -113,11 +114,11 @@ flashdata.read_flag=1;
 	
      
      delay_ms(10);
-    STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)&flashdata,sizeof(flashdata));
+    STMFLASH_Write(FLASH_SAVE_ADDR,(uint16*)&flashdata,sizeof(flashdata));
     flashdata.read_flag=0;
     delay_ms(10);
    Log_Printf_Debug("写入数据完成\r\n");
-   STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&flashdata,sizeof(flashdata));
+   STMFLASH_Read(FLASH_SAVE_ADDR,(uint16*)&flashdata,sizeof(flashdata));
    Log_Printf_Debug("读取完成read_flag:%d,deviceSecret:%s,productKey:%s,deviceName:%s\r\n",flashdata.read_flag,flashdata.deviceSecret,flashdata.productKey,flashdata.deviceName);
 
 }

+ 5 - 5
Drivers/INflash.h

@@ -16,17 +16,17 @@
 //(现在是512页的stm32 f103ZE)
 #define FLASH_SAVE_ADDR SAVE_ADDR		//设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
 
-#define Secretsize 100
 
-extern int test_testflag;
+
 void store(void);
 void clearflash(void);
 void STMFLASH_Read(uint32_t ReadAddr,uint16_t *pBuffer,uint16_t NumToRead);
+//结构体存储数组
 #pragma pack(1)
  typedef struct{
-	char deviceSecret[Secretsize];
-	char productKey[Secretsize];
-    char deviceName[Secretsize];
+	char deviceSecret[40];
+	char productKey[20];
+    char deviceName[20];
 	uint8_t    read_flag;//判断存flash是否成功,从flash读取值为1代表成功
 }Coefficient_Data;
 #pragma pack()

+ 39 - 38
Drivers/LowPower.c

@@ -40,11 +40,17 @@ extern uint8_t send_data_switch;
 
 // 计时相关的变量
 uint8_t Power_time_flag = 0;
+
+uint8_t Restart_flag = 0;//5分钟内重启次数计数
+
+uint8_t module_switch = 0;//4G模块开关 0正常,1是关闭标志
+
 uint32_t Power_timer_ms = 0;
 uint32_t Power_wait_time = 10;
+uint32_t Restart_time_ms = 0;//重启时间计时
+uint8_t set_mincfun_flag=1;//最小功能模式的标志
+
 
-uint8_t set_mincfun_flag=1;
-uint8_t power_times=0;
 static uint8_t cgreg_n; 
 static uint8_t cgreg_stat; 
 static uint16_t cgreg_lac; 
@@ -73,8 +79,6 @@ static void powerwait(void)
 static void power_failure(char * info)
 {
 	Log_Printf_Debug("STEP: 数据发送失败,%s\r\n", info);
-//	UDP_Client5.status = Client_Status_Failure;
-//	strcpy(UDP_Client5.info, info);
 	networkTest_Flag=1;
 	pownext_step(STEP_SET_CFUN_0);
 }
@@ -83,8 +87,7 @@ static void power_failure(char * info)
 static void power_success(char * info)
 {
 	Log_Printf_Debug("STEP: 数据发送成功,%s\r\n", info);
-//	UDP_Client5.status = Client_Status_Success;
-//	strcpy(UDP_Client5.info, info);
+
 	networkTest_Flag=2;
 	pownext_step(STEP_SET_CFUN_0);
 }
@@ -114,8 +117,25 @@ void Power_Handle(void)
 	{
 		set_mincfun_flag=0;
 		pownext_step(STEP_START);
-		Log_Printf_Debug("完成准备\r\n");
+		Restart_flag++;
+		Log_Printf_Debug("完成准备%d\r\n",Restart_flag);
+		
+
 	}
+	
+	if(Restart_time_ms>=240000)
+		{
+		 Restart_flag=0;
+		 Restart_time_ms=0;
+		}else
+        {
+		  if(Restart_flag>=4&&module_switch==0)//4分钟内重启4次
+		  {
+		    module_switch=1;
+			  pownext_step(STEP_SET_CFUN_0);//模块不断重启,直接进入最小功能模式
+			  Log_Printf_Debug("模块关闭中...%d\r\n",module_switch);
+		  }
+	    }
 	if(set_mincfun_flag==1) 
 	{
 		return ;
@@ -178,7 +198,6 @@ void Power_Handle(void)
 					
 					// 下一步
 			            power_success("查询PS域成功");
-//						pownext_step(STEP_SET_CFUN_0);
 					
 				}
 				else if(query_cgreg_times > 20) // 最多查询20次
@@ -208,9 +227,7 @@ void Power_Handle(void)
 			{
 				Log_Printf_Debug("设置最小功能模式失败\r\n");
 				pownext_step(STEP_FAILURE);
-//				ec800m.enter_sleep();
-//				power_failure("设置最小功能模式失败");
-//				pownext_wait_step(STEP_START, 5);
+
 			}
 			break;
 		case STEP_WAIT: // 等待
@@ -231,7 +248,15 @@ void Power_Handle(void)
 			break;
 		case STEP_FAILURE: // 失败
 			ec800m.enter_sleep();
-			pownext_wait_step(STEP_START, 5);
+			
+		 if(module_switch==0)
+		 {
+		 pownext_wait_step(STEP_START, 5);
+		 }
+		 else
+		 {
+		 pownext_wait_step(STEP_SET_CFUN_0, 100);
+		 }
 			break;
 		default:
 			break;
@@ -271,7 +296,6 @@ uint32_t Power_timer_ms = 0;
 uint32_t Power_wait_time = 10;
 
 uint8_t set_mincfun_flag=1;
-uint8_t power_times=0;
 static uint8_t cgreg_n; 
 static uint8_t cgreg_stat; 
 static uint16_t cgreg_lac; 
@@ -430,38 +454,15 @@ void Power_Handle(void)
 				power_failure("查询ps域失败");
 			}
 			break;
-//		case STEP_SET_CFUN_0: // 设置最小功能模式
-//			result = bc260y.set_cfun(0);
-//			if(result == Result_Success)
-//			{
-//				pownext_step(STEP_SUCCESS);
-//				
-//				Log_Printf_Debug("设置最小功能模式成功\r\n");
-//			}
-//			else if(result == Result_Failed)
-//			{
-//				Log_Printf_Debug("设置最小功能模式失败\r\n");
-//				pownext_step(STEP_FAILURE);
-////				ec800m.enter_sleep();
-////				power_failure("设置最小功能模式失败");
-////				pownext_wait_step(STEP_START, 5);
-//			}
-//			break;
 		case STEP_WAIT: // 等待
 			powerwait();
 			break;
 		case STEP_SUCCESS: // 成功
 //			bc260y.enter_sleep();
 			pownext_wait_step(STEP_START, 5);
-//		   if(networkTest_Flag==1)
-//		   {
+
 		    set_mincfun_flag=1;
-//		   }else
-//		   {
-//			   set_mincfun_flag=0;
-//			if(power_times>=10)
-//		    set_mincfun_flag=1;
-//		   }
+
 			break;
 		case STEP_FAILURE: // 失败
 //			bc260y.enter_sleep();

+ 3 - 0
Drivers/LowPower.h

@@ -10,6 +10,9 @@ void Power_Handle(void);
 #if  _4GFLAG
 
 extern uint8_t set_mincfun_flag;
+extern uint32_t  Restart_time_ms;
+extern uint8_t module_switch;
 #endif
 extern uint32_t Power_timer_ms;
+extern uint8_t set_mincfun_flag;
 #endif

+ 23 - 26
Drivers/Regist.c

@@ -16,7 +16,6 @@
 #include "stm32f10x.h"
 #include "Regist.h"
 #include "AT.h"
-#include "AES.h"
 #include "ec800m.h"
 #include "bc260.h"
 #include "INflash.h"
@@ -26,8 +25,8 @@
 #include <string.h>
 #include <stdlib.h>
 #include "cJSON.h"
-
-extern valid_data_t valid_data;
+#include "Delay.h"
+#include "mbedtls_util.h"
 #if  NBFLAG
 uint8_t mcu_id[8]="8945809";
 #else
@@ -35,19 +34,20 @@ uint8_t mcu_id[8]="ceshi001";
 #endif
 uint16_t Version_data = 1032;
 uint8_t regist_result =0;
-char registData[100] = {0};
+
 //uint8_t registlen=0;
 
 extern struct AT_Struct AT;
 unsigned char key[17]="tuorenzhinenghua";
-unsigned char expansionkey[15 * 16];
 extern Coefficient_Data flashdata;
 extern uint8_t register_success;
 //static uint8_t tcpcontextID = 1;
 static uint8_t tcpconnectID = 2;
 static char * REGIST_SERVER ="8337239yf4.yicp.fun" ; //注册服务器地址
 static uint16_t REGIST_PORT=22155; //端口号
-
+char qcciddata[31]={0};//
+//char registData[100] = {0};
+char recvdata[512]={0};//和registData共用
 /**
 * 
 *注册信息打包
@@ -56,9 +56,9 @@ enum Result packRegistDataAnd(uint8_t *length){
 	 enum Result result = Result_None;
 //	 int i=0;
 	int datalen = 0;
-	char qcciddata[31]={0};//
-     memset(registData,0, sizeof(registData));
-	char* dataPtr = registData+2; //dataPtr指针指向registData第三个字节
+     memset(qcciddata,'\0',sizeof(qcciddata));
+     memset(recvdata,'\0', sizeof(recvdata));
+	char* dataPtr = recvdata+2; //dataPtr指针指向registData第三个字节
 	//复制muid,并转化为16进制
 	byteToHexStr(mcu_id, dataPtr, sizeof(mcu_id));
 	memcpy(dataPtr+strlen(dataPtr),"&",1);
@@ -81,12 +81,12 @@ enum Result packRegistDataAnd(uint8_t *length){
 	memcpy(dataPtr+strlen(dataPtr),qcciddata,31);
 	//复制版本号
 	snprintf(dataPtr+strlen(dataPtr),10,"&%d.%03d",Version_data/1000,Version_data%1000);
-	Log_Printf_Debug("device data:%s\r\n",dataPtr);//串口打印
-	Log_Printf_Debug("regist data:%s\r\n",registData+2);
-	ScheduleKey(key, expansionkey, 4, 10);//生成密钥
-	datalen = ECBAesEncrypt((unsigned char*)dataPtr, expansionkey, 10);		//2、AES 加密
-	registData[0] = datalen>>8;//头2个字节赋值数据长度
-	registData[1] = datalen;
+	Log_Printf_Debug("device data:%s,%d\r\n",dataPtr,strlen(dataPtr));//串口打印
+	Log_Printf_Debug("regist data:%s\r\n",recvdata+2);
+	datalen = utils_aes128_ECB_base64_enc_with_length((char *)key,(uint8_t *)dataPtr);
+
+	recvdata[0] = datalen>>8;//头2个字节赋值数据长度
+	recvdata[1] = datalen;
 	Log_Printf_Debug("strlendata:%d,datalen=%d\r\n",strlen(dataPtr),datalen);
 	 *length=datalen+2;
 	 return Result_Success;
@@ -98,9 +98,10 @@ enum Result packRegistDataAnd(uint8_t *length){
 enum Result analysis_recvdata()
 {
 	enum Result result = Result_None;
-	char recvdata[1024]={0};
+	
 	uint16_t recvdata_length=0;
   cJSON *json = NULL,*json_productKey = NULL,*json_deviceName = NULL,*json_deviceSecret = NULL;
+	memset(recvdata, '\0', sizeof(recvdata));
 	#if  NBFLAG
   result =bc260y.recv_with_time_sync(tcpconnectID,(uint8_t *)recvdata,&recvdata_length,10000);
 	#endif
@@ -112,11 +113,9 @@ enum Result analysis_recvdata()
  {
    return result;
  }
- 	//memset(valid_data.buf, 0, sizeof(valid_data.buf));
-//    memcpy(valid_data.buf,recvdata,recvdata_length);
-  ScheduleKey(key, expansionkey, 4, 10);
-//  valid_data.len=recvdata_length;
-  ECBAesDecrypt((unsigned char*)recvdata,recvdata_length, expansionkey, 10);//AES 解密
+ Log_Printf_Debug("recvdata:%d",strlen(recvdata));
+
+ utils_aes128_ECB_base64_dec((char *)key,(unsigned char*)recvdata,recvdata_length);
  Log_Printf_Debug("解密数据recvdata:%s,%d,%d\r\n",recvdata,strlen(recvdata),recvdata_length);
   			json = cJSON_Parse(recvdata);
 		if(!json)
@@ -130,9 +129,6 @@ enum Result analysis_recvdata()
 				json_productKey = cJSON_GetObjectItem(json,"productKey");
 				json_deviceName = cJSON_GetObjectItem(json,"deviceName");
 				Log_Printf_Debug("获取数据成功deviceSecret:%s,json_productKey:%s,deviceName:%s\r\n",json_deviceSecret->valuestring,json_productKey->valuestring,json_deviceName->valuestring);
-//				memcpy(flashdata.deviceSecret,json_deviceSecret->valuestring,Secretsize);
-//                memcpy(flashdata.productKey,json_productKey->valuestring,strlen(json_deviceName->valuestring));
-//				memcpy(flashdata.deviceName,json_deviceName->valuestring,strlen(json_deviceName->valuestring));
 				strcpy(flashdata.deviceSecret,json_deviceSecret->valuestring);
                strcpy(flashdata.productKey,json_productKey->valuestring);
 				strcpy(flashdata.deviceName,json_deviceName->valuestring);
@@ -223,7 +219,7 @@ result=bc260y.query_cgreg_sync(&regist_result,&stat,&lac,&ci);//循
  }
 
 
- result =bc260y.send_sync(tcpconnectID,(uint8_t *)registData,length);//数据发送
+ result =bc260y.send_sync(tcpconnectID,(uint8_t *)recvdata,length);//数据发送
     if(result==Result_Failed)
  {
    return 0;
@@ -307,7 +303,7 @@ result=ec800m.query_cgreg_sync(&regist_result,&stat,&lac,&ci);//循
 
    if(result==Result_Success)
  {
-   result =ec800m.send_sync(tcpconnectID,(uint8_t *)registData,length);//数据发送
+   result =ec800m.send_sync(tcpconnectID,(uint8_t *)recvdata,length);//数据发送
  }
 
     if(result==Result_Success)
@@ -354,6 +350,7 @@ uint8_t regist_device(void)
  regist_flag=regist_Handle();//注册流程
  if(regist_flag==0)//注册流程失败不储存flash
  {
+  flashdata.read_flag=0;
   return 0;
  }
  store();//存储到flash

+ 2 - 39
Drivers/Utils/sys.c

@@ -12,8 +12,6 @@
 
 
 
-valid_data_t valid_data = {0};//有效数据
-
 //字节流转HEX字符串
 void byteToHexStr(const unsigned char* source, char* dest, int sourceLen)  
 {  
@@ -66,9 +64,9 @@ void letterSwitch(char *str, int flag)
     }
 }
 
-void inttohex(u16 value,u8 *hex)
+void inttohex(uint16 value,uint8 *hex)
 {
-	u16 x1;
+	uint16 x1;
 	hex[0]=value/(16*16*16)+'0';
 	x1=value%(16*16*16);
 	hex[1]=x1/(16*16)+'0';
@@ -205,41 +203,6 @@ void splitCharLimit(char *str, char seprator, char *dest[], int limit)
 
 }
 
-void delay_us(uint32_t xus)
-{
-	SysTick->LOAD = 72 * xus;				//设置定时器重装值
-	SysTick->VAL = 0x00;					//清空当前计数值
-	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
-	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
-	SysTick->CTRL = 0x00000004;				//关闭定时器
-}
-
-/**
-  * @brief  毫秒级延时
-  * @param  xms 延时时长,范围:0~4294967295
-  * @retval 无
-  */
-void delay_ms(uint32_t xms)
-{
-	while(xms--)
-	{
-		delay_us(1000);
-	}
-}
- 
-/**
-  * @brief  秒级延时
-  * @param  xs 延时时长,范围:0~4294967295
-  * @retval 无
-  */
-void delay_s(uint32_t xs)
-{
-	while(xs--)
-	{
-		delay_ms(1000);
-	}
-} 
-
 uint8_t memmem(uint8_t * result,uint16_t result_length, uint8_t *rdystring,uint8_t rdylen)
 {
    for(int i=0;i<result_length-rdylen;i++){

+ 1 - 16
Drivers/Utils/sys.h

@@ -25,25 +25,13 @@ typedef unsigned short  uint16;
 typedef short			int16;
 typedef unsigned int    uint32;
 typedef int				int32;
-typedef unsigned int	size_t;
 
-typedef struct uart_recv_st
-{
-	char buf[UART_RECV_SIZE]; //缓存大小
-	unsigned int len; //接收长度
-	int recv_flag; //接收完成标志 1:接收完成, 0:接收未完成
-	char* start_addr; //字符开始地址
-} uart_recv_t; //串口接收缓存
 
 
-typedef struct valid_data_st {
-		char buf[RECV_SIZE]; //有效数据
-		int  len; //数据长度
-} valid_data_t;
 
 void byteToHexStr(const unsigned char* source, char* dest, int sourceLen);
 
-void inttohex(u16 value,u8 *hex);
+void inttohex(uint16 value,uint8 *hex);
 
 void letterSwitch(char *str, int flag);
 
@@ -68,9 +56,6 @@ void splitCharLimit(char *str, char seprator, char *dest[], int limit);
 * @Param ms:延时时间(单位ms)
 */
 
-void delay_ms(uint32_t ms);
- void delay_us(uint32_t us);
-void delay_s(uint32_t s);
 
 uint8_t memmem(uint8_t * result,uint16_t result_length, uint8_t *rdystring,uint8_t rdylen);
 

+ 284 - 0
Drivers/module/aliyuniot.c

@@ -0,0 +1,284 @@
+#include "stm32f10x.h"
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "aliyuniot.h"
+#include "AT.h"
+#include "CoAP.h"
+#include "mbedtls_util.h"
+#include "sys.h"
+#include "cJSON.h"
+
+
+
+/** 阿里云连接参数 **/
+static char ProductKey[20] = "k0g9w9xRhhi";
+static char DeviceName[20] = "3738393435363738";
+static char DeviceSecret[40] = "9b59c75bc0044b0de06f3a3355ce94ee";
+
+static char ClientID[60];
+
+static uint16_t Port = 5682;
+static char Host[60];
+
+static uint32_t SeqOffset = 65534;
+static char Random[20];
+static char Token[50];
+
+
+static void initClientIdAndHost(void);
+
+// 打印参数
+void aliyuniot_printf_params(void)
+{
+	Log_Printf("------aliyun start------\r\n");
+	Log_Printf("ProductKey=%s\r\n", ProductKey);
+	Log_Printf("DeviceName=%s\r\n", DeviceName);
+	Log_Printf("DeviceSecret=%s\r\n", DeviceSecret);
+	Log_Printf("Token=%s\r\n", Token);
+	Log_Printf("Random=%s\r\n", Random);
+	Log_Printf("SeqOffset=%d\r\n", SeqOffset);
+	Log_Printf("------aliyun end------\r\n");
+}
+
+// 获取host
+char * aliyuniot_get_host(void)
+{
+	initClientIdAndHost();
+	return Host;
+}
+
+
+// 获取port
+uint16_t aliyuniot_get_port(void)
+{
+	return Port;
+}
+
+// 判断是否认证
+uint8_t aliyuniot_is_authentication(void)
+{
+	if(strlen(Token) > 0) // 已认证
+	{
+		return 1;
+	}
+	else
+	{
+		return 0;
+	}
+}
+
+// 设置阿里云连接参数
+void aliyuniot_set_device_params(char * prodect_key, char * device_name, char * device_secret)
+{
+	memset(ProductKey, 0, sizeof(ProductKey));
+	strcpy(ProductKey, prodect_key);
+	memset(DeviceName, 0, sizeof(DeviceName));
+	strcpy(DeviceName, device_name);
+	memset(DeviceSecret, 0, sizeof(DeviceSecret));
+	strcpy(DeviceSecret, device_secret);
+}
+
+// 设置Token
+static void set_token(char * token)
+{
+	memset(Token, 0, sizeof(Token));
+	strcpy(Token, token);
+}
+static void set_random(char * random)
+{
+	memset(Random, 0, sizeof(Random));
+	strcpy(Random, random);
+}
+static void set_seqOffset(uint32_t seqOffset)
+{
+	SeqOffset = seqOffset;
+}
+void aliyuniot_set_device_token(char * token, char * random, uint32_t seqOffset)
+{
+	set_token(token);
+	set_random(random);
+	set_seqOffset(seqOffset);
+}
+
+// 初始化Host和clientID
+static void initClientIdAndHost(void)
+{
+	// 设置host
+	memset(Host, 0, sizeof(Host));
+	strcat(Host, ProductKey);
+	strcat(Host, ".coap.cn-shanghai.link.aliyuncs.com");
+	// 设置clientid
+	memset(ClientID, 0, sizeof(ClientID));
+	strcat(ClientID, ProductKey);
+	strcat(ClientID, "&");
+	strcat(ClientID, DeviceName);
+}
+
+// 拼接认证报文
+static char StrForSignature[100];
+static char sign[50];
+static uint8_t payload[256];
+void aliyuniot_get_auth_message(uint8_t * coap_message, uint16_t * coap_message_length)
+{
+	// 先初始化clientID和Host
+	initClientIdAndHost();
+	// CoAP协议
+	CoAP_Init();
+	CoAP_Set_T(0);
+	CoAP_Set_Code(2);
+	CoAP_Set_MessageID(SeqOffset);
+	// option
+	// host
+	CoAP_Set_Option_Str(3, Host);
+	// port
+	CoAP_Set_Option_Short(7, Port);
+	// path
+	CoAP_Set_Option_Str(11, "auth");
+	// content-format
+	CoAP_Set_Option_Short(12, 50);
+	// accept
+	CoAP_Set_Option_Short(17, 50);
+	
+	// 待签名数据
+	// 签名相关
+	memset(StrForSignature, 0, sizeof(StrForSignature));
+	sprintf(StrForSignature, "clientId%sdeviceName%sproductKey%sseq%d", ClientID, DeviceName, ProductKey, SeqOffset);
+	// 签名
+	memset(sign, 0, sizeof(sign));
+	utils_hmac_sha1_str(StrForSignature, strlen((char * )StrForSignature), sign, DeviceSecret, strlen(DeviceSecret));
+
+	// payload
+	memset(payload, 0, sizeof(payload));
+	sprintf((char * )payload, "{\"clientId\":\"%s\",\"signmethod\":\"hmacsha1\",\"sign\":\"%s\",\"productKey\":\"%s\",\"deviceName\":\"%s\",\"seq\":\"%d\"}", ClientID, sign, ProductKey, DeviceName, SeqOffset);
+	// 设置payload
+	CoAP_Set_Payload_Str((char *)payload);
+	
+	// 生成报文
+	* coap_message_length = CoAP_Get_Length();
+	memcpy(coap_message, CoAP_Get_Message(), * coap_message_length);
+}
+
+
+// 拼接数据报文
+// aes cbc
+static uint8_t aes_key[16] = {0};
+static char iv[] = "543yhjy97ae7fyfg";
+static char out[80];
+static char sha256_source[100];
+void aliyuniot_get_data_message(uint8_t * data, uint8_t data_length, uint8_t * coap_message, uint16_t * coap_message_length)
+{
+	// 先初始化clientID和Host
+	initClientIdAndHost();
+	SeqOffset++;
+	Log_Printf_Debug("STEP: 拼接数据报文,seqOffset=%d\r\n", SeqOffset);
+	
+	// 获取密钥
+	memset(sha256_source, 0, sizeof(sha256_source));
+	snprintf(sha256_source, sizeof(sha256_source), "%s,%s" ,DeviceSecret ,Random);
+	Log_Printf_Debug("sha256_source: %s\r\n", sha256_source);
+	memset(out, 0, sizeof(out));
+	utils_sha256(sha256_source, strlen(sha256_source), out);
+	memset(aes_key, 0, sizeof(aes_key));
+	memcpy(aes_key, out+8, 16); //获取key
+	
+	// CoAP协议
+	CoAP_Init();
+	CoAP_Set_T(0);
+	CoAP_Set_Code(2);
+	CoAP_Set_MessageID(SeqOffset);
+	// option
+	// host
+	CoAP_Set_Option_Str(3, Host);
+	// port
+	CoAP_Set_Option_Short(7, Port);
+	// path
+	CoAP_Set_Option_Str(11, "topic");
+	CoAP_Set_Option_Str(11, "sys");
+	CoAP_Set_Option_Str(11, ProductKey);
+	CoAP_Set_Option_Str(11, DeviceName);
+	CoAP_Set_Option_Str(11, "thing");
+	CoAP_Set_Option_Str(11, "model");
+	CoAP_Set_Option_Str(11, "up_raw");
+	// content-format
+	CoAP_Set_Option_Short(12, 50);
+	// accept
+	CoAP_Set_Option_Short(17, 50);
+	// 2088
+	CoAP_Set_Option_Str(2088, Token);
+	// 2089
+	char Rand2089[10] = {'\0'};
+	char Opt2089[20] = {'\0'};
+	my_itoa(SeqOffset, Rand2089, 10);
+	int Opt2089_Length = utils_aes128_cbc_enc((char * )aes_key, iv, Rand2089, Opt2089);
+	CoAP_Set_Option_Str(2089, Opt2089);
+	
+	// payload
+	memset(payload, 0, sizeof(payload));
+	int payload_length = utils_aes128_cbc_enc_with_length((char * )aes_key, iv, data, data_length, payload);
+	
+	CoAP_Set_Payload(payload, payload_length);
+	
+	// 生成报文
+	* coap_message_length = CoAP_Get_Length();
+	memcpy(coap_message, CoAP_Get_Message(), * coap_message_length);
+}
+
+
+
+
+// 接收数据处理
+static uint8_t plaintext[256]; // 明文
+uint8_t aliyuniot_recv_data_handle(uint8_t * coap_message, uint16_t coap_message_length)
+{
+	uint16_t payload_length = CoAP_Get_Payload_Length(coap_message, coap_message_length);
+	memset(payload, 0, sizeof(payload));
+	CoAP_Get_Payload(coap_message, coap_message_length, payload);
+	
+	Log_Printf_Debug("payload长度: %d\r\n", payload_length);
+	
+	// 判断是认证返回,还是数据发送返回
+	if(payload_length == 0) // 无返回
+	{
+		// 清空Token,重新认证
+		memset(Token, '\0', sizeof(Token));
+		return 0;
+	}
+	else if(payload[0] == '{' && payload[payload_length-1] == '}') // 认证返回
+	{
+		// 解析json
+		cJSON * cjson = cJSON_Parse((char * )payload);
+		Log_Printf_Debug("plaintext(%d): %s\r\n",payload_length, payload);
+		if(cJSON_HasObjectItem(cjson, "random"))
+		{
+			char * random = cJSON_GetObjectItem(cjson, "random")->valuestring;
+			set_random(random);
+		}
+		if(cJSON_HasObjectItem(cjson, "seqOffset"))
+		{
+			uint16_t seqOffset = cJSON_GetObjectItem(cjson, "seqOffset")->valueint;
+			set_seqOffset(seqOffset);
+		}
+		if(cJSON_HasObjectItem(cjson, "token"))
+		{
+			char * token = cJSON_GetObjectItem(cjson, "token")->valuestring;
+			set_token(token);
+		}
+		cJSON_Delete(cjson);//清除结构体 
+		return 1;
+	}
+	else
+	{
+		// 数据发送成功返回
+		memset(plaintext, 0, sizeof(plaintext));
+		uint16_t plaintext_length = utils_aes128_cbc_dec((char * )aes_key, iv, (char * )payload, payload_length, (char * )plaintext);
+		Log_Printf_Debug("\r\nplaintext(%d): %s\r\n",plaintext_length, (char *)plaintext);
+		return 2;
+	}
+}
+
+
+
+

+ 30 - 0
Drivers/module/aliyuniot.h

@@ -0,0 +1,30 @@
+#ifndef __ALIYUNIOT_H
+#define __ALIYUNIOT_H
+
+#include <stdint.h>
+
+// 打印参数
+void aliyuniot_printf_params(void);
+// 设置阿里云连接参数
+void aliyuniot_set_device_params(char * prodect_key, char * device_name, char * device_secret);
+// 设置Token
+void aliyuniot_set_device_token(char * token, char * random, uint32_t seqOffset);
+// 拼接认证报文
+void aliyuniot_get_auth_message(uint8_t * coap_message, uint16_t * coap_message_length);
+// 拼接数据报文
+void aliyuniot_get_data_message(uint8_t * data, uint8_t data_length, uint8_t * coap_message, uint16_t * coap_message_length);
+
+// 接收数据处理
+uint8_t aliyuniot_recv_data_handle(uint8_t * coap_message, uint16_t coap_message_length);
+
+
+// 判断是否认证
+uint8_t aliyuniot_is_authentication(void);
+
+
+// 获取host
+char * aliyuniot_get_host(void);
+// 获取port
+uint16_t aliyuniot_get_port(void);
+
+#endif

+ 9 - 4
Drivers/module/bc260.c

@@ -27,7 +27,7 @@
 
 #if  NBFLAG
 
-
+char hexData[800] = {0};//数据发送的中间数据
 // 方法声明
 
 void bc260y_reset(void); // 重置状态。该文件中的方法共用状态,在使用下面的方法前需要重置一下状态。
@@ -1006,20 +1006,23 @@ enum Result bc260y_open_socket(uint8_t connectID, char * service_type, char * IP
 	{
 		// 发送日志
 		Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
-		Log_SendArray_Debug(AT_result(), AT_result_length());
+		Log_SendArray_Debug(AT_result(), AT_result_length());//
 		
 		// 处理返回结果
 		char * saveptr = NULL;
 		char * split = "\r\n";
 		// 第一行
 		strtok_r((char * )AT_result(), split, &saveptr);
+	
 		// 第二行
 		char * Line2 = strtok_r(NULL, split, &saveptr);
 		// 第三行
 		char * Line3 = strtok_r(NULL, split, &saveptr);
 		// 查询结果为空
+	
 		if(strcmp(Line2, "OK") == 0)
 		{
+	
 			// 拆解第三行
 			char * saveptr_inner = NULL;
 			char * split_inner = ": ,\"";
@@ -1230,7 +1233,7 @@ enum Result bc260y_set_qisde_sync(uint8_t echo)
 enum Result bc260y_send(uint8_t connectID, uint8_t * data, uint16_t data_length)
 {
 	enum Result result = Result_None;
-	char hexData[1024] = {0};
+//	char hexData[1024] = {0};
 	
 	int activeID = 49, time = 10000; // 活动ID, 超时时间
 	// 校验ID
@@ -1239,9 +1242,11 @@ enum Result bc260y_send(uint8_t connectID, uint8_t * data, uint16_t data_length)
 	// 判断状态
 	if(getStatus() == Status_None) // 空闲状态
 	{
+		 memset(hexData,0, sizeof(hexData));
 		byteToHexStr(data,hexData, data_length);//nb需要转16进制
 		sprintf(AT_CMD, "AT+QISEND=%d,%d,%s\r\r\n", connectID, data_length,hexData); // 拼接AT指令
 		result = send_at(AT_CMD, activeID);
+		
 	}
 	else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
 	{
@@ -1293,7 +1298,6 @@ enum Result bc260y_send(uint8_t connectID, uint8_t * data, uint16_t data_length)
 enum Result bc260y_send_rai(uint8_t connectID, uint8_t * data, uint16_t data_length,uint8_t rai)
 {
 	enum Result result = Result_None;
-	char hexData[1024] = {0};
 	
 	int activeID = 49, time = 10000; // 活动ID, 超时时间
 	// 校验ID
@@ -1302,6 +1306,7 @@ enum Result bc260y_send_rai(uint8_t connectID, uint8_t * data, uint16_t data_len
 	// 判断状态
 	if(getStatus() == Status_None) // 空闲状态
 	{
+		 memset(hexData,0, sizeof(hexData));
 		byteToHexStr(data,hexData, data_length);//nb需要转16进制
 		sprintf(AT_CMD, "AT+QISEND=%d,%d,%s,%d\r\r\n", connectID, data_length,hexData,rai); // 拼接AT指令
 		result = send_at(AT_CMD, activeID);

+ 33 - 33
System/Delay.c

@@ -5,37 +5,37 @@
   * @param  xus 延时时长,范围:0~233015
   * @retval 无
   */
-//void delay_us(uint32_t xus)
-//{
-//	SysTick->LOAD = 72 * xus;				//设置定时器重装值
-//	SysTick->VAL = 0x00;					//清空当前计数值
-//	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
-//	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
-//	SysTick->CTRL = 0x00000004;				//关闭定时器
-//}
+void delay_us(uint32_t xus)
+{
+	SysTick->LOAD = 72 * xus;				//设置定时器重装值
+	SysTick->VAL = 0x00;					//清空当前计数值
+	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
+	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
+	SysTick->CTRL = 0x00000004;				//关闭定时器
+}
 
-///**
-//  * @brief  毫秒级延时
-//  * @param  xms 延时时长,范围:0~4294967295
-//  * @retval 无
-//  */
-//void delay_ms(uint32_t xms)
-//{
-//	while(xms--)
-//	{
-//		delay_us(1000);
-//	}
-//}
-// 
-///**
-//  * @brief  秒级延时
-//  * @param  xs 延时时长,范围:0~4294967295
-//  * @retval 无
-//  */
-//void delay_s(uint32_t xs)
-//{
-//	while(xs--)
-//	{
-//		delay_ms(1000);
-//	}
-//} 
+/**
+  * @brief  毫秒级延时
+  * @param  xms 延时时长,范围:0~4294967295
+  * @retval 无
+  */
+void delay_ms(uint32_t xms)
+{
+	while(xms--)
+	{
+		delay_us(1000);
+	}
+}
+ 
+/**
+  * @brief  秒级延时
+  * @param  xs 延时时长,范围:0~4294967295
+  * @retval 无
+  */
+void delay_s(uint32_t xs)
+{
+	while(xs--)
+	{
+		delay_ms(1000);
+	}
+} 

+ 3 - 3
System/Delay.h

@@ -2,8 +2,8 @@
 #define __DELAY_H
 #include <stdint.h>
 
-//void Delay_us(uint32_t us);
-//void Delay_ms(uint32_t ms);
-//void Delay_s(uint32_t s);
+void delay_us(uint32_t us);
+void delay_ms(uint32_t ms);
+void delay_s(uint32_t s);
 
 #endif

+ 2 - 1
User/main.c

@@ -18,6 +18,7 @@
 
 #include "sys.h"
 #include "CONFIG.h"
+#include "mbedtls_util.h"
 
 // ºÁÃë¼ÆÊ±Æ÷
 //extern uint32_t Timer_Ms;
@@ -54,7 +55,7 @@ int main(void)
 //	bc260y.enter_sleep();
 //	delay_ms(100);
 //	bc260y.reset();
-	
+//	test_encaes128();
 	while(1)
 	{
 		//AT_Handle();