关键词:嵌入式网关;多路通信接口;嵌入式Internet;μCLinux
嵌入式Internet技术的出现,使得嵌入式系统与Internet之间可以实现资源共享、信息通信和状态测控等功能。目前,该技术的主要问题之一就是Internet上面的各种通信协议对于计算机存储器、运算速度等的要求比较高,而测控领域中大量存在的8位和16位MCU系统是无法处理这些的。要解决这个问题,一个可行的方法就是利用在嵌入式领域比较常用的总线,如RS485、RS232、CAN总线等,将这些处理能力较低的嵌入式设备连接起来,接入到网关所提供的通信接口上,由网关来实现协议栈和协议转换,从而就将8位/16位的嵌入式设备接入到互联网。
1. 嵌入式网关的典型设计方案
网关又被称为网间协议变换器,用于连接采用不同通信协议的网络,实现网络之间的数据传输。当一个报文要求从一个网段发送到另一个网段时,网关需要完成对该报文的接收、翻译与转发工作[1]。就目前已应用到嵌入式系统中的网关来说,主要有以下两种:
1.1 利用PC机来实现的网关
利用PC机的丰富资源和较强的处理能力,在其上构建WEB服务器,实现和Internet客户端的通信,而8位/16位MCU设备连接到PC总线的扩展接口或特定的板卡上,通过通信程序实现与PC机通信,进而利用PC机这一网关接入互联网。这种方式实现相对容易,灵活性较好,但成本较高,设备的可靠性和环境适应性都比较差。
1.2 利用32位嵌入式系统实现的网关
它以32位嵌入式系统为硬件基础,体积小、成本低,设备的可靠性和环境适应性较好。按实现TCP/IP协议栈方法的不同,可将这种嵌入式网关分为以下两个设计方案。
(1)基于软件来实现TCP/IP协议栈[2]
这一方案通常有两种实现方法,第一种是嵌入式操作系统带有TCP/IP协议栈。网关运行在嵌入式操作系统之上,可以利用嵌入式操作系统的强大功能,按用户需求实现很多复杂的功能。第二种方法则单独采用TCP/IP协议栈软件模块,不使用嵌入式操作系统,所构建的系统只占用很小的存储空间,但是如果要实现复杂的功能,则编程的复杂性较大。
(2)直接利用TCP/IP协议栈芯片[2]
在这种方案中,将集成有TCP/IP协议栈的芯片直接使用在嵌入式网关中,使得设计简单,但增加了一个芯片,也就增加了制造成本,开发时需要熟悉TCP/IP协议栈芯片的接口。
2. 嵌入式网关的硬件结构
网关的硬件结构如图1所示,其中处理器使用基于ARM7TDMI的SAMSUNG S3C44B0X,它是16/32位RISC处理器,工作在66MHz,内置有丰富的片内外设,常用于手持设备和网络设备当中。系统内存使用4M×16bit 的HY57V65160b SDRAM,存储器使用1M×16bit的SST39VF160 Flash。网关的以太网控制器采用RTL8019AS,它支持IEEE802.3,支持8/16位数据总线,内置16KB SRAM,支持全双工方式,收发可同时达到10Mbps。网关提供多路本地通信接口,其中RS232接口利用S3C44B0X的UART0口实现,使用MAX3221E实现电平隔离和转换。RS485接口使用S3C44B0X的UART1口实现,外接MAX485完成TTL电平与RS485电平的转换和数据收发。CAN总线接口采用总线连接方式,使用PHILIPS公司的CAN控制器SJA1000T,它兼容基本CAN模式(BasicCAN)和增强CAN模式(PeliCAN),符合CAN2.0B协议,具有完成CAN通信协议所要求的全部特性,其外接TJA1040T作为CAN总线接口的收发器。此外,系统还预留了可用于扩展的其他通信接口。
图1 嵌入式网关硬件结构
图2嵌入式网关的软件构架
3. 嵌入式网关的软件设计
3.1 软件构架
本文所设计的嵌入式网关运行在嵌入式操作系统μCLinux之上,对外以WEB服务器与Intertent客户端交互;对内则按总线标准的不同,通过多个通信接口与多个不同类型的集散式子网相连,如图2所示。网关将内网中的各通信子网以及外网的Internet都看成是等同的网络,在转发数据时屏蔽网络之间的差异,将来自不同网络的数据都转换为统一格式的转发数据包,并采用基于优先级的调度机制来完成转发。这样便将内网和外网的通信整合在一起,实现各种子网通信协议与TCP/IP协议的转换,以及各种子网通信协议相互之间的转换。
当WEB服务器接收到来自Internet客户端的请求时,如果是请求静态网页,则将网页传给客户端(对应于图2中的①,下同);如果是要与本地子网的终端设备通信,服务器便将通信数据发往Internet接口模块(②),由其完成对数据的解析,并封装成转发数据包,发往接收子模块(③);相反,当Internet接口模块收到来自发送子模块的数据包时(④),则解析该数据包后生成动态网页,发往WEB服务器(②),服务器再将其发到客户端(①)。
当本地子网的某个终端设备要与别的设备通信,或者要将响应数据包发往Internet客户端时,按照一定的调度机制,将数据从终端设备发往内网通信模块(⑤),由该模块将数据转换为网关内部的转发数据包后,发往接收子模块(⑥)。与此相对,如果内网通信模块收到发送子模块发来的数据包(⑦),则根据该数据包的目的地址,选择相应的子网,将数据包转换为符合该子网的通信协议下的数据,再发往目的设备(⑤)。
接收子模块在接收到来自Internet(③)或本地子网(⑥)的数据包后,将这些格式统一的数据包按照优先级高低插入数据队列中(⑧)。当基于优先级的队列中有数据包的时候,发送子模块便从中取出数据包(⑨),发往目的子网(④⑦)。
3.2 嵌入式操作系统μCLinux的移植以及Boa服务器的配置
μClinux是一个完全符合GNU/GPL(通用公共许可证)的项目,其代码完全开放,专门针对没有MMU的MPU,通过对标准Linux内核的改动,针对嵌入式系统进行小型化处理,形成了一个高度优化的、代码紧凑的嵌入式Linux。将μClinux应用到网关中,可以利用其完备的网络功能,减小开发的难度,缩短开发时间。使用μClinux,第一步要做的就是根据网关的硬件平台移植μClinux,首先要在PC上安装Linux操作系统,下载uClinux源代码压缩包并解压,下载并安装交叉编译工具,建立交叉编译环境;其次根据不同的硬件系统修改源代码,编写或修改一些特殊硬件的驱动程序;然后配置内核,生成可在RAM中运行的内核文件;最后烧写到硬件系统的Flash存储器中,加电运行。
μClinux中常用的WEB服务器有:Boa、thttpd、httpd,网关可选择支持认证、支持CGI、非常适合于嵌入式系统的Boa WEB 服务器[3]。Boa是一个单任务的HTTP服务器,它不为每个访问的连接单独开启一个进程,也不会为多个连接而开启多个自身的拷贝,对所有活动的HTTP连接都在内部进行处理,而只为每个CGI连接启动新的进程,因此Boa在同等硬件条件下速度更快。使用Boa WEB服务器,需要对其运行环境、参数等进行设置,如设置侦听端口为80,设置服务器的文件根目录DocumentRoot,设置CGI文件的存放目录等。
3.3 Internet接口模块的设计
Internet接口模块实质上是一个CGI[3] (公共网关接口协议Common Gateway Interface)程序,CGI是对HTTP协议的补充,是一个用于定义WEB服务器与外部程序之间通信方式的标准,定义了建立互操作中双方必须遵守的规则集。CGI技术较为成熟,相关文献也较多,故本文不做详细论述,而是重点介绍一下Internet模块的实现算法,其流程图如图3所示。
图3 Internet接口模块流程图
Internet客户端可用“GET”或“POST”方式提交数据到WEB服务器上,WEB服务器会将本次所用的提交方式保存到环境变量REQUEST_METHOD中。如果是“GET”方式,则服务器将有效数据保存到环境变量QUERY_STRING中,Internet模块可直接读取这一环境变量来获得有效数据;如果是“POST”方式,则服务器将有效数据的长度保存到环境变量CONTENT_LENGTH中,则Internet模块就可在这一数据长度的控制下从标准输入读入有效数据。在获得了有效数据之后,Internet模块解析它们,生成转发数据包,发往转发模块。到此数据接收完毕,进程挂起自身,等待信号量InternetRec有效。当InternetRec有效时,说明有来自内网的反馈数据包到来,则进程被唤醒,接收反馈数据包,在判断目的地址无误后,根据数据包数据生成动态网页,交予WEB服务器发送到客户端。
3.4 转发数据包的设计
转发模块完成网关内部的数据包转发功能,它维护了一个基于优先级的数据队列(见图2),该队列属于临界资源,由接收子模块和发送子模块互斥使用。转发数据包的结构应有一定的通用性,具有兼容各种通信子网或Internet数据的能力,可用下面的数据结构来定义:struct DataProtocol{
int CommType;
struct Addr_t DstAddr;
struct Addr_t SrcAddr;
int Prio;
struct DataStruct *DataHead;
int DataLengh;
struct DataProtocol *pDProtc; };
(1)int CommType; 定义通信的类型。用来指明当前所传送的数据包的类型,即DATATYPE(有效数据包)和ERRORTYPE(错误信息包)。DATATYPE是指本数据包的数据域中的是有效的数据;而ERRORTYPE是指数据域中携带的是出错信息。网关在处理数据包的时候,就可以先判断数据包的类型,再采用相应的处理流程,这样便提高了处理的效率。
(2)struct Addr_t DstAddr; 通信的目的地址。用以指明数据发往的目的地址,其数据类型定义如下:struct Addr_t{
unsigned char SubNet; //指明是何种网络(本地子网或Internet)
unsigned char DevAddr; }; //指明子网内的终端设备地址
说明:由于网关所使用的Boa WEB服务器是单任务的,一次仅处理一个Internet连接,故当SubNet为Internet时,DevAddr应为零。
(3)struct Addr_t SrcAddr; 通信的源地址,用以指明数据的源地址。
(4)int Prio; 数据包优先级。对来自不同通信子网以及不同设备的数据包,根据通信的实时性要求不同,定义不同的数据包优先级。在转发模块中,优先级高的数据包被插入到队列的头部,优先被转发到目的网络。在指定具体的数据包优先级时,采用Prio数值越小优先级越高的方式,且规定与Internet相关的数据包较内网间传递的数据包有更高的优先级。
(5)struct DataStruct *DataHead; 存储有效数据的链表队列的头指针。该链表就是数据包的数据域部分,其数据类型定义如下:
struct DataStruct{
char *Name;
char *Value;
struct DataStruct *pDStruct; };
*Name保存数据或操作的类型,可为 “INFO”(说明信息)、“READ”(读数据)、“WRITE”(写数据)、“CONTROL”(发送控制指令);
*Value的格式为:操作名称或对象 [参数1] [参数2] …… [参数n]
其中,操作名称或对象和参数内都不能有空格,参数之间用空格分开,参数数量可为零。
比如要启动某个设备,只需传送如下数据:Name->CONTROL,Value->START;要读取设备温度值,只需传送:Name->READ,Value->TEMPERATURE。数据包仅是保存了有效数据的ASCII码,嵌入式网关只完成将这些ASCII码从发送端传送到接收端,实现路由功能和中间协议转换功能,这些ASCII码所表示的具体含义由发送端和接收端的应用层来规定,这样便实现了一种与具体数据意义无关的通用数据传送通道。
(6)int DataLengh; 指明有效数据中,“Name”、“Value”对的数目。
(7)struct DataProtocol *pDProtc; 指向下一个数据包的指针。在基于优先级的数据队列中,各数据包利用该指针,采用链表的形式加以组织,这样有利于数据的插入和删除。
3.5 内网通信模块及设备通信模块的设计
内网通信模块由调度子模块和若干子网接口子模块组成,其中前者较为简单,主要是完成转发模块和各子网接口子模块之间的数据包分发及收集功能;而后者就较为复杂了,涉及到各种网络的通信协议和数据格式,它与终端设备的通信模块形成一个基于该子网通信协议的通信系统,限于篇幅,本文不可能尽述,仅以RS232为例作一个简单介绍。
RS232标准仅定义了ISO/OSI基本参考模型中物理层规格和链路层硬件接口规格,要实现集散式的RS232子网的通信,需要一个网络层来进行终端设备的地址路由。此外,还要在链路层的软件层面上,设计一个数据帧格式,用于封装所传输的数据。在具体的实现上,就体现在转发数据包和RS232数据帧格式间的解析和转换封装上。
终端设备要接入嵌入式网关,在硬件上必须提供一个通信接口,如RS232接口、RS485接口或CAN接口等。在软件上则必须有一个通信模块,主要完成:从网关接收数据,经解析后提交给上层应用程序;从上层应用接收需发送的数据,对其封装,再发送到网关。应用程序按照应用层的协议规则分析接收到的有效数据,做出相应的操作或响应。
4. 结束语
本文在分析典型的嵌入式网关设计方案的基础上,提出了一种具有多通信接口的整合内、外网通信的嵌入式网关,适用于将8/16位嵌入式设备接入互联网的应用场合,该方案可以根据应用需求对各接口应用模块进行扩展和裁剪。在具体应用中,还需要增强和改进网关的安全性,进一步研究将更多的本地通信子网加入到网关中,从而增强网关的适用性。
本文作者创新点:设计了一个整合内外网通信、能为8/16位MCU系统接入互联网提供多个通信接口的嵌入式网关,详细讨论了网关软件模块的实现和转发数据包的格式。
参考文献:
[1] 孟军英,刘教民,王震洲. 基于ARM微处理器的CAN/以太网嵌入式网关[J]. 河北工业大学学报. 2005年8月. 第34卷增刊. 115-117.
[2] 赵国安,高航,张有成. 由W3100A构成嵌入式网关的家庭智能系统[J]. 单片机与嵌入式系统应用. 2003年第4期:51-53.
[3] 王羲,任琦梅.基于44B0平台的uC-Linux Web服务器实现方法研究[J].微计算机信息, 2005, 3-1:76-77