首页 IEC 62056(中文)62056-51

IEC 62056(中文)62056-51

举报
开通vip

IEC 62056(中文)62056-51GB/T ××××—×××× GB/T ××××—×××× 目 次 III前言 11 概述 11.1 范围 11.2 规范性引用文件 12 综述 12.1 基本术语(词汇) 12.2 子层与协议 22.3 规范语言 23 传输子层 23.1 传输子层协议 23.2 综述 23.3 传输协议规定条款 (clause) 33.4 传输服务和服务原语 33.5 传输协议数据单元 (TPDU)说明 43.6 传输参数 43.7 状态变换 53...

IEC 62056(中文)62056-51
GB/T ××××—×××× GB/T ××××—×××× 目 次 III前言 11 概述 11.1 范围 11.2 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 性引用文件 12 综述 12.1 基本术语(词汇) 12.2 子层与协议 22.3 规范语言 23 传输子层 23.1 传输子层协议 23.2 综述 23.3 传输协议 规定 关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定 条款 (clause) 33.4 传输服务和服务原语 33.5 传输协议数据单元 (TPDU)说明 43.6 传输参数 43.7 状态变换 53.8 出错处理与错误列表 64 应用子层 64.1 应用子层协议 64.2 综述 64.3 信息交换的安全性 64.4 客户机和服务器的身份验证 74.5 交互数据的保密性 84.6 应用环境 84.7 DLMS环境 94.8 应用服务和服务原语 94.9 应用协议数据单元APDU说明 104.10 信息交互管理 114.11 应用参数 114.12 状态变换 214.13 出错处理与错误列表 23附录A (_规范性附录) 规范语言 23A.1 术语与操作规则 24A.2 实体和实体调用 25附录B (_规范性附录) 致命错误列表 26附录C (_规范性附录) 身份验证与随机数 26C.1 生成随机数(随机数发生器) 27C.2 运算参数 27C.3 随机数变换 28附录D (_规范性附录) 数据保密的加密算法 28D.1 数据的保密性 28D.2 最长二进制序列 28D.3 加密和解密函数 29D.4 运算参数(操作参数) 30附录E (_规范性附录) 标识号和加密模式 30E.1 客户机和服务器标识号 30E.2 加密模式 前 言 随着我国市场经济的发展,以及能源计量管理水平的提高,对计量仪表自动抄表的需求日益迫切。目前为了适应通信技术的发展,提高计量仪表通信技术的整体水平,从1999年开始,国际电工委员会陆续发布了IEC 62056《抄表、费率和负荷控制的数据交换》标准文件系列。IEC 62056原文中“抄表,费率和负荷控制”其概念与我国习用的“自动抄表系统”相当。目前已有下列部分出版。这些标准文件对我国《自动抄表系统》的标准制定具有一定的指导意义。 第21部分: 直接本地数据交换 第31部分: 基于双绞线上载波信号的局域网的使用 第41部分: 使用广域网的数据交换 第42部分: 物理层服务和定向异步数据交换连接过程 第46部分: HDLC协议下的数据链路层 第51部分: 应用层协议 第52部分: 设备语言规范(DLMS)服务器通信协议 第53部分: COSEM 应用层 第61部分: OBIS 对象标识系统 第62部分: 接口类 本标准的附录A、B、C、D、E均为规范性附录 本标准等效IEC62056-51. 本标准由全国电工仪器仪表标准化技术委员会提出并归口。 本标准参加起草的单位有: 本标准主要起草人: 应用层协议 1  概述 1.1  范围 本技术 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 制定了一种用于与仪表设备通信的应用层通用规范(结构),不考虑配套使用的三层模型体系中的物理媒介和低层协议。 本技术报告制定了除DLMS(电力线报文规范)模型之外的应用层协议,有关DLMS模型的内容在IEC61334-4-41中有详尽的说明。 1.2  规范性引用文件 下列标准文件中规定的条款,作为参考内容构成了本技术报告的的各项条款,所指定的版本,在发布时均有效。所有这些标准都可能再修订,因而希望那些根据本技术报告签约的团体尽可能采用其最新版本。IEC和ISO的成员都存有当前有效的国际标准。 IEC61334-4-41:1996,使用电力线载波的配电自动化-第四部分:数据通信协议-第41节:应用协议-电力线报文规范(DLMS) ISO/IEC 8824:1990,信息技术-开放式系统互连-ASN.1规范(抽象语法表示法一) 2  综述 2.1  基本术语(词汇) 所有的通信联络都涉及呼叫方系统和被叫方系统的两种设备。呼叫方是指启动与远方设备通信的系统,远方设备称为被叫方系统;这种相对命名在本次通信的全过程中有效。 一次通信可以划分为确定次数的信息交互。每次信息交互是指从发送器到接收器的一次信息传送。在信息交互的过程中,呼叫方和被叫方轮流充当发送器和接收器。 客户机和服务器与DLMS模型(详见IEC61334-4-41)中的定义相同。服务器是响应所有特定服务请求的VDE系统 。客户机是通过一次或多次向服务器提出服务请求以达到特定目的系统。 呼叫方作为客户机,被叫方作为服务器无疑是最常见的情况,不过呼叫方作为服务器,被叫方作为客户机的情况也是存在的,特别是在发生紧急告警事件需要报告的时候。 2.2  子层与协议 本技术报告中描述的应用层模型又分为传输、应用和DLMS三个子层。每个子层及协议的名称如表1所示。 表1 子层与协议 子层 协 议 DLMS DLMS子层协议(DLMS+) 应用 应用子层协议(Application+) 传输 传输子层协议(Transport+) 传输和应用子层建立一个称作LLAC(逻辑链路访问控制)包。 DLMS子层协议在IEC61334-4-41中有详尽的说明。 2.3  规范语言 在本技术报告中,每一子层的协议均以表格形式表示的状态变换来表达。填表所使用的语法由附录A介绍的规范语言来定义。 若叙述的内容与状态变换有异议,以该表作为参考依据。 3  传输子层 3.1  传输子层协议 设计传输子层协议的目的是为了支持传输链路的多路复用,呼叫方和被叫方的行为是严格对等的(行为完全对称)。 3.2  综述 传输子层是处理系统直接链接的第一个子层。建立在传输子层的链接和更高子层上的链接被称为端端链接。端端(链接)的概念表明传输实体提供的服务是完全独立于物理网络的。 传输子层最重要的特征是端端传输(如上所述)、透明性(传输协议能接受任意格式和大小的二进制数据结构,并保持原样传送)和服务等级的选择性。由于传输协议是面向无链接的,在这里提及的服务等级的概念仅仅针对信息而言。 传输子层接受来自应用子层的报文,由于其报文的大小依具体应用情况而定,传输子层必须将其拆分为分组报文(TPDU:传输协议数据单元),并将其发送到对端的传输子层。相应地,对端的传输子层接受来自源端的分组报文,并为应用子层将其拼装成符合要求的报文。 传输子层协议必须能够在两个方向(呼叫方到被叫方,被叫方到呼叫方)同时传输数据。此外,在同一虚拟电路上多路传输连接意味着多个应用组可在给定通信中共存。 无论信息源自何方,TPDU都通过数据链路层的服务来实现信息传送。当然,数据链路子层不关心上层实现的多路复用。 3.3  传输协议规定条款 (clause) ISO提出了基于在低层传输中存在残余错误的几种不同类型的网络服务。残余错误分为两类:有报告的错误(例如:具有链路中断出错指示)和无报告的错误(未被检出和没有纠正的传输错误)。基于上述残余错误的网络类型分为三类,如表2所示。 表2 基于残余错误的网络服务的类型 类型 定 义 A 可接受的残余错误比率(包括有报告的和无报告的错误) B 可接受的无报告残余错误比率,不可接受的有报告残余错误比率 C 不可接受的残余错误比率(包括有报告的和无报告的错误) 传输子层协议源自ISO的第二类传输协议(class2),在ISO的第二类传输协议(class2)中假定了一种A类网络,其特点为具有多路复用、但不具有出错重发和流控制的报文拆分和报文拼装。 3.4  传输服务和服务原语 表3列出了传输协议用户使用的服务和服务原语。 表3 传输服务和服务原语 服 务 原 语 T_DATA T_DATA.req (STSAP, DTSAP, Pr, TSDU) T_DATA.ind (STSAP, DTSAP, TSDU) T_ABORT T_ABORT.req (Strong) T_ABORT.ind (ErrorNb) 每个服务原语的作用如下: · T_DATA.req (STSAP, DTSAP, Pr, TSDU) 用于应用子层向传输子层请求传输一个TSDU(传输服务数据单元)报文,该报文是从源传输地址STSAP到目的传输地址DTSAP或目的传输地址DTSAP到源传输地址STSAP,优先级为Pr *的报文。 · T_DATA.ind (STSAP, DTSAP, TSDU)用于传输子层通知应用子层已收到一个TSDU报文,该报文是从源传输地址STSAP到目的传输地址DTSAP或目的传输地址DTSAP到源传输地址STSAP的报文。 · T_ABORT.req (Strong)用于应用子层向传输子层请求终止优先级为Strong *的通信活动。 · T_ABORT.ind (ErrorNb)用于传输子层通知应用子层发生了一个标识号为ErrorNb的致命错误。 3.5  传输协议数据单元 (TPDU)说明 传输实体之间的报文交换以TPDU的形式分段传送,每个分段报文包含整数个八位字节。 在传输子层协议中,仅仅有一个有如下五个域定义的TPDU格式: _ TPDUType域 (DT+ ) : 3位 _ END域 : 1位 _ STSAP域 : 2位 _ DTSAP域 : 10位 _ Packet域 : 0个八位字节到MaxPktSize八位字节 3位 1位 2位 10位 0个八位字节到MaxPktSize八位字节 DT+ END STSAP DTSAP Packet DT+域: 为恒定编码“101B”。 END域: END域 置为1时表明该数据单元为最后一个分组报文。 STSAP域:包含源传输地址。 DTSAP域:包含目的传输地址,根据约定,“0000000000B”为DLMS通信协议管理服务 器的DTSAP保留。 Packet域:包含本报文的数据分段。 3.6  传输参数 由于没有明确的链接阶段,传输链接的数目和缓冲区的大小没有统一的标准,但要遵守如下规则: · 最大的传输链接的数目为4096个,每个传输链接由一个(STSAP, DTSAP)对来标识; · 所有激活的传输链接的发送和接收缓冲区对内存空间的要求以不超过远方设备的内存容量为原则。 内存空间的实际大小因设备而异,其大小应不小于512个八位字节。DLMS管理变量BufferPoolSize的值就是内存空间的大小,这一变量可以通过访问DLMS通信协议管理服务器获得。 Packet域的大小(MaxPktSize)应当与数据链路层帧的容量相适应。 3.7  状态变换 呼叫方与被叫方系统的状态机是严格对等的,这两个系统轮流充当TSDU的发送器和接收器,任一时刻,每套设备只能有一个控制器通信例程(任何设备一个时刻只能充当发送器和接收器中的一个)。 表4 传输子层状态变换 初始态 触发条件 操作组 终止态 Stopped $true () Init() Idle Idle T_DATA.req (STSAP, DTSAP, Pr, TSDU)& bufferpool (TSDU) SMsg= TSDU M.sgt Idle DL_DATA.ind (Pr, TPDU)& check_sgt(TPDU)& bufferpool (TPDU)& not(last_sgt (TPDU)) tsap (TPDU, STSAP, DTSAP) RMsg[STSAP, DTSAP,Pr]= concat(RMsg[STSAP, DTSAP,Pr], extract_pkt(TPDU)) Idle Idle DL_DATA.ind (Pr, TPDU)& check_sgt(TPDU)& bufferpool (TPDU)& last_sgt (TPDU) tsap (TPDU, STSAP, DTSAP) T_DATA.ind[STSAP, DTSAP, concat(RMsg[STSAP, DTSAP,Pr], extract_pkt(TPDU))) RMsg[STSAP, DTSAP,Pr]=”” Idle Idle (T_DATA.req(_,_,_,TPDU)& not(bufferpool(TSDU))) | (DL_DATA.ind (_, TPDU)& check_sgt(TPDU)& not(bufferpool(TPDU))) T_ABORT.ind(ET_2F) DL_ ABORT.req(Strong=1) stopped Idle DL_DATA.ind (_, TPDU)& not(check_sgt(TPDU)) T_ABORT.ind(ET_1F) DL_ ABORT.req(Strong=1) stopped Idle T_ABORT. req(Strong) DL_ ABORT.req(Strong) stopped Idle DL_ ABORT.ind(ErrorNb) T_ABORT.ind(ErrorNb) stopped M.sgt size(SMsg)>MaxPktSize End=0 DL_DATA. Req(Pr,concat(DT+,End, STSAP, DTSAP, Substr(1, MaxPktSize, SMsg))) SMsg= Substr(MaxPktSize+1, SMsg) M.sgt M.sgt Size(SMsg)<=MaxPktSize End=1, DL_DATA. Req(Pr,concat(DT+,End, STSAP, DTSAP, SMsg)) SMsg= “” Idle 表5 表4中状态的含义 状态 含 义 Stopped 对呼叫方和被叫方而言都是启动状态(初始状态) Idle(空闲等待状态) 等待应用子层的请求和数据链路层指示的状态 M.sgt(必须分组) 一个报文正在传输链路上分组传输的状态 表6 按字母先后顺序排列的过程和函数的定义 过程或函数 定 义 Bufferpool (TPDU) or Bufferpool (TSDU) 检查是否有足够的内存空间保存数据单元TPDU 或TSDU,内存空间的大小由管理变量BufferPoolSize定义。 check_sgt(TPDU) 检查收到的TPDU的类型是否与DT+相符。 Concat(MsgPart,Packet) or Concat(DT+,End, STSAP, DTSAP, Packet) 通过几个相关参数完成二进制串的拼接重组。 extract_pkt() 从收到的TPDU中提取报文域 Init() 初始化:置DT+为“101B”,变量MaxPktSize赋初值,将数组RMsg[]的元素置为“ 空”。RMsg []三维数组,第一维是STSAP号,第二维是DTSAP号,第三维是优先级 (0或 1)。 last_sgt (TPDU) 检查接收TPDU的是否为最后一个分组报文( End域是否为1)。 Size(SMsg) 计算SMsg报文的大小(八位字节数) Substr(Begin, Length, SMsg) or Substr(Begin, SMsg) 从SMsg中提取从Begin开始,长度为Length的八位字节串,如果没有指定Length参数,提取从Begin开始到报文结尾的八位字节串。 tsap (TPDU, STSAP, DTSAP) 从收到的TPDU中提取STSAP和DTSAP域 3.8  出错处理与错误列表 出错信息按如下编码规则列出: ET 在传输子层中发生的错误 - 分隔符 N 错误编号 F 致命错误 表7 错误一览表 ET-1F TPDU 错误,发生此类错误的唯一原因是TPDU的类型与DT+的定义不同。 发生此类错误后,传输子层先通知应用子层以发生错误,请求终止数据链路传输,然后传输子层重新初始化。 ET-2F 接收或发送空间已满 发生此类错误后,传输子层先通知应用子层以发生错误,请求终止数据链路传输,然后传输子层重新初始化。 在发生任何致命错误之后,都通过传输服务原语T_ABORT.ind送到上一子层。完整的致命错误编号列表在附录B中给出。 4  应用子层 4.1  应用子层协议 应用子层协议具有一种基于DLMS客户机-服务器模型(详见IEC 61334-4-41)的不对称特性。 4.2  综述 应用子层在采用DLMS时进行了大幅度地简化。从通信的观点来看,这一模型将实际设备抽象为一个或多个称为VDE(详见IEC 61334-4-41)的虚拟设备组,每个VDE都是由按类型分类虚对象组成,可以通过特定的服务访问。 将DLMS模型引入到分层协议体系后,应用子层的主要作用变成DLMS PDU的封装和双向传输,不过必须满足如下条件: · 如果条件满足,连接和断开物理链路。 · 应用组的管理。 · 数据编码转换语法的选择性。 · 信息交换的安全性 4.3  信息交换的安全性 信息交换的安全性包括如下几方面的内容: · 客户机和服务器的身份验证。 · 交互数据的保密性。 · 服务器可变对象的访问控制。 身份验证使服务器能够对客户机的身份进行控制,以便向客户机提供适当的访问权限。如果身份验证是双向的,客户机也能对服务器进行控制,以便检测设备是否被替换。 数据的保密性用于保护交互的数据,以防可能的非授权访问。 VDE-Handler(详见IEC 61334-4-41)通过控制客户机读写访问的保护系统提供了对服务器DLMS变量的访问。 4.4  客户机和服务器的身份验证 在客户机发出应用激活请求的阶段,通过加密报文实现客户机和服务器的相互身份验证。 AuthenticationReqAPSE AuthenticationReqAPSE InitiateReqAPSE InitiateReqAPSE 图2 身份验证交互过程 每台设备都应具有随机数生成系统。 借助与给定客户机类型(Client_type )相对应的密钥,身份验证通过交换一个加密随机数来实现。这些随机数由8个八位字节定义(详见附录C),通过一种算法加密,该算法使用的8字节密钥(Ki)是客户机和服务器双方都认同的。 客户机在向服务器提出启动请求前,先生成一个随机数Nc,并将其加载到身份验证请求报文(AuthenticationReqAPSE)中,然后发送给服务器。 服务器在收到客户机发送身份验证请求报文后,采用具有密钥(Ki)的同一的算法对Nc进行加密,取得一个加密随机数NcK,然后通过两个PDU的交换,按照内部秩序进行身份验证。 第一个PDU(从服务器发送给客户机的身份验证应答报文AuthenticationRespAPSE)包含由 客户机在收到该PDU后,采用具有密钥Ki的同一算法对Nc进行加密得出随机数Nc’,比较NcK和Nc’,如果二者相同,客户机认定服务器是经授权的,否则认为服务器是冒名顶替的,并终止与之通信。 在验证服务器的身份之后,客户机对随机数Ns采用具有密钥Ki的同一加密算法对Ns进行加密得出随机数NsK,并将其加载到第二个身份验证PDU(IinitiateReqAPSE)中,然后发送给服务器。 服务器在收到该PDU报文后,采用具有密钥Ki的同一算法对Ns进行加密得出随机数Ns’,比较NsK和Ns’,如果二者相同,服务器认定客户机经授权的,否则认为客户机是冒名顶替的,并终止与之通信。 所有的客户机及对应的服务器设备中,都有一张把私有密钥与客户机类型的每一个可能值相对应的表,因此,在通信过程中不需要再进行密钥交换。 4.5  交互数据的保密性 通过对每个要保护的报文进行加密,实现交互数据的保密性是可行的。应用子层协议为了数据交换所使用的加密算法与身份验证算法是不同的,该算法在附录D中进行了完整的描述。其主要特点如下: · 代码简单易行,执行起来比身份验证的代码快; · 加密功能是伪随机的,也是长期的; · 加密和解密算法是对等的(为互逆操作); · 该算法的唯一参数是一个n位的密钥,这个密钥是服务器为每个应用组自动计算得到的。 4.6  应用环境 应用协议包含一个称为APSE的简单SASE(特定应用服务元素),APSE分为客户机APSE和服务器APSE。 另外,为了保证数据交换的正确执行,客户机和服务器必须在同一个应用环境(控制和管理针对一个应用组的信息交换规则)中工作,应用子层协议容许对应用环境进行约定。不过,有一个确省的应用环境(用整数0标识)是客户机和服务器都是事先知道的。 DLMS管理变量ApplicationcontextNamelist包含一组服务器支持的应用环境。这一变量可以通过DLMS通信协议管理服务器进行访问。 APSE确省应用环境的隐含规则如下: · 低层特定通信协议子集的选择; · 抽象语法规范的使用(详见ISO 8824); · 编码和译码规则的规范; · 涉及的ASE列表和APDU的说明; · 附录C中描述的加密身份验证机制和随机数产生过程; · 附录D中描述的数据交换加密算法和密钥生成过程; · 与依赖客户机标识器类型的DLMS服务相对应的特定加密模式(详见附录E)。 值得注意的是确省应用环境不包含数据压缩算法。 4.7  DLMS环境 DLMS服务不传输任何客户机或服务器相互标识的信息,实际上该信息直接包含在DLMS环境中。DLMS环境包含如下元素: · 上文中定义的应用环境; · STSAP (源TSAP); · DTSAP(目的TSAP); · 客户机类型(详见附录E); · 在呼叫方客户机侧,被叫方服务器的地址; · 在呼叫方服务器侧,可以被呼叫的客户机地址的列表和服务器标识Server-identifier(详见附录E); · 如果客户机是呼叫方,客户机的物理地址; · 身份验证密钥的加密值; · (报文加密)密钥的加密值; 通常情况下,呼叫方是授权的客户机类型和由传输地址DTSAP标识VDE服务器(被叫方系统),然而在紧急告警信息需要传送给客户机时,情况正好相反,在这种情况下,应用组由服务器启动。 客户机类型(Client-type)无二意地标识一个DLMS环境,这一概念与VAAName(详见IEC 61334-4-41)的定义直接对应。在应用子层协议中,VAA都被当作静态目标。 对每个激活的传输链接,仅仅有一个DLMS环境是激活的。在呼叫方客户机侧,当前的环境假定已被当地的设备激活,在这里不再赘述,与此相反,在被叫方服务器侧,环境由初始化服务(详见IEC 61334-4-41)激活,被异常结束指示(详见IEC 61334-4-41)终止。 4.8  应用服务和服务原语 除非确认服务之外,所有在DLMS规范中定义的服务和服务原语都可由应用子层协议的用户使用。 如果符合条件,在客户机侧,非确认服务请求A_Disconnect.req()也要求完成物理链路断开。 服务、服务原语和DLMS PDU的完整定义请参阅IEC 61334-4-41。 4.9  应用协议数据单元APDU说明 应用组交换的每个报文都包含整数个八位字节,且应用报文的大小都应当和传输子层的内存空间相匹配。 应用子层协议中有十种类型的采用ASN.1 语法定义的APDU报文,定义如下: APSEPDU::=CHOICE{ ConfirmedRequest [0] ConfirmedReqAPSE, ConfirmedResponse [1] ConfirmedRespAPSE ConfirmedError [2] ConfirmedErrorAPSE UnsolicitedRequest [3] UnsolicitedReqAPSE, AuthenticationRequest [4] AuthenticationReqAPSE AuthenticationResponse [5] AuthenticationReqAPSE InitiateRequest [6] initiateReq APSE InitiateResponse [7] initiateRespAPSE Initiate Error [8] initiateErrorAPSE AbortRequest [9] AbortReqAPSE} ConfirmedReqAPSE::=OCTET STRING /* 八位字节串 */ · 是下列DLMS需确认请求PDU经加密后得到(的报文),包括: · confirmedServiceRequest, GetStatusRequest, GetNameListRequest, · GetVariableAttributeRequest,ReadRequest 或WriteRequest等报文类型。 ConfirmdRespAPSE::=OCTET STRING /* 八位字节串 */ · 是下列DLMS确认响应PDU经加密后得到(的报文),包括: · confirmedServiceResponse,GetStatusReponse,GetNameListReponse, · GetVariableAttributeResponse,ReadResponse,或WriteResponse 等报文类型。 ConfirmedErrorAPSE::=OCTET STRING /* 八位字节串 */ · 直接从DLMS确认错误PDU报文(ConfirmedServiceError)中获取。 UnsolicitedReqAPSE::= SEQUENCE{ /* 序列结构 */ Server_identifier OCTET STRING, /* 服务器标识,八位字节串 */ Client_type INTEGER(-32 768..32 767), /* 客户机类型,整型 */ Unsolicited_service_request OCTET STRING /* 主动服务请求,八位字节串*/ · 是下列DLMS主动请求PDU经加密后得到(的报文),包括: · UnsolicitedServiceRequest 或informationReportRequest 。} AuthenticationReqAPSE::=SEQUENCE{ /* 序列结构 */ client_type INTEGER(_32 768..32 767), /* 客户机类型,整型 */ client_random_number BIT STRING (SIZE (64)) } /* 客户机随机数,位串 (64位) */ AuthenticationRespAPSE::=SEQUENCE{ /* 序列结构 */ Ciphered-transformed_client_random_number BIT STRING (SIZE (64)) /* 经加密转换后的客户机随机数,位串 (64位) */ /* 服务器随机数,位串 (64位) */ InitiateRepAPSE::= SEQUENCE{ /* 序列结构 */ Ciphered_transformed_server_random_number BIT STRING (SIZE (64)) /* 经加密转换后的服务器随机数,位串 (64位) */ Proposed_app_ctx_name INTEGER(0..255), /* 确省的应用环境名,整型 */ Calling_physical_address OCTET STRING, /* 请求物理地址,八位字节串 */ Initiate_request OCTET STRING /* 初始化(启动)请求,八位字节串 */ · 直接从DLMS初始化请求PDU报文(InitiateRequest)中获取。} InitiateRespAPSE::= SEQUENCE{ /* 序列结构 */ Negociated_app_ctx_name INTEGER(0..255), /* 约定的应用环境名,整型 */ Iinitiate_response OCTET STRING /* 初始化(启动)响应(应答),八位字节串 */ · 直接从DLMS初始化应答PDU报文(InitiateResponse)中获取。} · 直接从DLMS初始化错误PDU报文(ConfirmedServiceError)中获取。 AbortReqAPSE::= OCTET STRING · 直接从DLMS终止请求PDU报文(AbortRequest)中获取。 4.10  信息交互管理 由于客户机和客户机的作用不可互换,应用子层协议也是不对称的。 客户机侧还没有建立传输链接时,应用组的初始化(DLMS初始化服务请求)将占用一个可用的物理链路。 对所有情况,服务器都要进行身份验证报文的交换和客户机类型的控制。如果通过了身份验证,而且DTSAP也与服务器的地址相符,服务器将再激活相应的应用组和DLMS环境,同时产生对应的VAA。 按DLMS的要求,应用子层协议不接受没有应答(挂起)的请求。在发送一个需确认的服务请求后,客户机的应用子层在进行新的发送前,将等待服务器响应的应答报文。等待过程由激活的MVRT(最大的VDE响应时间)控制,MVRT是一个简单的等待时间为T2的软看门狗。 在身份验证工作完成后,服务器将任何检测到加密错误都看成是违规访问,同时停止应用层的通信。与此相反,在客户机侧,加密错误并不看成是致命错误。 优先级Pr用于区分紧急的主动服务处理(Pr =1)和其它的DLMS服务处理(Pr=0)。 参数Strong用于区分致命错误处理(Strong=1)和其它由应用子层启动的物理链路断开请求的处理(Strong=0)。 在客户机侧,非确认服务请求A_Disconnect.req申请断开物理链路,释放通信媒介,同时导致应用控制器的所有通信例程(occurrence)重新初始化。 4.11  应用参数 客户机等待服务器应答的最长时间T2由如下公式得出,如果超过这一等待时间,客户机将断开逻辑链路。 T2> RespTime +MaxreqTime+MaxRespTime 式中:RespTime为服务器理论上的应答时间,MaxReqTime为服务请求最长的传输时间,MaxRespTime服务应答最长的传输时间。 4.12  状态变换 客户机和服务器的状态机是不相同的,为了清晰起见,客户机和服务器的状态机均划分为三张表:环境管理表、确认服务管理表、主动服务管理表。此外,在每台设备中,每个激活的传输链路都有一个控制器通信例程与之对应。 表8 服务器侧环境管理一览表 初始态 触发条件 操作组 终止态 Locked T_DATA.ind(STSAP,DTSAP, APSEPDU) & check_tsap(STSAP, DISAP) & tasepdu_TYPE(APSEPDU, AuthenticatianReqAPSE) & Entract_authentication_req(APSEPDU, Client Type) & Check_client_type(DTSAP, ClientType) APSEPDU=build_tasepdu(Authentication RespAPSE,_) T_DATA.req(STSAP, DTSAP, Pr=0, APSEPDU) IR.E Locked T_ABORT.ind(ErrorNB) Stort_error(ErrorNb) $purge() Locked IR.E T_DATA.ind(STSAP,DTSAP, DTSAP) & tasepdu_type(STSSAP, DTSAP) & tasepdu_type(APSEPDU, InitiateReqAPSE) Extract_OK=extract_initiate_req(APSEPDU, AppCtx, CallingAddr, DLMSPDU) Extract IR.E T_ABORT.ind(ErrorNb) Stort_error(ErrorNb) $purge() Locked Extract Extract_OK Set_dlms_contexe(AppCts,STSAP,DTSAP, ClientType,CallingAddr) Initiate.ind(DLMSPDU) Con.E Extract not(Extract_OK) $none() Locked Con.E Initiate.rsp(DLMSPDU) & Dlmsdpu_type(DLMSPDU, initiate) & Active_dlms_context(STSAP,DTSAP)& check_tsap(STSAP,DTSAP) APSEPDU=build_tasepdu(InitiateReqAPSE, DLMSPDU) T_DATA.req(STSAP, DTSAP, Pr=0, APSEPDU) Idle Con.E Initiate.rsp(DLMSPDU) & Dlmsdpu_type(DLMSPDU, initiate_ Error) & Active_dlms_context(STSAP,DTSAP)& check_tsap(STSAP,DTSAP) APSEPDU=build_tasepdu(InitiateReqAPSE, DLMSPDU) T_DATA.req(STSAP, DTSAP, Pr=0, APSEPDU) Locked Con.E T_ABORT.ind(ErrorNb) Stort_error(ErrorNb) $purge() Locked Idle T_DATA.ind(STSAP,DTSAP, DTSAP) & tasepdu_type(STSSAP, DTSAP) & tasepdu_type(APSEPDU, AuthenticatianReqAPSE) & Entract_authentication_req(APSEPDU, Client Type) & Check_client_type(DTSAP, ClientType) APSEPDU=build_tasepdu(Authentication RespAPSE,_) T_DATA.req(STSAP, DTSAP, Pr=0, APSEPDU) IR.E Idle T_DATA.ind(STSAP,DTSAP, DTSAP) & tasepdu_type(STSSAP, DTSAP) & tasepdu_type(APSEPDU, AbortReqAPSE0 Abort.ind() Locked Idle T_ABORT.ind(ErrorNb) Stort_error(ErrorNb) $purge() Locked 表9 – 客户机侧环境管理一览表 初始态 触发条件 操作组 终止态 Locked Initiate.rsp(DLMSPDU) & Active_dlms_context(STSAP,DTSAP)& check_tsap(STSAP,DTSAP) & address(CallingAddr,CalledAddr) Connect_OK=client_connect(CallingAddr, CalledAddr) Connect Locked A_Disconnect.req() T_ABOUT.req(strong=0) $purge() Locked Connect Connect_OK APSEPDU=build_tasepdu(Authentication RespAPSE,_) T_DATA.req( STSAP,DTSAP,Pr=0, APSEPDU) Init_timer(T2) NC.T Connect not(Connect_OK) DLMSPDU=service_error(application_ unreachable) Initiate.cnf(DLMSPDU) Inactivate_dlms_context() Locked AC.T T_DATA.ind(STSAP,DTSAP, APSEPDU) & check_ tsap(STSAP, DTSAP) &tasepdu_type(APSEPDU, AuthenticationRespAPSE) D_decipher_OK= d_ decipher(AuthenticationRespAPSE,Dkey) D.Deciph AC.T Time_out() DLMSPDU=service_error(time_elapsed) Initiate.cnf(DLMSPDU) Inactivate_dlms_context() Locked AC.T (T_ABOUT.ind(ErrorNb) & last_association()) | (exist_about_ind() & not(last_association())) DLMSPDU=service_error(provider_ Communication_error) Initiate.cnf(DLMSPDU) Store_error(ErrorNb) Inactivate_dlms_context() Locked D.Deciph D_decipher_OK APSEPDU=build_tasepdu(InitiateReqAPSE, DLMSPDU) T_DATA.req( STSAP,DTSAP,Pr=0, APSEPDU) updata_dlms_context(_,DKey) NC.T D.Deciph Not(D_decipher_OK) Stop_timer() DLMSPDU=service_error(deciphering_error) Initiate.cnf(DLMSPDU) Inactivate_dlms_context() Dis NC.T T_DATA.ind(STSAP,DTSAP, APSEPDU) & check_ tsap(STSAP, DTSAP) &tasepdu_type(APSEPDU, InitiateRespAPSE) Stop_timer() Extract_OK=extract_ Initiate_resp(APSEPDU, AppCtx, DLMSPDU) Extract NC.T T_DATA.ind(STSAP,DTSAP, APSEPDU) & check_ tsap(STSAP, DTSAP) &tasepdu_type(APSEPDU, InitiateErrorpAPSE) & Convert(APSEPDU,DLMSPDU) Stop_timer() Initiate.cnf(DLMSPDU) Inactivate_dlms_context() Dis NC.T Time_out() DLMSPDU=service_error(time_elapsed) Initiate.cnf(DLMSPDU) Inactivate_dlms_context() Locked 表9 (续) 初始态 触发条件 操作组 终止态 NC.T (T_ABOUT.ind(ErrorNb) & last_association()) | (exist_about_ind() & not(last_association())) DLMSPDU=service_error(provider_ Communication_error) Initiate.cnf(DLMSPDU) Store_error(ErrorNb) Inactivate_dlms_context() Locked Extract Extract_OK updata_dlms_context(AppCtx,_) Initiate.cnf(DLMSPDU) Idle Extract Not(Extract_OK) DLMSPDU=service_error(deciphering_error) Initiate.cnf(DLMSPDU) Inactivate_dlms_context() Dis Idle A_Disconnect.req() T_ABOUT.req(strong=0) $purge() Locked Idle Abort.req() activate_dlms_context(STSAP,DTSAP)& check_tsap(STSAP,DTSAP) AbortReqAPSE,_) T_DATA.req( STSAP,DTSAP,Pr=0, APSEPDU) Inactivate_dlms_context() Locked Idle Initiate.req(DLMSPDU) & Active_dlms_context(STSAP,DTSAP) & check_tsap(STSAP,DTSAP) & APSEPDU=build_tasepdu(Authentication ReqAPSE,_) T_DATA.req( STSAP,DTSAP,Pr=0, APSEPDU) Init_timer(T2) AC.T Idle (T_ABOUT.ind(ErrorNb) & last_association()) | (exist_about_ind() & not(last_association())) Store_error(ErrorNb) Inactivate_dlms_context() Locked Dis last_association() T_ABOUT.req(strong=0) Locked Dis Not(last_association()) Snone() Locked 表10 – 服务器侧确认服务管理一览表 初始态 触发条件 操作组 终止态 Idle T_DATA.ind(STSAP,DTSAP, APSEPDU) & check_ tsap(STSAP, DTSAP) &tasepdu_type(APSEPDU, ConfirmedRespAPSE) Decipher_OK= decipher(APSEPDU,DLMSPDU) Decipher Decipher Decipher_OK ConfirmedService.ind(DLMSPDU) CS.E Decipher Not(Decipher_OK) $none() Locked CS.E ConfirmedService.rsp(DLMSPDU) & Dlmspdu_type(DLMSPDU,confirmed-service) & activate_dlms_context(STSAP,DTSAP)& check_tsap(STSAP,DTSAP) APSEPDU=build_tasepdu(ConfirmedResp APSE, DLMSPDU) T_DATA.req( STSAP,DTSAP,Pr=0, APSEPDU) Idle CS.E ConfirmedService.rsp(DLMSPDU) & Dlmspdu_type(DLMSPDU,confirmed-error) & activate_dlms_context(STSAP,DTSAP)& check_tsap(STSAP,DTSAP) APSEPDU=build_tasepdu(ConfirmedError APSE, DLMSPDU) T_DATA.req( STSAP,DTSAP,Pr=0, APSEPDU) Idle CS.E T_ABOUT.ind(ErrorNb) Store_error(ErrorNb) $purge() Locked 表11 – 客户机侧确认服务管理一览表 初始态 触发条件 操作组 终止态 Idle ConfirmedService.req(DLMSPDU) & activate_dlms_context(STSAP,DTSAP)& check_tsap(STSAP,DTSAP) APSEPDU=build_tasepdu(ConfirmedReqAPSE, DLMSPDU) T_DATA.req( STSAP,DTSAP,Pr=0,APSEPDU) Init_timer(T2) CC.T CC.T T_DATA.ind( STSAP,DTSAP, APSEPDU) & check_Tsap(STSAP, DTSAP) & tasepdu_type(APSEPDU, ConfirmedErrorAPSE) Decipher_OK= decipher(APSEPDU,DLMSPDU) Decipher CC.T T_DATA.ind( STSAP,DTSAP, APSEPDU) & check_Tsap(STSAP, DTSAP) & tasepdu_type(APSEPDU, ConfirmedErrorAPSE) & Convert(apsepdu,dlmspdu) Stop_timer() ConfirmedService.cnf(DLMSPDU) Idle CC.T Time_out() DLMSPDU=Service_error(time_elapsed) ConfirmedService.cnf(DLMSPDU) Locked CC.T (T_ABOUT.ind(ErrorNb) & last_association()) | (exist_about_ind() & not(last_association())) DLMSPDU=Service_error(provider_ Communication_error) ConfirmedService.cnf(DLMSPDU) Store_error(ErrorNb) Inactivate_dlms_context() Locked Decipher Decipher_OK Stop_timer() ConfirmedService.cnf(DLMSPDU) Idle Decipher Not(Decipher_OK) Stop_timer() DLMSPDU= Service_error(deciphering_error) ConfirmedService.cnf(DLMSPDU) Idle 表12 – 服务器侧主动服务管理一览表 初始态 触发条件 操作组 终止态 Idle Unsolicited.req(DLMSPDU) & activate_dlms_context(STSAP,DTSAP)& check_tsap(STSAP,DTSAP) & check_client() APSEPDU=build_tasepdu(UnsolicitedReq APSE,DLMSPDU) T_DATA.req( STSAP,DTSAP,Pr=1, APSEPDU) Build_evt(InformationReported) Idle Idle not Unsolicited.req(_) & activate_dlms_context(STSAP,DTSAP)& check_tsap(STSAP,DTSAP) & check_client() & (exist_unsolicited_req() & activate_dlms_context(STSAP,DTSAP)& check_tsap(STSAP,DTSAP) & not(check_client())) T_ABOUT.req(strong=0) $purge() Locked Locked Unsolicited.req(DLMSPDU) & activate_dlms_context(STSAP,DTSAP)& check_tsap(STSAP,DTSAP) & address(CallingAddr,CalledAddr) Connect_OK=server_connect(CallingAddr, CalledList) Connect Connect Connect_OK APSEPDU=build_tasepdu(UnsolicitedReq APSE,DLMSPDU) T_DATA.req( STSAP,DTSAP,Pr=1, APSEPDU) Build_evt(InformationReported) Alarm Connect Not(Connect_OK) Build_evt(InformationNotReported) Locked Alarm exist_unsolicited_req(unsolicited.req (DLMSPDU)) & activate_dlms_context(STSAP,DTSAP)& check_tsap(STSAP,DTSAP) & check_client() APSEPDU=build_tasepdu(UnsolicitedReq APSE,DLMSPDU) T_DATA.req( STSAP,DTSAP,Pr=1, APSEPDU) Build_evt(InformationReported) Alarm Alarm not(exist_unsolicited_req())| exist_unsolicited_req() & activate_dlms_context(STSAP,DTSAP)& check_tsap(STSAP,DTSAP) & not(check_client())) $none() Dis Dis last_association() T_ABOUT.req(strong=0) Locked Dis Not(last_association()) $none() Locked 表13 客户机主动服务管理一览表 初始态 触发条件 操作组 终止态 Idle T_DATA.ind(stsap,dtsap, apsepdu) & check_tsap(APSEPDU,DTSAP)& tasepdu_type(apsepdu,UnsolicitedReqAPSE)& Extract_unsolicited_req(apsepdu, ClientType,DLMSPDU) Unsolicited.ind(DLMSPDU) Idle Locked T_DATA.ind(stsap,dtsap,apsepdu)& check_tsap(APSEPDU,DTSAP)& tasepdu_type(apsepdu,UnsolicitedReqAPSE) & Extract_unsolicited_req(apsepdu, ClientType,DLMSPDU) Set_dlms_context(ClientType) Unsolicited.ind(DLMSPDU) Locked AC.T T_DATA.ind(stsap,dtsap,apsepdu)& check_tsap(APSEPDU,DTSAP)& tasepdu_type(apsepdu,UnsolicitedReqAPSE) & Extract_unsolicited_req(apsepdu, ClientType,DLMSPDU) Stop_timer() Unsolicited.ind(DLMSPDU) Init_timer(T2) AC.T NC.T T_DATA.ind(stsap,dtsap,apsepdu)& check_tsap(APSEPDU,DTSAP)& tasepdu_type(apsepdu,UnsolicitedReqAPSE) & Extract_unsolicited_req(apsepdu, ClientType,DLMSPDU) Stop_timer() Unsolicited.ind(DLMSPDU) Init_timer(T2) NC.T CC.T T_DATA.ind(stsap,dtsap,apsepdu)& check_tsap(APSEPDU,DTSAP)& tasepdu_type(apsepdu,UnsolicitedReqAPSE) & Extract_unsolicited_req(apsepdu, ClientType,DLMSPDU) Stop_timer() Unsolicited.ind(DLMSPDU) Init_timer(T2) CC.T 表14 前表中所列状态的含义 State Meaning Locked 对客户机和服务器而言,都是初始(启动)状态 AC.T (Authentication at the Client end & Waiting under Timer) 在激活的MVRT(软看门狗)的控制下,客户机的DLMS用户等正在等待身份验证的应答。 IR.E (Initiate Request Expected) 服务器在发送身份验证应答报文之后,等待客户机发送的启动请求。 NC.T (No Context & waiting under Timer) 在激活的MVRT(软看门狗)的控制下,客户机的DLMS用户等正在等待启动应答。 Con.E (Context Expected) 服务器在收到客户机发送的启动请求之后,等待服务器DLMS用户的应答。 CC.T (Conformed service at the Client End & waiting under Timer) 在激活的MVRT(软看门狗)的控制下,客户机的DLMS用户等正在等待需确认服务的应答。 CS.E (Confirmed Service response Expected) 服务器在收到客户机确认的服务请求之后,等待服务器DLMS用户的应答。 Idle DLMS环境配置成功(等待服务请求或服务应答的运行状态) D.Deciph 客户机侧准备查询收到的身份验证值的子状态。 Decipher 客户机或服务器侧准备查询加密运算结果的子状态。 Connect 客户机或服务器侧准备查询是否有可用物理链路的子状态。 Extract 客户机或服务器侧准备查询报文信息提取和加密运算结果的子状态,或者服务器侧准备查询收到的身份验证值的子状态。 Dis (Disconnection) 准备查询一个可用物理链路断开的合理性的子状态。 Alarm 服务器侧为没有应答(挂起)的主动服务请求处理保留的子状态。 表15 按字母先后排序的过程和函数的定义 过程或函数 定义 Active_dlms_context(STSAP,DTSAP) 在可用的DLMS环境中查找 (STSAP,DTSAP) 对。 Address(CallingAddr,CalledAddr) or address(CallingAddr,CalledList) 采用应用控制器的当前通信例程参数更新DLMS环境。 · 对客户机而言:提取客户机物理地址和服务器物理地址。 · 对服务器而言:从管理变量ForAlarmClientList 中提取服务器物理地址和客户机物理地址。 build_evt(InformationReported) or build_evt(InformationNotReported) or build_evt(AbortIndication) 在服务器侧,生成一个主动请求报文处理结果的外部事件报告,或生成一个应用组终止的外部事件报告。值得注意的是$purge也自动产生一些Abortlndication类型的事件。 build_tasepdu(APSEPDU_type, DLMSPDU) 先对类型为APSEPDU-type的(请求或应答)信息加密,再构造相应的APSEPDU报文。在特殊情况下,当APSEPDU-type类型为AuthrnticationReqAPSE, AuthenticationReqAPSE, initiateReqAPSE,InitiateReqAPSE 或 UnsolicitedReqAPSE时,这个函数还要在激活的DLMS环境中查找遗失的信息,如果APSEPDU-type类型为AuthenticationReqAPSE,还需要保存一个用于生成专有密钥的随机数。 check_client() 检查包含在激活的DLMS环境中的客户机类型,是否存在与告警信息的接收者相符的客户机类型,否则,检查该告警信息的接收者是否包含在与当前客户机物理地址关联的管理变量ForAlarmClientList中。 check_client_type(DTSAP,ClientType) 对一个由DTSAP标识的VDE,检查其客户机类型标识是否存在于管理变量CallingIdentifierList中。 check_tsap(STSAP,DTSAP) 检查服务器是否识别该DTSAP,同时检查(STSAP,DTSAP)对是否与应用控制器的当前事件相符。 client_connect(CallingAddr, CalledAddr) 这一函数的定义依赖所使用的通信媒介。对各种媒介,函数的定义都是明确的。 convert(APSEPDU,DLMSPDU) 从APSEPDU中(不经解密)直接提取DLMSPDU报文。 d_decipher(AuthenticationRespAPSE, DKey) 在客户机侧,解密包含在AuthenticationReqAPSE数据,检查解密的结果,然后生成并保存专有密钥。 decipher(APSEPDU,DLMSPDU) 根据应用环境的加密模式,提取和解密DLMSPDU。 dlmspdu_type(DLMSPDU,initiate) or dlmspdu_type(DLMSPDU,initiate_error) or dlmspdu_type(DLMSPDU,conformed_ service) or dlmspdu_type(DLMSPDU,conformed_ error) 检查DLMSPDU的类型: · InitiateResponse · ConfirmedServiceError(在初始化服务出错时) · ConfirmedSserviceResponse, GetStatusResponse, GetNameListResponse,GetVariableAttributeResponse, ReadResponse, WriteResponse · ConfirmedSserviceError (在非初始化服务出错时) 表15(续) 过程或函数 定 义 exist_abort_ind() 检查是否存在T_ABORT.ind(ErrorNb)指示的事件。 exist_unsolicited_req() or exist_unsolicited_req(unsolicited.req) (DLMSPDU)) 检查是否存在Unsolicited.req(DLMSPDU)类型的主动请求事件,或是否完成Unsolicited.req(DLMSPDU)类型的主动请求事件。 extract_authentication_req(APSEPDU, ClientType) 在服务器侧,从AuthenticationReqAPSE 的APSEPDU中提取客户机类型和加密值,并对这些数据进行解密。 extract_initiate_req(APSEPDU, AppCts, CallingAddr, DLMSPDU) 在服务器侧,对InitiateReqAPSE APSEPDU中的数据信息进行提取、解密和检查,这些数据信息包括:需解密数、确省的应用环境AppCtx、呼叫方客户机的物理地址CallingAddr以及根据应用环境的加密模式进行解密的DLMSPDU。 extract_initiate_resp(APSEPDU,AppCts, DLMSPDU) 从InitiateReqAPSE的 APSEPDU中提取约定的应用环境AppCtx,以及根据应用环境的加密模式进行解密的DLMSPDU。 extract_unsolicited_req(APSEPDU, ClientType, DLMSPDU) 从UnsolicitedReqAPSE的APSEPDU中提取目标客户机类型,以及根据应用环境的加密模式进行解密的DLMSPDU。 inactivate_dlms_context() 关闭与当前应用控制器通信例程相对应的DLMS环境。 init_timer(T2) 初始化等待时间为T2的MVRT(软看门狗)。 last_association 检查当前的应用组是否为最后一个应用组。 server_connect(CallingAddr,CalledList) 这一函数的定义依赖所使用的通信媒介,对各种媒介,函数的定义都是明确的。 service_error(application_reference_type) or service_error(initiate_type) 构造ConfirmedServiceError的DLMSPDU,该报文类型中有一个指示服务错误的特征参数ServiceError,服务错误是指应用引用出错或启动等级出错(详见IEC 61334-4-41)。 set_dlms_context(AppCts, STSAP, DTSAP, ClientType, CallingAddr) or set_dlms_context(ClientType) 采用应用控制器的当前事件参数更新和激活DLMS环境。 · 对服务器而言:如果确省的应用环境AppCtx不在管理变量ApplicationContextNameList中,则AppCtx为0,其它必要信息从管理变量Confidentialltem中获取。 · 对客户机而言:仅上传客户机类型。 stop_timer() 关闭MVRT(软看门狗)。 store_error(ErrorNb) 在管理变量FatalError中保存最后的一个致命错误号ErrorNb。 tasepdu_type(APSEPDU, APSEPDU_type) 检查APSEPDU的类型是否属于APSEPDU_type。 time_out() MVRT(软看门狗)超时。 update_dlms_context(AppCts, Dkey) 采用应用控制器的当前事件参数更新客户机激活的DLMS环境。该应用控制器具有约定应用环境AppCtx和专用密钥Dkey。 4.13  出错处理与错误列表 出错信息按如下编码规则列出: EA 应用子层中发生的错误 - 分隔符 N 错误编号 F 致命错误 表16 应用子层错误一览表 EA_1 APSE PDU 错误 (不符合ASN.1编码语法规范) 发生此类错误将导致简单地忽略相应报文。 EA_2 服务器身份验证错误或客户机类型未被授权。 此类错误仅在服务器侧发生,服务器将回答否认的服务应答。 EA_3 地址不符 (未知的 DTSAP) 此类错误仅在服务器侧发生,服务器将回答否认的服务应答。 EA_4 客户机侧的加密错误 发生此类错误将回答否认的服务应答。 EA_5 服务器侧的加密错误 发生此类错误将导致忽略相应报文。 EA_6 在指定期限T2时间内,没有收到正确的PDU。 此类错误仅在客户机侧发生,客户机将回答否认的服务应答。 在应用子层,没有致命的错误报告。 附 录 A (_规范性附录) 规范语言 A.1  术语与操作规则 为了准确地表达各子层的作用,本技术报告采用了一个具有有限个状态的控制器来模拟实际的通信行为,这个控制器以表格形式给出。 每个控制器均有一张唯一的逻辑表与之对应,如果这张逻辑表特别大的话,可以将其划分为几张表来表达。 每个控制器通信例程在参考控制器的逻辑表中均有一个通信实例(与其它实例相区别的活性拷贝)与之对应。 每张表都由一些状态线组成,每根状态线描述的是状态机的触发条件(第二列),如果触发条件满足的话,通过执行一组操作(第三列),状态机将初始态(第一列)变换为终止态(第四列)。 第一个初始态为控制器的启动态(始发态),这个状态是唯一的,在表中列出时采用下划线标明。 停止态是控制器的最后一个状态,这个状态不能作为初始态。如果控制器没有停止态,那么这个控制器是无限的。有限控制器有一个或多个停止态,这些状态也采用下划线进行标明,因此,其表中状态的顺序是不重要的。 由于触发条件是相互排斥的,在同一初始态引出几根状态时,上述规则也是适用的。表中状态线的顺序仅仅是为了表达方便进行了排列。尽管如此,控制器逻辑上从启动态的开始转换。 状态线中的一组操作应当看成是一个临界区(即不可中断的执行序列),而且应按书写的顺序执行。每个操作由一个命名过程的调用来定义,该过程可能没有参数,也可能有一个或多个参数,所有引用的命名过程都应是分开列出的。另外还有两个预定义的操作:赋值操作=和空操作$none()(不进行任何操作)。 与一根状态线关联的触发条件可以由几个子条件组成,对一个组合条件的计算总是要涉及其所有子条件的计算,因此,子条件的书写顺序是不重要的。 组合条件的运算符是逻辑操作符&(逻辑与)、|(逻辑或)、not()(逻辑非),以及比较运算符(<, >,≥,≤, = 和 <>) 触发条件分为两类。 一类为简单条件,简单条件可以根据定义立即进行计算。简单条件可以是组合条件,不过其子条件必须都是简单条件。布尔类型的命名函数是简单条件的一个例子,所有引用的布尔型命名函数都是分开列出的。 另一类为事件条件,事件条件表示的是对一个事件的等待。它可以由多个事件子条件或简单子条件组成。 如果触发条件的计算结果为真,那么该条件是满足的。触发条件的满足必将导致一次状态变换。 一个事件可以定义为一个使事件型触发条件满足的因素。 当事件型触发条件满足时,其中包含的事件将自动处理,一个事件仅仅能处理一次。 任何事件发生前,控制器通信例程处于一个事件等待状态中,事件在处理前都按时间先后顺序保存在内部控制器队列中。 因此,每个控制器都有一个简单的队列,这个队列由控制器通信例程共享,队列的大小假定是准无限的,其组织和管理不在这里说明。值得注意的是任何状态变换从启动态开始时,都要对队列进行自动清理(与当前控制器通信例程相关的事件)。 还必须有一个半清理机制对队列中显然是无法消亡的事件进行自动检测和清理。另外有一个预定义的命名过程$purge(),其作用是对当前的内部控制队列进行全部清理,操作完成后,所有与控制器相关的通信例程都回到启动态。 事件是由与状态线相关的操作产生的。内部事件仅仅能被生成它的控制器处理,外部事件总是由另外一个控制器处理。 值得注意的是,事件不存在(由事件子条件的逻辑非表示)恒定为简单的子条件。 对一个初始态而言,如果有一根状态线对应的触发条件的类型是确定的(简单或事件),那么其所有的状态线对应的触发条件的类型都是相同的。 如果触发条件的类型是简单类型,那么该初始态称为子状态,子状态采用斜体字标明。子状态是一种暂时的状态,它总可以变换为其它状态。在表中出现的唯一原因在于提高表述的明确性。启动状态是一种特殊的子状态,有一个特定的触发条件$true()与之对应,这个触发条件是预先定义的,其值恒定为真。 对每个控制器通信例程而言,表中触发条件和操作引用的变量都是局部变量。也有一个预先定义的变量(不连接的变量)用于取代函数和命名过程中没有使用的参数。 A.2  实体和实体调用 本规范语言中说明的元素与OSI(开放式系统互连)中使用的概念有明确的对应关系。 例如,子层中实体与控制器对应,实体调用与控制器通信例程的概念相似。 附 录 B (_规范性附录) 致命错误列表 低层通信中发生的任何致命错误都直接送给本地的应用子层,这些致命错误都保存在DLMS管理变量FatalError中,这个变量可以通过DLMS通信协议管理服务器访问。 表B.1 FatalError错误编号 编号 1 2 错误 ET-1F ET-2F 对任何子层,发生致命错误都将导致: · 如果条件满足,通过服务原语abort.req停止相邻下一子层的运行; · 如果条件满足,通过服务原语abort.ind将出错信息通知相邻上一子层,致命错误编号为服务原语abort.ind传递出错信息的参数; · 相应控制器通信例程重新初始化。 附 录 C (_规范性附录) 身份验证与随机数 用于身份验证的算法要用到64位随机数的生成与处理。 C.1  生成随机数(随机数发生器) 选用的算法建立在对特定初始位串的进行模2加法后再移位运算的基础之上。 R0的初值为K,将R0和两个64位表征数(index)进行模2加法运算,运算结果保存在R2寄存器中。表征数(index)应当是可选择的,以保证结果具有伪随机特性。 R1寄存器包含一个63次不可约的简单生成多项式(模2)的系数。 通过f函数,R1和R2寄存器按如下算法进行组合计算: · 如果R2的最高有效位为1,R2左移一位,然后和R1进行模2加法运算; · 否则R2只左移一位。 生成的第一个随机数NA(1)是通过第一次报文交换获得的初值K计算得出,随后的随机数NA(i)采用同样的算法并将NA(i-1)取代K计算得出。 NA(1) = f ((K (INDEX1,INDEX2)),R1) for i = 1 NA(i) = f ((NA(i-1) (INDEX1, INDEX2)),R1) for i > 1 NA(1) = f ((K (INDEX1,INDEX2)),R1) 当 i = 1 NA(i) = f ((NA(i-1) (INDEX1, INDEX2)),R1) 当 i > 1 INDEX1 INDEX2 R1 R2 R0: NA(i+1) 图 C.1 – 随机数NA计算算法的实现图 C.2  运算参数 R0的初值为十六进制的八位字节串00 01 02 03 04 05 06 07。 选用的生成多项式为P(x) = x63 + x1 + 1,因此,R1寄存器的初值为十六进制的八位字节串80 00 00 00 00 00 00 03。 在服务器侧,Index1的值为每个应用组的管理变量ModificationCount中modification-count域的值。与此相对应,在客户机侧,Index1是 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 客户机收到确认服务次数的内部寄存器的值。 Index2的值为设备定时器的最大数。 C.3  随机数变换 DES算法 DES随机数变换的方法为对每个数中的64位数进行8次左循环移位。 如果这个数的八个八位字节都相同,那么变换后结果与变换前一样。对这种特殊情况而言,必须更换一个新的随机数。 SHA算法 SHA随机数变换的方法为在与随机数对应的串尾对身份验证密钥进行拼接后,生成一个16个八位字节的报文,对这个报文进行计算得出20个八位字节的SHA 印象,需要发送的随机数就是从这20个八位字节印象中提取的8个字节,提取方法为二取一(即取第一个,第三个,……,) 附 录 D (_规范性附录) 数据保密的加密算法 本附录中描述了应用子层确省应用环境的一个完整算法。 D.1  数据的保密性 数据的保密性通过对应用子层交换的报文进行加密和解密来保障。 事实上,在数据交换时采用身份验证机制获得安全性的算法会花费太多时间,特别是报文比较长的时候(,时间会更长)。 D.2  最长二进制序列 为了保证足够的安全性,加密算法应该是一个关于报文和时间的函数。实际上,采用一个具有长周期伪随机功能的算法便能保证足够的安全性,这种算法基于随后说明的最长二进制序列的概念。 假定A和B是按如下约定表示的n位的位串: A = (a1, a2...an) B = (b1, b2...bn) 串A’=(a’ 1,a’ 2...a’ n)为变换函数Fn (A, B)的运算结果,即A’=Fn (A, B)。其中: a’ I= a i+1 当i为1到n-1时 a’ n= a 1b1 ♁a 2b2 ♁... ♁a nbn (♁ 为模2加法运算符) D.3  加密和解密函数 假设MO为源报文,MC为加密后的报文,将MO分为k个n位的片段(最后一个片段长度位l位,1≤l≤n),那么MO和MC可以表示为如下的形式: MO = (MO1 , MO2 ... MOk) where MOi = (moi1, moi2 ... moin) 当i为1到k-1时 and MOk = (moi1, moi2 ... moil) 1≤l≤n MC = (MC1 , MC2 ... MCk) where MCi = (mci1, mci2 ... mcin) 当i为1到k-1时 and MOk = (moi1, moi2 ... moil) 1≤l≤n 由关系MC = Fc (MO)定义的加密函数Fc为: MCj = Rj ♁MOj 当j为1到k时 (♁为模2向量加法运算符) Rj = Fn(Rj-1, B) 当j为2到k时 R1 算法的初始密钥。 密钥 R1的计算方法如下: · DES算法: · R1 =服务器在身份验证阶段生成的随机数Ns的低n位(n≤64); · 如果R1= ”0...0”H, 则 R1= ”F...F”H。 · SHA算法: · R1 =服务器在身份验证阶段生成的SHA 印象最后两个八位字节。 由于模2加法运算是可逆的,解密函数Fd 和加密函数是对等的。 MO = Fd(MC) = Fd(Fc(MO)) = Fc(Fc(MO)) D.4  运算参数(操作参数) 参数n和B的选择是保障数据保密性的关键。 附 录 E (_规范性附录) 标识号和加密模式 E.1  客户机和服务器标识号 对服务器设备来说,客户机由其类型来标识: Client-type::=INTEGER(-32 768..32 767) 最高有效位 最低有效位 项目标识号(13位) 对象类(3位) 对VAA对象而言,其对象类选为111。 项目标识号占用13位,它的值可以自由选择。 DLMS管理变量提供了实际设备VDE的客户机类型列表,该变量CallingldentifierList可以通过DLMS通信协议管理服务器访问。 服务器采用序列号来标识自己,序列号属性由DLMS(详见IEC 61334-4-41)定义,它是全球唯一的。 Server-identifier::=OCTET STRING /* 八位字节串 */ DLMS管理变量提供了实际设备VDE的服务器标识号。该变量ApplicationList可以通过DLMS通信协议管理服务器访问。 E.2  加密模式 用于数据交换保密性(机密性)的加密模式包含在应用环境中,加密模式的产生规则如下表所示。 表E.1 – 加密模式 DLMS 服务类 管理客户机类型1) 其它客户机类型 ConfirmedServiceRequest 采用专用密钥加密 采用专用密钥加密 ReadRequest 采用专用密钥加密 采用专用密钥加密 ReadResponse 采用专用密钥加密 不加密 WriteRequest 采用专用密钥加密 采用专用密钥加密 Other service classes 不加密 不加密 1)也就是说通过DLMS通信协议管理服务器访问 服务器 客户机 f ICS 17. 220. 20 N 22 中华人民共和国国家标准 GB/T ××××—×××× 应用层协议 �Electricity metering - Data exchange for meter reading,tariff and laod control-Application layer protocols� (IEC 62056-5: 1999, Electricity metering - Data exchange for meter reading,tariff and laod control-Part 61: Object identification system,IDT) (草案稿) (本稿完成日期:2002) ××××-××-××发布 ××××-××-××实施 国家质量技术监督局 发布 � 优先级Pr用于区分诸如informationReport紧急服务处理和其它DLMS服务处理(优先级为0)的等级。 � Strong参数用于区分致命错误(Strong=1) 和其它由应用子层启动的物理链路中断请求(Strong=0)的等级。 � ASN: 抽象语法表示法。 II I
本文档为【IEC 62056(中文)62056-51】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_360995
暂无简介~
格式:doc
大小:302KB
软件:Word
页数:0
分类:建筑/施工
上传时间:2018-09-10
浏览量:24