วันอังคารที่ 3 มีนาคม พ.ศ. 2558

ESP8266 GPIO Http Server

ในบทความนี้จะต่อจากครั้งที่แล้วโดยจะใช้ ESP8266-01 เป็นตัวทดสอบ

เราใจใช้ GPIO0(3) กับ GPIO2(4)


ซึ่งผมได้ปรับปรุง Codeจากครั้งที่แล้วเพื่อให้สามารถควบคุมการทำงานของ GPIO ได้

Source Code

gpio.mode(3,gpio.OUTPUT)
gpio.mode(4,gpio.OUTPUT)
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)

    gpio3 = 'ON'
    gpio4 = 'ON'
    if (gpio.read(3) == 1) then
       gpio3 = 'OFF'
    end
    if (gpio.read(4) == 1) then
       gpio4 = 'OFF'
    end
    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><style>input[type=submit] {font-size:large;width:8em;height:4em;}</style>\
     <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>ESP8266-01</h2><hr>\
     <form action="/digital/3/'..gpio.read(3)..'" method="POST">\
     <input type="submit" value="GPIO3 '..gpio3..'"/></form><br><br>\
     <form action="/digital/4/'..gpio.read(4)..'" method="POST">\
     <input type="submit" value="GPIO4 '..gpio4..'" /></form>\
     </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]=="digital") then
          local pin = tonumber(list[3]) 
          local status = tonumber(list[4]) 
          if (status == 1) then
               gpio.write(pin, 0)   
          else
               gpio.write(pin, 1)
          end  
          --print(gpio.read(pin))        
          index(conn)
      else
          notfound(conn)   
      end      
      conn:close() 
    end)
end)


อุปกรณ์ที่ใช้ในการทดสอย





Donate

วันจันทร์ที่ 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