using MessagePack;
using System;
namespace SHH.Contracts
{
///
/// 通用指令请求载体 (Request)
/// 用于 NetMQ 的 Request-Reply 或 Router-Dealer 模式
///
[MessagePackObject]
public class CommandPayload
{
#region --- 0. 协议自描述 ---
///
/// 协议类型标识
/// 建议值: "COMMAND" 或 "指令包"
///
[Key(0)]
public string Protocol { get; set; } = "COMMAND";
#endregion
#region --- 核心路由信息 ---
///
/// 指令代码 (路由键)
/// 示例: "PTZ", "RECORD_START", "SERVER_REGISTER"
///
[Key(1)]
public string CmdCode { get; set; }
///
/// 目标对象 ID
/// 示例: 摄像头ID "101",或者系统级指令填 "SYSTEM"
///
[Key(2)]
public string TargetId { get; set; }
///
/// 业务参数 (JSON 字符串)
/// 根据 CmdCode 的不同,反序列化为不同的 DTO (如 PtzControlDto)
///
[Key(3)]
public string JsonParams { get; set; }
#endregion
#region --- 追踪与元数据 ---
///
/// 请求追踪 ID (UUID)
/// 核心字段:用于实现异步等待 (await)。回执包必须携带此 ID。
///
[Key(4)]
public string RequestId { get; set; } = Guid.NewGuid().ToString("N");
///
/// 发送时间戳
///
[Key(5)]
public DateTime Timestamp { get; set; } = DateTime.Now;
#endregion
#region --- 可靠性控制字段 (QoS) ---
///
/// 是否需要回执 (ACK)
/// true: 发送端会 await 等待结果 (默认)
/// false: 发后即忘 (Fire-and-Forget),服务端收到后不回发任何消息,减少带宽
///
[Key(6)]
public bool RequireAck { get; set; } = true;
///
/// 重试计数器
/// 0: 首次发送
/// 1, 2...: 第N次重试
/// 服务端据此判断是否需要查重 (幂等性处理)
///
[Key(7)]
public int RetryCount { get; set; } = 0;
///
/// 消息过期时间 (Unix时间戳)
/// 如果接收端收到时已经超过此时间,直接丢弃,不处理也不回复
///
[Key(8)]
public long ExpireTime { get; set; }
#endregion
}
}