Pada tulisan ini saya mencoba melakukan eksplorasi lanjutan setelah sebelumnya membuat Telnet Server yang digunakan untuk mengemulasikan console NodeMCU Lua yang dilengkapi dengan perintah ls, sntp dan time. Pada bagian ini kita mencoba membuat Web Server mini yang nantinya dapat mengendalikan LED BUILTIN dengan menggunakan klik pada button ON atau OFF.
Secara umum pembuatan server web adalah tidak berbeda dengan telnet server, yang membedakan keduanya adalah nomor port yang digunakan, jika telnet server melakukan listen pada port 23, maka http server adalah melakukan listen pada port 80. Berikut ini adalah source code yang saya adaptasi dari berbagai sumber dari internet.
app.lua
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
position = "off" function led_builtin(position) gpio.mode(4, gpio.OUTPUT) if (position == "on") then gpio.write(4, gpio.LOW) -- LED BUILTIN ON else gpio.write(4, gpio.HIGH) -- LED BUILTIN ON end end function receive(conn, payload) --debug print(payload) -- extra path and variables local _,_,method,path,vars = string.find(payload,"([A-Z]+) (.+)?(.+) HTTP") if(method==nil) then _, _, method, path = string.find(payload,"([A-Z]+) (.+) HTTP") end -- extract the variables passed in the url local _GET = {} if (vars~=nil) then for k,v in string.gmatch(vars,"(%w+)=(%w+)&*") do _GET[k] = v --debug print(k .. ":" .. v) end if (_GET['led'] ~= nil) then position = _GET['led'] end end -- turn led ON/OFF led_builtin(position) local content="<!DOCTYPE html>" .. "<html>" .. "<head>" .. "<link rel='icon' type='image/png' href='http://nodemcu.com/favicon.png' />" .. "</head>" .. "<body>" .. "<h1>LED BUILTIN is " .. position .. "</h1>" .. "<p>" .. "<a href='?led=on'><button>on</button></a>" .. "<a href='?led=off'><button>off</button></a>" .. "</p>" .. "</body>" .. "</html>" local contentLength=string.len(content) conn:on("sent", function(sck) sck:close() collectgarbage() end) conn:send("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length:" .. contentLength .. "\r\n\r\n" .. content) end function connection(conn) conn:on("receive", receive) end -- check whether server is already started if srv~=nil then print("stop existing server...") srv:close() print("OK") end -- start a new server print("start a new server ...") srv=net.createServer(net.TCP, 1) srv:listen(80, connection) print("OK") |
Gambar 1. Verbose Web Server pada Esplore
Gambar 2. Turn LED BUILTIN ON/OFF via Web