사물인터넷(IoT)2016. 7. 6. 16:24

이번에는 NodeMCU Lua 를 사용해서 간단한 웹서버를 만들어보고 브라우저로 웹서버로 접속해서 응답을 얻어보겠습니다. 웹서버를 만들기 위해서는 'NodeMCU Lua 사용해보기 #5 - 인터넷에 연결해보기' 를 먼저 공부해야 합니다. 인터넷에 연결이 되어 있어야 웹서버가 동작 하니까요. 일단 간단하게 브라우저에서 ESP8266 장치로 요청을 보내면 장치가 준비된 HTML 을 브라우저로 응답을 보내주는 형식 입니다.


NodeMCU 펌웨어가 설치된 ESP8266 장치를 PC에 연결 하고 ESPlorer 를 실행 합니다. Open 을 눌러서 PC와 통신 가능 상태로 만들어 줍니다.


웹서버 기능은 총 3개의 Lua 파일로 만들었습니다. 와이파이 연결 정보를 담고 있는 credentials.lua, 인터넷 연결을 해 주는 init.lua, 그리고 웹서버의 역할을 해 주는 webserver.lua 의 3개 파일로 구현 할 수 있습니다.


■ credentials.lua


1
2
3
4
-- WiFi Connect information
SSID = "와이파이 이름"
PASSWORD = "와이파이 패스워드"
 
cs


위와 같이 와이파이 연결 정보를 SSID, PASSWORD 변수에 담아 두는 소스 입니다.


■ init.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
-- load credentials, 'SSID' and 'PASSWORD' declared and initialize in there
dofile("credentials.lua")
 
function startup()
    if file.open("init.lua"== nil then
        print("init.lua deleted or renamed")
    else
        print("Running")
        file.close("init.lua")
        -- the actual application is stored in 'application.lua'
        dofile("webserver.lua")
    end
end
 
print("Connecting to WiFi access point...")
wifi.setmode(wifi.STATION)
wifi.sta.config(SSID, PASSWORD)
wifi.sta.connect()
tmr.alarm(110001, function()
    if wifi.sta.getip() == nil then
        print("Waiting for IP address...")
    else
        tmr.stop(1)
        print("WiFi connection established, IP address: " .. wifi.sta.getip())
        print("You have 3 seconds to abort")
        print("Waiting...")
        tmr.alarm(030000, startup)
    end
end)
 
cs


init.lua 파일은 ESP8266 이 부팅 시 가장 먼저 실행하는 파일 입니다. 이 파일에 인터넷 연결 소스를 작성 합니다. 와이파이 연결에 credentials.lua 의 내용을 dofile("credentials.lua")  부분을 통해서 참조하게 되고 와이파이에 연결 합니다. 와이파이 연결 후 startup() function을 call 하고 startup() 은 실행 후 dofile("webserver.lua") 을 통해서 webserver.lua 파일을 실행하게 됩니다. 


■ webserver.lua

1
2
3
4
5
6
7
8
9
10
-- a simple HTTP server
srv = net.createServer(net.TCP)
srv:listen(80, function(conn)
    conn:on("receive", function(sck, payload)
        print(payload)
        sck:send("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1> Hello, NodeMCU.</h1>")
    end)
    conn:on("sent", function(sck) sck:close() end)
end)
 
cs


웹서버로 브라우저의 요청이 오면 가지고 있던 HTML 을 응답으로 내어주는 가장 간단한 형태의 웹서버 구현 입니다. 


HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1> Hello, NodeMCU.</h1>


위의 HTML 코드를 브라우저로 보내 줍니다. 그리고 브라우저에서는 웹서버에서 응답받은 내용을 브라우저에 표시해 주겠죠. 그리고 위의 소스를 보면 srv:listen(80, function(conn)  부분이 있습니다. 


여기에서 80은 웹서버의 서비스 포트 입니다. 80은 기본 웹서비스 포트로서 브라우저 URL 입력창에 포트 번호를 붙이지 않아도 됩니다. 만약 포트를 80이 아니라 8080 같은 포트로 설정하면 URL 마지막에 포트 번호를 표기 해야 합니다. 예를 들면 http://192.168.0.18:8080 이런 식으로 주소를 적어야 합니다. 혹시나 가정용 인터넷을 이용할 경우에는 80포트를 인터넷 회사에서 사용하지 못하도록 막아 놓는 경우도 있기 때문에 8080, 8088... 등 다른 포트를 이용해서 외부에서 연결을 설정 하기도 합니다. 



위와 같이 3개의 소스 파일을 ESPlorer 에서 작성하고 Save to ESP 버튼을 눌러서 ESP8266 보드에 업로드 해 줍니다. 업로드 순서는 init.lua 파일을 가장 나중에 업로드 해 주시면 됩니다. 왜냐하면 업로드 후 자동으로 실행이 되는데 나머지 2개의 파일을 찾지 못하면 에러를 내기 때문에 그렇습니다. 업로드 후 Reset 버튼을 눌러서 Soft Reset 해 봅니다. 보드가 다시 시작 하면서 init.lua 를 자동으로 실행하게 되고 위와 같이 192.168.0.18 이라는 IP를 잡고 웹서버가 실행이 됩니다. 고로 웹서버의 IP 가 접속주소가 됩니다.


브라우저를 하나 열고 제대로 ESP8266에서 작동 중인 웹서버가 제대로 응답을 주는지 확인해 봅니다.


PC의 브라우저를 열고 웹서버 주소인 192.168.0.18 로 연결해 보았습니다. 응답을 잘 주고 있습니다.


PC뿐 안니라 스마트폰의 브라우저 에서도 웹서버 연결이 잘 됩니다.


이상으로 NodeMCU Lua를 이용해서 ESP8266 보드에서 간단한 웹서버를 구현해 보았습니다.  간단하지만 센서값을 인터넷을 통해 보여주거나 반대로 외부에서 ESP8266에 연결된 장치 들을 콘트롤 할 수 있는 기초가 마련된 것 입니다.




▶ 추가사항 (2016.07.25) : http://orasman.tistory.com/358 여기에 위의 소스의 개선점을 트랙백으로 올려 주셨네요. 서버가 닫히지 않았을 경우 닫아주는 소스가 추가 되었습니다.

반응형
Posted by 대네브 (deneb)

댓글을 달아 주세요