单片机嵌入式Internet技术的Web应用实现. 下载本文

内容发布更新时间 : 2024/7/6 22:56:03星期一 下面是文章的全部内容请认真阅读。

单片机嵌入式Internet技术的Web应用实现

2.2 uIP驱动底层网络设备RTL8019AS uIP是一个仅包含3层网络层核心协议的协议栈,uIP自身不包含任何类型的底层网络驱动和上层应用程序,它只提供接口函数供用户开发使用。因此为了完成与底层网络设备的交互,用户必须根据网络设备的类型,在uIP中自行实现对底层网络设备的驱动。本文采用的网络设备是RTL8019AS网卡,因此需要在uIP中实现对

RTL8019AS网卡的驱动[4]。 RTL8019AS驱动程序包括:RTL8019AS芯片初始化、芯片复位以及数据的发送和接收。RTL8019AS芯片初始化可以通过初始化函数void init_8019(void)完成。芯片复位通过芯片上的RSTDRV引脚执行复位操作,该引脚高电平有效。

3 单片机上嵌入式Web服务器的软件实现 3.1 Web服务器的建立 在进行以上的工作之后,用户就可以建立Web服务器,通过uIP协议实现不同的微控制器或工作站之间的通信。Web服务器和客户端浏览器间的通信采用HTTP协议。嵌入式系统经常需要根据用户的指令,采集系统的当前数据信息传送给客户端浏览器,为实现这种客户端浏览器和Web服务器的动态交互,需要在服务器端采用通用网关接口CGI(Common Gateway Interface)技术。CGI是一个在服务器上运行的程序,它分析处理用户发送到服务器上的数据信息,完成动态文件资源的创建和处理,再将用户信息返回给客户端。 Web服务器初始化完成后,服务器等待客户端的连接请求,客户端浏览器输入服务器的IP地址后发一个物理地址解析协议(ARP)请求包,服务器收到后进行应答。客户端收到应答包后发送超文本传输协议(HTTP)包,服务器收到HTTP包后开始建立与客户端的TCP连接并作出对此包的响应。客户端收到响应包后即断开连接,服务器侦测到客户端断开了连接也同时断开连接。 3.2 Web服务器数据处理流程 当系统的网卡接收到从网络传送来的数据包后,首先分析目的地址是否与自己的物理地址一致,如果不一致,则丢弃此包;如果一致,则读取网络数据并分析。如果是ARP请求包,则转入ARP处理程序,并发送一个ARP应答包给客户端。如果是IP包,则交由IP层处理,同时去掉以太网首部[4-5]。IP层根据IP首部的协议字段分析该IP包属于什么数据包,如果是UDP包则,丢弃;如果是ICMP请求包,则发送一个ICMP应答包给客户端;如果是TCP包且IP地址和端口号正确,则接收数据包,数据解包后,将数据部分通过串口输出,控制

MAX232现场设备。反之,如果现场通过串口发送数据到单片机,单片机将数据按照TCP协议格式打包,送入RTL8019AS,由RTL8019AS将数据发送到局域网中。根据需要还可以在收到串口数据时,先完成数据预处理,再将处理好的数据送到局域网。具体的处理过程如图2所示。 3.3 单片机上的Web服务器编程 uIP协议栈提供了一个称为宏的UIP_APPCALL的应用程序接口供用户设计应用程序时使用[4]。要在单片机上实现Web Server服务,首先将该宏定义为一个应用程序函数名,然后在此函数中实现HTTP协议。完成后,用户可以从局域网内的任何客户机访问该单片机Web服务器。如果分配一个公网IP地址,则也可以从Internet上访问此Web服务器。实现的程序如下: #define UIP_APPCALL uip_http /*定义宏UIP_APPCALL为uip_http的应用程序函数*/ void uip_http(void) /*开始实现http协议建立Web服务器*/ {struct uip http_state*s; s=(struct uip app_state*)uip_conn->appstate;

if(uip_connected()) {… /*打开连接接口函数,开始一个新的应用程序连接

*/ } if(uip_newdat()||uip_rexmit()) /*接收数据接口或重发数据接口函数,应用程序发送数据*/ {if(uip_datalen()>0) /*判定数据的大小接口函数 {if(uip_conn->lport==80) /*收到新连接端口号为80的请求,此即http应用*/ {update_table_data(); s->dataptr=newpage; s->dataleft=1957; uip_send(s->dataptrs->dataleft); /*发送上述http应用数据*/ } } } if(uip_acked()) /*返回ACK数据确认接口函数*/ {if(s->dataleft>uip_mss()&&uip_conn->lport==80) {s->dataptr+=uip_conn->len; s->dataleft-=uip-conn->len; uip_send(s->dataptrs->dataleft); } return; } if(uip_poll()) {… /*轮询接口函数用于轮询各个客户端发起的连接*/ return; } if(uip_timedout()|| /*判断连接是否超时*/ uip_closed()|| /*关闭当前的连接*/ uip_aborted()) /*中断连接接口*/ {return;} }本篇文章共3页,此页为第二页 上一页 后页