HTTP属于高级的应用协议了,为了使用这种高级协议,你必须加载整个协议栈才能实现,从底层的PHY,到MAC,ARP,IP,TCP/UDP,最后才是HTTP,如果要支持PING还得加载IGMP。最好是直接使用现成的库,STM32的库里应该是有TCP/IP V4的包可以用的。用了库以后,只要设置好网络地址,就可以着手HTTP的操作了。HTTP,就是通过TCP连接方式进行通信的一个协议。学习它的协议头格式,可以完成与浏览器的交互,另外要想做出精美的网页,还得会HTML和CSS,要快速入门,需要会的东西也挺多的。要准确的回答你的问题也挺难的,毕竟这里都不是一两句话能说清楚的东西,只能大概给你搭了一个架子。
细节上来说,我就只介绍一下WEB控制硬件的核心重点:
例如,你要用按钮控件来开灯,那么你在HTML页面中可能会写如下的代码:
<form method="POST" action="ProcessLED">
<input type="submit" name="LED" value="开灯" />
</form>
其中method选择了POST方式,就是隐含提交的,但是这会在HTTP头中附带的POST参数集中看到表单中所有的项目,此例中则会看到有“LED=开灯”这样的数据(HTTP头上还有很多其它信息,我这里只是强调数据中包含这一信息),然后,你的程序就根据读取到的这一信息来处理打开LED灯的硬件操作,怎么打开LED会单片机应该就知道如何做,不详细讲了。然后因为灯已经开了,并且POST页面提交后实际上是转向action后所指的ProcessLED页面的(在单片机页面上,其实这只是一个标识,只在有文件系统时这才对应一个文件,WEB是根据URL串来区别给出什么回应的),那么既然灯已经是开着的了,那如果要回到刚才那个控制灯的页面上的话,显然不能再显示“开灯”了,所以这里在WEB上要做2件事,第一件事是在ProcessLED的页面中要发送返回的命令,不过我们假设开灯操作不只是一个IO打开,而是要用串口发送给一个下位机去处理带地址控制的多个LED灯之一,那么如果使用重定向直接扔回之前的开关控制页面就是不明智的了,因为重定向很快,甚至还没有来得及得到灯的回应。万一你发送了开灯命令下去,灯超时了,并没有返回ACK之类的状态消息呢?所以这里建议做成阻塞之的,就是说,ProcessLED页面上,先显示一个“正在开灯...”的提示,因为WEB是一次性加载的,不能实时运行,所以需要通过JS或定时刷新的HTTP头来实现页面重载,在ProcessLED页面里内嵌一个用来守候并检测状态的子框架,子框架里读取开灯的结果,并使用JS(可能涉及AJAX的概念,具体请参考相关教程,这里不讲太深)来回调至浏览器前台,如果开灯失败,则可以通过top.location.href扔到报错页上,如果你的系统能够知道原因,还可以在那里写下失败的原因,例如“您要开的灯在5秒内没有回应主机的请求,开灯失败,请检查远端LED灯是否已经上电。”
如果成功了呢?可以先alert一个消息告诉用户“开灯成功”,然后就是我刚才说的2件事中的第2件了,重新显示控制灯的页面(也就是前面给出代码的那个页)时,value就不能再是“开灯”了,因为灯已经开着了,你要再操作它,显然是关灯对不对?没错,所以这里要改成关灯。而ProcessLED再收到这个按钮事件时,因为值是关灯,所以操作也不同了,大致同开灯的操作,不再重复介绍。
这大概就是使用HTTP协议来控制硬件的一个Flash The LED例程文字版吧~