ESP8266 & NodeMCU 開發入門 (Part 2) - 實作 HTTP Server

既然 ESP8266 與 NodeMCU 是 WiFi MCU 類型的 IoT 裝置,WiFi 功能自然是優先要介紹的主題了。

NodeMCU 網路連線

要讓 NodeMCU 上網,就必須使用 Node MCU 的 WiFi API

Step 1:設定 WiFi 模式

將 NodeMCU 設定為 wifi.STATION 模式,也就是 WiFi 用戶端模式(Client):

wifi.setmode (wifi.STATION)  

Step 2:指定 SSID 與密碼

呼叫 wifi.sta.config() 設定要連接的 WiFi 基地台名稱與密碼,函數用法如下:

wifi.sta.config("SSID", "PASSPHRASE")  
  • 第 1 個參數:基地台名稱
  • 第 2 個參數:連線密碼

範例:

wifi.sta.config ("jollenchen", "qqqqqqqq")  

Step 3:使用自動連線

呼叫 wifi.sta.autoconnect() 連線至 WiFi 基地台:

wifi.sta.autoconnect(1)  
  • 第 1 個參數:填寫 1 表示要使用自動連線

Step 4:建立 Server

呼叫 net.createServer() 來建立 Network Socket 的 Server 端,函數用法如下:

net.createServer(type, timeout)  
  • 第 1 個參數:net.TCP 或 net.UDP,指定通訊協定類型
  • 第 2 個參數:如果是 TCP server 的話,可指定 timeout 值,範圍為 1~28800(秒)

Timeout 指的是當 Client 端沒有動作時,自動斷線的等候時間。

範例:

sv = net.createServer(net.TCP, 30)  

Step 5:進入 Listening 模式

呼叫 net.server:listen() 進入 Listening(等待連線)模式,函數用法如下:

net.server.listen(port,[ip],function(net.socket))  
  • 第 1 個參數:指定 Port 編號
  • 第 2 個參數:等待特定 IP 位址的連線,不填寫表示等待任何 IP 位址的連線
  • 第 3 個參數:一個 Callback Function,成功建立與 Client 端的連線後呼叫

範例:

sv:listen(80,function(c)  
end)  

在這個步驟裡,我們看到了 Lua 的 Callback Function 用法。後續的 NodeMCU 教學,將會看到許多 Callback Function 的寫法,甚致是非常 Node.js 風格的 Callback Function 用法。

Step 6:事件處理

延續 Step 5,Callback Function 收到一個 net.socket 的物件。net.socket 使用事件處理(Event Handling)的方式,處理網路的連線狀態。

使用 net.socket.on() 來註冊連線事件,函數用法如下:

on(event, function cb())  

第 1 個參數是事件名稱,可指定的事件如下:

  • "connection"
  • "reconnection"
  • "disconnection"
  • "receive"
  • "sent"

第 2 個參數是處理事件的 Callback Function,原型宣告如下:

function cb(net.socket, [string])  

例如,處理 receive 事件的寫法如下:

sv:listen(80,function(c)  
    c:on("receive", function(sck, c)
        print(c) 
    end)
end)  

當 NodeMCU 接收(receive)到資料時,我們就在 Callback Function 裡將資料印出來。

完整 HTTP Server 範例

根據上述步驟,可以在 NodeMCU 裡實作一個非常簡單的 HTTP Server。完整程式碼列表如下:

-- Print IP address
ip = wifi.sta.getip()  
print(ip)

-- Configure the ESP as a station (client)
wifi.setmode(wifi.STATION)  
wifi.sta.config("jollenchen", "qqqqqqqq")  
wifi.sta.autoconnect(1)

-- Create a server
-- and set 30s time out for a inactive client
sv = net.createServer(net.TCP, 30)

-- Server listen on 80
-- Print HTTP headers to console
sv:listen(80,function(c)  
    c:on("receive", function(userdata, headers)
        print(headers) 
    end)
end)  

執行後,NodeMCU 就會成為一個 HTTP Server 裝置。我們可以使用 curl 來測試,在 Host 端執行以下指令:

$ curl -I http://172.20.10.2/

就可以在 ESPlorer 訊息視窗看到 curl 送出的 HTTP headers,如圖 1.2。

圖 2.1:執行結果 圖 2.1:執行結果

要測試 NodeMCU 的 HTTP Server 功能,就要知道 NodeMCU 的 IP 位址。上述範例呼叫 wifi.sta.getip() 來取得 IP 位址。

課堂練習

基於上述範例,以及 ESP8266 & NodeMCU 開發入門 (Part 1) - Hello World 的內容:開發一個可使用瀏覽器燈亮 LED 點的物聯網系統。

小結

學習讓 NodeMCU 透過 WiFi 上網是基本功,在 NodeMCU 裡實作一個小型的 HTTP Server 則是第一堂課。

後續教學將改用 Lua 的 HTTP 模組來開發 HTTP Server,並開始學習 Node.js 風格的程式碼寫法。

其它