본문 바로가기
Study/ESP8266(WIFI),ESP32(BLE,WIFI)

nodeMCU AP모드에서 공유기에 접속시키기

by Answer Choi 2015. 12. 18.
반응형

소스코드



바로 전 포스팅에서는 버튼으로 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)으로 읽으면 됩니다.






반응형

인기글