diff --git a/src/gateway_cloud.cpp b/src/gateway_cloud.cpp index 267f465..11c59d7 100644 --- a/src/gateway_cloud.cpp +++ b/src/gateway_cloud.cpp @@ -12,6 +12,34 @@ extern "C" { namespace { constexpr const char* kTag = "dali_cloud_bridge"; +std::string jsonEscape(const std::string& value) { + std::string out; + out.reserve(value.size() + 8); + for (char ch : value) { + switch (ch) { + case '\\': + out += "\\\\"; + break; + case '"': + out += "\\\""; + break; + case '\n': + out += "\\n"; + break; + case '\r': + out += "\\r"; + break; + case '\t': + out += "\\t"; + break; + default: + out.push_back(ch); + break; + } + } + return out; +} + std::string toString(const cJSON* item) { if (item == nullptr) { return ""; @@ -180,6 +208,22 @@ bool DaliCloudBridge::publishRegister(const std::string& payloadJson) { return publishJSON(topicRegister(), payloadJson); } +#ifdef ESP_PLATFORM +std::string buildRegisterPayload(const GatewayCloudConfig& config) { + const std::string deviceID = jsonEscape(config.deviceID); + std::ostringstream oss; + oss << "{\"type\":\"register\"," + << "\"status\":\"online\"," + << "\"device_id\":\"" << deviceID << "\"," + << "\"base_mac\":\"" << deviceID << "\"," + << "\"identifier\":\"" << deviceID << "\"," + << "\"identifier_type\":\"mac\"," + << "\"gateway_type\":\"dali_cpp\"," + << "\"topic_prefix\":\"" << jsonEscape(config.topicPrefix) << "\"}"; + return oss.str(); +} +#endif + bool DaliCloudBridge::publishJSON(const std::string& topic, const std::string& payloadJson) { #ifdef ESP_PLATFORM if (client_ == nullptr || !connected_.load()) { @@ -318,7 +362,7 @@ void DaliCloudBridge::onMqttEvent(esp_mqtt_event_handle_t event) { ESP_LOGI(kTag, "MQTT connected"); esp_mqtt_client_subscribe(client_, topicDown().c_str(), config_.qos); publishStatus("online"); - publishRegister("{\"type\":\"register\",\"status\":\"online\"}"); + publishRegister(buildRegisterPayload(config_)); break; } case MQTT_EVENT_DISCONNECTED: