2016-08-01 9 views
1

ホストが同じネットワークに接続された別のデバイスからデータを受信すると、テキストファイルを更新する簡単なウェブサイトを構築します。問題のデバイスは温度を測定する小さな気象ステーションです。温度はESP8266チップからWifi経由でPHP GETコマンドでステーションから送信されます。信号はホームルータによって受信され、ウェブサイトをホストしているネットワーク上のラップトップにリダイレクトされる。PHP GETリクエストがESP8266無線チップで送信されましたが、ウェブサイトでは受信されません

ESP8266チップがdata/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ファイルはdata.txtを内の温度を格納できるように、PHPファイルに送信されたGETリクエストは温度が含まれている必要があります。

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> 

は私が手動でFirefoxで次の行を入力するとき。

Temperature is 28 oC. 

ESP8266チップ

としては、最終的なシステムでESP8266チップは小さい気象局からのシリアル命令を受信し、上記説明しました。しかし、デバッグを簡単にするために、チップはUSB-to-Serial(UART)ケーブルでラップトップに接続されています。シリアルコマンドは、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 

この時点で、「Temperature is 10 oC」というメッセージが表示されます。シリアルモニタに表示され、番号 "10"がファイル "data.txt"に付加されるはずです。しかし、何も起こりません...

何か提案がありますか?

追加メモ

1)PHPとコードを私が使用していますが、この記事で提示されたものと非常に似ています:https://www.youtube.com/watch?v=q02f4sPghSo

2)以下、いくつかのコメントで指摘したように、GETコマンドが少なく、従来のかもしれません。 POSTまたはPUTが適切かもしれません。しかし、現時点では、私はウェブサイトがチップに応答していない理由を理解しようとしています。

+0

GI要求を使用してサーバーの状態を変更することは、貧弱な/非従来型/反対称のスタイルです。 POSTまたはPUTを使用する必要があります。 – barny

+0

プロトコルスニファを使用して、ネットワーク上で実際に何が起こっているかを確認し、どのような要求/応答が起きているかを確認します。 – barny

+0

@barny:上記の情報をありがとう。提案するプロトコルスニファはありますか?私はプロトコルスニファに精通していません。 – phodor

答えて

1

[OK]を私はこの問題を把握しました。

それはArduinoのIDEのシリアルモニタは、特殊文字として「\ rを」と「\ n」を認識しないことが判明し、4つの文字として扱います。私は「入力」(または「送信ボタン」をクリックしてください)のArduino IDEのシリアルモニタに入力するときしかし、それは自動的にキャリッジリターン&改行文字(Iは、送信しようとしています文字列より2文字以上)を送信します。したがって、IDE経由でシリアルに「\ 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」をクリックすると、シリアルモニタで2文字が追加されます。これは、AT+CIPSEND=31ではなく、この行を送信するためのAT+CIPSEND=33を説明しています。

同様に、 "ホスト: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 
関連する問題