วันจันทร์ที่ 2 มีนาคม พ.ศ. 2558

ESP8266 Sample Http Server

ในบทความนี้จะกล่าวถึงการทำ web server อย่างง่าย ๆ ด้วย Lua Script กับ NodeMCU ซึ่ง web server จะทำงานอยู่บน TCP Transport Layer ฉนั้นเราจะต้องสร้าง Object Server ขึ้นมาก่อนโดยที่กำหนด Type เป็น TCP แล้วสั่งรับการ Connection จาก Client ที่ Port 80 srv:listen(80, func(conn)) เมื่อมีการร้องขอจาก Client (ในที่นี้หมายถึง Web Browser) ก็จะมาเข้าการทำงานที่ conn:on("receive", func(conn, payload))


ทีนี้สิ่งที่เราต้องใช้คือ payload ถามว่า payload คืออะไร? payload ก็คือ Request Header ที่ส่งมาจาก  Client (ในที่นี้หมายถึง Web Browser) ที่  Browser ถ้าเราพิมพ์ URL http://192.168.0.125 รูปแบบของ Request Header ก็จะได้ประมาณนี้ขึ้นอยู่กับ Browser แต่ละค่าย


แต่ถ้าเราพิมพ์ URL http://192.168.0.125/index.html  รูปแบบของ Request Header ก็จะได้ประมาณนี้


มาถึงตอนนีเราจะเห็นได้ว่าสิ่งที่เราสนใคอยู่ที่บรรทัดแรก ในตัวอย่างจะทำารสร้าง Page ขึ้นมา 2 Page

Index

About

ป้องกันการเรียน URL ผิดเราก็ต้อวมี Page Not Found

สิ่งที่สำคับของ web server คือการ Response Header เพื่อบอก Status ให้ Browser รู้ Status Code จะมีอยู่หลาย Code ในที่นี้จะยกมาให้ดู 2 Code

  • HTTP/1.1 200 OK
  • HTTP/1.1 404 Not Found
Response Status 200

Response Status 404

Lua Script


function split(s, delimiter)
    result = {};
    for match in (s..delimiter):gmatch("(.-)"..delimiter) do
        table.insert(result, match);
    end
    return result;
end
function urldecode(payload)
    result = {};
    list=split(payload,"\r\n")
    list=split(list[1]," ")
    list=split(list[2],"\/")
    table.insert(result, list[1]);
    table.insert(result, list[2]);
    table.insert(result, list[3]);
    return result;
end

function index(conn)
    conn:send('HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nCache-Control: private, no-store\r\n\r\n\
     <!DOCTYPE HTML><html><head>\
     <meta content="text/html;charset=utf-8"><title>ESP8266</title>\
     <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">\
     <body bgcolor="#ffe4c4">\
     <h2>Page Index</h2><hr>\
     </body></html>')
end
function about(conn)
    conn:send('HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nCache-Control: private, no-store\r\n\r\n\
     <!DOCTYPE HTML><html><head>\
     <meta content="text/html;charset=utf-8"><title>ESP8266</title>\
     <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">\
     <body bgcolor="#ffe4c4">\
     <h2>Page About</h2><hr>\
     </body></html>')
end
function notfound(conn)
     conn:send('HTTP/1.1 404 Not Found\r\nConnection: keep-alive\r\nCache-Control: private, no-store\r\n\r\n\
          <!DOCTYPE HTML>\
         <html><head><meta content="text/html;charset=utf-8"><title>ESP8266</title></head>\
          <body bgcolor="#ffe4c4"><h2>Page Not Found</h2>\
          </body></html>') 
end

srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
    conn:on("receive",function(conn,payload)
      print("Http Request..\r\n")
      print (payload)
      list=urldecode(payload) 
      if ((list[2]=="") or (list[2]=="index.html")) then 
          index(conn)     
      elseif (list[2]=="about.html") then 
          about(conn)  
      else
          notfound(conn)   
      end      
      conn:close()
    end) 
end)

หวังเป็นอย่างยิ่งว่าคงจะมีประโยชน์ไม่มากก็น้อย บทความหน้าจะมาควบคุม GPIO กัน

Donate

1 ความคิดเห็น: