引言
远程信息监测系统是通过网络远程收集目标信息并监控目标对象运行状态的嵌入式系统。远程信息监测系统中嵌入式Web服务器的使用,可以使用户通过浏览器访问远端的嵌入式设备,这样能够大大提高系统的易用性和可维护性。目前,在远程监测系统中普遍采用的实时数据采集方法是在网页上嵌入Applet或ActiveX控件,但是这种方法不仅会威胁到客户端的安全,还增加了服务器的负担,从而限制了Web服务器的实现和应用。为了满足资源有限的嵌入式系统的需要,本文采用微型TCP/IP协议栈uIP,在协议栈之上设计实现了基于CGI的动态Web服务器,并将AJAX技术应用到客户端与服务器的实时数据交互中。AJAX技术的实现是将JavaScript程序内嵌在网页中,不需要在浏览器上另外安装插件,降低了系统成本和Web服务器实现的难度。
1 uIP协议栈分析
uIP是专为8/16位嵌入式微处理器设计的轻量级TCP/IP协议栈。uIP本身的源代码和占用的内存资源都非常少,其源代码只有几KB,RAM仅占几百字节。uIP采用BSD授权,遵循RFC标准,完全由C语言编写,具有良好的可移植性,可免费用于非商业和商业用途。uIP协议栈有多个版本,本设计采用的是uIP 1.0。
为了减少对系统资源的要求,uIP的内部实现主要采用以下设计措施:
①不支持动态内存分配机制,使用单一的全局缓冲区uip_buf收发网络数据;
②着重实现了与完整TCP/IP通信所必需的ARP(地址解析协议)、IP(网际互联协议)、TCP(传输控制协议),而UDP(用户数据包协议)、ICM P(网络控制报文协议)只作为可选模块;
③各层协议紧密耦合,应用协议也参与了部分协议栈功能的实现。
uIP的体系结构如图1所示。由图1可以看出,uIP协议栈处于网络通信的中间层,用户需要为uIP提供底层网卡驱动程序和定时器驱动程序。
而uIP为底层系统提供了4个接口函数:uip_init()完成协议栈的初始化;uip_input()用于处理从以太网接收到的IP数据包;uip_perio dic()用于协议内核周期性地对各TCP连接的轮询;uip_udp_periodic()则用于UDP服务下对各UDP连接的轮询。其中,uip_input()和uip_per iodic()在协议的内部采用同一个函数void uip_process(u8_t flag)实现,区别在于调用的参数不同。uIP主程序清晰地展示了各接口函数的调用方法,其主程序流程图如图2所示。
uIP的各处理程序会调用UIP_APPCALL()进行应用程序处理,用户需要将UIP_APPCALL宏定义为实际的应用函数名,应用程序就可以挂接到uIP中,而uip_flags是协议栈提供给应用层查询的状态变量。
2 动态Web服务器的实现
在uIP中已经提供了webserver的应用实例,用户可以参考它并根据自己的需求进行设计。为了实现浏览器与服务器之间的交互性,本文采用了CGI动态Web技术。CGI(Common Gateway Interface)是Web服务器与外部扩展应用程序交互的一种标准接口。目前,服务器端的动态Web技术除CGI外,还有ASP、PHP、JSP等解决方案,但它们或者是针对某种语言的,或者是依赖于特定的操作系统或商业软件,只有CGI技术适用于资源有限、编程语言受限的嵌入式Web服务器。设计的Web服务器的结构如图3所示。
在系统初始化后Web服务器开始监听80端口,一旦有客户端请求连接,uIP就为其分配一个连接项。服务器在收到HTTP请求后,首先依据请求文件的类型来判断该请求是动态请求还是静态请求,如果请求的是HTML类型的文件则为静态请求;如果请求的是shtml类型的则为动态请求。
对于静态请求,服务器会直接查询其文件系统是否存在该网页,如果存在就响应客户端的请求;如果不存在就响应404请求错误网页。为了减少存储资源的使用,uIP没有一般的文件系统,而是将所有静态网页存储为常量数组,并将这些数组串联成一个文件链表,采用轮询的方式按照网页名称进行查询。
如果请求的是动态网页,服务器会调用CGI服务程序,CGI程序首先会根据HTTP请求参数调用相应的应用程序,生成动态数据,而后转化为动态网页,由服务器端发往客户端。CGI程序的处理流程如图4所示。
3 AJAX脚本
AJAX技术与其他Web技术相比,主要有以下特点:
①把服务器的一部分工作转移到客户端,利用客户端的处理能力,减轻了服务器的负担;
②主要依靠XMLHttpRequest对象实现异步通信机制,避免数据更新时整个网页的刷新,降低了通信量,节约了网络带宽;
③适当的AJAX技术应用可以实现更好的用户体验。
AJAX技术的以上特点非常适合在资源有限的嵌入式系统中应用。浏览器解析AJAX脚本并运行,而服务器则会将浏览器请求的动态数据按照数据流的方式发送到客户端,其实际运行时的通信数据如图5所示。
在笔者设计的动态网页中,异步交互部分的JavaScript代码如下:
结语
笔者将本文的设计应用到油井电机参数的远程监控中,现场实验结果表明,整个监控过程运行流畅、部署方便、复用度高。用户的监控页面如图6所示。
本文在uIP协议栈上实现了基于AJAX和CGI的动态Web服务器,该方法实现的嵌入式Web服务器可以提供静态信息的浏览,也可以通过AJAX技术异步访问服务器上的动态数据。AJAX的使用大大减少了服务器的开销,节省CGI的处理时间。基于AJAX和CGI技术的嵌入式Web服务器非常符合嵌入式系统开发过程中低成本、高可用性的要求,对于在中低端平台上实现嵌入式Web服务器的远程信息监测系统有较高的实用价值。