一、协议的定义
要对某种协议进行编解码操作,就必须知道协议的基本定义,首先我们来看一下 CJ/T188 的数据帧定义(协议定义),了解请求数据与响应数据的基本结构。
1.1 CJ/T188 水表通讯协议
请求帧:
字节 | 值 | 描述 |
---|---|---|
0 | 0x68 | 数据帧开始标识。 |
1 | T | 表计类型代码,详细信息请参考 表计类型表 。 |
2-8 | A0-A6 | 表计地址,水表设备的具体地址,这里是 BCD 形式。 |
9 | CTR_01 | 协议控制码,例如 0x1 就是读表数据。 |
10 | 0x3 | 数据域长度。 |
11-12 | 0x1F,0x90 | 数据标识 DI0-DI1。 |
13 | 0x00 | 序列号,一般为 0x00,序列号也被作为整个数据域的长度。 |
14 | CS | 表示校验和数据,即 0-13 位置的所有字节的累加和。 |
15 | 0x16 | 数据帧的结束标识。 |
例如有以下请求帧数据(读取水表数据):
68 10 01 00 00 05 08 00 00 01 03 1F 90 00 39 16
对应的解释如下。
顺序 | 0 | 1 | 2-8 | 9 | 10 | 11-12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|
说明 | 帧头 | 类型 | 地址 | CTR_0 | 长度 | 数据标识 | 序列号 | 校验和 | 帧尾 |
实例 | 68 | 10 | 01 00 00 05 08 00 00 | 01 | 03 | 1F 90 | 00 | 39 | 16 |
表计类型表:
值 | 含义 |
---|---|
10 | 冷水水表 |
11 | 生活热水水表 |
12 | 直饮水水表 |
13 | 中水水表 |
20 | 热量表 (记热量) |
21 | 热量表 (记冷量) |
30 | 燃气表 |
40 | 电度表 |
响应帧(读表操作):
字节 | 值 | 描述 |
---|---|---|
0 | 0x68 | 数据帧开始标识。 |
1 | T | 表计类型代码,详细信息请参考 表计类型表 。 |
2-8 | A0-A6 | 表计地址,水表设备的具体地址,这里是 BCD 形式。 |
9 | CTR_1 | 协议控制码,在返回帧含义即是请求帧的控制码加上 0x80。 |
10 | L | 数据域长度。 |
11-12 | 0x1F,0x90 | 数据标识 DI0-DI1。 |
13 | 0x00 | 序列号,一般为 0x00。 |
14-17 | ALL DATA | 累计用量,以 BCD 形式进行存储。 |
18 | 单位 | 计量单位,具体含义可以参考 计量单位表 。 |
19-22 | MONTH DATA | 本月用量,以 BCD 形式进行存储。 |
23 | 单位 | 计量单位,具体含义可以参考 计量单位表 。 |
24-30 | 时间 | 表示实际时间,以 BCD 形式存储,格式为 ss mm HH dd MM yy yy。 |
31 | 状态 1 | 状态字段。 |
32 | 状态 2 | 保留字节,一般置为 0xFF。 |
33 | CS | 表示校验和数据,即 0-32 位置的所有字节的累加和。 |
34 | 0x16 | 数据帧的结束标识。 |
例如有以下响应帧数据:
68 10 44 33 22 11 00