协议栈模块设计文档

一 引言

有两种方向的数据交换。一种是请求/响应类型的数据交换,主机请求从机,从机提供响应,涉及到读取、设置、操作、代理等服务;另一种是通知/确认类型的数据交换,从机主动上报,主机回复确认,涉及到上报服务。在开发过程中,主机指客户机,包括主站(某上位机)或终端(集中器),从机指服务器,这里就是电表。

二 数据链路层

2.1 字节格式

链路层帧的基本单元为8位字节,传输顺序为低位在前,高位在后;低字节在前,高字节在后。

2.2 帧格式

2.2.1 帧结构

本标准采用的帧格式见下:

起始字符(68H) 1字节
长度域 L 2字节
控制域 C 1字节
地址域 A N字节
帧头校验 HCS 2字节
链路用户数据 APDU
帧校验 FCS 2字节
结束字符(16H) 1字节
2.2.2 长度域L

长度域L由2字节组成,采用BIN编码,定义见下图。

bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
保留 帧数据长度单位 帧数据长度值

其中:

a) bit0…bit13:帧数据长度值,是传输帧中不包含起始字符和结束字符的数据长度;

b) bit14:帧数据长度单位,0表示帧数据长度单位为字节,1表示帧数据长度单位为千字节;

c) bit15:保留。

2.2.3 控制域C
2.2.3.1控制域C定义

控制域C为1个字节,按位或位的组合使用,定义见下图

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
传输方向DIR 启动标志PRM 分帧标志 保留 扰码标志SC 功能码
2.2.3.2传输方向及启动标志位

传输方向位及启动标志位定义:

a)传输方向位:bit7=0表示此帧是由客户机发出的;bit7=1表示此帧是由服务器发出的;

b)启动标志位:bit6=0表示此帧是由服务器发起的;bit6=1表示此帧是由客户机发起的。

传输方向位DIR和启动标志位PRM组合意义见下表。

DIR PRM 组合意义
0 0 客户机对服务器上报的响应
0 1 客户机发起的请求
1 0 服务器发起的上报
1 1 服务器对客户机请求的响应

服务器发起的上报:

图片

客户机对服务器上报的响应:

图片

客户机发起的请求:

图片

服务器对客户机请求的响应:

图片

2.2.3.3分帧标志位

分帧标志位:bit5=0,表示此帧链路用户数据为完整APDU;bit5=1,表示此帧链路用户数据为APDU片段。

图片

2.2.3.4扰码标志位

扰码标志位:bit3=0,表示此帧链路用户数据不加扰码;bit3=1,表示此帧链路用户数据加扰码,发送时链路用户数据按字节加33H。

正常请求报文:

图片

开启扰码请求报文:

图片

回复对比:

图片

2.2.3.5功能码

功能码采用BIN编码,定义见下表

功能码 服务类型 应用说明
0 保留
1 链路管理 链路连接管理(登录,心跳,退出登录)
2 保留
3 用户数据 应用连接管理及数据交换服务
4…7 保留

(1)预连接(Link.request/response/indication/confirm)

对于本地通信信道如:RS485、红外等。当物理连接建立时,默认预连接的通道即存在,不需要额外的建立以及预连接管理。

适用于交换网络传输信道如:以太网/GPRS;

需通过登录确认身份;

需心跳来维持链路活动状态;

本地信道如:RS232/红外不需要该服务;

(2)应用连接:

(CONNECT.request/response/indication/confirm)————建立

(RELEASE.request/response/indication/confirm/notification)————断开

其中notification由服务器应用进程调用,通知客户机应用进程连接因超时而失效,将被断开,此服务不需要客户机做任何响应。(待考证)

图片

(3)数据交换:

数据交换是通过逻辑名引用来访问接口对象的属性或方法。
请求/响应类型:读取(GET)、设置(SET)、操作(ACTION)、代理(PROXY)
通知/确认类型:上报(REPORT)

图片

2.2.4 地址域
2.2.4.1地址域组成

地址域A由可变字节数的服务器地址SA和1字节的客户机地址CA组成,定义见下图

服务器地址SA
客户机地址CA
2.2.4.2服务器地址SA
2.2.4.2.1服务器地址定义

