一种远程调用通信组件的系统及方法

文档序号:7617132阅读:103来源:国知局
专利名称:一种远程调用通信组件的系统及方法
技术领域
本发明涉及通信组件的测试领域,特别是一种远程调用通信组件的系统及方法。
背景技术
通信组件作为通信网络的平台软件,在开放过程中提供丰富的应用程序接口(API),以方便用户在使用该通信组件时自由地扩展、适配、配置以及进行功能可裁剪等。由于通信组件在通信网络中的应用非常灵活,在测试通信组件的过程中需要模拟真实的网络环境,用户在测试端远程调用被测端的通信组件,使其模拟对应的功能。并且由于在测试过程中,被测试对象通信组件对外唯一可见的就是API接口,所以对通信组件的调用相当于对API接口的调用,即通过调用API接口实现对通信组件的调用。在测试过程中,测试端和被测试对象所在的被测端形成客户端/服务器端(Client/Server)架构,该架构中的客户端(Client)为测试端,服务器端(Server)为被测端。
目前,微软(Microsoft)公司提供了一套标准的远程过程调用(RPC)调用库(library)来实现从客户端远程调用服务器端通信组件的API接口。Microsoft RPC利用接口定义语言(IDL)规则封装API接口,设计桩(Stub)函数,并利用MIDL编译器进行编译产生客户端Stub和服务器端Stub,而且还将客户端Stub与测试代码进行联编、服务器端Stub与被测组件进行联编。该RPC调用架构如图1所示,图中左侧为Client端,右侧为Server端,所述Client端包括客户端应用层(application)、客户端实时桩(Client Stub)、客户端运行库(Client Run-Time Library)、客户端传输部分(Transport),所述Server端包括服务器端应用层(application)、服务器端实时桩(ServerStub)、服务器端运行库(Server Run-Time Library)、服务器端传输部分(Transport)。在上述Microsoft RPC调用架构中,RPC的调用过程及各部分的作用如下步骤101至步骤104,客户端应用层直接调用客户端Stub。客户端Stub从客户端地址空间获得过程参数并对远程过程参数进行必要的字节转换,例如将参数从网络序转换成字节序。调用客户端Run-Time Library库函数,并通过底层transport向服务器端发送调用请求和过程参数。
步骤105至步骤107,服务器端的Run-Time Library从底层传输部分接收请求消息,并调用Stub的相应过程,其中过程参数保存在网络缓冲区中。服务器端Stub从网络缓冲区读取、解析参数,并将数据从字节序转换成网络序。
此后,服务器端根据Stub提供的过程参数调用被测的远程过程,调用完成之后,产生返回值和输出参数。
步骤108至步骤110,远程过程将返回值和输出参数传送给服务器端Stub。Stub将返回值和输出参数转换为字节序,并返回给服务器端的Run-Time Library。服务器端的Run-Time Library通过底层传输层将返回值和输出参数传送给客户端。
步骤112至步骤114,客户端的Run-Time Library从底层传输层接收到返回值和输出参数后,将返回值和输出参数传给客户端Stub。客户端Stub对返回值和输出参数转换字节序后,将输出参数写入数据缓冲区,并将返回值传递给应用层,应用层进行数据处理。
在使用Microsoft RPC远程调用API接口时,需要利用IDL规则对通信组件的API接口进行封装,以及利用MIDL编译器编译产生客户端Stub和服务器端Stub,还要将客户端Stub与测试代码进行联编、服务器端Stub与被测组件进行联编,可以看出整个过程非常复杂,构造测试系统的工作量很大。另外,当远程过程参数很复杂时,用C语言构造测试数据非常困难,而且修改测试数据需要重新全部编译,可见Microsoft RPC方法可重用性较差。

