package mqtt import ( "encoding/json" "time" ) // Envelope MQTT 消息通用外层(协议文档 §4) // // { // "requestId": "req-uuid" | null, // "dockId": "dock-...", // "droneSn": "..." | null, // "timestamp": 1784700000000, // "payload": { ... } // } type Envelope struct { RequestID string `json:"requestId"` EventID string `json:"eventId"` Version int64 `json:"version"` DockID string `json:"dockId"` DroneSN string `json:"droneSn"` Timestamp int64 `json:"timestamp"` Payload json.RawMessage `json:"payload"` } // ParseEnvelope 解析通用外层;payload 缺失(无外层的历史扁平消息)时把整个消息体当作 payload。 func ParseEnvelope(data []byte) *Envelope { var env Envelope if err := json.Unmarshal(data, &env); err != nil { return &Envelope{Payload: data} } if len(env.Payload) == 0 { env.Payload = data } return &env } // NewEnvelope 构造下行外层;payload 为业务字段(内部自动 marshal),timestamp 取当前毫秒。 func NewEnvelope(requestID, dockID, droneSN string, payload any) *Envelope { var raw json.RawMessage if payload != nil { if b, err := json.Marshal(payload); err == nil { raw = b } } return &Envelope{ RequestID: requestID, DockID: dockID, DroneSN: droneSN, Timestamp: time.Now().UnixMilli(), Payload: raw, } }