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

ARDUINO PHP POST로 통신하기

by Answer Choi 2017. 11. 8.
반응형


앞서 소켓통신만을 했었는데, ESP8266으로 PHP를 이용한 WEB 통신도 가능합니다.


arduino 소스코드부터 보겠습니다.


esp8266을 ap-station모드로 변환하는건 앞선 포스팅을 참고하세요.


모두 제거하고 간단 소스만 올렸습니다.


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
IPAddress server{1921680102};
int serverport = 80;
WiFiClient Wificlient;
#define debug Serial
setup(){
    debug.begin(115200);    
    Wificlient.connect(server, serverport);
}
 
loop(){
 
    if(Wificlient.connected){
        String PostData="mac="+Wifi8266.softAPmacAddress();
        Wificlient.println("POST /esp8266/test.php HTTP/1.1");
        Wificlient.println("Host:  192.168.0.102");
        Wificlient.println("Content-Type: application/x-www-form-urlencoded;");
        Wificlient.print("Content-Length: ");
        Wificlient.println(PostData.length());
        Wificlient.println();
        Wificlient.println(PostData);
    } else {
        debug.println("connection failed");
        Wificlient.connect(server, serverport);
    }    
    delay(1000);
    while(Wificlient.connected()&&Wificlient.available()){
        String rcv=Wificlient.readStringUntil('\r');
        debug.println(rcv);
    }                
}
cs


Line : 1~2는 접속할 Web서버 정보입니다.


Web이기 때문에 port는 80이 default입니다.


Line 7 : 서버에 접속을 합니다.


Line 12~20 : 서버에 접속이 되어있으면 들어옵니다.


Line 13 : 보낼 데이터 입니다.


Line 14 : 전달방식 POST, php파일의 위치, 프로토콜을 지정합니다.


Line 15 : 서버의 주소입니다.(한번 더 적어줍니다.)


Line 16 : Content type( 그대로 적습니다.)


Line 17~18 : Content size(보낼 데이터 사이즈정보입니다.)


Line 20 : 보낼 데이터입니다.


Line 21~24 : 서버접속이 되어있지않으면 재접속합니다.


Line 26~29 : 서버로부터 받은 데이터를 디버그창으로 뿌려줍니다.


php 소스코드입니다.


마찬가지로 최대한 간추렸습니다.


1
2
$mac=$_POST['mac'];
print(time());
cs


Line 1 : ESP8266에서 보낸 data를 받는 부분입니다.(어떻게 쓸지는 코딩하시면됩니다.)


Line 2 : ESP8266으로 응답데이터를 보내는 부분입니다.


여기서는 시간정보(timestamp)를 보냅니다.



ESP8266에서 받은 데이터 입니다.


이 중 우리가 받을데이터는 가장 아래쪽에있는 1510107446입니다.


Content data는 가장 뒤에 나옵니다.


HTTP 프로토콜 정보가 그대로 프린트되어 원하는 데이터는 파싱을 해서 써야합니다.


그럼 원하는 데이터를 쉽게 파싱하기 위해 코드를 조금 수정해 줍니다.


PHP에서 파싱하기 쉽도록 구분문자를 넣어줍니다.


1
2
3
$mac=$_POST['mac'];
$data="t".time().",";
print($data);
cs


Line 2 : 저의 경우 timestamp 앞뒤로 't'와 ','를 넣었습니다.


ESP8266도 데이터를 수신하는 부분에서 아래와 같이 수정합니다.


1
2
3
4
5
6
7
8
9
while(Wificlient.connected()&&Wificlient.available()){
    char ch = Wificlient.read();            
    if(ch=='\n'){
        if(Wificlient.read()=='t'){
            String time=Wificlient.readStringUntil(',');
            debug.println(time);
        }
    }
}
cs


Line 2 : 받은 데이터를 한바이트씩 읽습니다.


Line 3: 만약 '\n'을 만나면 Line 4~7로 빠집니다.


Line 4~7 : '\n' 다음 바이트가 't'이면 데이터를 읽습니다.


Line 5 : 데이터를 String으로 ','를 만날때까지 읽습니다.


결과화면입니다.



원하는 결과값만 String으로 받습니다.


이 데이터를 원하는 방식으로 사용하면 됩니다.


사실 위값은 String이므로 int형으로 변환하려면 toInt() 함수를 사용하시면 됩니다.


자세한건 아두이노 함수 홈페이지를 찾아보시면 됩니다.





반응형

인기글