服务器地址SA由1字节地址特征和N个字节地址组成。定义见下图

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 1字节地址特征
地址类型 逻辑地址 地址长度
扩展逻辑地址/分路地址 1字节
地址 N-1字节地址

地址特征定义:

a)bit0…bit3:为地址的字节数,取值范围:0…15,对应表示1…16个字节长度;

b)bit4…bit5:逻辑地址;

bit5=0表示无扩展逻辑地址,bit4取值0和1分别表示逻辑地址0和1;

bit5=1表示有扩展逻辑地址,bit4备用;地址长度N包含1个字节的扩展逻辑地址,取值范围2…255,表示逻辑地址2…255;

c)bit6…bit7:为服务器地址的地址类型,0表示单地址,1表示通配地址,2表示组地址,3

表示广播地址。

扩展逻辑地址和地址要求如下:

a)扩展逻辑地址取值范围2…255;

b)编码方式为压缩BCD码,0保留;

c)当服务器地址的十进制位数为奇数时,最后字节的bit3…bit0用FH表示。

2.2.4.2.2单地址

单地址的长度为可变字节。

无扩展逻辑地址:

图片

有扩展逻辑地址

图片

2.2.4.2.3组地址

组地址的长度为可变字节。组地址对系统中属于该群组的服务器有效,无需应答。

2.2.4.2.4通配地址

通配地址的长度为可变字节。每字节二进制高低各4位分别编码表示两个0到9的十进制数或通配符AH。通配符按十进制位使用,对应的十进制位为AH时,表示该十进制位可为0到9的任意值。

图片

2.2.4.2.5广播地址

广播地址的长度固定为1字节,广播地址=AAH。广播地址对系统所有服务器有效,无需应答。

图片

2.2.4.3客户机地址CA

客户机地址CA用1字节表示,0表示不关注客户机地址。

2.2.5 帧头校验HCS

帧头校验HCS为2字节,是对帧头部分不包含起始字符和HCS本身的所有字节的校验。

2.2.6 链路用户数据

链路用户数据包含一个APDU或APDU分帧片段,APDU(应用层数据单元)。

2.2.7 帧校验FCS

帧校验FCS为2字节,是对整帧不包含起始字符、结束字符和FCS本身的所有字节的校验。

传输规则

2.3.1 字节规则

采用串行通信方式发送数据时:

a)线路空闲状态为二进制1;

b)在有效数据帧前加4个FEH作为前导码;

c)数据链路层帧的字节之间无线路空闲间隔;两帧之间的线路空闲间隔至少33位。

2.3.2 分帧传输
2.3.2.1分帧传输规则

当一个APDU数据组帧的长度超过协商的最大帧长度时,采用分帧传输。采用分帧传输时,控制域中分帧标志位置1。数据接收端应对分帧进行逐条确认。

2.3.2.2分帧传输格式定义

分帧传输时,数据链路层的链路用户数据为分帧传输帧,分为数据帧和确认帧;分帧传输的数据帧包含分帧格式域和APDU片段,格式定义见下图。分帧传输的确认帧仅包含分帧格式域,不含APDU片段。

分帧格式 链路用户数据
APDU片段

分帧格式域为2字节,按位或位的组合使用,定义见下图

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
bit15…bit14 bit13 bit12 bit11 bit10 bit9 bit8

位定义如下:

a)bit0…bit11:表示分帧传输的帧序号,取值范围0…4095,循环使用;

b)bit12…bit13:保留;

c)bit14…bit15:表示分帧类型,定义见下表。

分帧类型 意义
0 表示分帧传输起始帧
1 表示分帧传输末尾帧
2 表示分帧传输确认帧
3 表示分帧传输中间帧
2.3.2.3分帧传输交互规则

分帧传输交互可由服务器或客户机任意一侧发起,适用于主动发起的数据服务或者被动应答的数据服务,发送方将APDU应用数据单元分割成若干个片段,通过分帧方式依次发送。

分帧过程如下:

a) 分帧的第一帧数据,帧序号(block)=0,分帧类型=0;

图片

b) 分帧传输确认,分帧类型=2,block值为最近一次收到正确的帧序号;

图片

c) 分帧的发送方在接收到确认帧后传输下一个数据帧,分帧类型=3,分帧序号block=接收到确认帧的帧序号+1,重复b)和c);

图片

确认帧帧号+1:

图片

