论文部分内容阅读
摘 要:针对嵌入式系统资源有限、应用定制的特点,提出一种经裁减的轻量级TCP/IP协议的设计思想,经过协议的分析与裁减、功能模块的划分与具体实施,实现了一个为嵌入式系统量身定制的通信协议,并把协议集成在一个实际的嵌入式WEB服务器系统中。实践表明方案灵活高效、占用资源少、扩展性和移植性好。
关键词:嵌入式系统;Web Server;轻量级 TCP/IP协议
中图分类号:TP393文献标识码:A
Design and Realization of A lightweight Embedded Web Server
WU Tao
(computer science Department of Lishui University,Zhejiang Lishui 323000)
Key words: embedded system;Web Server;lightweight TCP/IP protocol
嵌入式Internet技术是嵌入式技术和网络通信技术紧密结合的产物。它使互联网延伸到各种各样的嵌入式设备。具有广阔的应用前景和巨大的市场潜力。嵌入式Internet技术的实现方案很多,大致可分为以下四种[1]:
(1)处理器+专用网络芯片方式。这种方式采用独立的专用网络接口芯片实现网络功能,通过网关与Internet相连。典型的产品有E1552、Webchip等。图1方式(1)为专用芯片Webchip实现的网络接入方案。这种方案的优点是不必考虑网络协议,只需要解释并执行网络芯片传送过来的指令和数据就可以实现与Internet连接。缺点是只能在低性能处理器中使用,而且需要一台微机作为通信的网关。
(2)“EMIT技术”方式[2]。该技术由emWare公司开发,这种系统由emNet和emGateway两部分组成,emNet是运行在处理器内部,实现嵌入式系统和其他网络(如RS485等)连接的网络协议。emGateway(嵌入式微控制器网关)运行在外部设备(PC机等),它是实现与Internet连接的桥梁。图1方式(2)所示。这种方式应用广泛,适合于高性能的处理器。缺点是开发人员必须熟悉emNet协议和相关的接口,处理器处理emNet协议要占用一定的资源,同时需要计算机做通信网关。
(3)“固化TCP/IP协议硬件芯片”方式。典型产品有沈阳东大公司的Webit。公司对产品的定义为:“Webit是一个微型Web服务器,它可以有自己的IP地址,传统的电器设备通过它可以直接连接到Internet,这样人们即便在千万里之外,也可以轻易地通过Internet控制各种电器设备”[3]。解决方案图1方式(3)所示。网络协议芯片把协议处理部分独立出来,使得开发人员省去了网络部分的工作,可把主要精力集中在应用系统本身上。但是从总体上看,它还是一个基于AVR单片机的系统,资源有限,不利于扩展。
(4)嵌入式操作系统方式。这是目前应用最广泛的嵌入式Internet接入方式。处理器一般为高性能的ARM系列、Xscale系列等。系统都有一个集成了完整TCP/IP协议的操作系统。在嵌入式操作系统上实现各类服务或应用程序。这种方式的优点是开发方便、快捷。缺点是操作系统和TCP/IP协议都很庞大,要占用许多嵌入式系统资源,实时性不好。
从上述分析可知,前三种网络接入方式主要针对单片机系统,使用场合受限。第四种方案从开发模式、操作系统以及TCP/IP协议都借鉴了桌面系统,同样不太适合嵌入式系统的特点和开发条件。为此,本文提出了一种轻量级TCP/IP协议的设计思想。
1 轻量级Internet网络接入设计
1.1轻量级TCP/IP协议设计思想
嵌入式Internet应用系统的特点是资源有限、应用定制。而传统的TCP/IP通信协议庞大臃肿,消耗大量的系统资源。本文的设计思想是:针对嵌入式设备的具体特点,对TCP/IP协议进行裁减:使之成为紧凑的、轻便的,同时又是模块化的、高效的和易于移植的轻量级TCP/IP协议。用模块化的设计方法加以实现,集成到具体的应用系统中。
本设计思想的实现方法是:(1)以"够用"为原则。对TCP/IP协议的进行裁减,去掉系统用不到的协议,同时对系统用到的协议也作适当简化。变庞大臃肿为紧凑轻巧。(2)模块化实现。把TCP/IP协议分成不同的模块实现,达到高效而又易于移植。(3)协议模块直接集成到一个无操作系统的应用程序中,实现嵌入式设备的Internet连接。(4)协议实现原则:一是高效(占用尽可能少的存储器和处理器时间),二是非阻塞(防止程序进入死锁)[4]。
这是一种轻量级的TCP/IP协议在嵌入式设备"裸机"上直接实现的网络接入方案。特点是协议体积小、性能高、使用灵活、组件复用性强。不足之处在于系统结构复杂,开发周期长;同时协议与实际应用系统集成时,需要解决一些技术细节。
1.2基于轻量级TCP/IP协议的嵌入式WEB服务器系统
基于上述设计思想。我们开发一个轻量级TCP/IP协议的嵌入式WEB服务器系统:某医院重症监护区(ICU)实时监护监控系统。该系统对重症病人单一生命体征实施24小时不间断、无人值守监控,同时实现设备远程操作和应急报警等。监护参数有:心电(ECG)、血压(NIBP)、体温(TEMP)、血氧饱和度(SPO2)等。监护数据和设备控制信号通过接口电路进入嵌入式系统,嵌入式设备通过网线接入医院的局域网。供相关人员随时查询,远程指导以及应急处理等。
针对实际系统,以“够用”为原则对TCP/IP协议进行裁减。具体实现如表1所示。系统接入层协议只保留以太网接入模块和ARP模块。传输层只保留TCP模块。应用层使用HTTP协议,WEB服务器中的业务处理包括各种实时信息的处理,由专门的程序实现。
1.3软硬件系统的选择和确定
硬件系统:目前设计和生产嵌入式系统的芯片公司很多。考虑到开发团队对芯片的熟悉程度、硬件的通用性和成本等因素,本系统采用Samsung 公司的S3C44B0X微处理器,芯片使用ARM7TDMI核,集成了许多部件。性价比高、通用性好。重症监护区(ICU)监控信号和对外控制信号都从GPIO接口接入。
软件平台:系统是从“零”开始,在硬件“裸机”上直接开发的,因此软件开发平台的选择至关重要。在比较了各种集成开发环境(IDE)后,确定使用IAR Embedded Workbench的嵌入式开发平台。平台包含了C/C++编译器、调试器的IDE、起步套件、硬件调试探示器和状态机设计等工具。能在同一平台上实现编辑、编译、调试以及直接编译成二进制文件。从网络接入层的驱动到应用程序功能的实现都可以在这个集成开发环境中完成。下载最终编译成的二进制文件到硬件系统的工具采用Philips公司的Flash软件。网络调试和测试时还用到网络协议分析器(Wireshark)和网络包捕获器(WinPcap)等工具。
2 轻量级嵌入式系统的实现
2.1底层的协议实现
2.1.1以太网引擎集成芯片接口
系统的以太网控制器为Cirrus Logic公司的CS8900A芯片。芯片与S3C44B0X处理器实际的连接线有:IOW(写信号线)、IOR(读信号线)、4条地址线(XA)和16条数据线等。网络集成芯片工作在S3C44B0的Bank2上。
2.1.2以太网协议层的再次分层实现
以太网接口层是网络的实际连接层,底层要对网络集成芯片端口和寄存器读写访问,高层要实现对网络层数据包的收、发处理。调用关系复杂。采用再次"分层"的方法不仅明晰了各函数调用的关系,而且利于实现。如图2为各子层之间调用的关系图。在Ethernet.c文件中实现。对芯片的I/O口、内部寄存器、状态寄存器定义后。使用汇编函数NIC_read_port()和NIC_writer_port()分别实现读写I/O端口;NIC_read_reg()为读寄存器函数,NIC_writer_reg()为写寄存器函数;Frame_get()负责拆分以太帧。Frame_send()把上层的数据打包成以太帧。再上面一层就是提供给IP层访问的接口层了,IP层调用Ethernet_poll()轮询状态信息,当接收了以太帧后由frame_process() 处理。当IP层发送数据包时,调用ethernet_send()函数。
系统加电时,调用相应初始化函数。先对芯片I/O引脚的方向和相应的内部寄存器初始化。再加载或初始化以下的状态参数:1)指定数据包大小和帧头长度。2)确定接收、发送数据缓冲区大小,3)网络参数的初始化,包括IP地址、子网掩码地址、物理地址,网关等。4)以太网帧头结构定义。5)网络字节序列与处理器字符序的转换宏定义。6)其它模块的常量和外部变量等。一旦初始化完成。系统调用Ethernet_poll()自动轮询函数。进入正常的运行状态。
2.1.3ARP协议和IP协议的实现
ARP(地址解析)协议实现网络中的IP地址与物理地址的对应。使用结构体描述这一映射表。struct arp_entry { char proaddr[4]; //IP地址
char hwaddr[6];//物理地址
char state;//状态
unsigned short tout; //超时
charretries; // 重试
unsigned shortqueries; //被请求的次数 };
模块实现的主要功能:(1)初始化ARP表。(2)处理进入的ARP报文。(3)解析IP地址。(4)维护ARP表。(5)实现显示ARP表。
IP协议层主要功能是根据IP数据报头拆分或封装IP数据报。当下一层传来的数据包时,函数ip_process()对数据拆分,供上一层调用。待发送的数据,由ip_send()打包通过调用底层函数把数据包发送出去。标准的IP数据报头的结构体如下:
struct ip_hdr {char verhl;// IP协议版本号和头长
char tos; // 服务类型
unsigned short len; // 总长度
unsigned short id;// 标识号
unsigned short fragment; // 标志和字段偏移量
char ttl; // 生存时间
char protocol;// 协议
unsigned short chksum;// IP 头部检验和
char srcipaddr[4];// 源IP地址
char destipaddr[4];// 目标IP地址};
开发和使用过程中,需要对网络进行调试和测试。本层还实现ICMP协议的功能。以实现简单的显示请求服务(ping命令)。
2.2高层协议的实现
2.2.1面向连接的套接字的实现
TCP是一个基于套接字的面向连接的协议。系统中引用运输控制块(TCB)保持每个TCP连接和套接字的状态[5],TCB由一个表结构体组成,每个条目对应一个套接字字段:TCB表的结构和字段说明以下:
struct tcb { charstate;//状态
unsigned short local_port;//本地端口号
char remote_ip[4];//远程IP地址
unsigned short remote_port; //远程端口号
unsigned short remote_mss; // 远程最大数据报长度
char flags;//标志
unsigned int snduna; //程的外部标识符
unsigned intsndnxt;unsigned short sndwnd;
unsigned int rcvnxt; unsigned short rcvwnd;
unsigned short rTimer; unsigned short rTimeout;
char retries;unsigned short cTimer;
void(*event_handler)(int,char,char*,unsigned short,unsigned short,unsigned short);//套接字结构指计
unsigned short more_data;//还有未发送数据
unsigned short position; //发送位置
int (*fill_buffer) (int,unsigned short *,unsigned short *); };
定义了通信的Socket套接字,就可以实现套接字相关的函数实现。如初始化套接字、打开、建立、断开、接收、关闭TCP套接字、TCP端口侦听等。系统运行时,各状态之间变迁和事件的处理由TCP有限状态机实现。这与WINODWS下的网络通信相似。
2.2.2文件系统的实现
本系统中的WEB服务页面相对固定,体积不大。所以决定把文件系统放在内存中。首先需要在HTTP模块中定义一个表结构体来支持文件系统。结构体中的条目为文件的属性[3]:
struct{char filename[13]; //13字节的文件名
const char *contentpointer; //指向对应的content_Type的字符串指针
unsigned short contentsize; //保存content_Type字符串的长度
const char*filepointer;//指向文件内容的开始位置
unsigned short filesize;//文件的长度
}filesystem[NUMBER_OF_FILES]
WEB服务器创建HTTP响应时,不同的文件类型加载不同的内容类型首部。因此还需在模块中定义下列文件类型:
const char text[] = "Content-Type: text/plain\r\n";
const char html[] = "Content-Type: text/html\r\n";
const char app[] ="Content-Type: application/octet-stream\r\n";
系统启动时,将调用文件系统的初始化函数,分别把txt文件、html文件、程序代码等文件和数据存储到指定的内存空间。一旦文件系统被加载,WEB服务器就可以启动了。
2.2.3Web服务器处理HTTP请求的流程
系统启动时首先运行初始化函数。在进行各种初始化工作后,开始调用监听函数监听网络中HTTP请求,当建立了TCP连接,接收了HTTP请求后,则会产生数据接收事件。服务器要完成以下处理:(1)处理HTTP请求:如果是GET命令请求,会直接调用函数获取请求的文档的索引值。如果是POST命令请求,则先回调处理上传的变量,处理完后再去获取请求文件的索引值。(2)处理POST命令:从POST命令中提取"变量=值"的数据。实现事务层的处理。(3)创建HTTP响应:创建页面文件给浏览器。
图3为一个完整的HTTP请求过程:当TCP层的Tcp_process_segment()例程收到来自下层(IP层)的HTTP请求时,它通知http_control_process()发生TCP-EVENT_DATA事件①,然后调用http_process()例程处理该请求②。如果HTTP请求的命令是POST,则调用应用服务层的Process_POST()程序③来处理浏览器提交的变量A,http模块提供了parse_variable()完成该任务B。当完成了POST数据,就去调用getFileName()函数获取请求的文件名的索引号④。一旦http_process()返回一个值,便可从文件系统中提取被请求的文档,由Tcp_send_data()函数负责向浏览器发送HTTP响应⑤。Tcp_send_data()例程调用回调函数create_contend()填充发送缓冲区,创建HTTP响应⑥,向该响应中加载状态行、内容类型首部、空行和报文主体(被请求的网页)。当填满缓冲区时,调用tcp_send()⑦把http响应发送出去。
2.2.4整个系统开机启动的流程
系统是从“裸机”上开始实现的。必须从CPU的初始化开始实现。运行的流程为:CPU初始化‘关中断’中断初始化‘开中断’COM口初始化‘应用程序初始化’协议初始化‘WEB服务初始化’进入正常状态(协议进程和应用程序进程)。
3 结束语
经过精心的设计和调试,系统终于上线使用。实际应用表明,系统设计合理,效果令人满意。并有以下优点:(1)系统体积小。本系统编译好的二进制文件只有209KB。(2)灵活高效,实时性好。(3)系统移植性和扩展性好。如只要修改应用层模块功能,就可方便地实现其它的嵌入式系统;如果使用PPP拨号连网,则用PPP协议替代以太网协议模块就可以了。
系统存在的不足之处有:对TCP/IP协议进行了精简而没有做到很好的优化;系统有些模块需要进一步改进和完善。
以后的工作:一是进一步完善和优化系统,提高实时性和在复杂网络中的通信性能,二是把这一轻量级协议移植到其它嵌入式应用,开展更多的嵌入式应用。
参考文献:
[1]刘锬.四种嵌入式Internet实现方式[J].计算机世界报.2006,(8):23.
[2]朱林生.嵌入式系统与Internet的互连技术[J].浙江师范大学学报(自然科学版)2003,(8).
[3]沈阳东大新业信息技术股份有限公司.Webit 用户手册(V1.0).2005.
[4]田裕康.轻量级TCP/IP协议栈OpenTCP的移植与应用[J].单片机与嵌入式系统应用.2008,(5).
[5]阿根廷.Sergio Scaglia嵌入式Internet TCP/IP基础、实现及应用[M].北京航天航空大学出版社,2008.
[6]史绪蓬,卢迪.一种通用嵌入式Ethernet接口设计与实现.理论与方法[J].2008,(2):13.
关键词:嵌入式系统;Web Server;轻量级 TCP/IP协议
中图分类号:TP393文献标识码:A
Design and Realization of A lightweight Embedded Web Server
WU Tao
(computer science Department of Lishui University,Zhejiang Lishui 323000)
Key words: embedded system;Web Server;lightweight TCP/IP protocol
嵌入式Internet技术是嵌入式技术和网络通信技术紧密结合的产物。它使互联网延伸到各种各样的嵌入式设备。具有广阔的应用前景和巨大的市场潜力。嵌入式Internet技术的实现方案很多,大致可分为以下四种[1]:
(1)处理器+专用网络芯片方式。这种方式采用独立的专用网络接口芯片实现网络功能,通过网关与Internet相连。典型的产品有E1552、Webchip等。图1方式(1)为专用芯片Webchip实现的网络接入方案。这种方案的优点是不必考虑网络协议,只需要解释并执行网络芯片传送过来的指令和数据就可以实现与Internet连接。缺点是只能在低性能处理器中使用,而且需要一台微机作为通信的网关。
(2)“EMIT技术”方式[2]。该技术由emWare公司开发,这种系统由emNet和emGateway两部分组成,emNet是运行在处理器内部,实现嵌入式系统和其他网络(如RS485等)连接的网络协议。emGateway(嵌入式微控制器网关)运行在外部设备(PC机等),它是实现与Internet连接的桥梁。图1方式(2)所示。这种方式应用广泛,适合于高性能的处理器。缺点是开发人员必须熟悉emNet协议和相关的接口,处理器处理emNet协议要占用一定的资源,同时需要计算机做通信网关。
(3)“固化TCP/IP协议硬件芯片”方式。典型产品有沈阳东大公司的Webit。公司对产品的定义为:“Webit是一个微型Web服务器,它可以有自己的IP地址,传统的电器设备通过它可以直接连接到Internet,这样人们即便在千万里之外,也可以轻易地通过Internet控制各种电器设备”[3]。解决方案图1方式(3)所示。网络协议芯片把协议处理部分独立出来,使得开发人员省去了网络部分的工作,可把主要精力集中在应用系统本身上。但是从总体上看,它还是一个基于AVR单片机的系统,资源有限,不利于扩展。
(4)嵌入式操作系统方式。这是目前应用最广泛的嵌入式Internet接入方式。处理器一般为高性能的ARM系列、Xscale系列等。系统都有一个集成了完整TCP/IP协议的操作系统。在嵌入式操作系统上实现各类服务或应用程序。这种方式的优点是开发方便、快捷。缺点是操作系统和TCP/IP协议都很庞大,要占用许多嵌入式系统资源,实时性不好。
从上述分析可知,前三种网络接入方式主要针对单片机系统,使用场合受限。第四种方案从开发模式、操作系统以及TCP/IP协议都借鉴了桌面系统,同样不太适合嵌入式系统的特点和开发条件。为此,本文提出了一种轻量级TCP/IP协议的设计思想。
1 轻量级Internet网络接入设计
1.1轻量级TCP/IP协议设计思想
嵌入式Internet应用系统的特点是资源有限、应用定制。而传统的TCP/IP通信协议庞大臃肿,消耗大量的系统资源。本文的设计思想是:针对嵌入式设备的具体特点,对TCP/IP协议进行裁减:使之成为紧凑的、轻便的,同时又是模块化的、高效的和易于移植的轻量级TCP/IP协议。用模块化的设计方法加以实现,集成到具体的应用系统中。
本设计思想的实现方法是:(1)以"够用"为原则。对TCP/IP协议的进行裁减,去掉系统用不到的协议,同时对系统用到的协议也作适当简化。变庞大臃肿为紧凑轻巧。(2)模块化实现。把TCP/IP协议分成不同的模块实现,达到高效而又易于移植。(3)协议模块直接集成到一个无操作系统的应用程序中,实现嵌入式设备的Internet连接。(4)协议实现原则:一是高效(占用尽可能少的存储器和处理器时间),二是非阻塞(防止程序进入死锁)[4]。
这是一种轻量级的TCP/IP协议在嵌入式设备"裸机"上直接实现的网络接入方案。特点是协议体积小、性能高、使用灵活、组件复用性强。不足之处在于系统结构复杂,开发周期长;同时协议与实际应用系统集成时,需要解决一些技术细节。
1.2基于轻量级TCP/IP协议的嵌入式WEB服务器系统
基于上述设计思想。我们开发一个轻量级TCP/IP协议的嵌入式WEB服务器系统:某医院重症监护区(ICU)实时监护监控系统。该系统对重症病人单一生命体征实施24小时不间断、无人值守监控,同时实现设备远程操作和应急报警等。监护参数有:心电(ECG)、血压(NIBP)、体温(TEMP)、血氧饱和度(SPO2)等。监护数据和设备控制信号通过接口电路进入嵌入式系统,嵌入式设备通过网线接入医院的局域网。供相关人员随时查询,远程指导以及应急处理等。
针对实际系统,以“够用”为原则对TCP/IP协议进行裁减。具体实现如表1所示。系统接入层协议只保留以太网接入模块和ARP模块。传输层只保留TCP模块。应用层使用HTTP协议,WEB服务器中的业务处理包括各种实时信息的处理,由专门的程序实现。
1.3软硬件系统的选择和确定
硬件系统:目前设计和生产嵌入式系统的芯片公司很多。考虑到开发团队对芯片的熟悉程度、硬件的通用性和成本等因素,本系统采用Samsung 公司的S3C44B0X微处理器,芯片使用ARM7TDMI核,集成了许多部件。性价比高、通用性好。重症监护区(ICU)监控信号和对外控制信号都从GPIO接口接入。
软件平台:系统是从“零”开始,在硬件“裸机”上直接开发的,因此软件开发平台的选择至关重要。在比较了各种集成开发环境(IDE)后,确定使用IAR Embedded Workbench的嵌入式开发平台。平台包含了C/C++编译器、调试器的IDE、起步套件、硬件调试探示器和状态机设计等工具。能在同一平台上实现编辑、编译、调试以及直接编译成二进制文件。从网络接入层的驱动到应用程序功能的实现都可以在这个集成开发环境中完成。下载最终编译成的二进制文件到硬件系统的工具采用Philips公司的Flash软件。网络调试和测试时还用到网络协议分析器(Wireshark)和网络包捕获器(WinPcap)等工具。
2 轻量级嵌入式系统的实现
2.1底层的协议实现
2.1.1以太网引擎集成芯片接口
系统的以太网控制器为Cirrus Logic公司的CS8900A芯片。芯片与S3C44B0X处理器实际的连接线有:IOW(写信号线)、IOR(读信号线)、4条地址线(XA)和16条数据线等。网络集成芯片工作在S3C44B0的Bank2上。
2.1.2以太网协议层的再次分层实现
以太网接口层是网络的实际连接层,底层要对网络集成芯片端口和寄存器读写访问,高层要实现对网络层数据包的收、发处理。调用关系复杂。采用再次"分层"的方法不仅明晰了各函数调用的关系,而且利于实现。如图2为各子层之间调用的关系图。在Ethernet.c文件中实现。对芯片的I/O口、内部寄存器、状态寄存器定义后。使用汇编函数NIC_read_port()和NIC_writer_port()分别实现读写I/O端口;NIC_read_reg()为读寄存器函数,NIC_writer_reg()为写寄存器函数;Frame_get()负责拆分以太帧。Frame_send()把上层的数据打包成以太帧。再上面一层就是提供给IP层访问的接口层了,IP层调用Ethernet_poll()轮询状态信息,当接收了以太帧后由frame_process() 处理。当IP层发送数据包时,调用ethernet_send()函数。
系统加电时,调用相应初始化函数。先对芯片I/O引脚的方向和相应的内部寄存器初始化。再加载或初始化以下的状态参数:1)指定数据包大小和帧头长度。2)确定接收、发送数据缓冲区大小,3)网络参数的初始化,包括IP地址、子网掩码地址、物理地址,网关等。4)以太网帧头结构定义。5)网络字节序列与处理器字符序的转换宏定义。6)其它模块的常量和外部变量等。一旦初始化完成。系统调用Ethernet_poll()自动轮询函数。进入正常的运行状态。
2.1.3ARP协议和IP协议的实现
ARP(地址解析)协议实现网络中的IP地址与物理地址的对应。使用结构体描述这一映射表。struct arp_entry { char proaddr[4]; //IP地址
char hwaddr[6];//物理地址
char state;//状态
unsigned short tout; //超时
charretries; // 重试
unsigned shortqueries; //被请求的次数 };
模块实现的主要功能:(1)初始化ARP表。(2)处理进入的ARP报文。(3)解析IP地址。(4)维护ARP表。(5)实现显示ARP表。
IP协议层主要功能是根据IP数据报头拆分或封装IP数据报。当下一层传来的数据包时,函数ip_process()对数据拆分,供上一层调用。待发送的数据,由ip_send()打包通过调用底层函数把数据包发送出去。标准的IP数据报头的结构体如下:
struct ip_hdr {char verhl;// IP协议版本号和头长
char tos; // 服务类型
unsigned short len; // 总长度
unsigned short id;// 标识号
unsigned short fragment; // 标志和字段偏移量
char ttl; // 生存时间
char protocol;// 协议
unsigned short chksum;// IP 头部检验和
char srcipaddr[4];// 源IP地址
char destipaddr[4];// 目标IP地址};
开发和使用过程中,需要对网络进行调试和测试。本层还实现ICMP协议的功能。以实现简单的显示请求服务(ping命令)。
2.2高层协议的实现
2.2.1面向连接的套接字的实现
TCP是一个基于套接字的面向连接的协议。系统中引用运输控制块(TCB)保持每个TCP连接和套接字的状态[5],TCB由一个表结构体组成,每个条目对应一个套接字字段:TCB表的结构和字段说明以下:
struct tcb { charstate;//状态
unsigned short local_port;//本地端口号
char remote_ip[4];//远程IP地址
unsigned short remote_port; //远程端口号
unsigned short remote_mss; // 远程最大数据报长度
char flags;//标志
unsigned int snduna; //程的外部标识符
unsigned intsndnxt;unsigned short sndwnd;
unsigned int rcvnxt; unsigned short rcvwnd;
unsigned short rTimer; unsigned short rTimeout;
char retries;unsigned short cTimer;
void(*event_handler)(int,char,char*,unsigned short,unsigned short,unsigned short);//套接字结构指计
unsigned short more_data;//还有未发送数据
unsigned short position; //发送位置
int (*fill_buffer) (int,unsigned short *,unsigned short *); };
定义了通信的Socket套接字,就可以实现套接字相关的函数实现。如初始化套接字、打开、建立、断开、接收、关闭TCP套接字、TCP端口侦听等。系统运行时,各状态之间变迁和事件的处理由TCP有限状态机实现。这与WINODWS下的网络通信相似。
2.2.2文件系统的实现
本系统中的WEB服务页面相对固定,体积不大。所以决定把文件系统放在内存中。首先需要在HTTP模块中定义一个表结构体来支持文件系统。结构体中的条目为文件的属性[3]:
struct{char filename[13]; //13字节的文件名
const char *contentpointer; //指向对应的content_Type的字符串指针
unsigned short contentsize; //保存content_Type字符串的长度
const char*filepointer;//指向文件内容的开始位置
unsigned short filesize;//文件的长度
}filesystem[NUMBER_OF_FILES]
WEB服务器创建HTTP响应时,不同的文件类型加载不同的内容类型首部。因此还需在模块中定义下列文件类型:
const char text[] = "Content-Type: text/plain\r\n";
const char html[] = "Content-Type: text/html\r\n";
const char app[] ="Content-Type: application/octet-stream\r\n";
系统启动时,将调用文件系统的初始化函数,分别把txt文件、html文件、程序代码等文件和数据存储到指定的内存空间。一旦文件系统被加载,WEB服务器就可以启动了。
2.2.3Web服务器处理HTTP请求的流程
系统启动时首先运行初始化函数。在进行各种初始化工作后,开始调用监听函数监听网络中HTTP请求,当建立了TCP连接,接收了HTTP请求后,则会产生数据接收事件。服务器要完成以下处理:(1)处理HTTP请求:如果是GET命令请求,会直接调用函数获取请求的文档的索引值。如果是POST命令请求,则先回调处理上传的变量,处理完后再去获取请求文件的索引值。(2)处理POST命令:从POST命令中提取"变量=值"的数据。实现事务层的处理。(3)创建HTTP响应:创建页面文件给浏览器。
图3为一个完整的HTTP请求过程:当TCP层的Tcp_process_segment()例程收到来自下层(IP层)的HTTP请求时,它通知http_control_process()发生TCP-EVENT_DATA事件①,然后调用http_process()例程处理该请求②。如果HTTP请求的命令是POST,则调用应用服务层的Process_POST()程序③来处理浏览器提交的变量A,http模块提供了parse_variable()完成该任务B。当完成了POST数据,就去调用getFileName()函数获取请求的文件名的索引号④。一旦http_process()返回一个值,便可从文件系统中提取被请求的文档,由Tcp_send_data()函数负责向浏览器发送HTTP响应⑤。Tcp_send_data()例程调用回调函数create_contend()填充发送缓冲区,创建HTTP响应⑥,向该响应中加载状态行、内容类型首部、空行和报文主体(被请求的网页)。当填满缓冲区时,调用tcp_send()⑦把http响应发送出去。
2.2.4整个系统开机启动的流程
系统是从“裸机”上开始实现的。必须从CPU的初始化开始实现。运行的流程为:CPU初始化‘关中断’中断初始化‘开中断’COM口初始化‘应用程序初始化’协议初始化‘WEB服务初始化’进入正常状态(协议进程和应用程序进程)。
3 结束语
经过精心的设计和调试,系统终于上线使用。实际应用表明,系统设计合理,效果令人满意。并有以下优点:(1)系统体积小。本系统编译好的二进制文件只有209KB。(2)灵活高效,实时性好。(3)系统移植性和扩展性好。如只要修改应用层模块功能,就可方便地实现其它的嵌入式系统;如果使用PPP拨号连网,则用PPP协议替代以太网协议模块就可以了。
系统存在的不足之处有:对TCP/IP协议进行了精简而没有做到很好的优化;系统有些模块需要进一步改进和完善。
以后的工作:一是进一步完善和优化系统,提高实时性和在复杂网络中的通信性能,二是把这一轻量级协议移植到其它嵌入式应用,开展更多的嵌入式应用。
参考文献:
[1]刘锬.四种嵌入式Internet实现方式[J].计算机世界报.2006,(8):23.
[2]朱林生.嵌入式系统与Internet的互连技术[J].浙江师范大学学报(自然科学版)2003,(8).
[3]沈阳东大新业信息技术股份有限公司.Webit 用户手册(V1.0).2005.
[4]田裕康.轻量级TCP/IP协议栈OpenTCP的移植与应用[J].单片机与嵌入式系统应用.2008,(5).
[5]阿根廷.Sergio Scaglia嵌入式Internet TCP/IP基础、实现及应用[M].北京航天航空大学出版社,2008.
[6]史绪蓬,卢迪.一种通用嵌入式Ethernet接口设计与实现.理论与方法[J].2008,(2):13.