package device import ( "context" "git.huangwc.com/pig/pig-farm-controller/internal/infra/models" "git.huangwc.com/pig/pig-farm-controller/internal/infra/transport/proto" ) // 设备行为 type DeviceAction string var ( DeviceActionStart DeviceAction = "start" // 启动 DeviceActionStop DeviceAction = "stop" // 停止 ) // 指令类型 type Method string var ( MethodSwitch Method = "switch" // 启停指令 ) // SendOptions 包含了发送通用指令时的可选参数。 type SendOptions struct { // NotTrackable 如果为 true,则指示本次发送无需被追踪。 // 这将阻止系统为本次发送创建 device_command_logs 记录。 // 默认为 false,即需要追踪。 NotTrackable bool } // SendOption 是一个函数类型,用于修改 SendOptions。 // 这是实现 "Functional Options Pattern" 的核心。 type SendOption func(*SendOptions) // WithoutTracking 是一个公开的选项函数,用于明确指示本次发送无需追踪。 // 调用方在发送 Ping 等无需响应确认的指令时,应使用此选项。 func WithoutTracking() SendOption { return func(opts *SendOptions) { opts.NotTrackable = true } } // Service 抽象了一组方法用于控制设备行为 type Service interface { // Switch 用于切换指定设备的状态, 比如启动和停止 Switch(ctx context.Context, device *models.Device, action DeviceAction) error // Collect 用于发起对指定区域主控下的多个设备的批量采集请求。 Collect(ctx context.Context, areaControllerID uint32, devicesToCollect []*models.Device) error // Send 是一个通用的发送方法,用于将一个标准的指令载荷发送到指定的区域主控。 // 它负责将载荷包装成顶层指令、序列化、调用底层发送器,并默认记录下行命令日志。 Send(ctx context.Context, areaControllerID uint32, payload proto.InstructionPayload, opts ...SendOption) error } // 设备操作指令通用结构(最外层) type DeviceRequest struct { MessageID int // 消息ID, 用于后续匹配响应 Method string // 这是什么指令 Data interface{} // 指令参数 } // 设备操作指令通用响应结构(最外层) type DeviceResponse struct { MessageID int // 消息ID, 用于匹配这是哪一个请求的响应 Message string Data interface{} // 响应内容 }