d) 分帧的最后一帧,block=最后一帧的帧序号,分帧类型=1,发送方在接收到最后一个确认帧后,分帧传输过程完成。

图片

最后一帧回复:

图片

2.4 APDU解析

2.4.1 客户机应用层数据单元
数据类型定义 说明
Client-APDU∷=SEQUENCE
{
应用层服务CHOICE
{
建立应用连接请求 [2] CONNECT-Request,
断开应用连接请求 [3] RELEASE-Request,
读取请求 [5] GET-Request,
设置请求 [6] SET-Request,
操作请求 [7] ACTION-Request,
上报应答 [8] REPORT-Response,
},
时间标签域 TimeTagOPTIONAL
}
2.4.2 服务器应用层数据单元
数据类型定义 说明
Server-APDU∷=SEQUENCE
{
应用层服务CHOICE
{
建立应用连接响应 [130] CONNECT-Response,
断开应用连接响应 [131] RELEASE-Response,
断开应用连接通知 [132] RELEASE-Notification,
读取响应 [133] GET-Response,
设置响应 [134] SET-Response,
操作响应 [135] ACTION-Response,
上报通知 [136] REPORT-Notification,
},
跟随上报信息域 FollowReportOPTIONAL,时间标签域 TimeTag OPTIONAL
}
2.4.3 安全传输数据单元
数据类型定义 说明
SECURITY-APDU∷=CHOICE
{
安全请求 [16] SECURITY-Request,
安全响应 [144] SECURITY-Response
}

建立应用连接:

图片

回复帧:

图片

断开应用连接:

图片

ESAM回抄表号:

图片

回复帧:

图片

三 物联表协议需求

3.1 协议安全

设备接入认证、安全业务报文处理需求如下:

1)具有安全需求的业务报文通过系统管理APP统一转发给安全APP进行加解密处理后返回给系统APP执行后续业务流程。

2)主站(或手机、终端)的应用连接报文由系统APP转给安全APP处理安全相关事宜,具体协商参数(如协商尺寸),在应答报文中由系统APP填充处理。

3)系统APP根据是否安装安全APP(通道是否建立、INI文件是否有安全APP)来确定是否启用安全转发功能,在有安全APP的前提下,所有发给电表APP(包括业务APP及扩展APP)的业务报文均转给安全APP判断安全模式及权限判断及OI过滤判断,在安全APP确认安全后,返回系统APP进行路由转发。所有从电表APP发送到外围通道(扩展模组或主动上报),也均需经过安全APP确认后,再进行消息路由转发。

扩展模组的明文报文根据逻辑地址直接转发(对应的安全模式判断由扩展模组自己完成)。扩展模组的密文经过安全APP加解密处理后转发。

4)未安装安全APP时(调试或试挂等特殊场景如终端或主站功能未开发完成),明文报文根据逻辑地址直接转发,如收到带安全的报文直接返回失败或不处理。

5)安全模式(F1010200)启用放在系统APP,出厂默认不启用安全模式。不启用安全模式时,明文直接从sys_app透传给mt_app;出厂前需修改为启用安全模式,启用安全模式后,不能再改回不启用安全模式,过程不可逆。

6)密文通信:管理模组收到主站发给计量模组的密文不做解密,直接转发;管理模组收到主站发给扩展模块的密文,先使用主站与管理模组之间的密钥解密,然后使用管理模组与扩展模块之间的密钥加密,再发报文发给模块;主站和扩展模块之传输,除密钥更新外,管理模组只负责报文的加解密转发,不处理报文。更新扩展模块密钥时,管理模组需先走正常解密,再进行管理模组与扩展模块密钥更新流程,最后再进行一次扩展模块加密将密钥传递给扩展模块。

7)一条命令不能同时访问不同APP的数据,例如请求读取若干个对象属性(GetRequestNormalList)不能同时抄读基础业务APP、系统管理APP的数据。

8)未启用安全模式和启用安全模式唯一的区别是未启用安全模式明文可以执行一切操作,支持读取安全app信息、建立应用连接、密文操作。

3.2 扩展模组通信

1)主站与扩展模组或扩展APP交互,服务器地址为管理模组通信地址,逻辑地址为模组(或扩展APP)的扩展逻辑地址;

