#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的頭部,這一步是必須的。