Files
pig-farm-controller/internal/infra/transport/proto/device.proto

107 lines
4.1 KiB
Protocol Buffer
Raw Normal View History

syntax = "proto3";
package device;
2025-10-02 00:18:13 +08:00
option go_package = "internal/domain/device/proto";
2025-11-29 17:06:09 +08:00
// --- 核心指令与数据结构 ---
2025-09-29 23:54:09 +08:00
// 平台生成的原始485指令单片机直接发送到总线
message Raw485Command {
2025-09-30 00:01:51 +08:00
int32 bus_number = 1; // 总线号,用于指示单片机将指令发送到哪个总线
bytes command_bytes = 2; // 原始485指令的字节数组
}
2025-10-07 16:14:47 +08:00
// 一个完整的、包含所有元数据的批量采集任务。
message BatchCollectCommand {
2025-09-30 00:01:51 +08:00
string correlation_id = 1; // 用于关联请求和响应的唯一ID
repeated CollectTask tasks = 2; // 采集任务列表
2025-09-25 20:16:07 +08:00
}
2025-10-07 16:14:47 +08:00
// 定义了单个采集任务的“意图”。
message CollectTask {
2025-10-09 13:55:46 +08:00
Raw485Command command = 1; // 平台生成的原始485指令
2025-09-26 15:26:21 +08:00
}
// 这是设备响应的、极致精简的数据包。
message CollectResult {
2025-09-30 00:01:51 +08:00
string correlation_id = 1; // 从下行指令中原样返回的关联ID
repeated float values = 2; // 按预定顺序排列的采集值
2025-10-07 16:14:47 +08:00
}
// 平台向设备发送的Ping指令用于检查存活性。
message Ping {
// 可以留空,指令本身即代表意图
}
// 设备对Ping的响应或设备主动上报的心跳。
// 它包含了设备的关键状态信息。
message Pong {
string firmware_version = 1; // 当前固件版本
// 可以扩展更多状态, e.g., int32 uptime_seconds = 2;
}
2025-12-03 14:06:56 +08:00
// --- OTA 升级相关 ---
// PrepareUpdateReq: 平台发送给设备,通知设备准备开始 OTA 升级 (下行)
message PrepareUpdateReq {
string version = 1; // 新固件版本号
2025-12-03 16:23:33 +08:00
uint32 task_id = 2; // 升级任务唯一ID
2025-12-03 14:06:56 +08:00
string manifest_md5 = 3; // 清单文件的 MD5 校验和,用于设备初步校验清单文件完整性
}
// RequestFile: 设备向平台请求特定文件 (包括清单文件和固件文件) (上行)
message RequestFile {
2025-12-03 16:23:33 +08:00
uint32 task_id = 1; // 升级任务ID
2025-12-03 14:06:56 +08:00
string filepath = 2; // 请求的文件路径 (例如 "/manifest.json" 或 "/main.py")
}
// FileResponse: 平台响应设备请求,发送单个文件的完整内容 (下行)
// LoRa 传输层会自动处理分片和重组,因此应用层可以直接发送完整的单个文件内容
message FileResponse {
2025-12-03 16:23:33 +08:00
uint32 task_id = 1; // 升级任务ID
2025-12-03 14:06:56 +08:00
string filepath = 2; // 设备上的目标路径 (例如 "/manifest.json" 或 "/main.py")
bytes content = 3; // 文件的完整内容
}
// UpdateStatusReport: 设备向平台报告升级状态 (上行)
message UpdateStatusReport {
2025-12-03 16:23:33 +08:00
uint32 task_id = 1; // 升级任务ID
2025-12-03 14:06:56 +08:00
string current_version = 2; // 操作完成后的当前版本
enum Status {
STATUS_UNSPECIFIED = 0; // 未指定protobuf3 要求枚举从0开始
SUCCESS = 1; // 升级成功,新固件已运行
SUCCESS_ALREADY_UP_TO_DATE = 2; // 版本已是最新,未执行升级
FAILED_PRE_CHECK = 3; // 升级前检查失败 (例如拒绝降级、准备分区失败)
FAILED_MANIFEST_VERIFY = 4; // 清单文件下载或校验失败
FAILED_DOWNLOAD = 5; // 固件文件下载或校验失败
FAILED_ROLLED_BACK = 6; // 新固件启动失败,已自动回滚
FAILED_TIMEOUT = 7; // 平台在超时后仍未收到SUCCESS报告将任务标记为此状态 (平台推断)
}
Status status = 3; // 升级的最终状态
string error_message = 4; // 人类可读的详细错误信息
string failed_file = 5; // 失败时关联的文件路径 (可选)
}
2025-11-29 17:06:09 +08:00
// --- 顶层指令包装器 ---
// Instruction 封装了所有与设备间的通信。
// 使用 oneof 来确保每个消息只有一个负载类型,这在嵌入式系统中是高效且类型安全的。
2025-10-07 16:14:47 +08:00
message Instruction {
oneof payload {
2025-11-29 17:06:09 +08:00
// --- 下行指令 (平台 -> 设备) ---
2025-10-07 16:14:47 +08:00
Raw485Command raw_485_command = 1;
BatchCollectCommand batch_collect_command = 2;
2025-12-03 14:06:56 +08:00
Ping ping = 3;
PrepareUpdateReq prepare_update_req = 4;
FileResponse file_response = 5;
2025-11-29 17:06:09 +08:00
// --- 上行数据 (设备 -> 平台) ---
CollectResult collect_result = 101;
2025-12-03 14:06:56 +08:00
Pong pong = 102;
RequestFile request_file = 103;
UpdateStatusReport update_status_report = 104;
2025-10-07 16:14:47 +08:00
}
}