嵌入式环境下Web Service技术的实现
技术 实现 Service Web 环境 嵌入式 相关文章:
2.2.2 XML解析
SOAP消息是由XML语言组成的,因此对XML的解析是处理SOAP消息的一个重点。当今有2种流行的XML解析API,它们是DOM(Document Obj ect Model)和SAX(Simple API for XML),尽管这两种方法都能用来解析XML数据,但相互间却有很多本质的不同:DOM一次性把整个XML文档读入内存并建立完整的树结构,而SAX则基于事件驱动模型,一次只读取一个XML元素,每当遇到一个读取事件时就会触发一个事件处理器。两种方法各有优缺点:DOM在处理单个元素之前必须把其他所有的元素都读入内存建立树结构,这既费时间又费内存,在这方面SAX的性能
更为优异,但DOM一旦建立树结构之后,就可以方便地处理文档中的任意元素,因为整个XML结构都在内存里,而SAX则必须从头逐个解析XML文档每一个元素,直到需要的那个元素。
考虑到SOAP消息的解析是一次性的过程,不需要进行元素的随机访问,而且嵌入式环境下资源有限,为此采用SAX做为XML的解析方式。定义以下结构体用来存储节点结构。
另外建立一个列表用来存储XML文档中声明的命名空间,避免XML文档里的元素名或属性名相互之间可能会发生的语义冲突。在XML文档的解析过程中,保留当前节点及其父节点的结构体,除此之外的节点在读取完毕后立即释放其占用的资源,必要时还可以关闭对节点属性的解析,进一步降低内存消耗。当遇到新的读取事件时(节点开始、节点结束、发现节点值),将此次事件的相关信息作为参数传入回调函数,在回调函数中对节点信息进行处理:
2.2.3 具体服务实现
为了方便查找服务,程序里将所有支持的服务函数的名称以及对应的命名空间预先保存在一个列表中。当进入XML解析的回调函数后,根据XML节点的节点名称以及命名空间,首先试图从列表中搜索本次SOAP消息所请求的服务,如果所请求的服务函数存在,则将XML节点信息传入该服务函数对应的初始化函数,完成对服务函数的参数列表的初始化,为之后的服务函数执行做好准备。图3给出了该过程的程序框图。XML解析完毕后退出XML解析器,此时服务函数也已经完成初始化,直接调用服务函数的执行部分,并将结果打包成SOAP格式发送回客户端。鉴于动态生成XML文档需要耗费较多的资源,程序中为每个服务函数预存了一个模板,模板中已经定义好了回复消息的整体结构,仅需在服务函数被实际调用后往模板中填入结果即可,另外可以在发送回复消息的过程中复用之前的接收缓冲区,这样一来同时节省了处理时间和资源消耗。
2.3 性能测试
由于Web Service函数是被其他程序调用的,一般不会提供界面让用户或测试人员直接使用,这造成了测试上的困难。由eviware公司推出的Web Service测试软件soapUI极大的改变了这一局面,在soapUI中通过简单的操作即可完成复杂的测试,不需要了解底层的通讯细节,大大减轻了工作量。为了测试系统的性能,将STM32F107VC接入局域网之中,并开启A/D采样,客户端通过Web Service函数ReadValue获取指定通道的A/D采样值(最大值、最小值、平均值)。SOAP消息的具体请求和响应示例如下:
在soapUI中模拟多个用户线程对系统进行90 min的压力测试,每个线程每次的请求间隔随机分布在0.5~1 s之间,图4给出了10个用户线程下系统的平均响应时间曲线,其中横轴表示经过的时间(单位:s),纵轴表示线程个数以及SOAP请求平均响应时间(单位:ms)。由于系统同一时间只处理一个SOAP请求,当多个用户线程同时连接时,未处理的请求会被排队,其处理时间也会相应延长。受网络环境变化和连接并发情况的影响,平均响应时间会出现波动,在10个线程的情况下平均响应时间介于30~50 ms之间,整个系统保持稳定,没有内存泄露或者连接丢失现象发生。
本文基于32位微处理器ARM Cortex-M3以及小型实时操作系统FreeRTOS,在资源极其受限的情况下完成了XML语言的解析以及SOAP和HTTP协议的绑定,实现了不易实现的嵌入式Web Service技术。XML语言强大的表达能力和SOAP协议的灵活性,有效地解决了嵌入式设备与异构平台间的信息交换问题,大大降低了系统集成的难度。随着网络化思想的进一步深入以及硬件成本的逐步下降,面向服务的编程思想所代表的新一代软件架构技术会逐渐渗透到越来越多的嵌入式系统当中。