发明内容
有鉴于此,本发明的目的在于提供一种简单、方便的远程调用通信组件的系统和方法。
根据上述目的,本发明提供了一种实现远程调用通信组件的系统,该系统包括测试端和被测端,所述被测端包括被测对象通信组件,所述测试端包括客户端测试模块,用于通过脚本语言和编解码规则对所要调用通信组件的API接口名和参数进行描述形成测试脚本,根据编解码规则将测试脚本生成测试消息发送给被测端,以及接收从被测端的服务器端测试模块返回的调用结果;所述被测端进一步包括服务器端测试模块,用于解析所述测试消息得到API接口名和参数,并通过根据所述API接口名和参数调用与所述API接口名对应的API接口函数实现对通信组件的调用,以及向测试端的客户端测试模块发送调用结果。
所述脚本语言为树表结合标示语言TTCN、工具命令语言TCL或脚本描述语言Python。
所述测试端的客户端测试模块和被测端的服务器端测试模块之间通过TCP/IP协议建立通信连接。
所述脚本语言为TTCN,所述客户端测试模块进一步包括TTCN模块和TTCN适配器;其中,所述TTCN模块用于通过TTCN和编解码规则对所要调用通信组件的API接口名和参数进行描述形成测试脚本,以及将所述测试脚本传输给TTCN适配器;所述TTCN适配器用于根据编解码规则将所述测试脚本生成测试消息发送给被测端,以及接收从被测端返回的调用结果。
所述编解码规则为抽象符号描述语言ASN.1编解码规则。
所述服务器端测试模块进一步包括消息解释器和API映射模块;其中,所述消息解释器用于从被测端接收的数据中解析出测试消息并传递给API映射模块,以及向测试端的客户端测试模块发送调用结果;所述API映射模块用于解析所述测试消息得到API接口名和参数,以及通过根据所述API接口名和参数调用与所述API接口名对应的API接口函数实现对通信组件的调用。
所述API映射模块进一步包括函数注册表,用于保存API接口名及其对应的API接口函数地址;所述API映射模块进一步用于根据所述函数注册表获取与所述API接口名对应的API接口函数地址,以及通过将所述参数映射到所述API接口函数地址指示的内存空间调用所述API接口函数。
所述API映射模块进一步包括数据缓冲区,用于存放所述参数。
本发明还提供了一种远程调用通信组件的方法,该方法包括以下步骤A.测试端通过脚本语言和编解码规则描述所要调用通信组件的API接口名和参数形成测试脚本,并根据编解码规则将测试脚本生成测试消息发送给被测端;B.被测端解析所述测试消息,得到所述API接口名和参数;C.被测端通过根据所述API接口名和参数调用与所述API接口名对应的API接口函数实现对通信组件的调用,并向测试端发送调用结果。
步骤A中所述脚本语言为TTCN、TCL或Python;和/或所述编解码规则为ASN.1编解码规则。
预先在被测端保存API接口名与API接口函数地址的对应关系;步骤C中,所述被测端根据所述API接口名和参数调用与所述API接口名对应的API接口函数的步骤包括根据所保存的对应关系获取与所述API接口名对应的API接口函数地址;通过将所述参数映射到所述API接口函数地址指示的内存空间中调用所述API接口函数。
步骤C中所述向测试端发送调用结果的步骤包括向测试端发送调用成功或失败的消息;和/或在调用成功且完成后,向测试端发送通信组件的返回值,并在存在输出参数的情况下向测试端发送所述输出参数。
从上述方案中可以看出,由于本发明使用了ASN.1规则之类的编解码规则和TTCN、TCL、Python等脚本语言对待调用通信组件的API接口名和参数进行描述,形成测试脚本,并利用ASN.1编解码规则将测试脚本生成测试消息,然后发送给被测端,在被测端解析测试消息得到API接口名和参数,调用对应的API接口函数,从而实现对通信组件的调用,本发明不需要对API接口设计桩函数,因此本发明所提供的方法和系统具有简单易实现的优点,能够降低组建通信组件测试系统的开发成本,以及降低修改测试数据时的工作量,大大提高了测试数据的自动化程度和复杂测试数据构造的便利性。并且本发明在修改测试数据的时候不需要重新编译,具有良好的可重用性。