2)管理模组收到此命令后,首先判断服务器地址是否和管理模组通信地址一致,如果一致,则再根据管理模组中逻辑地址、端口的对应关系转发给对应的端口;

3)管理模组收到扩展模组的主动上报后,将模组主动上报报文中的逻辑地址更换为模组的逻辑地址,再转发给主站;主站的上报应答报文,转发给管理模组。

4)电能表模组列表(OI:4031)中:

模组类别按bit-string(SIZEOF(16)):bit0–通信,bit1—计算,bit2–控制,bit3–存储,bit4–显示,其它位保留为0。

逻辑地址:2–负荷开关,3–非介入式负荷感知模块,4–有序充电模块,5–电能质量模块,6–扩展通信模块1,7–扩展通信模块2,8–智能锁具,9–随器计量模块,10–洗衣机,11–冰箱,12–热水器,13–空调,14–光伏设备模组。范围分配:230为功能模组,3462为重复的第二个功能模组,即第一个功能模组逻辑地址+0x20,64~127给APP128–手机APP,其中63保留为上行通信模块,上行通信模块不在属性2中,属性2中模组不能占用63这个逻辑地址。

5)负荷开关的模组描述符:“type=Relay”,逻辑地址:2,模组类别:0004H。非介入式负荷辨识模组的模组描述符:“type=NILM”,逻辑地址:3,模组类别:0002H。电能质量模组的模组描述符:“type=PowerQuality”,逻辑地址:5,模组类别:000AH。有序充电模组的模组描述符:“type=Charging”,逻辑地址:4,模组类别:0005H。

6)电能表模组列表中每个模组的逻辑地址指该模组在698.45协议中的扩展逻辑地址,主站从管理模组读取电能表模组列表后,就要采用扩展逻辑地址访问模组。模组(扩展模块)应支持版本信息(OAD:43000300)、对象列表(OAD:44000200)的读取,对象列表(OAD:44000200)中包括模组中各个对象的访问权限。考虑管理模组的应用连接应答中有版本信息(协议上数据同OAD:43000300),管理模组可以支持读取OAD:43000300,返回基础APP的版本信息。

图片

四 协议栈设计流程

4.1 函数接口设计

4.1.1 协议栈流程图

图片

4.1.2 判断APDU数据格式

图片

4.1.3 处理APDU数据

图片

4.1.4 内部抄读接口

图片

附录一 协议栈结构体

数据类型 含义
typedefstruct
{
u8LogicAddr;//逻辑地址:00管理板、01计量板、扩展模块逻辑地址
u8NeedNext;//是否有后续帧标志,应用层分帧标志,暂时无用。
u8ServiceType;//服务类型:GetRequest、GetResponse等,
u8AddrType;//地址类型:单地址、广播地址、组地址等,
u8PortNum;//通信端口号
u8CryptType;//加密类型:如明文+MAC,密文等
u8ClientAddr;//客户机地址
u8Rerse1;//预留等
u16LenData;//APDU长度:传输的实际APDU长度
u16MaxLen;//消息路由分配的最大APDUBUF大小,默认2K,
u8Rerse2[4];//预留,后续扩展645协议等
}T_ChannelMsgHeadInfo;
接受帧的头(安全App处理后的消息头)
typedefstruct
{
u8TimeTagBuf[12];//时间数组
boolTimeTagFlag;//没有时间标签
boolIsValidTimeTagFlag;//时间标签有效
u8CryptType;//安全模式,加密类型:如明文+MA
u8PortNum;//通信端口号:暂时无用,
u8LogicAddr;//逻辑地址
u8RequestMode;//APDU[0]//服务类型:
u8RequestType;//APDU[1]01、02、03、
u8RequestPIID;//APDU[2]PIID
u8AddrType;//地址类型:单地址、广播地址、组地址
u16OADBuflen;//请求帧OADBUF的对应长度
u8NewRecordFlag;//用于判断是否有新一条编程记录
u8Data[1];//预留
}T_APDUHeadInfo;
返回桢的头
typedefstruct
{
u8*DataBuf;//提供存储数据的地址指针DataBuf
u16DataLen;//提供存储数据的位置
u16MaxDataLen;//位置最大限制
u8LoadDataFlag;//是否需要读取EE或者FLASH
u8Data[2];//预留
T_APDUHeadInfotRevMsgHead;//APP头
}T_StoreData;//向DataBuf的第DataLen个元素写入
返回帧的结构体

