package protocol // ============================================================ // 部署指令/分片 (Cloud → Edge) // ============================================================ // Pack_DeployCmd 部署指令或分片 type Pack_DeployCmd struct { Header Data DeployCmdData `json:"data"` } type DeployCmdData struct { Version string `json:"Version"` // 目标版本号 FileName string `json:"FileName"` // 文件名, e.g. "ipole" TotalChunks int `json:"TotalChunks"` // 分片总数(Action="start"时有效) ChunkSize int `json:"ChunkSize"` // 单片大小(Action="start"时有效) ChunkIndex int `json:"ChunkIndex"` // 当前分片索引(Action="chunk"时有效) MD5 string `json:"MD5"` // 完整文件 MD5(Action="start"时有效) Data string `json:"Data"` // base64 编码的分片数据(Action="chunk"时有效) Action string `json:"Action"` // "start" | "chunk" | "abort" } func (o *Pack_DeployCmd) EnCodeCmd(id, gid string, seq uint64, version, fileName, md5 string, totalChunks, chunkSize int) (string, error) { o.Header.SetHeaderData(id, gid, seq) o.Data.Version = version o.Data.FileName = fileName o.Data.TotalChunks = totalChunks o.Data.ChunkSize = chunkSize o.Data.MD5 = md5 o.Data.Action = "start" return json.MarshalToString(o) } func (o *Pack_DeployCmd) EnCodeChunk(id, gid string, seq uint64, version string, chunkIndex int, data string) (string, error) { o.Header.SetHeaderData(id, gid, seq) o.Data.Version = version o.Data.ChunkIndex = chunkIndex o.Data.Data = data o.Data.Action = "chunk" return json.MarshalToString(o) } func (o *Pack_DeployCmd) EnCodeAbort(id, gid string, seq uint64, version string) (string, error) { o.Header.SetHeaderData(id, gid, seq) o.Data.Version = version o.Data.Action = "abort" return json.MarshalToString(o) } func (o *Pack_DeployCmd) DeCode(message string) error { return json.UnmarshalFromString(message, o) } // ============================================================ // 部署执行 ACK (Edge → Cloud) // ============================================================ // Pack_DeployAck 部署执行结果(文件接收+替换的成功/失败) type Pack_DeployAck struct { Header Data DeployAckData `json:"data"` } type DeployAckData struct { Version string `json:"Version"` Success bool `json:"Success"` Error string `json:"Error"` // 失败时填写原因 } func (o *Pack_DeployAck) EnCode(id, gid string, seq uint64, version string, success bool, errMsg string) (string, error) { o.Header.SetHeaderData(id, gid, seq) o.Data.Version = version o.Data.Success = success o.Data.Error = errMsg return json.MarshalToString(o) } func (o *Pack_DeployAck) DeCode(message string) error { return json.UnmarshalFromString(message, o) } // ============================================================ // 健康检测结果 (Edge → Cloud) // ============================================================ // Pack_HealthCheck 健康检测结果上报 type Pack_HealthCheck struct { Header Data HealthCheckData `json:"data"` } type HealthCheckData struct { Version string `json:"Version"` Phase int `json:"Phase"` // 1 或 2 Success bool `json:"Success"` // 当前 Phase 是否全部通过 Timestamp int64 `json:"Timestamp"` Checks []HealthCheck `json:"Checks"` } type HealthCheck struct { Name string `json:"Name"` // "process" | "mqtt" | "redis" | "serial" | "modbus" | "device_online" Status string `json:"Status"` // "ok" | "fail" | "pending" | "timeout" Detail string `json:"Detail"` // 人类可读的详情 DurationMs int `json:"DurationMs"` // 检测耗时ms } func (o *Pack_HealthCheck) EnCode(id, gid string, seq uint64, version string, phase int, success bool, checks []HealthCheck) (string, error) { o.Header.SetHeaderData(id, gid, seq) o.Data.Version = version o.Data.Phase = phase o.Data.Success = success o.Data.Timestamp = BJNow().Unix() o.Data.Checks = checks return json.MarshalToString(o) } func (o *Pack_HealthCheck) DeCode(message string) error { return json.UnmarshalFromString(message, o) }