# jh212-parser **Repository Path**: lily_2006/jh212-parser ## Basic Information - **Project Name**: jh212-parser - **Description**: No description available - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-29 - **Last Updated**: 2026-10-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # HJ212-2017 环保协议报文解析器 软件工程实验一作品。使用 Python 实现的 HJ212-2017 环保协议报文解析类库。 ## 功能 - **报文格式验证** `is_valid_message`:检查 `##` 头、4 位长度字段、数据段实际长度与长度字段一致、`4 位 CRC`、`\r\n` 结尾 - **CRC16 校验** `validate_crc`:ANSI 标准 CRC16 算法(初始值 0xFFFF,多项式 0xA001),重算数据段 CRC 并与报文中 CRC 比对 - **数据段解析** `parse_data_segment`:将数据段解析为键值对字典;正确处理 CP 字段的 `&&` 包裹结构及其内部的 `;` 与 `,` 两种分隔符 - **监测因子提取** `extract_monitoring_data`:从 CP 字段中提取所有监测因子编码及其实时值(`-Rtd` 后缀) ## 报文结构 ``` ## + 4位长度 + 数据段 + 4位CRC + \r\n ``` 以测试报文为例: ``` ##0137ST=32;CN=2011;PW=123456;MN=C201801010001;Flag=5;CP=&&DataTime=20180611090000;a34002-Rtd=30.1,a34002-Flag=N;a21026-Rtd=0.5,a21026-Flag=N&&ED94\r\n ``` | 部分 | 内容 | 说明 | |---|---|---| | `##` | 固定开头 | 所有 HJ212 报文都以 ## 开始 | | `0137` | 4 位长度 | 表示后面数据段的长度为 137 个字符 | | `ST=32;...&&` | 数据段 | 系统字段 + CP 监测数据,用 `;` 分隔 | | `ED94` | 4 位 CRC | 数据段的 CRC16 校验码(十六进制) | | `\r\n` | 回车换行 | 报文结束符 | ## 使用方法 ```python from hj212_parser import HJ212Parser msg = '##0137ST=32;CN=2011;PW=123456;MN=C201801010001;Flag=5;CP=&&DataTime=20180611090000;a34002-Rtd=30.1,a34002-Flag=N;a21026-Rtd=0.5,a21026-Flag=N&&ED94\r\n' parser = HJ212Parser() parser.is_valid_message(msg) # True parser.validate_crc(msg) # True parser.parse_data_segment(msg) # {'ST': '32', ..., 'CP': {...}} parser.extract_monitoring_data(msg) # {'a34002': '30.1', 'a21026': '0.5'} ``` ## 运行测试 ```bash python test_hj212.py ``` 预期输出: ``` 格式检查: True CRC校验: True 数据段解析: {'ST': '32', 'CN': '2011', 'PW': '123456', 'MN': 'C201801010001', 'Flag': '5', 'CP': {'DataTime': '20180611090000', 'a34002-Rtd': '30.1', 'a34002-Flag': 'N', 'a21026-Rtd': '0.5', 'a21026-Flag': 'N'}} 监测因子: {'a34002': '30.1', 'a21026': '0.5'} 篡改CRC后: False ``` ## 开发过程记录 1. 实现基本格式验证,测试通过 2. 实现 ANSI CRC16 算法,用真实报文验证校验正确 3. 测试发现 CP 字段被 `;` 误切分的 bug → 修复为遇到 `CP=&&` 后持续收集字段直到 `&&` 结尾 4. 测试发现监测因子的逗号分隔属性(如 `-Rtd=30.1,-Flag=N`)未拆分 → 修复为按 `;,` 双分隔符解析 5. 全部测试用例通过