B05、IEC62056技术文档--ASN.1语法.doc

上传人:豆**** 文档编号:29925863 上传时间:2022-08-02 格式:DOC 页数:18 大小:244.50KB
返回 下载 相关 举报
B05、IEC62056技术文档--ASN.1语法.doc_第1页
第1页 / 共18页
B05、IEC62056技术文档--ASN.1语法.doc_第2页
第2页 / 共18页
点击查看更多>>
资源描述

《B05、IEC62056技术文档--ASN.1语法.doc》由会员分享,可在线阅读,更多相关《B05、IEC62056技术文档--ASN.1语法.doc(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、IEC62056技术文档ASN.1语法简介深圳市航天泰瑞捷电子有限公司修订记录版本日期作者备注1。02012-5-23梁高强初版范围:本文就IEC62056系列标准中涉及的ASN.1语法进行简要概述,便于协助开发工程师阅读、理解DLMS/COSEM通信协议。目录1.ASN.1是什么52.ASN.1历史53.应用领域54.ASN.1语法75.ASN.1显式值(Explict Value)76.ASN.1容器77.ASN.1修改器87.1. 可选(OPTIONAL)87.2. 默认(DEFAULT)87.3. 选择(CHOICE)88.ASN.1头字节(tag)88.1. 类别位98.2. 结构化

2、位98.3. 原始类型99.ASN.1长度编码109.1. 定长方式109.1.1. 短编码。109.1.2. 长编码。119.2. 不定长方式1110.ASN.1的数据类型1110.1. ASN.1布尔类型1210.2. ASN.1整数类型1210.3. ASN.1位串类型1310.4. ASN.1八位位组串类型1310.5. 空类型1410.6. 对象标识标符类型1410.7. ASN.1序列和集合类型1410.8. ASN.1可打印字符串和IA5String类型1510.9. ASN.1世界协调时类型15ASN.1 语法简介1. ASN.1是什么ASN.1全称为abstract synt

3、ax notation dot one ,抽象语法1(数字1被ISO加在ASN的后边,是为了保持ASN的开放性,可以让以后功能更加强大的ASN被命名为ASN.2等,但至今也没有出现),是一种独立于机器的描述语言,用于描述在网络上传递的消息。通俗的来讲,抽象语法就是协议采用ASN.1规范描述的描述文本,这里涉及到另一个语法:传输语法,就是实际通讯系统间的码流。例如字母A为抽象语法,0X41为传输语法。2. ASN.1历史开始于1982年,许多开发应用层标准的人意识到他们面临同一个问题:数据结构变得越来越复杂,难以用预定的规程来编码比特或字节,ASN.1由此而生,它特别适合表示现代通信应用中那些复

4、杂的、变化的及可扩展的数据结构,它不是用一些表格,及一些固定的帧格式来描述的,而是用一种抽象语法语言来描述。这样做的好处是,极大的提高了协议的抽象性和通用性,可扩展性。3. 应用领域在GSM系统中,空中接口上传递的补充业务内容采用了ASN.1的BER编码格式,其RRM模块以及其他层3消息均采用ASN.1编码。3G移动系统使用ASN.1标准数据交换的第三代移动通信网络。这一系统基于UMTS(通用移动通信系统)标准,其使用了ASN.1和分组编码标准(PER)。在3GPP的层3消息体系中,使用ASN.1描述层3消息(包括Uu,Iub,Iur,Iu等接口的层3消息)使用ITU-T建议X.691的各种算

5、法进行编解码,如RRC消息采用UPER编码格式。IP语音在通信领域中的另一个重要应用是通过包转换网络(如因特网)传递语音数据。多媒体数据信号编解码器(CODEC)标准(H.323等等)基于ASN.1并且使用于分组编码标准来获取理想的数据传输速率。安全应用因特网安全授权同样也使用了ASN。1。高级编码标准在数据表示方面形成了 一个方便的、平台无关的标准,比加密要优越。PKIX、PKCS和X。509也是我们所熟悉的标准,它们也是基于ASN.1的。传统通信网络ASN.1和基本编码规则(BER)已经在主要通信领域流行了很长一段时间,所有的ss7到ISDN 的一切都使用了ASN.1 BER信息在各种类型

6、的设备和计算机之间传递信号。军事和空间应用美国国家宇航局(NASA)在其航空通信网规范中,也正在使用ASN.1和分组编码规则作为空对地或地对空协议。在DLMS中的应用如下图所示:例COSEM-OPEN.request服务原语,用ASN。1描述出来如下所示AARQ-apdu := APPLICATION 0 IMPLICIT SEQUENCEprotocol-version 0 IMPLICIT BIT STRING version1 (0) DEFAULTversion1,application-context-name 1 Application-context-name,called-AP

7、-title2 AP-title OPTIONAL,called-AE-qualifier3 AE-qualifier OPTIONAL,called-AP-invocation-id4 AP-invocation-identifier OPTIONAL,called-AE-invocation-id 5 AE-invocation-identifier OPTIONAL,calling-AP-title6 AP-title OPTIONAL,calling-AE-qualifier 7 AE-qualifier OPTIONAL,calling-AP-invocation-id 8 AP-i

8、nvocation-identifier OPTIONAL,calling-AE-invocation-id9 AE-invocation-identifier OPTIONAL,. The following field shall not be present if only the kernel is used。. sender-acse-requirements 10 IMPLICIT ACSE-requirements OPTIONAL,- The following field shall only be present if the authentication function

9、al unit is selected。mechanism-name 11 IMPLICIT mechanism-name OPTIONAL,- The following field shall only be present if the authentication functional unit is selected。calling-authentication-value12 EXPLICIT authentication-value OPTIONAL,implementation-information 29 IMPLICIT implementation-data OPTION

10、AL,user-information 30 IMPLICIT association-information OPTIONAL4. ASN.1语法ASN.1语法遵循传统的巴科斯范式BNF风格,最基本的表达式如:Name := type 。 表示为定义某个名称为Name的元素,它的类型为type。例如:MyName := IA5String。表示为定义了一个名为MyName的元素或变量,其类型为ASN.1类型IA5String (类似于ASCII字符串)。 一个用ASN.1语法描述的数据帧,看上去应该是下面的样子:Name := tag IMPLICIT/ EXPLICIT Data type

11、null-data 0 IMPLICIT NULL,item11 IMPLICIT/ EXPLICITData type A1 OPTIONALitem22 IMPLICIT/ EXPLICITData type A2 OPTIONALitem33 Data type 5. ASN.1显式值(Explict Value)有些时候,我们需要定义一种ASN.1类型,它的子集元素包含预定义值。Name := type (Explict Value)。显式值(Explict Value)必须是ASN.1类型允许选择的值,而且也必须是元素所允许的值。例: MyName := IA5String (Tom

12、) 表示MyName是字符串Tom的IA5String编码。又例如: MyName := IA5String(Tom|Joe) 表示字符串的值既可以是Tom, 也可以是Joe。这种语法的使用是为了扩展确定的解码器,例:Data-Access-Result := ENUMERATEDSuccess (0)Hardware-flaut (1)Temporary-failure (2)Read-write-denied (3)Other-reason (250)6. ASN.1容器容器是值一个包含了其他相同或者不同类型元素的数据类型(例如序列值SEQUENCE或集合值SET类型)目的是为了组合一些复

13、杂的数据类型集ASN.1规范定义了4种容器类型:序列,单一序列(SEQUENCE OF),集合和单一集合(SET OF)虽然它们意义不同,但是语法是一样的。Name := Container Name Type Name Type。方括号中的内容和容器的元素个数都是可选项。还可以进行嵌套定义。例:Get-Request-With-List := SEQUENCEInvoke-id-and-priority Invoke-And-PriorityAttribute-descriptor-list SEQUENCE OF Cosem-Attribute-Descriptor-With-Select

14、ion7. ASN.1修改器ASN.1定义了各种修改器,如可选(OPTIONAL),默认(DEFAULT),和选择(CHOICE)。 他们可以改变表达式的声明典型地用于定义一种要求编码灵活,而定义又不繁琐的类型。7.1. 可选(OPTIONAL)顾名思义,其表示改变一个元素以便在编码时它的类型是可选择的即编码器可以忽略这个元素,解码器不能假设它将出现。定义: Name := Type OPTIONAL7.2. 默认(DEFAULT)默认修改器允许容器包含默认值如果待编码的数据值等同于它的默认值,那么它将在发送的数据流中被忽略。7.3. 选择(CHOICE)选择修改器允许一个元素在给定的实例中可

15、以有多个可能值。GET-Respose :=CHOICEget-respone-normal 1IMPLICIT Get-Response-Normalget-response-with-datablock 2 IMPLICIT Get-Response-With-Datablockget-response-with-list 3 IMPLICIT Get-Response-With-List 8. ASN.1头字节(tag)头字节(hearder byte)位于ASN.1编码的开始,通常是一个八位组,由3部分组成,有如下两种形式,如下图:当Tag不大于30时,Tag只在一个八位组中编码;当T

16、ag大于30时,则Tag在多个八位组中编码。在多个八位组中编码时,第一个八位组后五位全部为1,其余的八位组最高位为1表示后续还有,为0表示Tag结束。8.1. 类别位类别位(classification bits)由两位表示,用来描述数据将要解释的上下文。 位7位6类别及解释00通用(Universal)01应用(Application)10上下文特定(Context Specific)11专用(Private)所有的类型中,通用类别最常用。8.2. 结构化位结构化位(constructed bit)表示一个给定的编码是否是相同类型的多种编码的结构化。结构化元素是容器类型必需的,因为在逻辑上,

17、它们只是其他元素的集合。结构化元素有自己的头字节和长度字节,之后是元素各个要素组件的单独编码。也就是说,这些要素组件是独立地可解码ASN。1数据类型。严格的说,容器类是唯一允许使用结构化位的数据类型。这是因为对于其他数据类型,给定内容,只允许一种编码。所以其他所有数据类型的结构化位都为0。8.3. 原始类型ASN.1头字节的低5位定义了32种ASN。1的原始类型(primitive type)代码ASN。1类型作用1布尔型存储布尔值2整数存储整数3位串存储位数组4八位位串存储字节数组5空预留位(例如在选择修改器中)6对象标识符标识算法及协议16序列和单一序列未分类元素的容器17集合和单一集合已

18、分类元素的容器19可打印字符串ASCII编码(忽略一些不可打印字符)22IA5StringASCII编码23世界协调时以统一格式表示的时间9. ASN.1长度编码根据编码的实际长度,ASN.1定义了两种长度编码(length encoding)方法,定长方式(长编码和短编码),不定长方式。编码字节的最高位代表的是短编码还是长编码;而低7位则形成一个长度立即数。9.1. 定长方式9.1.1. 短编码。在短编码中,负载的长度必须小于128字节。长度立即数用来表示负载的长度。例如,对于一个长度为65 (0x41)的负载进行编码,其长度编码字节只需简单的设置为0x41即可。因为其最高位是0,则编码器可

19、以判断出这是短编码,而且长度是65。9.1.2. 长编码。在长编码中,定义了附加的抽象数据来对长度进行编码,它仅适用于所有长度为128字节或以上的负载。在这种模式下,长度立即数存储的是为了表示负载长度所需的字节数。这个长度必须以big-endian格式进行编码。例如,为一个长度为47310 (0xB8CE)的负载进行编码,因为它的长度大于127, 所以要采用长编码方式。实际的长度需要1个字节来表示。则,长度编码字节为0x81 02; 然后用big-endian格式存储的长度值为0xB8 0xCE。则全部长度编码为 0x81 02 B8 CE。9.2. 不定长方式Length所在八位组固定编码为

20、0x80,但在Value编码结束后以两个0x00结尾。这种方式使得可以在编码没有完全结束的情况下,可以先发送部分消息给对方。图解如下所示:10. ASN.1的数据类型ASN.1针对广泛的应用定义了多种数据类型,这里只讨论跟DLMS相关的数据类型。我们将讨论如下数据类型:布尔型 (Boolean);八位位组串 (OCTET String);位串 (BIT String);IA5String;可打印字符串 (PrintableString);整数 (INTEGER);对象标识符 (OBJECT Identifier, OID);世界协调时 (UTCTIME);空 (NULL);序列,单一序列;集合

21、;单一集合;任何ASN.1编码都是以两个字节开始(或者八位位组,含有个二进制位),不管什么类型它们都是通用的第一个字节是类型标识符,也包含一些修正位;第二各字节是长度。10.1. ASN.1布尔类型布尔编码的负载或者是全0或者是任何不是全0的八位位组。头字节以0x01开始,长度编码字节为0x01,负载内容取决于布尔值的取值。布尔值编码False0x01 01 00True0x01 01 FF10.2. ASN.1整数类型整数类型表示一个有符号的任意精度的标量,它的编码是可移植,平台无关的。正整数的编码比较简单。每个字节表示的最大整数是255 (0xFF), 存储的实际数值分成字节大小的数字,并

22、且以big-endian格式存储。例如:八位位组Xk, Xk-1,。, X0将以递减的顺序从Xk到X0进行存储编码规定正整数的第一个字节的最高位必须是0,即Xk的最高为必须是0,为1的话则为负数例如:x = 49468= 193 * 256 + 60 = 0xC1 * 0x FF + 0x3C; 即X1=0xC1, X0 = 0x3C。 按正常规定,编码应该是 0x02 02 C1 3C, 但是X1的最高位是1, 应该被看成负数最简单的方法是用前端零字节进行填充编码变为 0x02 02 00 C1 3C。负整数的编码有些复杂要先找到一个最小的256的幂,使它比要编码的负数的绝对值还要大例如:x

23、 = - 1555; 被1555大的256的最小的幂是2562 = 65536; 然后将这个数跟负数相加以得到2的补码 65536 + (-1555) = 63981 = 0xF9 * 0xFF + 0x ED。 则编码为 0x02 02 F9 ED。 以下是一些常用整数编码的例子:值编码00x02 01 0010x02 01 0120x02 01 021270x02 01 7F1280x02 02 00 80-10x02 01 FF-1280x02 01 80-327680x02 02 80 0012345678900x02 04 49 96 02 D210.3. ASN.1位串类型位串(B

24、IT STRING)类型以可移植形式表示位数组除了ASN。1头部两个字节之外,还有一个附加的头部用来表示填充数据(通常是一个字节,因为填充是为了形成一个完整的字节)编码规则:位串的第一位放到第一个负载字节的第8位;位串的第二位放到第一个负载字节的第7位; 依此类推填充满第一个负载字节,就继续填充第二个负载字节如果最后一个负载字节未被填充满,空的位用0来填充, 0的个数存放到头部用来表示填充数据的那个字节里下面举例说明:有一个位串1,0,0,0,1,1,1,0,1,0,0,1,开始填充负载字节第一个字节填充后为10001110 = 0x 8E; 第二个字节填充后为10010000 = 0x90,

25、 低位4个0为填充的空位则,负载为2个字节加上表示填充0个数的一个字节0x04总共3个字节则完整的编码为:0x03 03 04 8E 90。解码器通过计算8 * 负载长度 - 填充数 来得到存储输出所需要的位数10.4. ASN.1八位位组串类型八位位组串(OCTET STRING)是保存字节数组,它和位串类型(BIT STRING)很相似这种编码非常简单,像其他类型一样对头部进行编码,然后直接将八位位组复制过去即可例如:对FE, ED, 6A, B4编码;首先存储类型0x04, 接着是长度0x04,然后是字节本身0xFE ED 6A B4; 完整的编码为 0x04 04 FE ED 6A B

26、4。10.5. 空类型空(NULL)类型实际上是占位符, 它是含有空白选项的选择修改器所特有。例如: MyAccount := SEQUENCE Name IA5String,Group IA5String,Credentials CHOICE rsaKey RSAPublicKey,passwdHash OCTET STRING,none NULL 在上面这个结构中,帐号的证书应该包含一个RSA密钥或一个密码散列值或什么都没有空类型的编码是 0x05 00。10.6. 对象标识标符类型对象标识符(OBJECT IDENTIFIER, OID)类型用层次的形式来表示标准规范。标识符树通过一个点

27、分的十进制符号来定义,这个符号以组织,子部分然后是标准的类型和各自的子标识符开始。例如:Application-context-name的LN引用 表示为joint-iso-ccitt(2) country (16) country-name(756) identified-organization(5) DLMS-UA (8) Application-context (1) context_id(1)对OID的编码规则: 前两部分如果定义为x。y, 那么它们将合成一个字40*x + y, 其余部分单独作为一个字节进行编码。每个字首先被分割为最少数量的没有头零数字的7位数字。这些数字以big-

28、endian格式进行组织,并且一个接一个地组合成字节。 除了编码的最后一个字节外,其他所有字节的最高位(位8)都为0。Application-context-nameOID的编码:第一步:将2.16.756.5.8.1.1转换成字数组 96, 756, 5, 8, 1,1。第二步:将每个字分割为带有最高位的7位数字,0x60,ox85,0x74,0x05,0x02,0x08,0x01,0x01。第三步:完整的编码为 06 07 60 85 74 05 02 08 01 01。10.7. ASN.1序列和集合类型序列(SEQUENCE)和单一序列(SEQUENCE OF)以及相应的集合(SET)

29、和单一集合(SET OF)类型叫做结构类型或简单容器它们是一种用来把相关数据元素收集为一个独立的可解码元素的简单方法。序列编码有以下性质:1. 编码是结构化的即头字节的位6必须设置。2. 编码的内容是由ASN。1序列类型定义列表中的所有数据类型值的完全编码所组成,并且按照它们出现的顺序进行编码,除非这些类型被可选(OPTIONAL)或默认(DEFAULT)关键字所引用。例:考虑如下序列 User := SEQUENCE IDINTEGER, Active BOOLEAN 当取值为32,TRUE时,编码为 0x 30 06 02 01 20 01 01 FF 在ASN.1文档里,使用空格来表示编

30、码的属性0x30 0602 01 2001 01 FF10.8. ASN.1可打印字符串和IA5String类型可打印字符串对象是ASCII集合的一个有限子集,这个子集包括32,39,4041,4358,61,63以及65122。IA5String类型的编码对象是ASCII集合中的大多数包括NULL,BEL,TAB,NL,LF,CR以及32126。 可打印字符串和IA5String的编码和八位位组串相似可打印字符串的头字节是0x13, IA5String的是0x16。 例如:Hello World的编码为0x13 0B 48 65 6D 6D 6F 20 57 6F 72 6D 64。 10.

31、9. ASN.1世界协调时类型 世界协调时(UTCTIME)定义了一种相对GMT时间的标准时间(以日期)编码。它使用YYMMDDHHMMSSZ的格式分别表示年,月,日,时,分,秒。 其中Z是遗留自初始的UTCTIME。 如果没有Z,就允许两种附加组+/-hh mm,其中hh和mm分别为与GMT的时差和分差。 如果有Z,则时间是以Zulu或GMT时间表示。字符串的编码按照IA5String编码规则进行转换(ASCII字符集),其头字节为0x17而不是0x16。 例如: July 4,2003 at 11:33 and 28 seconds编码为030704113328Z, 再编码0x17 0D

32、30 33 30 37 30 34 31 31 33 33 32 38 5A。18 编再 0码 如例。0而 字,) 换则码 码示间 间时有差差 为 , +附许,有果 始留 中。分,示分 用它)日间标 对一义 (调世类调界 0 为的 例。 字符打串八编 和印可 , 数的中 是象型 , 括个这有一集 象符字类 和印 . 00性的码格使档 0000 码时 为当 =: 序下:例字键 认默 被型除码序现它按成码全值数的列义类。 是编置设位节即构码质质码法单素码可个收元数来种们容或构类 合一)(的相) 列单 类集和 .。 0000 00 为整: ,0 0 , 数 高为割每 , , 数转 . 将码的 0为)

