GET 与记录查询
头文件:<dlt698/protocol/apdu/get.hpp>、<dlt698/protocol/apdu/get_block.hpp>,命名空间 dlt698::protocol::apdu。
属性读取
约束:
- Normal 恰含一个属性,NormalList 必须非空。
list=false传多个属性会返回错误。 - DAR 与 Data 分开保存。
AttributeResult::result是 variant,判断类型才知道是失败还是值。 - 按原顺序保留。 响应顺序与请求 OAD 顺序一一对应,
Session会检查这一点。 - 不支持 FollowReport。 解码带该字段的响应返回
unsupported_service;编码响应时始终写入"FollowReport 不存在"的标记。
读取单个属性:
记录查询
每条查询保存完整的 Rsd/Rcsd。响应必须给出表头——即使 RCSD 为空表示全选,RecordResult::columns 里也要列出实际列。选择器的业务语义由 provider 解释,库不做假设。
行数据用 RecordRow(一组 Data)表示,每行的列数必须与 columns 一致,且每列类型与表头匹配。
GET Next 分块
服务端切分
split 的语义:
- 完整属性或记录行是最小单位。 记录表按行拆分,各块保留 OAD/RCSD;客户机合并相同表头的连续记录行。重复记录 OAD 的查询保持整个记录结果边界,Session 自动禁用合并;独立收集器须显式传
merge_record_rows=false。 target_bytes是期望值而非硬约束。不可切分的单元超过target_bytes时仍由链路分帧传输,但必须满足limits。- 最多 65536 块,16 位块号不循环。
snapshot是首次查询结果,后续取块不再次读取 provider。快照总量、超时和会话数量由调用方另外限制。
accept 的语义:
- 只接受从零开始的连续块,跳号、重复、分支变化都返回错误。
- 非末块返回空
optional,末块返回完整快照。 - 失败时 DAR 原码在
Error::remote_code。 - 不检查 TimeTag 和地址——
Session检查后再调用;也不会自动重发请求。
客户端收集
正常使用不需要直接用 GetBlockTransfer。Session::async_get 和 async_get_record 会自动收齐所有数据块,回调拿到的是完整结果。
如果注册了记录处理器,Session 会缓存首次结果直到分块完成或超时,后续分页不会再次调用 provider。
编解码入口
decode_get 还会检查 PIID 保留位、属性结果选择器和可选时间标签的合法性。其他服务、变体或带 FollowReport 的响应返回 unsupported_service。
与链路分帧的区别
两套机制独立:
SessionOptions::prefer_get_blocks(默认 true)决定超长 GET 优先走应用层分块;即使走应用层分块,单个块超过帧尺寸时仍会用链路分帧传输。