163 lines
2.7 KiB
C
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;
|
|
|
|
}
|