基于TCP/IP硬件协议栈的嵌入式HTTP服务器设计与实现
2019-01-30汪海兵董天宝
汪海兵, 董天宝
(国防科技大学 电子对抗学院, 安徽 合肥 230037)
0 引 言
第四次工业革命以互联网为核心,使传统行业与互联网紧密结合,推进工业系统实现智能化。工业领域低成本高可靠性地接入互联网?目前有基于通用个人电脑、基于ARM9嵌入式系统和基于ARM7单片机小系统三种方案,其中基于单片机的小系统以其低复杂度、高可靠性和低成本、低功耗等优点成为入网的最佳选择。联网通信协议有UDP、TCP和HTTP三种,HTTP协议通过IE浏览器即可通信,不需要开发上位机软件,更灵活。
目前基于单片机的入网方案大部分基于专用网络协议芯片[1-4]只实现以太网MAC层和物理层(PHY),单片机需要实现TCP/IP软件协议栈,一般配合UCOSII操作系统才能完成网络调度,代码量大,复杂度高,影响系统的稳定性。
本文提出基于wiznet公司全硬件协议栈W5200芯片[5]2和STM32F103RET单片机[6-7]的嵌入式HTTP服务器设计方案。W5200芯片是业界首款实现TCP/IP全硬件协议栈的网络控制器,不仅实现了以太网MAC层和PHY层,还以硬件方式支持TCP、UDP、ICMP、ARP、IGMP和PPPOE等协议,单片机通过SPI接口配置W5200的工作参数,控制W5200的工作状态机跳转,即可实现网络通信,而不必实现TCP/IP软件协议栈。
1 硬件设计
嵌入式HTTP服务器的总体设计如图1所示。STM32单片机内置一个小型网站,在IE浏览器中输入服务器的IP地址即可打开登录网页,输入正确的用户名和密码进入操作界面,对入网设备进行远程读写数据操作,从而实现入网设备接入互联网的功能。
图1 嵌入式HTTP服务器总体方案
网络芯片采用wiznet公司的W5200芯片,主控单片机采用意法半导体公司STM32F103RET芯片,板上存储器采用W25X64芯片,可用于存储采集的数据与系统运行日志。W5200电路连接如图2所示,与单片机连接关系如表1所示。其他电路设计可以参考器件手册。
图2 W5200硬件设计
2 软件设计
2.1 TCP/IP协议栈实现
TCP/IP协议栈具有层次结构,分层如图3所示。HTTP服务器协议从逻辑角度看属于应用层,传输协议采用HTTP超文本协议,在数据包组织上,HTTP数据位于传输层TCP帧的数据区内,而TCP帧位于网络层IP帧的数据区内,IP帧位于链路层MAC帧的数据区内。要获取HTTP数据包,必须实现链路层、网络层和传输层的网络协议,这在本方案中全部由具有硬件协议栈的网络芯片W5200在单片机的控制下自动完成,并将提取的应用层HTTP数据包发送给单片机处理。单片机只需要实现应用层的HTTP数据包协议,这大大减轻了单片机的代码量,提高了系统稳定性[5]3。
表1 W5200与单片机STM32F103RET连接对应关系
图3 TCP/IP协议栈分层与实现方式
2.2 W5200驱动开发
由2.1节可知,网络芯片W5200需要在单片机的控制下才能正确工作,具体是指单片机要通过SPI接口将网络参数写入W5200的相关寄存器,并将工作模式设置为TCPServer模式[5]33。有关寄存器地址[5]10如表2所示,据此开启TCP服务后,单片机需要实时监测W5200套接字的状态,并控制其按照图4所示跳转[5]25。注意这个循环需要实时监测的,即放在主程序的while(1)循环内部执行。图4中的函数“Proc_http_frame()”是HTTP协议实现函数,将在下节具体分析。
图4 W5200的TCP服务器套接字状态机跳转
2.3 交互式HTTP网页的实现
完成2.2节W5200驱动程序开发后,单片机就可以与远程IE浏览器之间收发HTTP超文本数据包了,相关功能封装在图5中的函数“Proc_http_frame()”中。
表2 W5200驱动程序相关寄存器地址
本文设计的嵌入式HTTP服务器内置一个小型网站,网页使用Adobe DreamweaverCS6进行制作,交互方式主要是通过公共网关接口(Common Gateway Interface,CGI)来完成。CGI 是外部应用程序与HTTP服务器之间传递信息的接口标准,允许HTTP服务器执行外部程序,并将它们的输出发送给HTTP浏览器。绝大多数的 CGI 程序被用来解释处理来自表单的输入信息,并在服务器产生相应的处理,或将相应的信息反馈给浏览器[8]。
以登录界面为例,在Dreamweaver中设置如下:登录按钮事件属性"LOGIN.CGI" ,方法属性"post",用户名编辑框名称为“username”,密码编辑框名称为“password”。在IE浏览器中输入正确的用户名和密码后,点击登录按钮,单片机端收到HTTP请求数据包含有“POST /LOGIN.CGI HTTP/1.1” 关键字,后续报文包含具体的用户名、登录密码和按钮信息:“path=/username=admin&password=admin&button=%E7%99%BB%E5%BD%95”,据此判断事件为用户登录请求,搜索用户名和密码信息,判断是否允许登录,密码错误,则根据HTTP超文本协议,生成登录错误网页的超文本数据包,使用TCPSend()函数发送给上位机,上位机的IE浏览器收到数据包后,显示如图5所示。
图5 单片机回传的登录错误超文本数据包在上位机IE浏览器显示效果
另外本文还设计了修改登录密码界面、远程输出数据和远程读取数据界面,具体效果见2.4小节。
2.4 烧录HTTP网页
由于网页源文件不能直接放到 STM32 里面,所以要做一个转换,本文使用“ROMFILEMaker.exe”工具将HTTP服务器的网页源文件转换成二进制文件。首先点击“Add Files”选择所需网页文件,然后点击“Make Image”。该软件可从http://www.wiznet.co.kr/en/ 网站下载。然后将该网页文件拼接到单片机固件的后面,一起烧录到STM32单片机内部存储器中,同时在单片机程序中记录网页存储的起始字节地址,HTTP服务器程序在访问内嵌的服务器网页时,就从该地址开始搜索。
3 系统演示
HTTP服务器硬件实物如图6所示。远程读取数据示例如图7所示。
图6 HTTP服务器实物
4 结束语
本文设计实现了基于硬件协议栈的单片机HTTP服务器,利用HTTP超文本协议中的CGI技术设计了交互式网页,并通过IE浏览器进行了远程登录和远程读写操作,取得了预期效果,为各种入网设备低成本、低复杂度和高可靠性地接入互联网提供了一个通用的解决方案。
图7 远程读取数据