根据ASN.1imsi编码规则则解析智能变电站报文编码并对各个字段加以简要说明。

当前位置: >>
IEC61850通讯标准中的编码规范ASN.1
16:54:08&&作者:&&来源:赛尔电力自动化 总第75期&&
  ASN.1规范是广泛应用在ISO/OS I七层开放互联模型的网络通讯中的国际标准,由于它具有丰富且规范的语义表达和统一的编码规则等优点,许多的国际通讯标准都采用ASN.1作为协议描述和编解码的规范。本论文简要介绍了ASN.1规范的语法、标记和编解码规则,并根据它的标记特点和编码规则,应用一种程序源代码自动生成的翻译工具——ASN.1 Compi1er,自动生成标准的C代码,从而快速集成到应用系统中,缩短开发时间,提高可靠性。IEC61850作为实施数字化变电站的国际标准,其制订的通讯协议栈就采用了ANN。
  IEC61850,变电站内的通讯网络和系统(Communicationnetworksandsystemsinsubstations)是实施数字化变电站的唯一国际标准,它定义了变电站内智能电子设备IED(IntelligentElectricDevice)之间信息交换的数据模型和互操作规范。在具体的通讯过程中,IEC61850标准所要求遵循的编解码规范就是ASN。1。
  ASN。1是抽象语法标记(ASN。1:AbstractSyntaxNotationOne)的英文缩写,是一种ISO/ITU-T标准,描述了一种对结构化信息对象进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述信息对象的结构,而不管机器语言上如何执行及这些数据的具体指代,不用去管到底是什么样的应用程序,或者采用什么规范的接口或通信介质。作为一种异构计算机系统之间的信息交换的国际标准,它已经被广泛应用在各种各样的计算机通信协议中。
  由于ASN。1规范了结构化信息对象的描述和解码过程,使得在通信协议中传递带有语义的信息对象成为可能,程序设计者所关注的目标,已不再是繁琐的编解码流程,而是如何定义和描述异构系统之间通信过程中的信息对象,至于具体的编解。
  码过程,则有统一的ASN。1编码器和解码器来实现。
  1关于ASN。1规范
  ASN。1规范位于ISO/OSI七层开放互连模型的第六层——表示层,包括以下国际标准:
  ISO/IEC99,Informationtechnology-AbstractSyntaxNotationOne(ASN。1):Specificationofbasicnotation基本标记规范。
  ISO/IEC99,Informationtechnology-AbstractSyntaxNotationOne(ASN。1):Informationobjectspecification信息对象规范。
  ISO/IEC99,Informationtechnology-AbstractSyntaxNotationOne(ASN。1):Constraintspecification规范约束。
  ISO/IEC99,Informationtechnology-AbstractSyntaxNotationOne(ASN。1):ParameterizationofASN。1ASN。1参数化。
  ISO/IEC8825-l:2000,Informationtechnology-ASN。1encodingrules:SpecificationofBasicEncodingRules(BER),CanonicalEncodingRules(CER)andDistinguishedEncodingRules(DER)ASN。1编码规则:基本编码规则BER,典型编码规则CER,区分编码规则DER。
  ISO/IEC00,Informationtechnology-ASN。1encodingrules:SpecificationofPackedEncodingRules(PER)ASN。1编码规则:压缩编码规则PER。
  ISO/OSI七层互连模型中的应用层协议大量使用了ASN。1来描述它们所传输的协议数据单元PDU,这些协议包括:用于传输电子邮件的X。400、用于目录服务的X。500、用于VoIP的H。323和用于网络管理的SNMP;用于实时通讯的制造报文规范MMS等等。
  2ASN。1的标记与语法
  ASN。1的标记和语法,如同程序开发人员所熟悉的高级语言一样,在理解和掌握上是很容易的。
  (1)标记类型
  ASN。1定义了许多的通用的数据标记类型,比如像整型、字符串、实型等原子级的数据类型。这些类型是不可再分的。
  除了简单类型,ASN。1也规范了一些结构化标记类型,例如:
  结构(SEQUENCE):由不同的变量类型组成的有序的结构。这个就如同“C”语言中的结构类型(struct)。
  结构列表(SEQUENCEOF):同一个结构类型构成的有序的结构列表。
  集合(SET):由不同的变量类型组成的无序的结构,用来描述复杂的信息对象。
  类型选择(CHOICE):在不同的变量类型中选择之一。
  表1列举了一些ASN。1的数据类型,每个数据类型都有唯一的标记值与之对应,这个标记值将是编解码过程中的类型识别码,它将决定具体的编解码规则。更详细的标记类型,请参考ASN。1的有关规范。
  表1ASN。1标记的数据类型
  类型&关键字&标记值(十进制表示)
  布尔&BOOLEAN&1
  整形&INTEGER&2
  位串&BITSTRING&3
  八进制字符串&OCTETSTRING&4
  空类型&NULL&5
  对象标识符&OBJECTIDENTIFIER&6
  对象描述符&OBJECTDESCRPTOR&7
  引用的外部类型&EXTERNAL&8
  实形&REAL&9
  枚举&ENUMERATED&10
  结构和结构列表&SEQUENCE,SEQUENCEOF&16
  集合和集合列表&SET,SETOF&17
  可打印字符串&PrintableString&19
  ASCII码字符串&IA5String&22
  统一时间&UTCTime&23
  (2)ASN。1模块描述文件
  ASN。1规范中的基本构造模块Module,是指采用ASN。1的标记语法,对应用信息模型进行定义和标记的模块称之为ASN。1模块。用来存储ASN。1模块的文件称之为ASN。1模块描述文件。
  一个模块的典型格式如下:
  &ModuleReference&DEFINITIONS::=
  EXPORTS
  IMPORTS
  AssignmentList
  其中:
  ::=为赋值符号;
  具体的描述和标记信息就是由位于BEGIN和END之间的语句所构成;
  EXPORTS这个模块中的定义可能被其他模块引入;
  IMPORTS定义由其他模块引入;
  AssignmentList这个模块中将定义类型分配、值分配及宏定义。
  3ASN。1的基本编码规则
  从标准中我们就可以看到,ASN。1主要有以下几种编码规则:基本编码规(BER,BasicEncodingRules),规范编码规则(CER,CanonicalEncodingRules),区分编码规(DER,DistinguishedEncodingRules),压缩编码规(PER,PackedEncodingRules)和XML编码规(XER,XMLEncodingRules)等。
  每种编码规则各有特点,可以应用不同的场合。BER编码规则的每个标记符号都有特定格式,编码简单,但较占字节;CER和DER是从BER派生出来的,CER针对不定长格式,常应用在需要传输大量数据的应用,DER针对定长格式,适合安全数据传输,特别是数字签名;PER可大大缩短编码后的字节数,常应用在视频电话、多媒体、3G等需要高速数据传输的领域。
  ASN。1的传输,是基于八位位组的字节序列来进行的,因此,它的编码规则遵循着标记TAG、长度LENGTH、值VALUE的格式,简称TLV,示意图如图1。
  图1ASN。1编码的格式(3。jpg)
  其中:TAG:标记,是该段编码的头字节,描述该段编码所代表的信息类型,通常占据1~2个字节。当标记值小于32时,占据一个字节;当标记值大于等于32时,则TAG字段的第一个字节被置为16进制的1F,第二个字节则是实际的标记值。
  为了保证数据在传送时被接收方正确解码,ASN。1对标记TAG定义了4种类型:UNIVERSAL、ContextSpecific、APPLICATION、PRIVATE)。UNIVERAL表示ASN。1定义的标准数据类型,APPLICATION为显式(EXPLICIT)定义,而隐式(IMPLICIT)后面紧接着的类型TAG将不进行编码。若未注明TAG类型即为ContextSpecific类型。
  当TAG小于31时:
  表2TAG≤31,TAG的编码方式
  Bit7&Bit6&Bit5&Bit4~0
  00:UNIVERSAL通用
  01:APPLICATION应用
  10:ContextSpecific上下文相关
  11:PRIVATE私有
  0:PRITITIVE
  1:Constructed&TAG
  当TAG大于等于31时:
  表3AG&31,TAG的编码方式
  字节1&字节2
  Bit7&Bit6&Bit5&Bit4~0&Bit7&Bit6~0
  00:UNIVERSAL通用
  01:APPLICATION应用
  10:ContextSpecific上下文相关
  11:PRIVATE私有&0:PRITITIVE
  l:Constructed&11111&1&
  LENGTH:长度。描述在后续的VALUE值是由多少个字节数所构成,根据VALUE的长度不同,LENGTH所占据的字节也不同。一般,小于等于127个字节的VALUE时,LENGTH占据一个字节;大于127时,则LENGTH的第一个字节表示LENGTH字段占据的实际字节数,并且第7位置位,后续的字节则表示实际的VALUE长度。
  表4LENGTH的编码方式
  &字节1&字节2~字节n+1
  &Bit7&Bit6~0&
  LENGTH≤127&0&LENGTH&LENGTH
  LENGTH&127&1&LENGTH的字节长度n&
  VALUE:值。实际所要传递的编码内容,具体的编码规则,则根据不同的标记类型,采用不同的编码规范。
  4ASN。1Compiler
  (1)ASN。1标记语法与高级语言之间的对应关系
  正如上个章节中我们介绍的那样,要理解ASN。1的标记与语法,就如同我们理解高级编程语言当中的语法或者类型声明一样,ASN。1中规范的编辑和类型,我们很容易的就可以在高级语言中找到与它相对应的类型和语法。下面就是一个简单的例子(以C语言为例):
  PersonName是一个用ASN。1规范来标记的数据结构,来记录有关人名的信息,一共有3个元素来描述这个人名:分别是本名(givenName)、原名(initial)、家族名(familyName)。以下是其用ASN。1规范的描述:
  PersonName::=[APPLICATION1]IMPLICIT
  SEQUENCE
  givenNameIA5String;
  initialIA5String;
  familyNameIA5String
  相对应的,我们可以用“C”语言来描述这个PersonName:
  typedefstructPersonName
  IA5StringgivenName;
  IA5Stringinitial;
  IA5StringfamilyName
  }PersonName
  通过这个例子,给我们深刻的印象是在ASN。1标记语法之间和高级语言之间,有一个明确而且唯一的映射关系,那么,只要知道了这个唯一的对应关系,我们是否可以采用一个自动化编码的处理流程,来自动生成ASN。1规范所对应的高级语言的编解码过程呢?
  答案是肯定的,这就是目前在通讯领域广泛应用的ASN。1代码翻译工具——ASN。1Compiler。
  (2)ASN。1Compiler自动翻译器
  一个典型的ASN。1Compiler的输入输出如图2。。
  图2ASN。1Compiler工作流程(4。jpg)
  图中的ASN。1Compiler在输入需要翻译的ASN。1模块文件之后,根据对应和翻译规则,生成了描述和定义类型、变量及函数原型的。h文件,以及具体的编码、解码函数代码的。c文件,经过C语言编译链接程序的编译链接,生成了可执行代码供实际的应用通讯调用。
  以下为应用ASN。1Compiler翻译成的C语言代码:
  PersonNameh
  表5ASN。1Compiler生成的C代码头文件
  /*结构类型声明*/
  typedefstructPersonName/*[APPLICATION1]IMPLICITSEQUENCE*/
  IA5StringgivenName;/*IA5String*/
  IA5Stringinitial;/*IA5String*/
  IA5StringfamilyName;/*IA5String*/
  }Name;
  /*编码函数原型声明*/
  AsnLenBEncPersonNameContentPROTO((BUF_TYPEb,PersonName*v));
  /*解码函数原型声明*/
  voidBDecPersonNameContentPROTO((BUF_TYPEb,AsnTagtagId0,AsnLenelmtLen0,PersonName*v,AsnLen*bytesDecoded,ENV_TYPEenV));
  PersonName。c
  表6ASN。1Compiler生成的C文件
  #include“asn-incl。h”
  #include“PersonName。h”
  /*编码函数的源代码*/
  AsnLen
  BEncNameContentPARAMS((b,v),BUF_TYPEb_AND_PersonName*V)
  returntotalLen;
  }/*BEncPersonNameContent*/
  /*解码函数的源代码*/
  VoidBDecNameContentPARAMS((b,tagId0,elmtLen0,v,bytesDecoded,env),
  BUF_TYPEb_AND_AsnTagtagId0_AND_AsnLenelmtLen0_AND_PersonName*v_AND_AsnLen*bytesDecoded_AND_ENV_TYPEenv)
  }/*BDecNameContent*/
  很显然,只要在应用中调用相应的编码函数,所要传送的信息内容就被编成字节流的形式;或者在网络通讯中接收到一串字节流后,调用相应的解码函数,就会得到一个具体的信息内容,至于具体的编解码过程,则是我们不再需要考虑的了。
  (3)应用ASN。1Compiler的优势
  由于采用了机器的自动识别和翻译,不仅缩短了编程时间,而且生成的代码在可读性、效率和准确性都有大幅度的提高,减少了人为的错误,使得实际通讯变得简单高效起来。
  目前,已经有众多的ASN。1Compiler的成熟产品可供选择,用户可以根据不同的需求选择不同的工具生成如C/C++/JAVA/XML等语言的源代码,从而缩短开发周期。可以说,ASN。1Compiler的出现,使得程序开发人员不再担心通讯过程中的编码、解码流程,而把更多的精力投放到通讯应用的本身,ASN。1Compiler无疑是一个针对开发者的高效的辅助工具。
  5ASN。1在数字化变电站系统中的应用
  数字化变电站的研究和实施在国内正方兴未艾,IEC61850作为其唯一的国际通讯标准,克服了在传统的自动化设备问互联时封闭的、针对特定应用、语义简单的通讯模式,而是建立在开放式互联模型ISO/OSI7层规范的应用层协议上,丰富的而又规范的语义表达,统一的编解码规则,使得更多的传输信息成为可能。应用配电载波线路的配电自动化的国际标准IEC61334(DistributionAutomationusingDistributionlinecarriersystems)等也都采用了ASN。1规范作为其标记和编码规则。
  以IEC61850标准为例,IEC、IEC和IEC是规范其通讯协议栈的部分。在IEC中,通讯协议栈映射到制造报文规范MMS,而MMS是建立在ISO/OSI7层互联模型的应用层的协议,让我们看一下采用ASN。1规范书写的MMS的模块文件内容:
  MMSDEFINITIONS::=BEGIN
  MMSpdu::=CHOICE{
  confirmed-RequestPDU[0]
  IMPLICITConfirmed-RequestPDU,
  confirmed-ResponsePDU[1]
  IMPLICITConfirmed-ResponsePDU,
  confirmed-ErrorPDU[2]
  IMPLICITConfirmed-ErrorPDU,
  unconfirmed-PDU[3]
  IMPLICIT
  Initiate-RequestPDU,
  initiate-ResponsePDU[9]
  IMPLICITInitiate-ResponsePDU,
  initiate-ErrorPDU[10]
  IMPLICITInitiate-ErrorPDU,
  conclude-RequestPDU[11]
  IMPLICITConclude-RequestPDU,
  conclude-ResponsePDU[12]
  IMPLICITConclude-ResponsePDU,
  conclude-ErrorPDU[13]
  IMPLICITConclude-ErrorPDU}
  Confirmed-RequestPDU::=SEQUENCE{
  invokeIDUnsigned32,
  ConfirmedServiceRequest}
  根据ASN。1的标记及语法不难理解,上面所定义的MMS协议数据单元PDU共有confirmed-RequestPDU、Confirmed-ResponsePDU等多个可选项,具体到confirmed-RequestPDU,它是一个结构化的信息体,包括一个32位的无符号整数和结构体ConfirmedServiceRequest组成,至于ConfirmedServiceRequest还会在上面的模块文件中得到标记和描述。
  同样的,在IEC和IEC中,也采用ASN。1的标记语法对其协议数据单元进行了定义:
  IEC61850DEFINITIONS::=BEGIN
  IMPORTSDataFROMISO-IEC-9506-2
  IECSpecificProtocol::=CHOICE{
  9-1-Pdu[0]IMPLICITOCTETSTRING,
  savPdu[APPLICATION0]IMPLICITSavPdu,
  6结束语
  ASN。1是一个开放性的异构系统之间的编码规范。采用一个高效的代码生成工具——ASN。1Compiler,就可以很容易地生成基于ASN。1规范的编码/解码流程的源代码(例如最常见的C/C++语言),经过编译链接后变成可执行代码。
  ASN。1规范的应用,对计算机通讯来说,是一个具有里程碑意义的变革,它使得通讯双方关注信息交换的内容,而非具体的编解码过程。这也是新一代的自动化通讯标准IEC61850在实用性、规范性、灵活性和易扩展上都强于传统的远动归约的原因之一。
  正是采用了ASN。1的编码规范,IEC61850标准己不再关心具体的通讯过程,而是大量的研究和规范了数字化变电站内IED设备间的数据交换模型和互操作规范,因此,要实现和实施好数字化变电站系统,研究透彻ASN。1规范就是非常重要的了,这也是实现IEC61850的核心技术之一。
 小编推荐
【中国设计师网电气微信公众平台】 微信号 saier电气
打开微信,点击底部的&发现&,使用 &扫一扫& 即关注&saier电气&分享网页到朋友圈!
本文引用地址:
  频道精选
  频道活动
  热点排行
  精华帖子
Copyright &
shejis.com.All Rights Reserved
京ICP备号-5&61850典型报文解析说明_图文_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
61850典型报文解析说明
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩11页未读,
定制HR最喜欢的简历
你可能喜欢论文发表、论文指导
周一至周五
9:00&22:00
一种基于GCM的智能变电站报文安全传输方法
  【摘 要】变电站作为我国电网中电力中转的重要节点,并担负着电能分配与电压转换的重要任务,而变电站能否准确、可靠与安全的运行,对整个电网的安全与稳定都有着重要的影响。如何在新形势下保障智能变电站的报文传输安全,也成为了电力工作者所急需解决的一项重要课题。本文结合实际工作经验,从智能变电站的报文安全机制出发,并提出和设计了一种基于GCM的智能变电站报文安全传输方法。 中国论文网 /8/view-4911385.htm  【关键词】GCM;智能变电站;报文;安全传输   MMS、SMV和GOOSE作为智能变电站常用的三种报文,在IEC61850标准中对这三种报文的长度、内容、传输时间以及安全性的复杂程度等多个方面均作出了不同的相应规定。而如果每一种报文都对于一种加密传输算法,则必然会增加智能变电站中网络设备的负担,并影响到其互操作性。基于GCM的认证加密算法具有易于实现、加密和解密速度快,以及无专利等多个优点,尤其是具有认证、认证加密和明文发送这三种不同的加密模式,能够充分满足当前智能变电站对不同报文传输的安全需要。   1 智能变电站通信安全机制及GCM算法概述   1.1 智能变电站通信安全机制   IEC61850标准将MMS、SMV和GOOSE报文分别映射在不同的通信链路中,由于这三种报文的允许传输时间,PDU大小等方面都有各自不同的特点,标准建议通过不同的安全措施来实现不同报文的处理。   对于安全性和传输实时性要求较高的GOOSE报文,标准提倡采用认证而非加密的方法以确保其完整性,当然该标准并不否定加密,只要求能够满足4ms最低要求且适宜的加密算法也是可行的;对于主要是一些测量数据的SMV报文,由于其数据量大,而重要性相对较小,因此可不进行加密措施,但要实施完整的检测;对于作为跨变电站内部与外部网络的MMS报文,由于其非常容易被入侵者利用,因此要求必须具备很高的安全性,并应通过认证与加密的双重保障。   1.2 GCM算法概述   认证加密算法是当前较为主流的一种安全技术,能够同时实现数据加密与数据认证这两种安全措施。当前GCM算法的吞吐率已然突破了100Gbps,而且最高吞吐量已达到了162.56Gbps。GCM算法因其高安全性、高速率、无专利以及能适用于数据链路层加密等多个方面的优点,使其在安全技术方面得到了广泛的关注与应用。GCM算法的定义如下:   GCM加密函数:   GCM解密函数:   2 基于GCM算法的安全报文模型设计   本文在保留了IEC62351扩展报文格式优点的基础上,对适合GCM算法处理的报文模型进行了设计,如下图1所示。通过重新定义而保留了字段1,并将所保留的字段分为了A和B两个部分,分别表示扩展字段的长度以及加密模式,其中每一个部分都各自占有一个字节。从而通过对A、B两个不同部分的组合,来确定报文是否需要加密以及确定采用加密的模式。   图1 基于GCM算法的安全报文结构   在设计中,若当A部分为0而B部分取任意值时,该报文即为原始报文,可不采取任何的认证与加密措施,而进行明文发送,其中GCM算法选择NULL模式;若A部分为20,则表示该报文为扩展报文,此时B部分定义为0或者255,则分别表示扩展报文选择GCM认证模式或者认证加密模式,如B部分为两者之间则为预留字段。通过这样的定义设计,也方便了对智能变电站中不同报文的分类处理,提高了传输的灵活性与安全性。   3 基于GCM的智能变电站报文安全传输的算法设计   3.1 加密算法设计   步骤一:在发送端组织好报文,并将其组装为APDU,经过变电站表示层和应用层的ASN.1编码处理后传递到数据链路层。   步骤二:通过Set_ReservedFied(A,B)分别将A部分和B部分设置为20和255,并通过对Get_SeqNum函数将APDU中的SeqNum的属性值赋值给SN。   步骤三:对报文的安全类型和模式的选择,以此判断该报文为扩展报文,且需要经过认证和加密处理。在加密处理之前应首先对该报文进行扩展,并添加MAC头部字段、扩展字段以及优先权字段,并计算赋值给A部分。   步骤四:调用GCM加密函数对该报文进行加密。加密过程中首先通过Step1和Step2对向量参数H和P进行初始化;Step3进行报文的预处理;Step4、Step5和Step6对每段明文进行加密后再输出密文段;Step7调用GHASH函数的计算验证码,并选择最高位中的16位码作为认证码T;Step8返回认证码T和密文段,并将其添加进相应的字段中。   步骤五:计算CRC值并将其填充入保留字段2中,再发送报文,加密算法结束。   3.2 解密算法设计   步骤一:首先进行CRC值的检查,如果没有错误再进行其余变量的初始化工作。   步骤二:通过Get_InitialVal中所获得的报文各字段的值,将优先权字段和头部字段的值赋值给A部分,保留字段的值分别赋值给A和B部分,MAC字段赋值给T,SN字段赋值给P,密文数据赋值给M。   步骤三:对报文的安全类型和模式进行选择,判断该报文为扩展报文,需选择认证和加密模式。   步骤四:调用GCM解密函数进行解密运算,在解密之前应先进行MAC判断,若相等则证明报文未被篡改,具有完整性,然后再进行相应的解密操作。   步骤五:若解密成果,则将明文提交到相应的接受设备中进行内部安全处理。若解密失败或MAC不相等,则表明该报文已经被篡改,应当丢弃,则解密算法结束。   4 基于GCM的智能变电站报文安全传输方法的优点分析   (1)对于GOOSE类报文,可利用GCM算法中的GMAC模式,将该类报文分为需要安全保护的报文和不需要安全保护的报文,只系统的检查消息内的完整性与来源的正确性。这样不仅提高了数据传输的安全性,有节省了时间,减少了网络流量。   (2)对于电能质量和计量类的SMV报文,由于其数据流量大,也可采取与GOOSE类相同的模式,以减轻网络负担,减少网络延时。   (3)对于变电站内外网络交互的MMS报文,由于其安全性要求很高,为加强报文的完整性与机密性,可选择加密模式中的GCM模式,同时实现报文的完整性和机密性检测。   5 总结   本文针对智能变电站的特殊需求环境,设计了一种基于GCM的智能变电站报文安全传输算法,并就该方法的优点进行了分析与介绍,证明了其能够充分满足智能变电站报文传输在安全性和实时性上的要求。   参考文献:   [1]宋磊,罗其亮,等.电力系统实施数据通信加密方案[J].电力系统自动化,2004(14).   [2]吴文玲,冯登国,等.分组密码的设计与分析[M].北京:清华大学出版社,2009.
转载请注明来源。原文地址:
【xzbu】郑重声明:本网站资源、信息来源于网络,完全免费共享,仅供学习和研究使用,版权和著作权归原作者所有,如有不愿意被转载的情况,请通知我们删除已转载的信息。
xzbu发布此信息目的在于传播更多信息,与本网站立场无关。xzbu不保证该信息(包括但不限于文字、数据及图表)准确性、真实性、完整性等。没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 合同编码规则 的文章

 

随机推荐