图1为现有技术中RPC方案的系统以及调用过程示意图;图2为本发明远程调用通信组件的系统示意图;图3为测试端和被测端交互原语流程示意图;图4为被测端API映射模块的处理流程示意图;图5为解析和保存参数的流程示意图;图6为API接口函数地址检索的流程示意图;图7为本发明的流程示意图。
具体实施例方式
为使本发明的目的、技术方案和优点更加清楚,以下举实施例对本发明进一步详细说明。
与Microsoft的RPC方案不同,本发明在测试端通过脚本语言和编解码规则直接根据API接口名和参数构造测试消息,在被测端解析出测试消息中的API接口名和参数,通过将参数映射到对应的API接口函数运行的内存空间中,直接调用对应的API接口函数,从而实现对通信组件的调用,并且不需要对API接口进行封装,降低了测试结构设计的工作量。
本发明采用的编解码规则为抽象符号描述语言(ASN.1,Abstract SyntaxNotation One)编解码规则,所采用的脚本语言如树表结合的标示语言(TTCN,Tree and Tabular Combined Notation)、工具命令语言(TCL,ToolCommand language)或者脚本描述语言(Python)等,下面以TTCN为例说明本发明的具体实施方法。
如图2所示的是本发明测试系统的原理结构图。图中测试端即客户端包括客户端测试模块,被测端即服务器端包括服务器端测试模块和被测实现(IUT),所述IUT即为被测通信组件。
其中客户端测试模块利用TTCN和ASN.1规则对所要调用通信组件的API接口名和参数进行描述,形成测试脚本,然后根据ASN.1编解码规则将测试脚本生成二进制数据流格式的测试消息,并发送给服务器端的CComp模块;客户端测试模块还将被测端CComp模块发送过来的返回值和输出参数转换字节序,然后将转换后的返回值传递给应用层、将转换后的输出参数写入测试端的数据缓冲区。
客户端测试模块进一步可分为TTCN模块和TTCN适配器,其中TTCN模块利用TTCN和ASN.1规则对所要调用通信组件的API接口名和参数进行描述,形成测试脚本,并将测试脚本传送给TTCN适配器;TTCN适配器根据ASN.1编解码规则将测试脚本生成测试消息,并通过TCP/IP协议发送给服务器端的CComp模块,TTCN适配器还能将被测端CComp模块发送过来的返回值和输出参数转换字节序,然后将转换后的返回值传递给应用层、将转换后的输出参数写入测试端的数据缓冲区。
图2中被测端的服务器端测试模块与客户端TTCN适配器建立TCP/IP协议的底层通信连接,并解析从底层通信连接接收到的网络数据,从中解析得到测试消息,然后将测试消息进行消息解码,解析出API接口名和具体参数信息,并通过将参数映射到与API接口名对应的API接口函数运行的内存空间中,调用该API接口函数,从而实现对通信组件的调用。
服务器端测试模块进一步可分为消息解释器(CComponent,简称CComp模块)和API映射模块。其中CComp模块与客户端TTCN适配器建立TCP/IP协议的底层通信连接,并解析从底层通信连接接收到的网络数据,从中解析得到测试消息,并将测试消息传送给API映射模块;API映射模块将接收到的测试消息进行消息解码,解析出API接口名和具体参数信息,并通过将参数映射到与API接口名对应的API接口函数运行的内存空间中,调用对应的API接口函数,从而实现对通信组件的调用。
下面分别说明图2中各模块的实现方法。
图2中的客户端TTCN模块利用ASN.1以及TTCN规则对API接口名和参数进行描述,形成测试脚本。以下给出进行描述所用的各种数据类型的示例,其中主要涉及到ASN.1和TTCN的定义,由于ASN.1和TTCN的定义为现有公知技术,这里只对其作简单说明。

表1简单数据结构定义表1给出了TTCN模块中用到的数据类型定义的示例,表1中第一列为各个数据类型的名称;第二列是对应的编码类型;第三列为约束条件,用于限制变量占用的字节数,该项的数字表示变量占用的字节数;第四列是扩展的ASN.1编解码函数,其中BITS(n)用于限制变量占用的长度为n个bit,TLV表示如何来编码或解码该结构,包含4个参数Tag、TagLen、LenLength、offset,分别为该结构的标识符、该标识符占用的长度、该结构长度值所占用的长度、偏移量,例如TLV(0,0,8,0)表示在编解码该结构时没有Tag标识符,且该结构的长度值占用8位,即1个字节。
在确定数据类型之后即可根据表1的各种数据类型构造参数结构,具体的参数结构如表2、表3和表4所示。
表2给出的是自定义OnePar类型参数的说明,该类型包括用于声明参数长度的ParaSize,为一个字节长度;用于声明参数类型的ParaPtrL,为一个字节长度,所述参数类型是指参数是指针类型还是非指针类型;用于存放实际参数值的ParData,为可变长度。

