南向驱动开发
本章面向二次开发者,目标是给出一套可长期维护的驱动开发方法论:清晰边界、强容错、可观测、可压测。
核心原则:驱动只做“协议与设备能力”,不要把业务规则、平台协议、或 UI/存储细节塞进驱动。
驱动的职责边界
一个驱动应当覆盖:
- 连接与会话:串口/TCP 的连接管理、重连、心跳
- 读写能力:点位读写、批量策略、超时控制
- 协议解析:帧编解码、校验、粘包/半包处理
- 点位映射:协议地址 → 统一 point/value
- 错误语义:可操作的错误分类(可重试/需重连/不可恢复)
不应该覆盖:
- 北向 publish、主题/载荷、平台鉴权
- 业务规则/行业逻辑(应放在 transform/规则层或插件)
推荐的结构(文件/模块)
建议按“可测试”拆分:
codec/:纯编解码(输入&[u8],输出结构体/枚举),便于单测与 fuzztransport/:串口/TCP 读写与重连client/:协议会话与请求响应匹配(含超时/重试)mapping/:点位映射与批量策略
容错与稳定性
- 严禁
unwrap/expect:所有 I/O 与解析必须返回可诊断错误 - 指数退避 + 抖动:对重连/重试默认开启,避免雪崩
- 设备级隔离:每个设备任务独立运行,错误不扩散
性能与吞吐
- 批量优先:减少 RTT 和帧开销
- 预分配与复用:热点路径避免频繁分配
- 零拷贝解析:尽量用
&[u8],必要时用Bytes共享缓冲 - 有界队列:与 core pipeline 协作背压,避免无界缓存
测试策略(最低要求)
- 编解码单测:黄金用例 + 边界/异常用例
- 集成测试:模拟设备或回放报文(pcap/录包)
- 压力测试:点位规模、采集频率、断线重连、噪声数据注入
