1、问题点:当RCU网络状态异常的情况下,网络还处于协商状态下,还未进入正常通讯环节时,取电变化不会进行判断。这会导致取电变化上报与实际产生取电状态时间点对不上。 2、将BLV_C1F_Module代码上传至Gitea,之前代码修改记录请查看 .\BasicCode\Readme.txt
293 lines
9.3 KiB
C
293 lines
9.3 KiB
C
/***
|
||
阿里云相关
|
||
**/
|
||
#include "aLiYun.h"
|
||
#include "utils_hmac.h"
|
||
#include "DBG.h"
|
||
#include "PC_DeviceTest_Fun.h"
|
||
#include "flash.h"
|
||
|
||
#if MQTT_EN
|
||
|
||
|
||
/*******************************************************************************
|
||
* Function Name : ALiYun_Default_Parameter_Get 2022-09-03
|
||
* Description : 初始化默认参数
|
||
* Input : aliyun_info
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void ALiYun_Default_Parameter_Get(ALIYUN_INFO* aliyun_info)
|
||
{
|
||
UINT8 mactostr[12]; //mac地址字符数组
|
||
uint8_t j=0;
|
||
for(uint8_t i=0;i<6;i++)
|
||
{
|
||
mactostr[j]=(MACAddr[i]>>4)&0x0F;
|
||
mactostr[j+1]=MACAddr[i]&0x0F;
|
||
|
||
if(mactostr[j] <= 9)
|
||
{
|
||
mactostr[j] += 0x30;
|
||
}
|
||
else if((mactostr[j] >= 10) && (mactostr[j] <= 15))
|
||
{
|
||
mactostr[j] += 0x37;
|
||
}
|
||
|
||
if(mactostr[j+1] <= 9)
|
||
{
|
||
mactostr[j+1] += 0x30;
|
||
}
|
||
else if((mactostr[j+1] >= 10) && (mactostr[j+1] <= 15))
|
||
{
|
||
mactostr[j+1] += 0x37;
|
||
}
|
||
|
||
j+=2;
|
||
}
|
||
|
||
memcpy(aliyun_info->productKey,DEF_PRODUCTKEY,12);
|
||
memcpy(aliyun_info->publish,DEF_ALIY_PUBLISH,12);
|
||
memcpy(aliyun_info->sublish,DEF_ALIY_SUBLISH,9);
|
||
aliyun_info->mqtt_data.keepAliveInterval=120;
|
||
memcpy(aliyun_info->deviceName,mactostr,12);
|
||
Flash_Read((UINT8*)aliyun_info->deviceSecret ,33, FLASH_MCU_MQTT_START_ADDRESS+FLASH_MQTTINFO_DeviceSecret_OFFSET);
|
||
|
||
}
|
||
|
||
|
||
/*******************************************************************************
|
||
* Function Name : ALiYun_Machine_Init
|
||
* Description : 一机一密方式初始化阿里云
|
||
* Input : ProductKey:ProductKey
|
||
* deviceName: 设备名
|
||
* DeviceSecret: 设备秘钥
|
||
sublish: 订阅地址
|
||
keepAliveInterval:保持在线时间
|
||
* Output : None
|
||
* Return : 成功启动返回0,此处成功不代表阿里云成功初始化,只代表函数启动初始化成功
|
||
*******************************************************************************/
|
||
UINT8 ALiYun_Machine_Init(MQTT_INFO* Mqtt_info, char* ProductKey, char* deviceName, char* DeviceSecret, char* sublish, int keepAliveInterval)
|
||
{
|
||
if(Mqtt_info == NULL || ProductKey == NULL || deviceName == NULL || sublish == NULL || DeviceSecret == NULL) return 1; //参数错误
|
||
|
||
UINT8 domain_name_len = strlen(ALIYUN_DOMAIN) + strlen(ProductKey) +1;
|
||
UINT8 clientID_len = strlen(ALIYUN_CLIENT_ID) + strlen(deviceName) +1;
|
||
UINT8 userName_len = strlen(ProductKey) + strlen(deviceName) + 2;
|
||
UINT8 passWord_len = 40+1;
|
||
UINT8 sublish_len = strlen(sublish) + strlen(ProductKey) + strlen(deviceName) + 5;
|
||
int msg_len = strlen(CLIENT_ID_KEY) + strlen(deviceName) + strlen(DEVICE_NAME_KEY) \
|
||
+ strlen(deviceName) + strlen(PRODUCTKEY_KEY) + strlen(ProductKey) + 1;
|
||
|
||
char* domain_name = malloc(domain_name_len); //存放域名(ProductKey + 固定后缀)
|
||
if(domain_name == NULL) return 4; //内存不足错误
|
||
|
||
char* clientID = malloc(clientID_len); //存放clientID (对应设备名 + 固定后缀)
|
||
if(clientID == NULL)
|
||
{
|
||
free(domain_name);
|
||
return 4; //内存不足错误
|
||
}
|
||
|
||
char* userName = malloc(userName_len); //存放userName (对应设备名 + & + ProductKey)
|
||
if(userName == NULL)
|
||
{
|
||
free(domain_name);
|
||
free(clientID);
|
||
return 4; //内存不足错误
|
||
}
|
||
|
||
char* passWord = malloc(passWord_len); //存放 hmacsha1 password
|
||
if(passWord == NULL)
|
||
{
|
||
free(domain_name);
|
||
free(clientID);
|
||
free(userName);
|
||
return 4; //内存不足错误
|
||
}
|
||
|
||
char* msg = malloc(msg_len); //存放 hmacsha1 参数键值对的值
|
||
if(msg == NULL)
|
||
{
|
||
free(domain_name);
|
||
free(clientID);
|
||
free(userName);
|
||
free(passWord);
|
||
return 4; //内存不足错误
|
||
}
|
||
|
||
char* sublish_str = malloc(sublish_len); //存放 订阅地址
|
||
if(sublish_str == NULL)
|
||
{
|
||
free(domain_name);
|
||
free(clientID);
|
||
free(userName);
|
||
free(passWord);
|
||
free(msg);
|
||
return 4; //内存不足错误
|
||
}
|
||
|
||
memset(domain_name, 0, domain_name_len);
|
||
memset(clientID, 0, clientID_len);
|
||
memset(userName, 0, userName_len);
|
||
memset(passWord, 0, passWord_len);
|
||
memset(msg, 0, msg_len);
|
||
memset(sublish_str, 0, sublish_len);
|
||
|
||
sprintf(domain_name, "%s%s", ProductKey, ALIYUN_DOMAIN); //拼接域名
|
||
sprintf(clientID, "%s%s", deviceName, ALIYUN_CLIENT_ID); //拼接clientID
|
||
sprintf(userName, "%s&%s", deviceName, ProductKey); //拼接userName
|
||
sprintf(msg, "%s%s%s%s%s%s", CLIENT_ID_KEY, deviceName, DEVICE_NAME_KEY, deviceName, PRODUCTKEY_KEY, ProductKey); //拼接hmacsha1 参数键值对的值
|
||
sprintf(sublish_str, "/%s/%s/%s", ProductKey, deviceName, sublish); //拼接订阅地址
|
||
|
||
PRINT("domain_name:%s\n", domain_name);
|
||
PRINT("clientID:%s\n", clientID);
|
||
PRINT("userName:%s\n", userName);
|
||
|
||
PRINT("msg:%s\n", msg);
|
||
|
||
utils_hmac_sha1(msg, strlen(msg), passWord, DeviceSecret, strlen(DeviceSecret)); //计算password
|
||
|
||
PRINT("passWord:%s\n", passWord);
|
||
|
||
free(msg);
|
||
|
||
return MQTT_Init(Mqtt_info, domain_name, NULL, clientID, userName, passWord, sublish_str, keepAliveInterval);
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : ALIYUN_Flash_Parameter_Init
|
||
* Description : 从flash获取参数初始化阿里云
|
||
* Input : Mqtt_info
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
UINT8 ALIYUN_Flash_Parameter_Init(MQTT_INFO* Mqtt_info)
|
||
{
|
||
if(Mqtt_info == NULL) return 1;
|
||
char* publish = NULL;
|
||
ALIYUN_INFO aliyun_info;
|
||
ALIYUN_INFO aliyun_temp;
|
||
UINT8 ret = 0;
|
||
UINT16 keepAlive = 0;
|
||
|
||
memset(&aliyun_info, 0x00, sizeof(ALIYUN_INFO));
|
||
Flash_Read((UINT8*)&aliyun_temp ,sizeof(ALIYUN_INFO)-4, FLASH_MCU_MQTT_START_ADDRESS);
|
||
|
||
// Dbg_Println(DBG_BIT_NET_STATUS_bit,"temp_keepAliveInterval:%d", aliyun_temp.mqtt_data.keepAliveInterval);
|
||
// Dbg_Println(DBG_BIT_NET_STATUS_bit,"temp_sublish:%s", aliyun_temp.sublish);
|
||
// Dbg_Println(DBG_BIT_NET_STATUS_bit,"temp_temp_temp_temp_publish:%s", aliyun_temp.publish);
|
||
// Dbg_Println(DBG_BIT_NET_STATUS_bit,"temp_temp_productKey:%s", aliyun_temp.productKey);
|
||
// Dbg_Println(DBG_BIT_NET_STATUS_bit,"temp_temp_deviceName:%s", aliyun_temp.deviceName);
|
||
// Dbg_Println(DBG_BIT_NET_STATUS_bit,"temp_deviceSecret:%s\n", aliyun_temp.deviceSecret);
|
||
|
||
if(memcmp(aliyun_info.deviceName,aliyun_temp.deviceName,sizeof(aliyun_info.deviceName))!=0
|
||
||memcmp(aliyun_info.productKey,aliyun_temp.productKey,sizeof(aliyun_info.productKey))!=0
|
||
||memcmp(aliyun_info.publish,aliyun_temp.publish,sizeof(aliyun_info.publish))!=0
|
||
||memcmp(aliyun_info.sublish,aliyun_temp.sublish,sizeof(aliyun_info.sublish))!=0
|
||
||memcmp(&aliyun_info.mqtt_data.keepAliveInterval,&aliyun_temp.mqtt_data.keepAliveInterval,sizeof(aliyun_info.mqtt_data.keepAliveInterval))!=0
|
||
)
|
||
{
|
||
memcpy(&aliyun_info,&aliyun_temp,sizeof(ALIYUN_INFO)); //flash中参数不为零,则使用flash中的参数初始化阿里云。否则,使用默认参数初始化。
|
||
}
|
||
else
|
||
{
|
||
ALiYun_Default_Parameter_Get(&aliyun_info);
|
||
}
|
||
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"keepAliveInterval:%d", aliyun_info.mqtt_data.keepAliveInterval);
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"sublish:%s", aliyun_info.sublish);
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"publish:%s", aliyun_info.publish);
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"productKey:%s", aliyun_info.productKey);
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"deviceName:%s", aliyun_info.deviceName);
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"deviceSecret:%s", aliyun_info.deviceSecret);
|
||
|
||
if(aliyun_info.mqtt_data.keepAliveInterval < 0xFFFF)
|
||
{
|
||
keepAlive = aliyun_info.mqtt_data.keepAliveInterval;
|
||
}
|
||
else //参数不合法,使用默认值
|
||
{
|
||
keepAlive = 120;
|
||
}
|
||
|
||
if(aliyun_info.sublish[0] != 0xFF && aliyun_info.sublish[0] != 0x00)
|
||
{
|
||
|
||
}
|
||
else //参数不合法,返回
|
||
{
|
||
ret = 3;
|
||
goto reault;
|
||
}
|
||
|
||
if(aliyun_info.productKey[0] != 0xFF && aliyun_info.productKey[0] != 0x00)
|
||
{
|
||
|
||
}
|
||
else //参数不合法,返回
|
||
{
|
||
ret = 3;
|
||
goto reault;
|
||
}
|
||
|
||
if((aliyun_info.deviceName[0] != 0xFF) && (aliyun_info.deviceName[0] != 0x00) && (0x0C == strlen((char *)aliyun_info.deviceName)))
|
||
{
|
||
|
||
}
|
||
else //参数不合法,返回
|
||
{
|
||
ret = 3;
|
||
goto reault;
|
||
}
|
||
|
||
if(aliyun_info.deviceSecret[0] != 0xFF && aliyun_info.deviceSecret[0] != 0x00)
|
||
{
|
||
|
||
}
|
||
else //参数不合法,返回
|
||
{
|
||
ret = 3;
|
||
goto reault;
|
||
}
|
||
|
||
if(aliyun_info.publish[0] != 0xFF && aliyun_info.publish[0] != 0x00)
|
||
{
|
||
UINT8 len = strlen((char*)aliyun_info.publish) + strlen((char*)aliyun_info.productKey) + strlen((char*)aliyun_info.deviceName) + 5;
|
||
publish = malloc(len);
|
||
if(publish == NULL)
|
||
{
|
||
ret = 4;
|
||
goto reault;
|
||
}
|
||
memset(publish, 0, len);
|
||
sprintf(publish, "/%s/%s/%s", (char*)aliyun_info.productKey, (char*)aliyun_info.deviceName, (char*)aliyun_info.publish); //拼接发布地址
|
||
|
||
if(Mqtt_info->pub_topic)
|
||
{
|
||
free(Mqtt_info->pub_topic);
|
||
}
|
||
Mqtt_info->pub_topic = publish;
|
||
}
|
||
|
||
reault:
|
||
switch(ret)
|
||
{
|
||
case 0: //无错误
|
||
case 4: //publish错误不影响初始化
|
||
return ALiYun_Machine_Init(Mqtt_info, (char*)aliyun_info.productKey, (char*)aliyun_info.deviceName, (char*)aliyun_info.deviceSecret,
|
||
(char*)aliyun_info.sublish, keepAlive); //初始化阿里云
|
||
|
||
default: //有错误
|
||
Dbg_Println(DBG_BIT_NET_STATUS_bit,"ALIYUN_Flash_Parameter err, Clear ALIYUN_Flash");
|
||
memset(&aliyun_info, 0x00, sizeof(ALIYUN_INFO)); //清0
|
||
Flash_Write((uint8_t *)&aliyun_info,sizeof(ALIYUN_INFO) ,FLASH_MCU_MQTT_START_ADDRESS); //清空
|
||
if(publish) free(publish);
|
||
return ret;
|
||
|
||
}
|
||
}
|
||
#endif
|
||
|