备注:需要前提知识:计算机中进制的转换,进制运算,大端序与小端序
可以参考我之前的文章:https://shuzhilin.top/archives/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80md
参考博客:https://blog.csdn.net/yangactive/article/details/84775232
新手上路,请多关照。
知识导图:376.1数据帧.xmind
解析帮助工具:链接:https://pan.baidu.com/s/1vwDAJjvv253RKZCFz-UDJw?pwd=08dy 提取码:08dy
符号和缩略语 | 表示 |
---|---|
BIN | 二进制编码 |
BS | 独立位组合 |
C | 控制域 |
CON | 请求确认标志位 |
CS | 帧校验和 |
DIR | 传输方向位 |
EC,EC1,EC2 | 事件计数器 |
ERC | 事件记录代码 |
FCB | 帧计数位 |
FCV | 帧计数有效位 |
FIR | 首帧标志:报文的第一帧 |
FIN | 末帧标志:报文的最后一帧 |
Fn | 信息类标识码 |
G | 电能量单位位 |
G1、G2、G3 | 组成倍率的码位 |
L | 长度 |
L1 | 用户数据长度 |
Lcn | 中文信息长度 |
Le | 事件记录长度 |
MSA | 主站地址 |
P | 校验位 |
pn | 信息点标识码 |
PFC | 启动帧计数器 |
PRM | 启动标志位 |
PSEQ | 启动帧序号 |
PW | 消息认证码字段 |
RSEQ | 响应帧序号 |
S | 正负极性位 |
S0 | 上下浮动位 |
SEQ | 帧序列域 |
Tp | 时间标签 |
TpV | 时间标签有效位 |
Td_c | 曲线类数据时标 |
Td_d | 日冻结类数据时标 |
Td_h | 小时冻结类数据时标 |
Td_m | 月冻结类数据时标 |
帧的基本单元为8位字节。链路层传输顺序为低位在前,高位在后;低字节在前,高字节在后。
案例:68 32 00 32 00 68 E9 00 30 0F 27 00 00 72 00 00 04 00 C8 16
传输规则:
接收方校验:
案例:68 32 00 32 00 68 E9 00 30 0F 27 00 00 72 00 00 04 00 C8 16
Java:代码中判断
案例:68 32 00 32 00 68 E9 00 30 0F 27 00 00 72 00 00 04 00 C8 16 (16进制)
frame[1] & 0x03 = 数据帧的第二个字节& 0000 0011
1:2005
2:376.1
3:保留
4:禁止
32 & 0x03 = 0011 0010 & 0000 0011 = 2
案例:68 BE 01 BE 01 68 A8 00 30 0F 27 00 0C E1 02 01 01 04 19 09 17 06 11 04 00 00 00 80 00 00 00 00 20 00 00 00 00 20 00 00 00 00 20 00 00 00 00 20 00 00 00 40 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00 00 20 00 00 00 05 00 00 00 05 00 00 00 05 00 00 00 05 00 00 00 20 00 00 00 05 00 00 00 05 00 00 00 05 00 00 00 05 00 01 00 00 03 51 16 19 09 CC 16
Java:
frame[2]<<8 | frame[1])>>2
0000 0001 <<8 | 1011 1110>>2
0000 0001 0000 0000 | 0000 0000 0010 1111
12F
return (frame[2]<<8 | frame[1])>>2)
DIR=0,表示此帧报文是由主站发出的下行报文,DIR=1,表示此帧报文是由终端发出的上行报文。
frame[6] & 0x80 = & 1000 0000
PRM=1,表示此帧报文来自启动站;PRM=0,表示此帧报文来自从动站。
frame[6] & 0x40 =& 0100 0000
frame[6] & 0x20 & 0010 0000
ACD位用于上行响应报文中。ACD=1表示终端有重要事件等待访问,则附加信息域中带有事件计数器ECACD=0表示终端无事件数据等待访问。(当ACD为11时,我们可以去记录终端的事件)
ACD置“1”和置“0”规则:
a) 自上次收到报文后发生新的重要事件,ACD位置“1”;
b) 收到主站请求事件报文并执行后,ACD位置“0”。
frame[6] & 0x20 & 0010 0000
FCV=1,表示FCB位有效;FCV=0,表示FCB位无效。
frame[6] & 0x10 & 0001 0000
功能码定义(PRM=1)
功能码 | 帧类型 | 服务功能 |
---|---|---|
0 | —— | 备用 |
1 | 发送∕确认 | 复位命令 |
2~3 | —— | 备用 |
4 | 发送∕无回答 | 用户数据 |
5~8 | —— | 备用 |
9 | 请求∕响应帧 | 链路测试 |
10 | 请求∕响应帧 | 请求1级数据 |
11 | 请求∕响应帧 | 请求2级数据 |
12~15 | —— | 备用 |
a) 启动站功能码10(请求1级数据)用于应用层请求确认(CON=1)的链路传输,应用层请求确认标志见本部分4.3.4.3.4。
b) 启动站功能码11(请求2级数据)用于应用层请求数据的链路传输。
功能码定义(PRM=0)
功能码 | 帧类型 | 服务功能 |
---|---|---|
0 | 确认 | 认可 |
1~7 | —— | 备用 |
8 | 响应帧 | 用户数据 |
9 | 响应帧 | 否认:无所召唤的数据 |
10 | —— | 备用 |
11 | 响应帧 | 链路状态 |
12~15 | —— | 备用 |
frame[6] & 0x0F & 0000 1111
案例:68 32 00 32 00 68 E9 00 30 0F 27 00 00 72 00 00 04 00 C8 16
E9 1110 1001
DIR: 1
PRM: 1
ACD: 1
功能码:9 链路测试
GB 2260—2007:https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=C9C488FD717AFDCD52157F41C3302C6D
地址域由行政区划码A1、终端地址A2、主站地址和组地址标志A3组成
地址域 | 数据格式 | 字节数 |
---|---|---|
行政区划码A1 | BCD | 2 |
终端地址A2 | BIN | 2 |
主站地址和组地址标志A3 | BIN | 1 |
前提知识:
一种编码方式,用二进制表示十进制。由于4位二进制共有16种可能,而只需表示0-9的十个数,故有一定的操作空间。(简单来说就是4位二进制,来表示十进制)。
我的理解如下:68 32 00 32 00 68 C9 03 44 04 00 00 02 71 00 00 01 00 88 16
第一部分为行政区划码_A1,行政区划码按_GB 2260—91_的规定执行,数据格式为两字节_BCD_码_03 44,字节顺序为低位在前高位在后,实际数值应为_4403_
0011 0000 0000 0000
3 0 0 0
个位 十位 百位 千位
(frame[7] & 0x0F) + (frame[7] >> 4) * 10 +(frame[8] & 0x0F )*100 + (frame[8] >> 4) * 1000
(frame[10]<<8) + frame[9]
我们来看:68 3a 00 3a 00 68 4b 00 30 0f 27 00 0e 71 00 00 02 00 00 17 49 16
这个终端地址(HEX):3000270F
frame[11]>>1
帧校验和是用户数据区所有字节的八位位组算术和,不考虑溢出位。用户数据区包括控制域、地址域、链路用户数据(应用层)三部分。
案例:68 3a 00 3a 00 68 4b 00 30 0f 27 00 0e 71 00 00 02 00 00 17 49 16
帧校验和:49
count: 为控制域、地址域、链路用户数据(应用层)字节总数
count&0xFF;
注意:对于应用层需要加密的关键数据,加密的数据区包括:应用层功能码、帧序列域、数据单元标识及数据单元部分
应用层功能码AFN由一字节组成,采用二进制编码表示
应用功能码AFN | 应用功能定义 |
---|---|
00H | 确认∕否认 |
01H | 复位 |
02H | 链路接口检测 |
03H | 中继站命令 |
04H | 设置参数 |
05H | 控制命令 |
06H | 身份认证及密钥协商 |
07H | 备用 |
08H | 请求被级联终端主动上报 |
09H | 请求终端配置 |
0AH | 查询参数 |
0BH | 请求任务数据 |
0CH | 请求1类数据(实时数据) |
0DH | 请求2类数据(历史数据) |
0EH | 请求3类数据(事件数据) |
0FH | 文件传输 |
10H | 数据转发 |
11H~FFH | 备用 |
案例:68 3a 00 3a 00 68 4b 00 30 0f 27 00 0e 71 00 00 02 00 00 17 49 16
0E:表示请求3类数据(事件数据)
帧序列域SEQ为1字节,用于描述帧之间的传输序列的变化规则,由于受报文长度限制,数据无法在一帧内传输,需要分成多帧传输(每帧都应有数据单元标识,都可以作为独立的报文处理)。
D7 | D6 | D5 | D4 | D3~D0 |
---|---|---|---|---|
TpV | FIR | FIN | CON | PSEQ∕RSEQ |
_seq & 0x80)
_seq & 0x40
_seq & 0x20
_seq & 0x10
启动帧
响应帧
帧序列改变规则
传输类别
类别 | 功能 | 用途 |
---|---|---|
S1 | 发送∕无回答 | 启动站发送传输,从动站不回答。 |
S2 | 发送∕确认 | 启动站发送复位命令,从动站回答确认。 |
S3 | 请求∕响应 | 启动站请求从动站的响应,从动站作确认、否认或数据响应。 |
seq & 0x0F
信息点DA | DA1 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|
DA2 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
信息类DT | DT1 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
DT2 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
信息点_DA_:信息点_DA_由信息点元_DA1_和信息点组_DA2_两个字节构成。DA2_采用二进制编码方式表示信息点组,低位在前高位在后,DA1_对位表示某一信息点组的_1_~_8_个信息点,以此共同构成信息点标识_pn(n=1_~_2040),当_DA1_和_DA2_全为“0”时,表示终端信息点,用_p0_表示;运算规则为*(DA2-1)8+DA1对应位的值就是信息点标识_pn
信息点组DA2 | 信息点元DA1 | |||||||
---|---|---|---|---|---|---|---|---|
D7~D0 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
1 | p8 | p7 | p6 | p5 | p4 | p3 | p2 | p1 |
2 | p16 | p15 | p14 | p13 | p12 | p11 | p10 | p9 |
3 | p24 | p23 | p22 | p21 | p20 | p19 | p18 | p17 |
…… | …… | …… | …… | …… | …… | …… | …… | …… |
255 | P2040 | P2039 | P2038 | P2037 | P2036 | P2035 | P2034 | P2033 |
信息点组_DA1_ | 对应值 |
---|---|
0x80 | 8 |
0x40 | 7 |
0x20 | 6 |
0x10 | 5 |
0x08 | 4 |
0x04 | 3 |
0x02 | 2 |
0x01 | 1 |
我的理解是对应的电表地址的索引:1~2033
案例:01 02
DA1: 0000 0001 DA2:2 =p9
信息类_DT_由信息类元_DT1_和信息类组_DT2_两个字节构成。DT2_采用二进制编码方式表示信息类组,DT1_对位表示某一信息类组的_1_~_8_种信息类型,以此共同构成信息类标识_Fn(n=1_~_248),运算规则为DT2*8+DT1**对应位的值(8421码)**就是信息类标识_Fn
信息类组DT2 | 信息类元DT1 | |||||||
---|---|---|---|---|---|---|---|---|
D7~D0 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
0 | F8 | F7 | F6 | F5 | F4 | F3 | F2 | F1 |
1 | F16 | F15 | F14 | F13 | F12 | F11 | F10 | F9 |
2 | F24 | F23 | F22 | F21 | F20 | F19 | F18 | F17 |
…… | …… | …… | …… | …… | …… | …… | …… | …… |
30 | F248 | F247 | F246 | F245 | F244 | F243 | F242 | F241 |
…… | 未定义 |
案例:04 00 =F3 心跳帧
消息认证码字段PW用于重要下行报文,由16字节组成,PW是由主站按系统约定的认证算法产生,并在主站发送的报文中下发给终端,由终端进行校验认证,通过则响应主站命令,反之则否认。终端在收到带有PW的报文,必须在认证通过后,才能响应命令。
事件计数器EC用于ACD位置“1”的上行响应报文中,EC由2字节组成,分别为重要事件计数器EC1和一般事件计数器EC2。计数范围0~255,循环加1递增。每发生1个事件,相应的计数器自动加1。
事件计数器EC | 数据格式 | 字节数 |
---|---|---|
重要事件计数器EC1 | BIN | 1 |
一般事件计数器EC2 | BIN | 1 |
启动帧帧序号计数器PFC | BIN | ||
---|---|---|---|
数据名称 | 数据格式 | 单位 | 字节数 |
1 | |||
启动帧发送时标 | 见附录A.16 | 秒分时日 | 4 |
允许发送传输延时时间 | BIN | min | 1 |