1. WebServer简介
Web Server就是提供Web服务的Server,主要功能是:存储、处理和传递网页给客户端,他只需支持HTTP协议、HTML文档格式以及URL,与客户端的网络浏览器配套。
其中,HTTP的协议就是基于TCP进一步实现的,所以跟之前学习的TCP协议是有一定相似之处的,例如发送请求和接收应答信号等。
Web服务器工作原理
这里都是通过HTTP协议,也就是在数据前面添加HTTP头部,服务器和客户端根据头部信息进行数据解析然后处理;这里的数据就都是html信息,而本次实验中的服务器就是我们的stm32开发板,这个html的网页信息都是预先存到MCU的FLASH之中的,通过服务器接收请求并根据HTTP协议的报文解析得到需要访问的网页,然后打开预存的文件,读取文件内容再次根据HTTP协议添加应答头部并发送回浏览器中,完成网页访问请求。
CGI技术简介
通用网关接口(Common Gateway Interface),这是一个Web服务器主机提供信息的标准接口。通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后把结果返回给客户端。
在通过HTTP协议接收到请求之后,就会通过CGI接口,获取客户端提交的信息,转交给CGI程序进行处理,产生数据后再次由CGI返回,添加应答头部信号传给客户端。
例如通过浏览器控制开发板的LED和蜂鸣器就是使用CGI技术来达成的。
SSI技术简介
Server Side Include,是一种类似于ASP的基于服务器的网页制作技术;大多是WEB服务器均支持SSI命令。将内容发送到浏览器之前,可以使用“服务器端包含(SSI)”指令将文本、图形或应用程序信息包含到网页之中。
SSI用在.shtml,.stm,.shtm文件中,以<!–#XXX–>的形式写在网页文件中,在服务器端接收到浏览器请求后,就会将网页文件中查找到的<!–#XXX–>替换成服务器中的Tag对应内容,然后连同网页数据一起发送给浏览器。
SSI用来从服务器获取数据!
SSI可以将数据发送到浏览器中进行显示,通过其格式显示开发板中采集的数据,并实时显示到网页中。与CGI相比,CGI只能控制开发板的一些外设进行工作,而数据的显示(也就是tag进行替换)还是要借助SSI。
2. WebServer实验
- 添加httpd协议:在工程下添加httpd.c文件;
- 使能CGI、SSI:配置SSI处理程序,配置CGI处理程序;
- 添加文件路径:添加…\Middlewares\lwip\src\include\lwip\apps路径;
- 网页数组制作:使用makefsdata工具制作网页。
上述最后一个宏,置0就是从fsdata.c中来获取网页信息;
httpd_init函数,就是先定义altcp_pcb结构体pcb,就是tcp的控制块,然后通过altcp_tcp_new_ip_type初始化pcb一个默认的IP地址,然后调用httpd_init_pcb进行初始化;这个函数通过altcp_bind,也就是tcp_bind把本地IP和端口号绑定到控制块上,然后调用altcp_listen,也就是tcp_listen开启监听,把开发板作为服务器,如果成功开启监听就调用altcp_accept,就是tcp_accept把控制块状态改为成功连接。
也就是说,httpd_init函数,实际上就是实现TCP的连接,把开发板作为服务器去监听浏览器,也就是客户端的传输情况。
httpd_ssi_init函数,在里面调用http_set_ssi_handler配置SSI句柄,把标签和数量都传入SSIHandler,这个标签,就是ppcTAGs,自定义了一个结构体,然后命名就是按照shtml中可被代替的标签变量一一对应来实现覆盖;而SSIHandler,就是一个处理函数,通过进入switch case之后,判断进入相应的任务的句柄并处理;
http_set_ssi_handler就是把SSIHandler传入的操作函数,其调用了一个函数指针来指向ssi_handler,然后会不断遍历标签,并通过传入的标签值进行替换。
httpd_cgi_init也类似,通过http_set_cgi_handlers传入ppcURLs和其数量完成操作;ppcURLs就是一个二维数组,把要对硬件做的操作对应上了例如“/leds.cgi”标签;LED和BEEP的操作,都是通过传入的pcParam进行比对,通过strcmp比对标签和标签的值,如果返回**==0为true那么就进行相应操作**。
总结
本讲主要讲述了怎么把CGI和SSI进行移植,然后通过开发板作为Web Server,PC上的浏览器作为客户端进行命令发布,然后开发板进行相应;CGI就是可以操作开发板上的BSP,而SSI则可以实时去更新浏览器上的标签(学过前端,比如qt能好理解一点),然后完成图像的更新。