/****************************************************************************** * @file protocol_mqtt_bcu.c * @brief protocol_mqtt_bcu * @version V1.0 * @author Gary * @copyright ******************************************************************************/ #include "protocol_mqtt_bcu.h" //把这个请按照数据模型填充完毕 const devPointMap bms_points[] = { {"BCU_2", 0, 0, NULL}, // 总告警 {"BCU_3", 0, 0, NULL}, // 总故障 {"BCU_4", 0, 0, NULL}, // 单体过压告警一级 {"BCU_5", 0, 0, NULL}, // 单体欠压告警一级 {"BCU_6", 0, 0, NULL}, // 单体过温告警一级 {"BCU_7", 0, 0, NULL}, // 单体低温告警一级 {"BCU_8", 0, 0, NULL}, // 单体压差告警一级 {"BCU_9", 0, 0, NULL}, // 充电过流告警一级 }; const int bms_point_count = sizeof(bms_points) / sizeof(bms_points[0]); void protocol_build_json(uint16_t groupId) { int val = 0; cJSON* root = cJSON_CreateObject(); cJSON_AddNumberToObject(root, "timeStamp", drv_rtc_get_tick()); // devData 数组 cJSON* devDataArr = cJSON_CreateArray(); cJSON_AddItemToObject(root, "devData", devDataArr); // 构建每一个设备项 cJSON* deviceObj = cJSON_CreateObject(); cJSON_AddItemToArray(devDataArr, deviceObj); cJSON_AddStringToObject(deviceObj, "devType", "4"); cJSON_AddStringToObject(deviceObj, "devName", "BCU"); cJSON_AddStringToObject(deviceObj, "devId", "001"); cJSON_AddStringToObject(deviceObj, "sn", "SN123456"); // 构建 data 对象 cJSON* dataObj = cJSON_CreateObject(); cJSON_AddItemToObject(deviceObj, "data", dataObj); for (int i = 0; i < bms_point_count; ++i) { const devPointMap* point = &bms_points[i]; if(point->groupId == groupId) { if (bms_points[i].get_val != NULL) { val = point->get_val(point->input); } else { val = 0; // 默认值 } } cJSON_AddNumberToObject(dataObj, point->key, val); } // 转为 JSON 字符串 char* json_str = cJSON_PrintUnformatted(root); if (json_str) { drv_mqtt_publish(json_str, strlen(json_str)); cJSON_free(json_str); } cJSON_Delete(root); } void publish_all_bms_groups(void) { uint8_t max_group = 0; for (size_t i = 0; i < bms_point_count; i++) { if (bms_points[i].groupId > max_group) { max_group = bms_points[i].groupId; } } for (uint8_t g = 0; g <= max_group; g++) { protocol_build_json(g); } } void mqtt_publish_bms_data(uint32_t basetime) { static uint32_t mqtt_cycle_tick = 0; static uint8_t groupMax = 0; uint16_t i = 0; mqtt_cycle_tick += basetime; if(mqtt_cycle_tick > 60000) { mqtt_cycle_tick = 0; publish_all_bms_groups(); } }