Files
AC7911BB_JL-AIBT-SoundBox/mqtt/mqtt_config.c
T

163 lines
2.7 KiB
C

#include "mqtt_config.h"
#include "wifi/wifi_connect.h"
#include "mbedtls/md.h"
#include <string.h>
#include <stdio.h>
static mqtt_config_t mqtt_config;
/*
* 生成紧凑MAC == 用户名
*
* AA:BB:CC:DD:EE:FF -> AABBCCDDEEFF(大写)
*/
static int make_compact_mac(char *buf, uint32_t len)
{
uint8_t mac[6];
int i;
if (!buf || len < 13)
{
return -1;
}
if (wifi_get_mac(mac))
{
return -1;
}
for (i = 0; i < 6; i++)
{
sprintf(buf + i * 2, "%02X", mac[i]);
}
return 0;
}
/*
* 生成密码
*
* password = MD5(PRODUCT_SECRET + client_id) 小写hex
*/
static int make_password(const char *client_id, char *buf, uint32_t len)
{
char raw[128];
unsigned char digest[16];
const mbedtls_md_info_t *md_info;
int i;
if (!client_id || !buf || len < 33)
{
return -1;
}
snprintf(raw, sizeof(raw), "%s%s", MQTT_PRODUCT_SECRET, client_id);
md_info = mbedtls_md_info_from_type(MBEDTLS_MD_MD5);
if (!md_info ||
mbedtls_md(md_info, (const unsigned char *)raw, strlen(raw), digest))
{
return -1;
}
for (i = 0; i < 16; i++)
{
sprintf(buf + i * 2, "%02x", digest[i]);
}
buf[32] = '\0';
return 0;
}
void mqtt_config_init(void)
{
char device_name[13];
memset(
&mqtt_config,
0,
sizeof(mqtt_config)
);
/*
* MQTT服务器
*/
strcpy(
mqtt_config.host,
MQTT_SERVER_HOST
);
mqtt_config.port = MQTT_SERVER_PORT;
mqtt_config.keepalive = 60;//秒
/*
* 设备身份
* username = 紧凑MAC
* client_id = PRODUCT_KEY_MAC_MODEL
* password = MD5(PRODUCT_SECRET + client_id)
*
*/
if (make_compact_mac(device_name, sizeof(device_name))) {
strcpy(device_name, "unknown");
}
strcpy(
mqtt_config.username,
device_name
);
snprintf(
mqtt_config.client_id,
sizeof(mqtt_config.client_id),
"%s_%s_%s",
MQTT_PRODUCT_ID,
device_name,
MQTT_DEVICE_MODEL
);
make_password(
mqtt_config.client_id,
mqtt_config.password,
sizeof(mqtt_config.password)
);
/*
* topic
*/
snprintf(
mqtt_config.subscribe_topic,
sizeof(mqtt_config.subscribe_topic),
"/sys/%s/%s/c/#",
MQTT_PRODUCT_ID,
device_name
);
snprintf(
mqtt_config.publish_topic,
sizeof(mqtt_config.publish_topic),
"/sys/%s/%s/s/event/property/post",
MQTT_PRODUCT_ID,
device_name
);
}
mqtt_config_t *mqtt_config_get(void)
{
return &mqtt_config;
}