바로 전 포스팅에서는 버튼으로 AP모드와 STATION모드를 전환했는데
보통은 AP모드에서 어플로 접속하여 SSID와 PW를 입력해서 공유기에 접속을 시킵니다.
첨에 안드로이드로 앱을 만들어 하였더니 글자가 깨지네요 ㅠ
인코딩이 안맞는지;;
할 수 없이 테스트는 PC에 wifi lan을 연결하여 docklight로 작업을 하였습니다.
이 부분이 ESP8266에 SSID와 PW를 전달해 주는 부분입니다.
ESP8266이 AP에 접속이 되면 서버에 접속하여 CDS의 상태를 전달해 줍니다.
위 그림의 밑줄부분이 ESP8266에서 SSID와 PW를 받은 부분이고, 밑의 dark는 cds의 상태입니다.
소스코드는 그 이전과 달라진 부분이별로 없습니다.
달라진 부분
1. 버튼을 하나로 통일하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | function readbutton() tmr.alarm(0,1000,1,function() key1=gpio.read(6) if(key1==0)then if(wifi.getmode()~=wifi.SOFTAP)then print("change ap mode") wifiap() end end end) end | cs |
버튼을 누르면 AP모드로 전환됩니다.
STATION모드로는 전환 할 필요가 없으니까요^^
AP모드에서 SSID와 PW를 받아 AP에 접속하는 부분입니다.
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 | function wifibroadcasting() tmr.stop(2) mac=wifi.ap.getmac() cfg={} cfg.ssid=mac wifi.ap.config(cfg) cfg2 ={} cfg2.ip="10.10.1.1" cfg2.netmask="255.255.255.0" cfg2.gateway="10.10.1.1" wifi.ap.setip(cfg2) bc = wifi.ap.getbroadcast() print("broadcasting! ") sv=net.createServer(net.TCP, 360) sv:listen(4000,function(c) c:on("receive",function(c,data) print(data) length=string.len(data) divchar=string.find(data,":") if(divchar~=nil)then conssid=string.sub(data,1,divchar-1) conpw=string.sub(data,divchar+1,length) wifistation() else print("not input ssid & password") end end) end) led(wifi.getmode()) end | cs |
기존 코드에서 Line 18~32 부분이 추가 되었습니다.
Line 18 : 서버를 만듭니다.
TCP나 UDP 타입과 타임아웃 시간을 넣어주면 됩니다.
Line 19 : Listen 모드로 들어갑니다.
Line 20 : receive 콜백함수입니다.
Line 21~26 : 받은 데이터(SSID와 PW)를 파싱합니다.
string.length(STRING) : string의 길이정보를 리턴합니다.
string.find(STRING,"찾을 문자열") :문자열의 시작과 끝위치를 리턴해 줍니다.
string.sub(STRING,시작,끝) : 문자열을 시작과 끝을 기준으로 자릅니다.
받은 문자열이 JEONGMIN2.4:jmc15201520이고, SSID가 ":"앞 부분, PW가 ":" 뒷부분입니다.
그리고 ":"를 기준으로 잘라서 SSID와 PW를 저장하는데 conssid와 conpw는 전역변수입니다.
1 2 | local conssid="" local conpw="" | cs |
Line 27 : station 모드로 전환합니다.
station모드에서는 ssid에 conssid를 pw에 conpw를 넣어줍니다.
connectserver함수입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function connectserver() tmr.stop(2) led(wifi.getmode()) print("connecting server") socket=net.createConnection(net.TCP, 0) socket:connect(5000,"192.168.0.101") socket:send("Hello") print("connected") tmr.alarm(3,5000,1, function() socket:close() socket=net.createConnection(net.TCP, 0) socket:connect(5000,"192.168.0.101") if(adc.read(0)<120)then socket:send("light\n") print("light") else socket:send("dark\n") print("dark") end end) end | cs |
서버에 연결이 되면 Hello를 먼저보내고, 5초마다 cds값을 전달합니다.
Line 10~21 : 이 부분이 새로 추가된 부분입니다.
타이머로 5초를 지정하였고, 앞서 서버로 데이터를 전달하고 Line 11에서 서버와 연결을 끊습니다.
Line 12~13 : 서버에 다시 접속을 합니다.
Line 14~20 : cds값을 읽어 결과를 서버로 보내줍니다.
adc를 읽는 함수는 adc.read(번호)입니다.
ADC는 nodeMCU에서 A0이라고 표기되어 있는 부분이고, 1개밖에 없어 adc.read(0)으로 읽으면 됩니다.
'Study > ESP8266(WIFI),ESP32(BLE,WIFI)' 카테고리의 다른 글
arduino에서 ESP8266 사용하기 (2) | 2015.12.23 |
---|---|
nodeMCU AP모드에서 공유기에 접속시키기2 (5) | 2015.12.21 |
AP모드-STATION모드 전환(nodeMCU using Lua) (4) | 2015.12.17 |
무한 리붓될때 해결방법 (nodemcu using Lua) (0) | 2015.12.17 |
ESP8266으로 간단한 통신하기(using Lua) (0) | 2015.12.15 |