33、位的字,节一的了节合地个并,进 -以数。位数有的最割首字编行一独单余 个合们 。义果部:编 ) _ ) )(- )( - ) ( ( - 为用 始符标各类标后部织以,定符的个一符。准表的层) 符类符象.0 0是的空没都或密或 个包该证中构面在 : 如例有改选白有它占是实)类类 0 0的 0字然00长接0类存码 ,对如即过组八后,进对一他像常种) 串它节保 组类串八 数的需储到数 度载 算0 000的则节 节字个填表节 负充0 0 后填二; = 0后字个节负开, 0,明明里字的数示部放个0填0空充被载一最如负二充继节负充推依位第节一放第的位节载第放的位码)字个成为为,一通数示表部附还外节头。 组

34、示式移类) 类位. 00 - 0 0 00 00 编子例数常是下 为编 + 0 )-( 码 以相跟这 = 小的的 - 如大对的码比,幂 个找杂编 0 0 码充行端用方简负被 是最 00 应编常正 0, = 0 * * = 如则的0须最 0是最的第数正行0 从减将 。 , 如。储 -以并字节字数实存 ( 是整表字单较的正关台,是编标的的有一类数 0 编尔值的布决内负0节码始0以头位八全任是是载的类布 度长字;修一,符型个用都类管)进二,位者开节是码.合合列列) ) ( ) , 符) () 字 ) ) (组) 型类如论。类的 跟只,类多义的对 类数 示所。方息部先下情全完在以方。00两后 但,为编

