潘磊 侯永涛 赵国瑞
中讯邮电咨询设计院有限公司 河南郑州450007
摘要:介绍了借助gSOAP开发工具,搭建通信机房中动环监控系统B接口协议测试工具的方法和常见问题。在B接口协议测试过程中,协议测试工具需要与监控单元进行通信,对监控单元指令反馈和主动上送数据进行解析和判断,从而验证监控单元的北向通信是否满足标准化要求。gSOAP工具功能独立,使用便捷,可以通过简单配置,完成B接口协议测试工具所需完整功能。功能包括接口服务的发布、服务调用响应以及下发指令,获取指令反馈等。同时,协议测试过程中的定制化的需求,都可以通过gSOAP工具进行配置来满足和解决。
关键词:gSOAP C++ ;动环监控;B接口协议;协议测试
1.概述
1.1.B接口通信协议
通信行业机房的动环监控系统中,监控中心(上位机)和监控单元(下位机)之间的通信协议,被称为B接口通信协议。各家通信运营商使用的B接口通信协议大多采用Web service技术来实现不同平台之间数据通信,即监控单元和监控中心均提供Web service接口服务。双方可互相调用对方发布的接口服务,实现双向通信[1]。
Web service服务,使用了“简单对象访问协议”(SOAP)和“可扩展标记化语言”(XML)两种技术[2],统一规范传输内容的格式,实现了在不同编程实现语言、不同操作系统之间完成数据共享或功能调用。其中,XML格式文本作为具体功能调用、数据传输的载体,需要按照SOAP通信协议的要求进行格式化封装。
经过SOAP协议封装后的报文内容,可以以HTTP协议为基础进行传输,也可基于其他如FTP、SMTP等传输协议完成协议报文的传输。在通信行业动环监控系统的B接口协议规范要求中,SOAP报文都是基于HTTP协议进行内容传输的,即在SOAP报文前需增加HTTP协议头部信息。并且,协议规范中说明,监控中心及监控单元发布的接口服务只包含一个方法,通过调用该方法传入不同内容的字符串来实现多种监控功能。
图1:动环监控B接口协议框架
图1中所示样例,表示了监控单元在调用接口服务时,所发送的协议内容框架。监控中心发布的接口服务中,仅提供一个名称为“invoke”的方法调用。由样例可见,监控单元调用接口服务,就是调用该invoke方法,并传入双方约定格式的字符串。监控单元每次调用接口时,字符串内容各有不同;监控中心对传入的不同内容字符串进行解析,识别请求,响应请求。在监控单元端,接口服务的配置相似,同样只发布了一个命名为“invoke”的可调用方法,调用方法时传入双方约定格式的字符串。最终,双方交互通信,可满足监控系统中数据上送、数据获取、设备遥控等多样化的功能需求。
上述双方约定格式的字符串,指的是企业制定的私有协议,也是动环监控B接口协议的主要组成部分[3]-[4]。B接口测试工具的主要业务逻辑,就是对私有协议部分进行验证。
1.2.gSOAP工具简介
gSOAP是一套开源的Web service接口服务实现工具。工具通过解析描述Web服务的WSDL文件,和XML文档元素描述文件(XML Schema),将文件中所描述的元素类型和接口定义转换为简单有效的C/C++代码,使得开发者在使用C/C++进行Web service应用程序开发时,将相关诸多规范要求交给gSOAP工具完成实现,而只需重点关注接口服务的业务逻辑即可[5]-[6]。
gSOAP工具使用编译技术自动、定制生成代码,提供了一套功能丰富,过程透明的接口实现方案。工具同时提供了wsdl2h和soapcpp2两个命令行界面工具,其中wsdl2h用于依照wsdl文件描述,生成.h头文件,将接口服务定义转换为C/C++描述;而soapcpp2工具通过读取前述头文件,可自动生成接口服务服务端的框架代码和客户端的桩代码,供应用程序使用。
gSOAP工具能够不依赖其他工具库独立运行使用,可快速的完成Web service客户端或服务端接口基本通信功能。该工具自2001年开始开发,随版本更替,包含功能愈加丰富和稳定。以工具支持的通信协议为例,可支持HTTP/S,TCP,UDP,HTTP1.0/1.1,IPV4,IPV6等多种常见协议。
2.协议测试工具
B接口协议测试工具借助gSOAP提供的功能,可以按照动环监控B接口协议要求模拟监控中心发布Web service接口服务,响应监控单元发送的服务调用;并实现Web service客户端功能,主动向监控单元发送报文。由此,协议测试工具可实现向监控单元下发指令,对监控单元指令反馈和主动上送数据进行解析和判断,从而验证监控单元的北向通信是否满足动环监控系统通信协议的标准化要求[7]。
接口说明wsdl文件是动环监控B接口协议的一部分,它对监控中心或监控单元开放的Web service接口进行了标准化格式的描述。gSOAP工具依据Web service接口描述,自动将调用接口服务、或响应接口调用所需功能进行了封装。接口协议相关所有配置信息,均保存在一个命名为“soap”的结构体中。如修改接口协议中SOAP协议绑定风格,http协议的keep-alive属性,服务端的端点地址等,均可以在soap结构体中配置对应属性完成设定。
gSOAP工具继承了wsdl文件中规定的命名空间,自动生成了soap结构体的代理类,并实现了多个代理类成员函数。使用这些成员函数,可实现建立连接、调用分发、调用响应、资源释放等所需所有功能。与soap结构体比较,使用代理类可以更加便捷的实现协议测试各项功能。
图2 B接口协议测试工具功能结构
在B接口协议测试工具的实现中,需包含服务端和客户端两部分功能代码;协议测试工具中,借助gSOAP分别对应生成了服务端代理类和客户端代理类,在下文中将使用SCServiceProxy和SUServiceProxy指代。
其中服务端功能,指的是协议测试工具模拟监控中心,监听监控单元发送的接口调用,并依据服务调用传入参数进行响应的功能。gSOAP工具依据接口描述wsdl文件,对应接口服务中规范的invoke方法,自动在服务端代理类SCServiceProxy中定义成员函数,用于实现服务端接口响应功能,下文中使用invoke函数指代该成员函数。invoke函数的参数与wsdl文件中定义的接口调用参数对应,gSOAP框架自动将调用Web service时传入参数,传递给该成员函数。
invoke函数在gSOAP自动生成代码中被定义为了纯虚函数,因此需要自行依据业务逻辑,完成该成员函数的实现。协议测试工具通过读取invoke方法调用时传入的字符串,接收由监控单元发送的SOAP协议报文;之后,测试工具按照B接口协议规范要求对字符串解析和判断,最终生成响应字符串,传递给invoke函数中的返回参数。后续生成SOAP协议报文,封装HTTP头、报文传输等工作都交由gSOAP框架自动完成。
为实现客户端部分功能,gSOAP工具同样生成了代理类,并同样在该代理类中定义了方法调用函数invoke。协议测试工具在实现客户端功能,模仿监控中心向监控单元下发指令时,直接调用该成员函数,传入字符串参数并接收响应字符串即可。之后B接口协议测试工具只需对监控单元指令反馈内容解析,判断其是否满足动环监控系统标准化要求。
3.常见问题
3.1.http头部信息
动环监控B接口协议规范要求使用SOAP基于HTTP协议完成通信。但是,在客户端代码中,若指定服务端终端地址的字符串描述中,不包含http描述字样,仅包含地址中的IP、端口信息时,gSOAP工具发出的通信请求中将省略HTTP头部信息,直接在TCP协议层上传输SOAP协议报文
图3:缺少http头部信息的报文结构
因此,在测试工具客户端代码中,配置服务端地址,也即监控单元端的端点地址时,需补充标准的http协议描述。
以监控单元IP地址为192.168.1.10,监听端口为8080为例。在测试工具客户端代码中,通过代理类对描述服务端配置信息的soap结构体进行初始化时,需编写代码:
SUServiceProxy.endpoint = “http://192.168.1.1:8080”
即可使测试工具按照B接口协议规范要求下发指令。
3.2.连接管理
生产环境中,监控中心长时间保持接口服务稳定运行,并满足大量监控单元断续接入的需求。监控单元会在必要时调用监控中心接口服务,完成监控数据的主动上送。监控单元作为客户端调用监控中心接口服务的频率不高。
因此,由监控中心在接口服务调用完成后,将自动关闭TCP连接,即通过短连接提供接口服务。gSOAP工具中通过对soap结构体的keep_alive属性配置切换服务端是否支持长连接,keep_alive属性默认为0,表示短连接。因此在默认配置中,B接口协议测试工具在响应监控单元接口调用后将立刻主动关闭连接。
同时为避免程序进程阻塞,还需借助gSOAP工具,在服务端代理类中进行配置
SCService.recv_timeout = 5;
配置服务端接受数据超时时间为5秒。表示在B接口测试工具在收到tcp连接申请,但5秒钟内没有收到内容时,测试工具作为服务端主动关闭连接。
另外,在客户端代理类中需配置:
SUService.recv_timeout = 5;
配置客户端接受数据超时时间为5秒。当B接口协议测试工具主动向监控单元建立连接并下发指令后,等待5秒没有收到指令反馈时,测试工具作为客户端主动关闭连接[8]。
3.3.服务保持
gSOAP工具的框架完成每次接口调用时,会返回错误码。错误码保存在服务器端代理类SCService的成员变量error中。错误码可描述TCP连接错误,超时错误,SOAP协议方法调用错误等多种原因产生的错误。
测试中发现,部分参与测试的监控单元在发送数据之前,会对网络连接进行试验性的连接申请,在建立TCP连接后,仅验证监控单元与监控中心之间的连接正常后随即关闭连接,并不发送任何数据。此时,gSOAP工具在接收到TCP连接后,进行服务分发处理时,由于没有收到任何SOAP协议内容,会在调用服务后返回SOAP_EOF错误码。SOAP_EOF常表示协议报文内容尚不完整时,传输过程就结束了。报文内容为空时,接口服务调用同样会返回SOAP_EOF错误码。
在出现上述SOAP_EOF错误时,B接口协议测试工具应继续保持接口服务的发布,等待监控单元发送监控数据;而当出现TCP连接错误时,例如端口被其他进程占用时,会导致接口服务启动失败;此时需要关闭监听服务,追溯并解决问题后才能重新启动服务。因此,在协议测试工具中需要将HTTP协议、SOAP协议应用层协议错误与TCP传输层错误进行区分,保证测试工具在不同情况下执行不同的功能流程。
while (SCService.run(port))
{
if (SCService.error == SOAP_TCP_ERROR)
{
//TCP错误表示需要中断接口服务
//输出错误信息
//通过break跳出while循环,结束服务
break;
}
}
上述代码中,代理类SCService的Run函数将完成端口调用,实现接口服务监听功能。函数返回值是上文提到的服务调用错误码;服务调用正常返回时,错误码为0。
当程序判断函数返回错误码表示TCP协议出现错误时,程序将输出错误信息,结束接口服务的发布。当错误码为SOAP_EOF时,程序判断可继续调用run函数,避免服务中断,持续监听接口调用请求。由此,监控单元可随时进行连接测试,提升了B接口测试工具的适用性。
4.结论
文中描述的B接口协议测试工具的全部功能,都基于gSOAP版本2.8.40完成了开发实现,并通过将测试工具与实际监控单元设备连接,完成协议测试工作,验证了基于开发gSOAP的B接口测试工具的可行性。gSOAP作为一款开源、轻量的,用于实现Web service接口应用的工具包,提供了功能全面、稳定的实现方式,可满足完成B接口测试的所有需求。
gSOAP工具自动生成的C++语言风格的代理类,与采用MFC编写实现的B接口测试工具十分契合。同时,综合前文所述,使用代理类可以便捷快速的完成传输层、应用层各类设定,满足B接口测试工具在连接管理、服务保持等方面的定制化需求,可以进一步提升测试工具的仿真程度及鲁棒性。
gSOAP还可以通过设定相关参数或加载相应插件,支持JSON解析工具,WS-Security协议传输,REST风格接口服务等多种特性,以应对动环B接口协议将来不断演进过程中出现的新需求。
参考文献:
[1]王童. 动力环境集中监控系统的发展[J]. 信息记录材料, 2018, 019(008):87-89.
[2]吕曦, 王化文. Web Service的架构与协议[J]. 计算机应用, 2002(12):64-67.
[3]吴建勇. 省级动环监控中心CSC的实际应用[J]. 电信工程技术与标准化, 2006, 019(006):65-68.
[4]高翠群.动力环境监控系统的消息传输协议设计研究[J].软件工程师,2010(7):53-54.
[5]燕思嘉. 基于gSOAP的物联网异构数据交换技术的研究[J]. 信息技术, 2013, 000(007):187-189.
[6]宗起振, 王丹丹, 赵琴. 基于GSOAP的状态监测设备系统设计与实现[J]. 软件导刊, 2016, 015(001):73-75.
[7]陈圆, 粟欣. 动环监控系统中B接口的实现[J]. 电子产品世界, 2017(08):62-65.
[8]User guide[EB/OL]. https://www.genivia.com/doc/guide/html/index.html.
作者简介:
潘磊,工程师,主要从事通信电源技术研究,通信机房动环监控技术研究、技术咨询等工作。
侯永涛,高级工程师,主要从事通信电源技术研究、节能技术研究、标准制定、技术咨询等工作。
赵国瑞,高级工程师,主要从事通信电源技术研究、节能技术研究、技术咨询等工作。