#include "WProgram.h"
#include "WebServer.h"
#include "Ethernet.h"
#include "Dht11.h"
//網(wǎng)絡(luò)模塊的MAC地址
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//網(wǎng)絡(luò)模塊的IP地址
IPAddress ip(192, 168, 1, 15);
//web服務(wù)器監(jiān)聽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輸出當(dāng)前溫濕度
response.print((String)"
Temperature:" + dht11.getTemperature() + (String)"℃");
response.print("Humidity:");
response.print(dht11.getHumidity());
response.println("%");
}
}
}
void setup()
{
//初始化Rainbow
boardInit();
//初始化默認(rèn)串口
Serial.begin();
//對網(wǎng)絡(luò)進(jìn)行初始化
Ethernet.begin(mac, ip);
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
//設(shè)置get請求的回調(diào)函數(shù)
server.onGet = httpGet;
//開始進(jìn)行監(jiān)聽
server.begin();
}
void loop()
{
//對http請求進(jìn)行處理,事件派發(fā)等
server.processConnection();
}
int main()
{
setup();
while(1) loop();
}
由于通過c++進(jìn)行了封裝,使得可以用區(qū)區(qū)幾十行代碼實(shí)現(xiàn)了一個(gè)能夠讀取溫濕度并通過瀏覽器展示出來的應(yīng)用。為了使Rainbow成為一個(gè)webserver,需要按照下列步驟進(jìn)行:
1、給Rainbow設(shè)定ip地址
2、定義WebServer對象,并設(shè)定webserver的監(jiān)聽端口:WebServer server(80);
3、定義get或post請求的處理函數(shù),函數(shù)的原型為:
void httpGet(HttpRequestStream & request, HttpResponseStream & response)
void httpPost(HttpRequestStream & request, HttpResponseStream & response)
方法名可以自定,但是參數(shù)必須是HttpRequestStream 和 HttpResponseStream,分別代表瀏覽器發(fā)來的請求流和輸出流,通過請求流可以獲取請求的url、參數(shù);通過輸出流可以將結(jié)果輸出到瀏覽器
4、將get或post請求函數(shù)傳給webserver:server.onGet = httpGet;
5、開始進(jìn)行webserver監(jiān)聽:server.begin();
6、調(diào)用server.processConnection()進(jìn)行http請求的派發(fā),根據(jù)請求的方法調(diào)用不同的處理函數(shù),如:httpGet或者h(yuǎn)ttpPost
本文介紹的這個(gè)webserver應(yīng)用重點(diǎn)處理在doGet函數(shù)中,函數(shù)首先通過HttpRequestStream讀取到url,再判斷如果這個(gè)url是demo.cgi,則讀取溫濕度,通過HttpResponseStream中的方法輸出到瀏覽器中。在HttpResponseStream輸出內(nèi)容之前,首先需要調(diào)用response.respOkHeader()來輸出http的頭部,這一步是必須的。