diff --git a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/iot_mqtt_srv.c b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/iot_mqtt_srv.c index 90806db..f03016d 100644 --- a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/iot_mqtt_srv.c +++ b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/iot_mqtt_srv.c @@ -429,6 +429,48 @@ static void iot_handle_publish(const char *topic, uint8_t *payload, int payload_ g_sub_code_enable.iot_enable ? "true" : "false"); iot_mqtt_publish(resp_topic, data_json, strlen(data_json), 1); + } else if (strcmp(cmd_str, "report_config") == 0) { + /* 平台下发配置 → 更新 g_report_cfg, 回 ACK */ + char data[512] = {0}; + simple_parse_json(json, "\"data\"", data); + if (strlen(data) > 0) { + char tmp2[64]; + memset(tmp2, 0, sizeof(tmp2)); + simple_parse_json(data, "\"enable\"", tmp2); + if (strlen(tmp2) > 0) g_report_cfg.enable = (strcmp(tmp2, "true") == 0); + memset(tmp2, 0, sizeof(tmp2)); + simple_parse_json(data, "\"interval\"", tmp2); + if (strlen(tmp2) > 0) g_report_cfg.interval = (uint16_t)strtoul(tmp2, NULL, 10); + memset(tmp2, 0, sizeof(tmp2)); + simple_parse_json(data, "\"once\"", tmp2); + if (strlen(tmp2) > 0) g_report_cfg.once = (strcmp(tmp2, "true") == 0); + memset(tmp2, 0, sizeof(tmp2)); + simple_parse_json(data, "\"env_eval\"", tmp2); + if (strlen(tmp2) > 0) g_report_cfg.env_eval = (strcmp(tmp2, "true") == 0); + memset(tmp2, 0, sizeof(tmp2)); + simple_parse_json(data, "\"sensor_type\"", tmp2); + if (strlen(tmp2) > 0) g_report_cfg.sensor_type = (uint8_t)strtoul(tmp2, NULL, 10); + } + char resp[256]; + snprintf(resp, sizeof(resp), + "{\"msg_id\":%lu,\"cmd\":\"report_config\"," + "\"ts\":%lu,\"code\":0,\"msg\":\"success\"}", + msg_id, dev_time_now()); + iot_mqtt_publish(resp_topic, resp, strlen(resp), 1); + + } else if (strcmp(cmd_str, "event_report") == 0) { + /* 平台对 event_report 的 ACK: 检查 code 字段 */ + char tmp3[64] = {0}; + int code = -1; + simple_parse_json(json, "\"code\"", tmp3); + if (strlen(tmp3) > 0) code = (int)strtol(tmp3, NULL, 10); + if (code == 0) { + iot_evt_handle_ack(msg_id, 0); + } else { + iot_evt_handle_ack(msg_id, code); + } + // ACK 不回复 (避免乒乓) + } else if (strcmp(cmd_str, "pwd_verify") == 0) { // 验证密码 char password[16] = {0}; @@ -477,14 +519,29 @@ static void iot_handle_publish(const char *topic, uint8_t *payload, int payload_ } } +/* 发送 initialize 上线消息 (IoT 路径) */ +static void iot_send_initialize(void) { + char payload[512]; + char topic[IOT_MQTT_TOPIC_MAX_LEN]; + snprintf(payload, sizeof(payload), + "{\"msg_id\":%lu,\"cmd\":\"initialize\",\"ts\":%lu," + "\"data\":{\"dev_serial\":\"%s\",\"model\":\"%s\"," + "\"hard_ver\":\"%s\",\"soft_ver\":\"%s\"," + "\"extra_info\":{\"code\":\"0\",\"csq\":\"0\",\"location\":\"\"}}}", + (unsigned long)(g_iot_msg_id + 1), dev_time_now(), + g_iot_dev_serial, PRODUCT_MODEL, HARDWARE_VER, FIRMWARE_VER); + snprintf(topic, sizeof(topic), "dld960/%s/dev", g_iot_dev_serial); + iot_mqtt_publish(topic, payload, strlen(payload), 0); +} + /* 处理 MQTT SUBACK */ static void iot_handle_suback(void) { PRINT("IOT: ← SUBACK, topics subscribed\n"); g_iot_state = IOT_STATE_READY; _iot_reconnect_backoff = 0; // 连接成功, 重置退避 - // V1.03: 订阅成功后发布 initialize 告知服务器上线 - dev_initialize_pub(); + // V1.03: 订阅成功后发布 initialize 告知服务器上线 (IoT 路径) + iot_send_initialize(); } /* 处理收到的 MQTT 数据 */