PortNum 定义:

双芯 SPI 0x01
双芯 UART 0x02
蓝牙主 1 0x10
蓝牙主 2 0x11
蓝牙从 1 0x12
蓝牙从 2 0x13
蓝牙从 3 0x14
上行模组 0x20
扩展模组 1 0x30
扩展模组 2 0x31
扩展模组 3 0x32
广播通道 0xFF

注:明确了端口(通道)号的数字后,APP需要严格按照此端口定义返回和发起请求,如:收到请求报文,响应应答时,按原来通道返回。发送请求报文时,填写正确的端口号,以便系统APP进行转发,比如请求计量芯的一些数据,有可能走SPI也可能是UART,这时需要填写正确端口号。

广播通道用于APP通知系统APP将广播发给各物联通道,比如在电表时间修改后,mt_app发送PortNum为0xFF的广播校时报文,系统APP收到此消息后,转发给所有从设备,从设备收到广播校时报文,则立即更新时间。

客户机地址、逻辑地址定义:

电能表APP客户机地址、逻辑地址默认分配

APP名称 客户机地址 逻辑地址 文件名 应用名称
基础业务APP 10H 00H mt_app.bin mt_app
安全服务APP 13H 53H sec_app.bin sec_app
系统管理APP 14H 54H sys_app.bin sys_app

注:安全APP发起的报文,客户机地址用0x13;系统APP发起的报文,客户机地址用

0x14。基表APP读取表号、密钥版本信息,数据结构中逻辑地址填写0即可。

注1:表格中APP、客户机地址、逻辑地址为推荐值,不强制要求。

加密类型:

typedefenum

{

UN_ENCRYPTED=0,/明文/

UN_ENCRYPTED_WITH_SIDMAC,/明文+SIDMAC/

UN_ENCRYPTED_WITH_RN,/明文+随机数/

UN_ENCRYPTED_WITH_RNMAC,/明文+RNMAC/

UN_ENCRYPTED_WITH_SID,/明文+SID/

ENCRYPTED=0x80,/密文/

ENCRYPTED_WITH_SIDMAC,/密文+SIDMAC/

ENCRYPTED_WITH_RN,/密文+随机数/

ENCRYPTED_WITH_RNMAC,/密文+RNMAC/

ENCRYPTED_WITH_SID,/密文+SID/

}EN_SECURITY_TYPE;

附录二系统管理APP及安全服务APP协议列表

系统APP支持协议处理

序号 OAD3 OAD2 OAD1 OAD0 数据项 备注
1 40 01 02 00 通信地址
2 40 05 02 NN 组地址
3 40 31 02 00 电能表模组列表
4 40 31 03 00 模组版本信息列表
5 43 00 06 NN 支持规约列表
6 30 30 06 00 模块变更事件判定延时
7 44 00 NN NN 应用连接类相关数据
8 44 01 02 00 认证密码 无安全APP时,由系统APP管理,有安全APP时,由安全APP管理
9 F0 01 NN NN 文件分块传输管理
11 F1 01 02 00 安全模式 出厂默认不启用安全模式,明文直接从sys_app透传给mt_app;出厂前需修改为启用安全模式,不能再改回不启用安全模式,操作不可逆。
12 F2 09 NN NN 载波/微功率无线设备对象列表
13 F2 0B NN NN 蓝牙设备对象列表
14 F2 0D NN NN 扩展设备对象列表 实现属性3和方法128
15 40 27 02 00 升级结果
16 73 01 NN NN 应用集合 7301方法131不支持
17 33 27 NN NN 系统监测事件单元
18 36 00 06 00 系统监测事件配置参数
19 36 02 06 00 应用监测事件配置参数
20 F4 02 02 00 应用单元

安全APP支持协议列表

序号 OAD3 OAD2 OAD1 OAD0 数据项 说明
1 44 01 02 00 认证密码 无安全APP时,由系统APP管理,有安全APP时,由安全APP管理
2 F1 01 NN NN 安全模式相关
3 40 02 02 00 表号
4 73 01 85 00 软件摘要信息比对
5 73 01 86 00 获取软件摘要信息
6 F1 00 NN NN ESAM相关
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