#include "mqtt_config.h" #include "wifi/wifi_connect.h" #include "mbedtls/md.h" #include #include 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; }