引 言
嵌入式Internet是近几年随着嵌入式系统的广泛应用和计算机网络技术的发展而兴起的一项技术。嵌入式系统凭借其以应用为中心、以计算机技术为基础、软件硬件可裁剪的特点,赢得了巨大的市场,在应用数量上远远超过了各种通用计算机。随着Internet的发展,各种设备都产生了连接性的需求,从冰箱到电表,似乎所有电器都需要连入因特网。通过为现有嵌入式系统增加因特网接入能力来扩展其功能,以Internet为介质实现信息交互的过程,这就产生了嵌入式Intefnet技术。
当前,在诸多的嵌入式操作系统上开发应用的模式与传统的桌面应用开发方式相差无几,基本上采用强类型的系统编程语言(如C、Java)及其相应的开发模式来进行。随着嵌入式设备特别是移动设备的逐渐普及,这些设备上的应用需求量远远大于桌面应用的需求量,应用的变化速度也相当惊人。传统模式的开发周期长的弱点就暴露了出来,因此在应用开发中应引入新的开发模式以适应新形势的发展。
但是在家电高度智能化的今天,仅仅对传统的计算机进行软件集成是不够的,还必须考虑到各种嵌入式设备。如何让各种手机、PDA使用原先只有传统计算机才能实现的服务,如何将电视机、微波炉等家电无缝集成到分布式系统中而不再需要驱动,这些都对计算机软件体系提出了新的挑战。本文利用“和欣”嵌入式操作系统的WEBSERVICE构件解决了上述问题。
1 和欣嵌入式操作系统和CAR构件技术
1.1 和欣嵌入式操作系统
“和欣”嵌入式操作系统是一个我国完全自主研发、完全自主知识产权的国际先进的嵌入式操作系统,在国内是最适合嵌入式设备搭建而向服务软件结构基础的嵌入式操作系统。
“和欣”嵌入式操作系统是一个基于构件化软件模型的系统,构件化软件设计思想贯穿于整个系统的设计与实现中。系统实现本身就是构件模式,除内核中最底层的控制部分外,所有系统功能都是以构件接口形式提供的。另外,操作系统为构件化软件模型提供了必要的运行环境,来源不同的构件可以在该环境上实现互操作。系统提供了构件自动寻址/自动加载机制,用户不必知道调用的构件程序是本地的还是来自子网上。也就是说,构件运行环境可以对用户透明,构件化系统的实现,使得操作系统本身具有高度的灵活性和扩展性。“和欣”采用的构件技术是CAR技术。
1.2 CAR构件技术
CAR(Component Application Run-Time)是一个国内自主知识产权的构件系统,是由上海科泰世纪科技有限公司开发的新一代的构件系统。其主要特点是从操作系统层面上引入“构件”的概念,所有的服务都由构件来提供,从而实现软件的目标代码级的重用。CAR是新一代的构件系统,为网络编程和网络服务提供了强大的支持。同时,CAR是一个面向构件的编程模型,它表现为一组编程规范,包括构件、类、对象、接口等定义与访问构件对象的规定。
2 在“和欣”上实现WEB SERVICE组件
2.1 “和欣”WEB SERVICE组件总体架构
“和欣”WEB SERVICE组件主要由以下几部分组成:XML解析器(此处仅实现了1个DOM解析器),1个基于XML解析器的SOAP文档解析器,1个基于XML解析器的WSDL文档解析器和生成器,1个CGI(作为HTTP服务器)以及1个基于XML解析器的WEB SERVICE配置文档解析器。总体上WEB SERVICE提供的组件如图l所示。
整个组件的主程序就是一个CGI的HTTP服务器,在启动时就调用配置文件解析器。配置文件是一个XML文档,用于配置和发布WEB SERVICE方法,包括HTTP服务的端口号,系统中的WEB SERVICE方法(将是一些CAR组件)及其调用方式和输入/输出参数等。之后就把这些内容存放在内存中,对配置的SOCKET端口进行侦听,等待HTTP请求。HTTP服务器接收的HTTP WEBSERVICE请求包括HTTP GET/POST和SOAP两种,服务器接收到SOAP请求之后就通过SOAP解析器进行解析,确定调用的是哪个WEB SERVICE方法,找到后就调用相应的CAR组件,并输入参数;用SOAP解析器将得到的结果包装成一个结果SOAP文档,然后从原端口返回给客户。
这里只提供了简单的SOAP接口解析,要进行客户端编程时可以使用;而且“和欣”嵌入式操作系统上已有标准浏览器,只需要改动部分代码,即可直接使用。
以下就仔细介绍各部分的实现和提供的API。
2.2 XML解析器
选定DOM解析器实现,暂时不提供SAX接口。因为在嵌入式系统上提供的WEB SERVICE文档通常不大,所以采用DOM不会出现效率问题。
“和欣”DOM API的实现参照了W3上的DOM规范,由于是嵌入式系统的关系,对W3的开源代码xercesc接口进行了裁剪和变更。
另外在编写DOM接口之前,参照MFC的String类编写了一个简单的String类,包含最基本的字符串操作。其中字符串全部使用UTF-8存储,具体函数参照MFC的String类,这里不在赘述。
“和欣”DOM API的主要“类”包括:
①Decument类。Document对象代表了整个XML的文档。所有其他的Node,都以一定的顺序包含在Docu-ment对象之内,排列成一个树形的结构。
②Node类。Node对象是DOM结构中最为基本的对象,代表了文档树中的一个抽象节点。在实际使用时,很少会真正地用到Node对象,而是使用诸如Element、Attr、Text等Node对象的子对象来操作文档。Node对象为这些对象提供了一个抽象的、公共的根。虽然在Node对象中定义了对其子节点进行存取的方法,但是有一些Node子对象(如Text对象)并不存在子节点,这一点是要注意的。
③NodeList类。NodeList类,顾名思义,就是代表了一个包含了一个或者多个Node的列表。可以简单地把它看作一个Nodc的数组,仅仅是为了方便Node中的某些函数使用。
④Element类。Element类代表的是XML文档中的标签元素,继承于Node,也是Node最主要的子类。在标签中可以包含有属性,因而Element对象中有存取其属性的方法,而任何Node中定义的方法,也可以用在Element对象上。
⑤Attr类。Attr类代表了某个标签中的属性,继承于Node。
这是一个简化的DOM解析器,大大降低了代码的复杂度。由于在嵌入式设备中存储空间甚至比内存都宝贵,所以XML文件不会很大,虽然有一些在大XML文件中会降低效率的修改,但是在实际使用中不会有影响。
2.3 SOAP解析器
拥有了DOM解析器,可以方便地构造一个SOAP解析器,用来解析SOAP文件,得到客户端的SOAP请求以及解析得到SOAP中的结果。同时,也可以把结果数据包装成SOAP文件,返回给服务器端。
“和欣”SOAP API的主要“类”包括:
①Soapheader类。Soapheader类继承自Doeunaent类,Decument类的方法它都可以使用。Soapheader类主要是处理Actor和MustUnderstand两个属性。
②Soapbody类。Soapbodyr类继承自Document类。它的处理比较复杂,暂时直接使用Document类的方法,只有一个产生错误SCIAP的方法。
③Soapclass类。Soapclass类继承自Document类,Document类的方法它都可以使用;另外它利用Soapheader和Soapbody类做一些额外的操作以降低代码复杂度(Soapbody类现在还没什么用)。Soapclass类有一些包装用的函数,以降低编程复杂度。
2.4 WEB SERVICE部署文件
前面已经说过,WEB SERVICE方法由CAR组件的形式编写。那么如何让HTTP服务器找到并且动态装载这些WEB SERVICE方法,如何确定输入/输出参数,HTTP服务器又将运行在什么端口上呢?这些都需要人为进行配置。所以定义一个WEB SERVICE的部署文件,以便在“和欣”上配置WEB SERVICE。WEB SERVICE部署文件的结构如下:
其中:domainname是指本机的域名;seTvicesocket则是指HTTP CGI在哪个端口进行侦听,启动服务时会首先检查这一项,默认为80。可以存在多个<soapaction>,每一个对应一个相应的WEB SERVICE方法;属性uri是相对路径,加上服务器的IP或者足域名可以组成整个URL。dllname是指相应的CAR编译成的DLL的名字,这样HTTP CGI解析到相应的WEB SERVICE方法,就可以直接装载褶应的DLL。但是注意DLL一定要注册过,才能被程序正确加载。如果这个函数是一个类的成员函数,那么这个类的名称必须在<classname>中指出。<function>就是要调用的CAR的方法。<uuid>是这种方法的UUID,供以后扩展时使用。后面的<Params>表示这个函数有几个参数,后面的3个参数表示变量名(在实际调用中投有什么用)、变量类型以及变量是输入还是输出,由于CAR接口的函数返回值都是HRESULT,所以没有返同值的设置。
2.5 WSDL组件
UDDI和WSDL是WEB SERVICE系列协议的精华部分,正是由于这两个协议的出现,才可以由程序动态地使用别人发布的WEB SERVICE方法。但是现在UDDI还没有和DNS一样普及起来,所以在“和欣”WEB SERVICE中的处理方法,设置一个GETWSDL的WEB SERVICE方法。这种方法的作用就是根据配置文件生成在此机器上提供的WSDL文件,并且返回给请求的客户端。这样客户端程序就可以根据WSDL来查找相应的方法。
2.6 HTTP服务器
这个部件其实是在整个“和欣”WEB SERVICE组件中的主程序部分,启动分析配置文件、监听网络端口,分析HTTP请求.动态调用CAR DLL中的函数,调用SDAP和DOM组件把结果包装成SOAP返回客户端,都是此部件的功能。首先简单介绍一下“和欣”网络编程接口(e1asock API)
“和欣”提供了一组套接口函数用于网络编程,统称为elasock API。与wlnsock一样,“和欣”的elasock也是从BSD socket发展而来的。elasock APl可以实现基本的网络通信功能,具体用法参见每个函数的文档。elasock与Wiosock基本兼容。“和欣”提供的elasock的错误代码与winsock有些不同。
有了elasock API和上述开发的部件,利用“和欣”CAR技术可以构造此部件。此部件的运行流程如图2所示。
首先启动主函数,分析部署文件有哪些WEB SERVICE方法,再找出监听端口,监听HTTP请求。此请求包括直接的HTTP GET/POST方式的请求和SOAP方式的请求。如果检测到合法的请求,就到解析过的部署文件中去寻找相应的WEB SERVICE方法;如果没有找到或者出了其他问题,就返回一个SOAP错误给客户端。
如果一切正常,就到解析过的部署文件巾寻找相应的CAR方法,动态加载,运行相应的函数,得到结果,并且把结果包装成SOAP协议,返回给客户端。主程序在一个循环内一直监听此端口,直到程序关闭。
3 总结与展望
本文利用“和欣”嵌入式操作系统的SDK和CAR原理,构造了一个XML和WEB SERVICE组件。通过这个组件,可以开发一个CAR作为WEB SERVICE方法,再在WEB SERVICE部署文件中配置此CAR,就可以简单地在WEB SERVICE组件中发布此方法。
“和欣”嵌入式操作系统现在可以运行在x86、ARM等CPU上,且科泰世纪同济大学基础软件中心的其他同事已经针对数字电视和对智能手机实现了“和欣”嵌入式操作系统的裁剪,使“和欣”嵌入式操作系统能够顺利地运行在数字电视和手机上。所以可以简单地把写好的CAR作为WEB SERVICE方法发布在经过裁剪的“和欣”嵌入式操作系统上,就可以使得数字电视和智能手机拥有直接提供XML based WEB SERVICE的方法。在不久的将来,随着我国信息化进程的加快,很快就会有大量的内嵌“和欣”、使用WEB SERVICE的智能电器出现,并且深入我国生产和生活的方方面面,为提高生产力、提高人民生活水平起到极大的推动作用。