2016-08-01 6 views
1

호스트가 동일한 네트워크에 연결된 다른 장치로부터 데이터를 수신 할 때 텍스트 파일을 업데이트해야하는 간단한 웹 사이트를 구축 중입니다. 해당 장치는 온도를 측정하는 작은 기상 관측소입니다. 온도는 ESP8266 칩에서 Wifi를 통해 PHP GET 명령으로 스테이션에서 전송됩니다. 신호는 홈 라우터에서 수신하고 웹 사이트를 호스팅하는 네트워크의 랩톱으로 리디렉션됩니다.PHP GET 요청이 ESP8266 Wifi 칩에 의해 전송되었지만 웹 사이트에서 수신되지 않았습니다.

ESP8266 칩이 데이터/PHP GET 명령을 올바르게 전송하는 것으로 보입니다. 그러나 웹 사이트는 결코 업데이트되지 않습니다.

문제 해결을 위해 시스템을 단순화하기 위해 기상대를 노트북으로 대체합니다. 노트북은 USB-to-Serial (UART) 케이블을 통해 ESP8266 칩에 직접 연결됩니다. ESP8266 칩과 통신하는 모든 AT 명령은 Arduino IDE 직렬 모니터에 입력됩니다.

웹 사이트

웹 사이트는 매우 간단합니다. ESP8266 칩에서 데이터를 수신 할 때마다 텍스트 파일에 데이터를 씁니다.

웹 사이트는 IP가 192.168.1.2 인 노트북에 저장되어 있습니다.

[email protected]:~$ ifconfig  
wlp2s0 Link encap:Ethernet HWaddr 18:cf:5e:ee:3f:10 
      inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0 

웹 사이트는 apache2 서버에서 호스팅되는 PHP 파일입니다. 실행되면, php 파일은 data.txt 파일에 온도를 저장합니다. 파일은/var/www/html에 저장됩니다.

[email protected]:~$ ls -la /var/www/html 
-rwxrwxrwx 1 root root  0 Jul 31 22:41 data.txt 
-rwxr-xr-x 1 root root 127 Jul 31 21:40 index.php 

PHP 파일에 보낸 GET 요청에는 온도가 포함되어 있어야 PHP 파일이 온도를 data.txt에 저장할 수 있습니다.

http://192.168.1.2/index.php?temp=28 

다음 텍스트는 브라우저 & 번호 "28"에 표시됩니다 data.txt로 저장됩니다 :

[email protected]:~$ cat /var/www/html/index.php 

<!DOCTYPE html> 
<html> 
<body> 
<?php 
    $a = $_GET['temp']; 
    $dataSaved = file_put_contents("data.txt",$a . "\n",FILE_APPEND); 
    echo "Temperature is " . $a . " oC."; 
?> 
</body> 
</html> 

내가 수동으로 파이어 폭스에서 다음 줄을 입력합니다.

Temperature is 28 oC. 

ESP8266 칩

As를

는 ESP8266 칩 작은 기상대로부터 일련의 지시를받을 최종 시스템에서, 상술. 그러나 디버깅을 단순화하기 위해이 칩은 UART (USB-to-Serial) 케이블로 랩톱에 연결됩니다. 직렬 명령은 Arduino IDE 직렬 모니터를 사용하여 칩으로 전송됩니다. 여기에 보낸 명령이 있습니다.

AT 

OK 
AT+CWLAP 
+CWLAP:(3,"MYMODEM",-31,"aa:bb:cc:dd:ee:ff",1,21) 

OK 
AT+CWJAP="MYMODEM","mypassword" 

WIFI CONNECTED 
WIFI GOT IP 

OK 
AT+CIPSTART="TCP","192.168.1.2",80 
CONNECT 

OK 
AT+CIPSEND=56 

OK 
> GET /index.php?temp=10 HTTP/1.1\r\nHost: 192.168.1.2\r\n\r\n 

busy s... 

Recv 56 bytes 

SEND OK 
CLOSED 

이 시점에서 "온도는 10 oC입니다."라는 메시지가 표시됩니다. 시리얼 모니터에 나타나야하며 숫자 "10"은 "data.txt"파일에 추가되어야합니다. 그러나 아무 일도 일어나지 않습니다 ...

어떤 제안이 있습니까?

추가 정보

1)를 PHP 코드 AT 내가 사용이 게시물에 제시된 것과 매우 유사하다 : https://www.youtube.com/watch?v=q02f4sPghSo.

2) 아래의 몇 가지 의견에서 지적했듯이 GET 명령은 덜 일반적입니다. POST 또는 PUT이 더 적절할 수 있습니다. 그러나 그 순간 나는 왜 웹 사이트가 칩에 응답하지 않는지 이해하려고 노력하고 있습니다.

+0

참고 GET 요청을 사용하여 서버 상태를 수정하는 것은 좋지 않은/틀에 얽매이지 않는/반대 표현 스타일입니다. POST 또는 PUT을 사용해야합니다. – barny

+0

프로토콜 스니퍼를 사용하여 네트워크에서 실제로 어떤 일이 일어나고 있는지 확인하고 어떤 요청/응답이 일어나는지 확인하십시오. – barny

+0

@barny : 위의 정보를 제공해 주셔서 감사합니다. 제안 할 프로토콜 스니퍼가 있습니까? 나는 프로토콜 스니퍼에 익숙하지 않다. – phodor

답변

1

나는 문제를 파악했습니다.

Arduino IDE 직렬 모니터는 "\ r"과 "\ n"을 특수 문자로 인식하지 못하고 4 문자로 취급합니다. 그러나 Arduino IDE 직렬 모니터에서 "Enter"(또는 "보내기 단추"클릭)를 입력하면 자동으로 캐리지 리턴 & 줄 바꿈 문자 (보내려는 문자열보다 2 문자 이상)가 전송됩니다. 따라서 IDE를 통해 Serial에 "\ r \ n"을 보내고 싶을 때마다 Enter 키를 눌러야합니다. 내 "예"처럼 문자열의 중간에 "\ r \ n"이 있으면 문자열을 2 개 (또는 그 이상)로 잘라야합니다. 이것에 의해

AT+CIPSEND=56 

OK 
> GET /index.php?temp=10 HTTP/1.1\r\nHost: 192.168.1.2\r\n\r\n 

:

나는 그러므로 내 코드의이 부분을 수정

AT+CIPSEND=33 


OK 
> GET /index.php?temp=10 HTTP/1.1  (here I press "Enter") 
Recv 33 bytes 

SEND OK 
AT+CIPSEND=21 


OK 
> Host: 192.168.1.2   (here I press "Enter") 
Recv 21 bytes 

SEND OK 

참고 "GET /index.php?temp=10 HTTP/1.1"31 자입니다 . "Enter"를 클릭하면 Serial Monitor가 두 개의 문자를 추가합니다. 이 줄을 보내는 데 AT+CIPSEND=33을 설명하고 AT+CIPSEND=31이 아니라고 설명합니다.

마찬가지로 "호스트 : 192.168.1.2"는 19 자입니다. 캐리지 리턴 및 줄 바꿈을 위해 2자를 추가 할 때 21자를 얻습니다. 따라서 AT+CIPSEND=21입니다.

그러면 서버가 올바른 응답으로 응답합니다.

+IPD,215:HTTP/1.1 200 OK 
Date: Sat, 06 Aug 2016 13:39:59 GMT 
Server: Apache/2.4.18 (Ubuntu) 
Content-Length: 67 
Content-Type: text/html; charset=UTF-8 

<!DOCTYPE html> 
<html> 
<body> 
Temperature is 10 oC.</body> 
</html> 
CLOSED