#include "protocol.h" #include #include #define PROTOCOL_VERSION 1 static inline int append(char* buf, size_t size, int pos, const char* fmt, ...) { if ((size_t)pos >= size) return -1; va_list args; va_start(args, fmt); int written = vsnprintf(buf + pos, size - pos, fmt, args); va_end(args); if (written < 0 || (size_t)(pos + written) >= size) { return -1; } return pos + written; } // --- TELEMETRY (single measurement) --- int build_telemetry_single( char* buf, size_t buf_size, const char* id, const char* device_id, int64_t ts_ms, const char* metric, double value, const char* unit, const char* source, int64_t m_ts_ms ) { int pos = 0; // header pos = append(buf, buf_size, pos, "{\"v\":%d,\"id\":\"%s\",\"type\":\"telemetry\",\"ts\":%lld," "\"deviceId\":\"%s\",\"payload\":{\"measurements\":[", PROTOCOL_VERSION, id, (long long)ts_ms, device_id ); if (pos < 0) return -1; // measurement start pos = append(buf, buf_size, pos, "{\"metric\":\"%s\",\"value\":%.3f", metric, value ); if (pos < 0) return -1; // optional if (unit) { pos = append(buf, buf_size, pos, ",\"unit\":\"%s\"", unit); if (pos < 0) return -1; } if (source) { pos = append(buf, buf_size, pos, ",\"source\":\"%s\"", source); if (pos < 0) return -1; } if (m_ts_ms > 0) { pos = append(buf, buf_size, pos, ",\"ts\":%lld", (long long)m_ts_ms); if (pos < 0) return -1; } // close measurement + payload pos = append(buf, buf_size, pos, "}]}}"); if (pos < 0) return -1; return pos; } // --- EVENT --- int build_event( char* buf, size_t buf_size, const char* id, const char* device_id, int64_t ts_ms, const char* name, const char* severity, const char* message ) { int pos = 0; // header pos = append(buf, buf_size, pos, "{\"v\":%d,\"id\":\"%s\",\"type\":\"event\",\"ts\":%lld," "\"deviceId\":\"%s\",\"payload\":{", PROTOCOL_VERSION, id, (long long)ts_ms, device_id ); if (pos < 0) return -1; // required pos = append(buf, buf_size, pos, "\"name\":\"%s\"", name); if (pos < 0) return -1; // optional if (severity) { pos = append(buf, buf_size, pos, ",\"severity\":\"%s\"", severity); if (pos < 0) return -1; } if (message) { pos = append(buf, buf_size, pos, ",\"message\":\"%s\"", message); if (pos < 0) return -1; } // close pos = append(buf, buf_size, pos, "}}"); if (pos < 0) return -1; return pos; }