表2参数OnePar结构说明

表3指针类型参数说明表3给出的是指针类型参数的说明,该类型包括用于声明指针级别的ptrLvl,为一个字节长度,所述指针级别是指该指针是单级指针还是多重指针;用于声明指针标示的ptrTag,为一个字节长度;用于存放实际指针数据的ptrData,为可变长度。
表4给出的是调用API接口的结构定义,该结构包括用于声明底层通信通道标识符的h_Comp,它为4个字节长度,h_Comp取0时表示通过函数注册表调用内置函数;所要调用的API接口名apiName,apiName是可见字符串类型,为可变长度,apiName被用来从函数注册表中搜寻实际调用的API接口函数地址;用于声明返回值类型的retPtrL,它为1个字节长度;用于存放实际函数返回值的retData,它的长度可变;用于存放参数数据的parData,为可变长度。

表4远程调用结构的说明图2中客户端的TTCN适配器和服务器端的CComp模块之间的交互信息和交互流程如图3所示,用Start、StartAck、Done、Notify等四个原语描述如下Start原语当启动测试过程时,TTCN适配器向CComp模块发送Start原语,携带被调用的API接口名以及参数等信息,启动测试过程;StartAck原语当服务器端根据收到的信息对通信组件进行调用后,CComp模块向TTCN适配器发送StarAck原语,告知TTCN适配器调用成功或失败;Done原语在通信组件调用结束后,CComp模块向TTCN适配器发送Done原语,携带通信组件的返回值给客户端;
Notify原语当被测通信组件存在输出参数时,CComp模块向TTCN适配器发送Notify原语,将输出参数传递给测试端。
图2中API映射模块的作用是从消息解释器传送来的测试消息中解析得到所要调用的API接口名及参数,将参数保存到数据缓冲区,根据预先建立的函数注册表寻找对应的API接口函数地址,并通过将数据缓冲区中数据映射到对应的API接口函数地址指示的内存空间中,调用API接口函数,从而实现对通信组件的调用。所述API接口函数指示的内存空间为该API接口函数运行的内存空间,API映射部分的实现和工作流程如图4所示步骤401,构造一个函数注册表,在函数注册表中保存API接口名,以及与API接口名对应的API接口函数地址。构造一个数据缓冲区,用于顺序存放解析测试消息中参数数据后得到的参数。
函数注册表的结构如下struct tagProcMap mapProc[]={{“Sample_Func1”,Sample_Func1},{“Sample_Func2”,Sample_Func2},{“Sample_Func3”,Sample_Func3},……}该函数注册表结构中每个单元前面的元素是API接口名,后面的元素是对应的API接口函数地址。
在上述函数注册表中API接口名和API接口函数地址的数据结构为Struct TagProcMap{VOS_CHAR nameProc[256];VOS_UINT32 h_Proc;}在测试过程中循环执行步骤402至步骤406。
步骤402,接收消息解释器传来的测试消息,该测试消息为二进制数据流。
步骤403,解析上述二进制数据流得到API接口名以及参数,并将参数保存到数据缓冲区。如果解析成功,则执行步骤404;如果解析失败,则执行步骤402,即继续接收测试消息。本步骤中参数解析和保存的过程将在后面图5所示的流程描述。
步骤404至步骤406,根据解析得到的API接口名在函数注册表中检索到对应的API接口名并获得与该API接口名对应的API接口函数地址,然后通过将数据缓冲区中的数据映射到API接口函数地址指示的内存空间中,调用对应的API接口函数,从而实现调用通信组件。无论在调用成功或失败后,皆通过CComp模块的StartAck原语向测试端发送相应的调用成功或失败的消息。在调用成功并且完成后,利用CComp模块的Done原语向客户端发送返回值,如果存在输出参数,则利用CComp模块的Notify原语将输出参数发送给测试端。
在上述步骤403中参数的解析和保存流程如图5所示,包括以下步骤步骤501,获取参数个数,不妨设为N个,下面从n=1开始解析各个参数。
步骤502至步骤503,解码第n个参数的长度与类型,并判断该参数的类型是否为指针类型,如果该参数的类型为指针类型,则执行步骤506及其后续步骤,否则执行步骤504及其后续步骤。
步骤504,将该参数存储到数据缓冲区。
步骤505,判断解码过程是否结束,即n是否等于N,如果n等于N,表明解码结束,则结束解码流程。否则表明解码未结束,将n加1后执行步骤502。
步骤506,获取当前参数的指针级别。
步骤507至步骤508,将指针替换为一级伪指针,并将数据拷贝到实际指针区。该步骤的目的是将指针值替换为数据实际存放在服务器端的内存位置的指针值,以便于调用API接口函数。这是因为来自客户端的参数中包含的指针信息指向的是客户端的内存地址,在服务器端是不可用的,服务器端需要将指针指向该数据在服务器端存储的内存地址后才可以使用。
步骤509,判断当前指针是否结束,如果结束则执行步骤505,否则执行步骤507。
另外,在上述步骤404中根据测试消息中的API接口名检索获得API接口函数地址的过程如图6所示,包括如下步骤步骤601,获取解析出来的API接口名。假设函数注册表中一共有N个API接口函数名,下面从n=1开始在函数注册表中检索。
步骤602至步骤603,获取函数注册表中第n个API接口名,将所解析出来的API接口名与函数注册表中第n个API接口名进行字符串比较,判断两者是否符合,如果两者符合,则执行步骤604,否则执行步骤605。
步骤604,获取函数注册表中第n个API接口名对应的API接口函数地址,结束检索流程。
步骤605,判断注册表是否结束,即n是否等于N,如果n等于N,则结束API检索流程。否则将n加1执行步骤602。
下面以一个调用实例来说明本发明的方法。假设参数类型为struct te{int i1;int*i2}该参数包括两个数据,其中一个i1为整型数据,另一个i2为指针。假设被测通信组件的定义如下int AddStructParLvl(struct te,int*i){int Sum;
Sum=te.i1+*te.i2;Return Sum;}该通信组件的API接口名为AddStructParLvl,通信组件的作用是将输入的参数Te中的整数i1和指针i2对应的取值相加得到两者之和Sum,并返回Sum。
下面以参数te={10,11}、I=20为例,并通过注册表调用内置函数,即h_Comp=0。参考图5,本实施例的流程如下步骤701,TTCN模块利用ASN.1以及TTCN规则对API接口名和参数进行描述,形成测试脚本。
根据前面相关部分的描述,该测试脚本的结构如表5所示。

