纯 MoonBit 的 HJ 212 污染物在线监控数据传输协议实现:帧编解码、数据区解析、命令层与流式分帧,核心零依赖。
##0140QN=20240115103000123;ST=31;CN=2011;PW=123456;MN=0100...DC0;Flag=5;CP=&&DataTime=...;a34013-Rtd=1.52&&3647\r\n
└┬─┘└──┘└──────────────────── 数据段 ────────────────────┘└──┘└─┘
包头 长度 CRC 包尾moon add Mr-Houjie/mbt-hj212match @hj212.Frame::decode(raw) {
Ok(frame) => {
println(frame.segment.cn) // "2011"
println(frame.segment.cp.get("a34013-Rtd")) // Some("1.52")
}
Err(error) => println(error.message()) // 直接给人看的中文描述
}let framer = @hj212.Framer::new()
for chunk in chunks {
for event in framer.feed(chunk) {
match event {
@hj212.Good(frame) => handle(frame)
@hj212.Bad(error, raw) => log(error, raw)
@hj212.Noise(text) => () // 日志前缀、半包残片
}
}
}let frame : @hj212.Frame = {
segment: {
qn: "20240115103000123",
st: "31",
cn: "2011",
pw: "123456",
mn: "010000A8900016F000169DC0",
flag: @hj212.Flag::new(@hj212.V2017, false, true),
pnum: None,
pno: None,
cp: @hj212.DataArea::new()
..set("DataTime", "20240115103000")
..set("a34013-Rtd", "1.52"),
extra: [],
},
}
println(frame.encode())mbt-hj212 explain <报文|文件> 逐字段解释一条报文
mbt-hj212 check <报文|文件> 只校验,不合法时退出码 1
mbt-hj212 frames <报文|文件> 按 TCP 流分帧,逐条列出
mbt-hj212 encode [选项] 构造一条报文
mbt-hj212 crc <数据段> 算数据段的 CRC 与字节长度$ mbt-hj212 explain '##0140QN=20240115103000123;ST=31;CN=2011;PW=123456;MN=010000A8900016F000169DC0;Flag=5;CP=&&DataTime=20240115103000;a34013-Rtd=1.52;a34013-Flag=N&&3647'
长度 140 字节(数据段)
CRC 3647 校验通过
版本 HJ 212-2017
Flag 5 版本位 000001 · 不分包 · 需应答
QN 20240115103000123 2024-01-15 10:30:00.123
ST 31 大气环境污染源
CN 2011 污染物实时数据 · 双向
PW 123456
MN 010000A8900016F000169DC0 24 位
CP 3 项
DataTime 20240115103000
a34013-Rtd 1.52
a34013-Flag Nmoon run cmd/verifytypes.mbt 公共类型:Version、Flag、DecodeError、Segment、Frame
text.mbt 字符/字节工具:UTF-8 计数、十六进制、显示宽度对齐
crc.mbt CRC16/MODBUS
field_type.mbt 数据类型表:C4、N5、N14.2、YYYY/MM/DD/hh/mm/ss/zzz
data_area.mbt 数据区:&& 包装、名称=值、逗号分隔多值
segment.mbt 数据段:字段切分(先定位 CP=)、序列化、语义校验
time.mbt QN 时间戳
frame.mbt 帧编解码 + 流式分帧器
commands.mbt 命令码表(表 9)
explain.mbt 逐字段解释,供 CLI 使用
corpus/ 语料与生成脚本
cmd/main/ 命令行
cmd/verify/ 语料自检moon test # 20 个单元测试
moon run cmd/verify # 26 个语料用例pub(all) enum DecodeError {
MissingHeader
BadLengthField(String)
Truncated(Int, Int)
BadCrc(String, String)
BadTail(String)
EmptySegment
MissingField(String)
DuplicateField(String)
BadField(String)
BadFieldValue(String, String)
BadDataArea(String)
TrailingGarbage(String)
}pub(all) enum Direction {
Down
Up
Both
}pub(all) enum FieldType {
Chars(Int)
Number(Int, Int)
Year
Month
Day
Hour
Minute
Second
Millisecond
}pub(all) struct Flag {
raw : Int
}pub(all) struct Framer {
buffer : String
}pub(all) struct QnTime {
year : Int
month : Int
day : Int
hour : Int
minute : Int
second : Int
millis : Int
}pub(all) enum Version {
V2005
V2017
V2025
Unknown(Int)
}fn utf8_len(s : String) -> IntInstall
Download zip纯 MoonBit 的 HJ 212 污染物在线监控数据传输协议实现:帧编解码、数据区解析、命令层与流式分帧,核心零依赖。