2025-09-15 21:26:18 +08:00
|
|
|
|
syntax = "proto3";
|
|
|
|
|
|
|
|
|
|
|
|
package device;
|
|
|
|
|
|
|
2025-10-02 00:18:13 +08:00
|
|
|
|
option go_package = "internal/domain/device/proto";
|
2025-09-15 21:26:18 +08:00
|
|
|
|
|
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-09-15 21:26:18 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-07 16:14:47 +08:00
|
|
|
|
// 一个完整的、包含所有元数据的批量采集任务。
|
2025-09-26 22:50:08 +08:00
|
|
|
|
message BatchCollectCommand {
|
2025-09-30 00:01:51 +08:00
|
|
|
|
string correlation_id = 1; // 用于关联请求和响应的唯一ID
|
2025-09-26 22:50:08 +08:00
|
|
|
|
repeated CollectTask tasks = 2; // 采集任务列表
|
2025-09-25 20:16:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-07 16:14:47 +08:00
|
|
|
|
// 定义了单个采集任务的“意图”。
|
2025-09-26 22:50:08 +08:00
|
|
|
|
message CollectTask {
|
2025-10-09 13:55:46 +08:00
|
|
|
|
Raw485Command command = 1; // 平台生成的原始485指令
|
2025-09-26 15:26:21 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-26 22:50:08 +08:00
|
|
|
|
// 这是设备响应的、极致精简的数据包。
|
|
|
|
|
|
message CollectResult {
|
2025-09-30 00:01:51 +08:00
|
|
|
|
string correlation_id = 1; // 从下行指令中原样返回的关联ID
|
2025-09-26 22:50:08 +08:00
|
|
|
|
repeated float values = 2; // 按预定顺序排列的采集值
|
2025-10-07 16:14:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-01 20:42:21 +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
|
|
|
|
}
|
|
|
|
|
|
}
|