摘 要: 讨论UBICOM公司(原SCENIX公司)的SX52BD100单片机构建WebServer的具体方案;给出硬件构成框图,并分析每一部分的作用、完成的功能以及软件流程图。为了突出这种单片机的虚拟外设的特性,特别详细地解释网络协定和协定栈的具体实现。
关键词:网络单片机 协定栈 虚拟外设 信息家电 WebServer
前 言
Internet的日益普及,信息共享水平的不断进步,给工作和生涯带来了极大的方便。现在,上网浏览对于人们来说是一件很平凡的事情。不仅如此,架构一个WebServer,做自己的主页也是司空见惯的。一般情况下,人们通过一台上网的电脑来建立WebServer。在这里将讨论另外一种方法:通过单片机来建立WebServer。之所以会想到用单片机来实现WebServer,是因为随着嵌入式体系的迅猛发展和IA(信息电器)的出现,以单片机为中心的使用体系将搭上Internet的快车逐步取代传统的以PC为中心的使用,成为未来Internet发展中的主力军。
一、 具体使用方案
1. 基于单片机的WebServer方案
基于单片机的WebServer的硬件平台如图1所示。
2. 重要芯片介绍
(1) SX52BD100
SX52BD100 是UBICOM公司生产的一款RISC指令集的单片机,片上带有4K×16 位的Flash存储器和262×8位的RAM。由于采取CPU并行流水线方法及单时钟周期指令,在100MHz晶振驱动下指令执行速度可达 100MIPS。该单片机的最大特性就是虚拟外设功能,即通过软件对I/O口进行机动的配置,CPU执行虚拟软件模块就可以驱动普通的I/O口来模拟外设的功能,比如UART、SPI、IIC和FSK等。当然,令人惊奇的是,SX52BD100可以通过虚拟外设功能来运行网络协定栈,例如TCP、IP、 HTTP以及SMTP等。
(2)RTL8019AS
RTL8019AS是RealTek公司出品的一种全双工以太网节制器。它自带16KB的SRAM,工作在Ethernet II和IEEE802.3、 10Base5、10Base2、10BaseT下,与NE2000兼容。
(3)24LC256
24LC256是Microchip公司生产的一种串行32KB的 E2PROM存储器,采取CMOS工艺,通过2根数据线和外界通信,兼容I2C总线接口,可设为硬件写掩护,10万次的擦写,200年以上的数据掩护。
图1中的E2PROM 24LC256用来存储WebServer的网页信息。它可以处理Web页面、图像文件、PDF文档记忆其它文件。当然,它不能像PC上WebServer中的硬盘那样可以存储大批的页面。它的容量抉择了WebServer的资源文件的大小。
二、网络协定栈的实现
网络协定通常分不同层次进行开发,每一层分别负责不同的通信功能。一个协定族,比如TCP/IP,是一组不同层次上的多个协定的组合。TCP/IP通常被以为是一个四层协定体系,如图3所示。每一层负责不同的功能。
(1)数据链路层,有时也称为网络接口层。通常包含操作体系中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。
(2)网络层,有时也称作互联网层。处理分组在网络中的活动,例如分组的选路。在TCP/IP协定族中,网络层协定包含IP协定(网际协定)、ICMP协定(Internet互联网节制报文协定)以及IGMP 协定(Internet组管理协定)。这里重要讨论IP协定。
(3)传输层重要为两台主机上的使用程序供应端到端的通信。TCP为两台主机供应高可靠性的数据通信。它所做的工作包含把使用程序交给它的数据分成适合的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层供应了高可靠性的端到端的通信,因此使用层可以忽略所有这些细节。
版本是指IP协定的版本号。目前的协定版本号是4, 因此IP也称作IPV4。
首部长度指的是首部占32bit字的数目。由于它是一个4位字段,因此首部最长为60个字节。在这里,IP数据报字段的值是5。
服务类型字段包含一个3位的优先权子字段(现在已被忽略)、4位的TOS子字段和1位未用位但必需置0。4bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。4bit中只能置其中1bit 。如果所有4bit 均为0,那么就意味着是一般服务。
总长度字段是指整个I P 数据报的长度,以字节为单位。使用首部长度字段和总长度字段,就可以知道I P 数据报中数据内容的起始位置和长度。
标识字段唯一地标识主机发送的每一份数据报。
标志字段用来指定目标地址是一个完全的主机地址还是一个网络地址。
生存时间字段设置了数据报可以经过的最多路由器数。
首部检验和字段是根据IP首部计算的检验和码。
源地址和目标地址都是32位的数据。
可选项定义安全和处理限制、记录路径、时间戳、宽松的源站选路、严厉的源站选路等信息。
(2)SX协定栈对IP层的实现
SX52BD100的协定栈中,IP层的实现就是把要发送出去的新闻进行IP打包,即加上IP包头,使之符合IP数据包的格式发送到物理层;将接收到的来自物理层的数据包进行IP解包,即去掉包头,送到TCP层。应注意,协定栈不接收分片的IP包,因为它并不对接收到的数据进行重新打包。
2. 传输层
(1)TCP 协定
TCP供应一种面向衔接的、可靠的字节传播送服务。TCP数据包的构造如图5所示。
每个TCP段都包含源端和目标端的端口号,用于寻找发端和收端使用进程。这两个值加上IP包头中的源端IP地址和目标端IP地址,唯一肯定一个TCP衔接。
序号用来标识从T C P 发端向T C P 收端发送的数据字节流。它表示在这个报文段中的第一个数据字节。
确认序号包含发送确认的一端所期望收到的下一个序号。
首部长度给出首部中32bit字的数目。
紧急指针是一个正的偏移量,与序号字段中的值相加表示紧急数据最后一个字节的序号。其余字段的意义和IP包中的差不多。
为了保证TCP层的数据能有效地传输,在建立TCP衔接时,用到了三向握手机制。具体进程如下(假设在A、B间通信,A、B的初始化序号为X、Y):
① 由A向B发出SYN信号,告知B,A的初始化序号为X。
② 由B向A发出ACK和SYN信号,告知A,B知道A的初始化序号为X,B的是Y。
③ 由A向B发出ACK信号,告知B,A知道B的初始化序号是Y。
经过这样的初始化后,TCP衔接的建立就完成了,A与B之间的数据传输也可靠了。
(2) SX协定栈对TCP层的实现
在SX52BD100的协定栈中,对TCP层的实现是通过供应的TCP API(使用程序接口)来实现。TCP的API重要包含下面的函数和变量:
TCPApp1Init():建立第一个TCP衔接的初始化函数;
TCPApp2Init():建立第二个TCP衔接的初始化函数;
TCPAppTxBytes():TCP衔接中发送数据的字节数;
TCPAppRxBytes():TCP衔接中接收数据的字节数;
TCPAppTxData():发送数据;
TCPAppRxData():接收数据;
TCPAppTxDone():发送完毕;
TCPAppRxDone():接收完毕;
TCPAppPassiveOpen():被动TCP衔接;
TCPAppActiveOpen():主动TCP衔接;
Sock1RomoteIP、Sock2RomoteIP:TCP衔接的远程主机的IP地址;
MyIP:本机的IP地址;
tcb1LocalPortMSB、tcb1LocalPortLSB、tcb2LocalPortMSB、tcb2LocalPortLSB:本机的TCP衔接端口;
tcb1RemotePortMSB、tcb1RemotePortLSB、tcb2RemotePortMSB、tcb2RemotePortLSB:远程主机的TCP衔接端口;
TCP协定栈支持同时建立两个TCP衔接:一个为主动衔接,由TCPApp1Init()来节制;另一个为被动衔接,由TCPApp2Init()来节制。TCP是基于衔接的协定,因为必需保持对TCP衔接状况的监视和状况有关的信息保留在发送节制块中;而TCP衔接状况的转变由TCP的软件状况机来实现。软件状况机又由事件或用户来触发。比如,当监视到一个带有SYN标志的TCP包到达时,状况机就将TCP衔接转换到接收状况;用户也可以手工节制状况机处于发送状况来建立TCP衔接。
① 用TCP API来建立TCP被动衔接
_TCPApp2Init
_bank TCB2_BANK
mov tcb2LocalPortLSB, #HTTP_PORT_LSB ; 设置TCP的服务端口
mov tcb2LocalPortMSB, #HTTP_PORT_MSB
bank HTTP_BANK
clr httpParseState
clr httpURIHash
setb flags2.TCP_SOCK ; 显示TCP2的衔接状况
jmp @TCPAppPassiveOpen ; 跳转到TCP被动衔接子程序,进行端口侦听
retp
② 用TCP API建立TCP主动衔接
_TCPApp1Init
test switch ; 条件触发
sz
retp ; 没有触发,退出
_bank HTTP_BANK
mov w, #HTTP_CONNECT ; 启动HTTP状况机
mov httpState, w
_bank TCB1_BANK
mov tcb1LocalPortLSB, #80 ; 设置本机TCP衔接服务端口
mov tcb1LocalPortMSB, #80
mov tcb1RemotePortLSB, #HTTP_PORT_LSB ; 设置远程主机TCP衔接服务端口
mov tcb1RemotePortMSB, #HTTP_PORT_MSB
_bank TCPSOCKET_BANK
mov sock1RemoteIP3,#SMTP_SERVER_IP3 ; 设置远程主机的IP地址
mov sock1RemoteIP2,#SMTP_SERVER_IP2
mov sock1RemoteIP1,#SMTP_SERVER_IP1
mov sock1RemoteIP0,#SMTP_SERVER_IP0
clrb flags2.TCP_SOCK ; 显示TCP主动衔接的状况
jmp @TCPAppActiveOpen ; 在指定的端口建立TCP衔接
retp
③ 用TCP API发送数据和接收数据
一旦建立了TCP衔接,那就只有两种情况:发送数据或接收数据。接收数据时,从IP层来的数据经过状况机去掉TCP包头后再送到使用层;发送数据时,软件状况机会在数据前面加上TCP包头再发送到IP层。
接收数据时,需要用到的TCP API函数为TCPAppRxBytes()、TCPAppRxData()和TCPAppRxDone();发送数据时,有一点值得关注:为了防止接收缓冲区的溢出,相对于发送数据包,协定栈给予接收数据包以更高的优先级。也就是说,协定栈软件会一直处理接收的数据包,直到接收缓冲区中没有任何数据。
发送数据时,需要用到的TCP API函数为TCPAppTxBytes()、TCPAppTxData()和TCPAppTxDone()。必需注意,只有在建立了TCP衔接后,才可以发送数据。
3. 使用层
HTTP是WWW上的协定。当用户要浏览服务器上的一个网页时,一个HTTP 恳求就会从用户的浏览器发到HTTP服务器。服务器响应这个恳求,把指定的网页传送回来,用户才看到了网页。
下面是一个典型的客户端向服务器发送恳求的例子:
GET Destination_IP/index.html http/1.0
GET代表客户端的恳求命令,而服务器也受理这个命令;
Destination_IP代表远程主机的IP地址;index.html是客户端恳求的资源;
http/1.0是HTTP协定的版本。
(1)SX协定栈对HTTP层的实现
因为HTTP层的下面是TCP层,也就是说HTTP把TCP作为它的传输协定,所以那两个TCP衔接也为WebServer所用。理所当然,TCP API的发送和接收函数也用来执行WebServer的恳求和相应命令。
所有的服务器资源都存放在外部的E2PROM中,HTTP使用统一资源定位器来指定返回给客户端的网络资源。统一资源定位器就像一个带有目录的文件路径一样,指定资源的路径和扩大名。SX协定栈并没有像普通的解决方案那样使用一般的文件体系来管理外部存储器中的资源,而是采取了一种称之为智能信息表来解决这个问题。当一个恳求到来时,一个8位的无用信息对统一资源定位器进行运算(8位字符加运算),再将得到的数据乘以2,并把这个后果作为一个索引区中的一个值。如果在E2PROM中已经建立了查找表,凭着这个值在E2PROM中去查表,找到相应的资源并返回。用这种方法的好处是可以避免繁琐的字符串的对比和将统一资源定位器直接存放在服务器中。这种文件体系的构造如图6所示。
(2)E2PROM的编程
在WebServer启动以前,要先把资源文件下载到E2PROM中。在这个方案中采取RS232端口从电脑上传输资源文件。下载程序主动从电脑中载入磁盘的目录构造并在E2PROM中创立E2PROM文件体系。
参考文献
1 SX52BD100 Data Sheet. UBICOM Corporation,2000
2 SX52BD100 User Manual. UBICOM Corporation,2000
3 Ethernet SX-Stack Internet Connectivity. UBICOM Corporation,2000
4 Web Server & Send Email Client Implementation with Ethernet as the Physical Layer. UBICOM Corporation,2000
文章评论(0条评论)
登录后参与讨论