Enhance DaliCloudBridge: add JSON escaping function and buildRegisterPayload for improved payload formatting
Signed-off-by: Tony <tonylu@tony-cloud.com>
This commit is contained in:
+45
-1
@@ -12,6 +12,34 @@ extern "C" {
|
|||||||
namespace {
|
namespace {
|
||||||
constexpr const char* kTag = "dali_cloud_bridge";
|
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) {
|
std::string toString(const cJSON* item) {
|
||||||
if (item == nullptr) {
|
if (item == nullptr) {
|
||||||
return "";
|
return "";
|
||||||
@@ -180,6 +208,22 @@ bool DaliCloudBridge::publishRegister(const std::string& payloadJson) {
|
|||||||
return publishJSON(topicRegister(), 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) {
|
bool DaliCloudBridge::publishJSON(const std::string& topic, const std::string& payloadJson) {
|
||||||
#ifdef ESP_PLATFORM
|
#ifdef ESP_PLATFORM
|
||||||
if (client_ == nullptr || !connected_.load()) {
|
if (client_ == nullptr || !connected_.load()) {
|
||||||
@@ -318,7 +362,7 @@ void DaliCloudBridge::onMqttEvent(esp_mqtt_event_handle_t event) {
|
|||||||
ESP_LOGI(kTag, "MQTT connected");
|
ESP_LOGI(kTag, "MQTT connected");
|
||||||
esp_mqtt_client_subscribe(client_, topicDown().c_str(), config_.qos);
|
esp_mqtt_client_subscribe(client_, topicDown().c_str(), config_.qos);
|
||||||
publishStatus("online");
|
publishStatus("online");
|
||||||
publishRegister("{\"type\":\"register\",\"status\":\"online\"}");
|
publishRegister(buildRegisterPayload(config_));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MQTT_EVENT_DISCONNECTED:
|
case MQTT_EVENT_DISCONNECTED:
|
||||||
|
|||||||
Reference in New Issue
Block a user