协议层
协议层是纯编解码,不依赖 socket、执行器或线程。所有接口都是自由函数,输出 Result<T>。
分层
先读这一页
第一次接触 698 的话,先看对象模型与测点寻址。它回答"一个测点是怎么被确定的",也就是 OI、属性标识和元素索引的三层关系,以及记录型对象为什么只能二维定位。不理解这一层,后面所有 GET/SET 的设计都悬着。
这一部分的页面
两种用法
按服务单独编解码。 需要构造某一种请求、或解析响应时,直接用 encode_connection、encode_get、encode_mutation。这是最常见的情况。
统一变体分发。 需要"先收字节、再按类型分发"的通用通道时,用 encode_apdu/decode_apdu。
尺寸约定
两个尺寸概念不要混淆:
- 帧尺寸(
AssociationParameters::send_frame_bytes)是长度域L的上限,不包含0x68和0x16起止符。 - APDU 尺寸(
apdu_bytes)不包含链路封装。
Limits::max_frame_bytes 是完整帧的字节上限(含起止符),默认 16385,对应 14 位长度字段的最大值。
异常分支的统一处理
未实现的 APDU 分支——then-get、非空 FollowReport、SECURITY、REPORT、PROXY——不会静默通过,而是返回 unsupported_service。这意味着你可以放心地解析未知对端的报文:能解出来的都是真实支持的分支,解不出来的会明确告诉你原因。