#include "WProgram.h"
#include "WebServer.h"
#include "Ethernet.h"
#include "Dht11.h"
//网络模块的MAC地址
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//网络模块的IP地址
IPAddress ip(192, 168, 1, 15);
//web服务器监听80端口
WebServer server(80);
//定义Dht11对象
Dht11 dht11(DHT11_DATA_PIN);
//处理所有的get类型的HTTP请求
void httpGet(HttpRequestStream & request, HttpResponseStream & response)
{
String uri = request.getUri();
response.respOkHeader();
if(uri == "/demo.cgi")
{
//读取温湿度成功
if(dht11.read() == Dht11::OK)
{
response.println("The room temperature and humidity is as follows:");
//通过Web输出当前温湿度
response.print((String)"
Temperature:" + dht11.getTemperature() + (String)"℃");
response.print("Humidity:");
response.print(dht11.getHumidity());
response.println("%");
}
}
}
void setup()
{
//初始化Rainbow
boardInit();
//初始化默认串口
Serial.begin();
//对网络进行初始化
Ethernet.begin(mac, ip);
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
//设置get请求的回调函数
server.onGet = httpGet;
//开始进行监听
server.begin();
}
void loop()
{
//对http请求进行处理,事件派发等
server.processConnection();
}
int main()
{
setup();
while(1) loop();
}
由于通过c++进行了封装,使得可以用区区几十行代码实现了一个能够读取温湿度并通过浏览器展示出来的应用。为了使Rainbow成为一个webserver,需要按照下列步骤进行:
1、给Rainbow设定ip地址
2、定义WebServer对象,并设定webserver的监听端口:WebServer server(80);
3、定义get或post请求的处理函数,函数的原型为:
void httpGet(HttpRequestStream & request, HttpResponseStream & response)
void httpPost(HttpRequestStream & request, HttpResponseStream & response)
方法名可以自定,但是参数必须是HttpRequestStream 和 HttpResponseStream,分别代表浏览器发来的请求流和输出流,通过请求流可以获取请求的url、参数;通过输出流可以将结果输出到浏览器
4、将get或post请求函数传给webserver:server.onGet = httpGet;
5、开始进行webserver监听:server.begin();
6、调用server.processConnection()进行http请求的派发,根据请求的方法调用不同的处理函数,如:httpGet或者httpPost
本文介绍的这个webserver应用重点处理在doGet函数中,函数首先通过HttpRequestStream读取到url,再判断如果这个url是demo.cgi,则读取温湿度,通过HttpResponseStream中的方法输出到浏览器中。在HttpResponseStream输出内容之前,首先需要调用response.respOkHeader()来输出http的头部,这一步是必须的。