表5测试脚本的结构步骤702,TTCN适配器利用ASN.1编解码规则将测试脚本生成二进制数据流,并通过Start原语发给被测端的消息解释器。
根据表5、表6和表7的解释,构成的数据流如下00000000 10 AddStructPar2Lvl 00 04 00000000 04 01 0A00000019800724 0B000000 04 01 14000000

表6第一个参数Te的解释

表7第二个参数I的解释步骤703,消息解释器接收到从客户端发送过来的数据后,将其解析,得到测试消息,即步骤702中所示的数据流,然后传送给API映射模块。
步骤704,API映射模块接收到CComp模块的二进制数据流后,进行消息解码,获取所要调用通信组件的API接口名AddStructPar2Lvl和参数,根据API接口名在函数注册表中寻找对应的API接口函数地址。将参数中的指针Te替换后和I存入数据缓冲区,并通过将数据缓冲区中的数据映射到API接口函数地址指示的内存空间中,调用API接口函数,从而实现调用通信组件。调用成功后,通过CComp模块用StartAck原语发送调用成功的消息。
步骤705,调用结束后,由CComp模块用Done原语将返回值Sum发送给客户端,以及用Notify原语携带输出参数给客户端。
步骤706,客户端TTCN适配器将返回值和输出参数转换字节序后,将返回值传递给应用层,以及将输出参数写入客户端的数据缓冲区。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种实现远程调用通信组件的系统,该系统包括测试端和被测端,所述被测端包括被测对象通信组件,其特征在于,所述测试端包括客户端测试模块,用于通过脚本语言和编解码规则对所要调用通信组件的API接口名和参数进行描述形成测试脚本,根据编解码规则将测试脚本生成测试消息发送给被测端,以及接收从被测端的服务器端测试模块返回的调用结果;所述被测端进一步包括服务器端测试模块,用于解析所述测试消息得到API接口名和参数,并通过根据所述API接口名和参数调用与所述API接口名对应的API接口函数实现对通信组件的调用,以及向测试端的客户端测试模块发送调用结果。
2.根据权利要求1所述的系统,其特征在于,所述脚本语言为树表结合标示语言TTCN、工具命令语言TCL或脚本描述语言Python。
3.根据权利要求1所述的系统,其特征在于,所述测试端的客户端测试模块和被测端的服务器端测试模块之间通过TCP/IP协议建立通信连接。
4.根据权利要求1所述的系统,其特征在于,所述脚本语言为TTCN,所述客户端测试模块进一步包括TTCN模块和TTCN适配器;其中,所述TTCN模块用于通过TTCN和编解码规则对所要调用通信组件的API接口名和参数进行描述形成测试脚本,以及将所述测试脚本传输给TTCN适配器;所述TTCN适配器用于根据编解码规则将所述测试脚本生成测试消息发送给被测端,以及接收从被测端返回的调用结果。
5.根据权利要求1至4中任意一项所述的系统,其特征在于,所述编解码规则为抽象符号描述语言ASN.1编解码规则。
6.根据权利要求1或4所述的系统,其特征在于,所述服务器端测试模块进一步包括消息解释器和API映射模块;其中,所述消息解释器用于从被测端接收的数据中解析出测试消息并传递给API映射模块,以及向测试端的客户端测试模块发送调用结果;所述API映射模块用于解析所述测试消息得到API接口名和参数,以及通过根据所述API接口名和参数调用与所述API接口名对应的API接口函数实现对通信组件的调用。
7.根据权利要求6所述的系统,其特征在于,所述API映射模块进一步包括函数注册表,用于保存API接口名及其对应的API接口函数地址;所述API映射模块进一步用于根据所述函数注册表获取与所述API接口名对应的API接口函数地址,以及通过将所述参数映射到所述API接口函数地址指示的内存空间调用所述API接口函数。
8.根据权利要求6所述的系统,其特征在于,所述API映射模块进一步包括数据缓冲区,用于存放所述参数。
9.一种远程调用通信组件的方法,其特征在于,该方法包括以下步骤A.测试端通过脚本语言和编解码规则描述所要调用通信组件的API接口名和参数形成测试脚本,并根据编解码规则将测试脚本生成测试消息发送给被测端;B.被测端解析所述测试消息,得到所述API接口名和参数;C.被测端通过根据所述API接口名和参数调用与所述API接口名对应的API接口函数实现对通信组件的调用,并向测试端发送调用结果。
10.根据权利要求9所述的方法,其特征在于,步骤A中所述脚本语言为TTCN、TCL或Python;和/或所述编解码规则为ASN.1编解码规则。
11.根据权利要求9所述的方法,其特征在于,预先在被测端保存API接口名与API接口函数地址的对应关系;步骤C中,所述被测端根据所述API接口名和参数调用与所述API接口名对应的API接口函数的步骤包括根据所保存的对应关系获取与所述API接口名对应的API接口函数地址;通过将所述参数映射到所述API接口函数地址指示的内存空间中调用所述API接口函数。
12.根据权利要求9所述的方法,其特征在于,步骤C中所述向测试端发送调用结果的步骤包括向测试端发送调用成功或失败的消息;和/或在调用成功且完成后,向测试端发送通信组件的返回值,并在存在输出参数的情况下向测试端发送所述输出参数。
全文摘要
本发明公开了一种远程调用通信组件的系统,该系统的测试端包括客户端测试模块,用于通过脚本语言和编解码规则对所要调用通信组件的API接口名和参数进行描述形成测试脚本,将测试脚本生成测试消息发送给被测端,以及接收从被测端返回的调用结果;被测端进一步包括服务器端测试模块,用于解析测试消息得到API接口名和参数,并通过根据所述API接口名和参数调用对应的API接口函数实现对通信组件的调用,以及向测试端发送调用结果。本发明还公开了一种远程调用通信组件的方法。本发明所提供的系统和方法具有简单易实现的优点,能够降低测试系统的开发成本,并且在修改测试数据的时候不需要重新编译,具有良好的可重用性。
文档编号H04L29/06GK1848774SQ20051006349
公开日2006年10月18日 申请日期2005年4月11日 优先权日2005年4月11日
发明者李金喜, 江火根 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1