多通信接口接入互联网的嵌入式网关设计(二)

来源:互联网 发布:如何在淘宝上做代理 编辑:程序博客网 时间:2024/05/21 17:58

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
 

原创粉丝点击