#include "stm32f10x.h" #include #include #include #include #include "Tuoreniot.h" #include "mbedtls_util.h" #include "Log_Module.h" #include "At_Module.h" #include "Common_Util.h" #include "ec800m.h" #include "cJSON.h" #include "FlashSetup.h" #include "Timer_Module.h" #include "CoAP_Util.h" // 注册时用的密钥 char regist_key[17]="tuorenzhinenghua"; // 注册数据 uint8_t regist_data[512]; uint16_t regist_data_length; #if PROD_ENV // 生产环境 char * REGIST_SERVER = "iot.tuoren.com" ; //注册服务器地址 uint16_t REGIST_PORT = 8888; //端口号 #endif #if TEST_ENV // 开发环境 //char * REGIST_SERVER = "b21759p174.iok.la" ; //注册服务器地址 //uint16_t REGIST_PORT = 43097; //端口号 char * REGIST_SERVER = "frp-fun.top" ; //注册服务器地址 uint16_t REGIST_PORT = 27827; //端口号 #endif // 从flash中读取注册响应 static void ReadRegistResponseFromFlash(void); // 将注册响应写入到flash中 static void WriteRegistResponseToFlash(void); // 注册结果 struct TUORENIOT_RegistResponseStruct regist_response = { .version = 1 }; // 初始化clientID static char ClientID[60]; static void InitClientId(void) { // 设置clientid memset(ClientID, 0, sizeof(ClientID)); strcat(ClientID, regist_response.productId); strcat(ClientID, "&"); strcat(ClientID, regist_response.deviceId); } /** * *注册数据解密 */ uint8_t TUORENIOT_AnalysisRegistData(uint8_t * regist_data, uint16_t regist_data_length) { // Log_Printf_Debug("regist_data: \r\n"); // Log_SendHex(regist_data, regist_data_length); // Log_Printf_Debug("\r\n"); uint8_t result; utils_aes128_ECB_base64_dec(regist_key,regist_data,regist_data_length); Log_Printf_Debug("解密数据(%d):%s\r\n", regist_data_length, (char *)regist_data); cJSON *json = cJSON_Parse((char *)regist_data); if(!json) { Log_Printf_Debug("json parse error,%s\r\n",cJSON_GetErrorPtr()); result = 0; } else if(cJSON_GetObjectItem(json, "code")->valueint == 200) { regist_response.code = cJSON_GetObjectItem(json, "code")->valueint; regist_response.version = cJSON_GetObjectItem(json, "version")->valueint; regist_response.userId = cJSON_GetObjectItem(json, "userId")->valueint; strcpy(regist_response.networkProtocol, cJSON_GetObjectItem(json, "networkProtocol")->valuestring); strcpy(regist_response.platform, cJSON_GetObjectItem(json, "platform")->valuestring); strcpy(regist_response.deviceSecret, cJSON_GetObjectItem(json, "deviceSecret")->valuestring); strcpy(regist_response.productId, cJSON_GetObjectItem(json, "productId")->valuestring); strcpy(regist_response.deviceId, cJSON_GetObjectItem(json, "deviceId")->valuestring); strcpy(regist_response.remoteAddress, cJSON_GetObjectItem(json, "remoteAddress")->valuestring); regist_response.remotePort = cJSON_GetObjectItem(json, "remotePort")->valueint; regist_response.wifiNumber = 3; // 解析wifi result = 1; WriteRegistResponseToFlash(); } else { result = 0; } cJSON_Delete(json); return result; } static uint32_t SeqOffset = 0; static char Random[20]; static char Token[50]; // 判断是否认证 uint8_t TUORENIOT_IsAuthentication(void) { if(strlen(Token) > 0) // 已认证 { return 1; } else { return 0; } } // 拼接认证报文 static char StrForSignature[100]; static char sign[50]; static uint8_t payload[256]; void TUORENIOT_PackAuthMessage(uint8_t * coap_message, uint16_t * coap_message_length) { // Log_Printf_Debug("<>\r\n"); } // 拼接数据报文 // aes cbc static uint8_t aes_key[16] = {0}; static char iv[] = "543yhjy97ae7fyfg"; static char out[80]; static char sha256_source[100]; static char Rand2089[10] = {'\0'}; static uint8_t Opt2089[20]; void TUORENIOT_PackDataMessage(uint8_t * data, uint8_t data_length, uint8_t * coap_message, uint16_t * coap_message_length) { // Log_Printf_Debug("<>\r\n"); } // 设置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; } // 接收数据处理 static uint8_t plaintext[256]; // 明文 uint8_t TUORENIOT_AnalysisMessage(uint8_t * coap_message, uint16_t coap_message_length) { // Log_Printf_Debug("coap_message(%d):\r\n", coap_message_length); // Log_SendHex(coap_message, coap_message_length); // Log_Printf_Debug("\r\n"); memset(payload, 0, sizeof(payload)); uint16_t payload_length = 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(aes_key, iv, (char * )payload, payload_length, (char * )plaintext); Log_Printf_Debug("\r\nplaintext(%d): %s\r\n",plaintext_length, (char *)plaintext); return 2; } } void TUORENIOT_PrintfRegistRequestStruct(struct TUORENIOT_RegistRequestStruct * regist_params_struct) { Log_Printf("------print regist params start------\r\n"); Log_Printf("version=%d\r\n", regist_params_struct->version); Log_Printf("networkType=%s\r\n", regist_params_struct->networkType); Log_Printf("networkProtocol=%s\r\n", regist_params_struct->networkProtocol); Log_Printf("deviceId=%s\r\n", regist_params_struct->deviceId); Log_Printf("platform=%s\r\n", regist_params_struct->platform); Log_Printf("userId=%d\r\n", regist_params_struct->userId); Log_Printf("------print regist params end------\r\n"); } void TUORENIOT_PrintfRegistResponseStruct(void) { Log_Printf("------print regist result start------\r\n"); Log_Printf("code=%d\r\n", regist_response.code); Log_Printf("version=%d\r\n", regist_response.version); Log_Printf("networkProtocol=%s\r\n", regist_response.networkProtocol); Log_Printf("platform=%s\r\n", regist_response.platform); Log_Printf("deviceId=%s\r\n", regist_response.deviceId); Log_Printf("deviceSecret=%s\r\n", regist_response.deviceSecret); Log_Printf("remoteAddress=%s\r\n", regist_response.remoteAddress); Log_Printf("remotePort=%d\r\n", regist_response.remotePort); Log_Printf("productId=%s\r\n", regist_response.productId); Log_Printf("userId=%d\r\n", regist_response.userId); Log_Printf("wifiNumber=%d\r\n", regist_response.wifiNumber); Log_Printf("------print regist result end------\r\n"); } // 初始化 void TUORENIOT_Init(void) { // 从flash中读取注册结果 ReadRegistResponseFromFlash(); } // 从flash中读取注册响应 static void ReadRegistResponseFromFlash(void) { Log_Printf_Debug("sizeof(regist_response): %d\r\n", sizeof(regist_response)); //读取flash Log_Printf_Debug("读取前code:%d\r\n", regist_response.code); Log_Printf_Debug("sizeof(regist_result): %d\r\n", sizeof(regist_response)); FlashReadOperate((uint8_t*)®ist_response, sizeof(regist_response), FLASH_SAVE_ADDR); Log_Printf_Debug("读取后code:%d\r\n", regist_response.code); if(regist_response.code == 200) { TUORENIOT_PrintfRegistResponseStruct(); } } // 将注册响应写入到flash中 static void WriteRegistResponseToFlash(void) { FlashWriteOperate((uint8_t*)®ist_response, sizeof(regist_response), FLASH_SAVE_ADDR); regist_response.code = 0; Log_Printf_Debug("写入数据完成\r\n"); FlashReadOperate((uint8_t*)®ist_response, sizeof(regist_response), FLASH_SAVE_ADDR); TUORENIOT_PrintfRegistResponseStruct(); } // 获取code uint8_t TUORENIOT_GetCodeOfRegistResponse(void) { return regist_response.code; }