35、位所 方长. 0 为度全 0长储格 然 00字编则示字 度的式长用 于度因编进负 0 个,。行 - 必长。的度载了的储立下式在的以 长用仅码度来象的了,码码编 度而编断可编,高其可 为设需节编,编负的 度一,如的负来立度节于小长,码码.方定数立度形 ;编还是代最节编长,编码长长法) 度两义 际的编度时示格调 编 符印不略码 符字 容的集单 容素序单 协法识中中选如数节字位数位整整尔尔作类 代 (类的 义 节字类 00化的数他所编许,内型数于因这类位结许一是,严型 。解地件要些说。单件个元之字和字的元合的素只它上因需型是素构化编多类否码的个 化构用最类中 定 解位位上释要数用位) 别 .。结 0

36、,还示位位八其全五八第码组位在码八个 时于 ;中八个 , 不:,两下, 组八是,码. ) (. - - - - - - - - - : 值可有可例给素许 择.略被据送发么值它同数编待包器改 (. : 现将假不码素略可即择可类码便元变表义 (选型类繁定,编种定地声表改们) 选) ) 可改各了改修 - - - - : - -义定进可选是素器和的括。 :的一法但义它 (单合) (单序类种 范 集的些组是的类 合 列如型素类者或了包一容 0 - - 0 : 例,解展为使语。 是 是值串表 ( = 例。 的串是 : 例值所须且,择型 必 值 = 。预元的型. 种定我 (式 / - = 子子是去看数描 .

37、用 串 类 型 类量或 为个义表 = 例 类素的 为义为 = 式达本, 式的传法.语. - - - - - - - - - - - - - - - - - - 0 0 - : 所所述。 ,服 . 示所用中议协或对作编组 在,网空其 宇家间号信间计设型各息 了都的 到 所时长很域通主 码基. 网的的 基们标悉我也。和 要比标无、便一成示表在级。 了也同安特用率输据理获码分用且 基等 标 (解号据媒数传特如换包是要另中通式码 用消 ,编法各 .- 用 的等 , ( 层. 中体层 在 (标组. 用其)通用通 统一络动代第据标 统码码 采消他及块其格编 了容内补上接中 领性展性和抽议提极是的样来言象用

38、是述格的些及一是,结扩的、杂些应现表特生由 或比程规预,越变据数问同到人标层发, 历 法输传0语为字例码间通实法:法到及,描的规 用协语,讲通消上网描用述器独一)没今,. 名 大更以可, 了, 在 被字 象 为.什是.简语 _ 时世. 0 型 串字 _ 型集序 .0 _ 符象. _ 空.0 _ 串八 0 _ 0 _ 位 .0 数 . _ 型布 .0 _ 数的 . _ 定. _ 。码 短 . _ 0 定 . _ _ 度 . _ 类原 _ 化结. _ 位 . 头 _ 择. _ ) 认 ) (. 修 . _ _ 容. _ 式 法 0 领用 _ 历 么. _ 目议协 解读阅开协述简法语 及准 围初高 -。备作日版记公有捷泰简简文技0

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