2017-03-08 26 views
0

私のデータベースにESP8266-01でデータを送信するのに問題があります。Arduino ESP8266 AT GETリクエスト

コンソールからはセンサーから正しいデータが得られますが、データベースには何もありません。 PHPスクリプトは正しいです、私はそれを知っています、確かに、私はここにもそれを追加するつもりです。

マイコード:

// http://playground.arduino.cc/Main/Average 
#include <Average.h> 
#include <SoftwareSerial.h> 

char serialbuffer[100];//serial buffer for request url 
SoftwareSerial mySerial(10, 11); 

const char* ssid = "Master"; 
const char* password = "#Bennet99*"; 

const char* host = "server"; 

void setup() { 
    Serial.begin(9600); // Connection to PC 
    mySerial.begin(9600); // Connection to ESP8266 
    pinMode(13, OUTPUT); 
    digitalWrite(13, LOW); 

    pinMode(7, OUTPUT); 
    digitalWrite(7, LOW); 
} 

void loop() { 
    float temp = getTemperatureAverage(); 
    Serial.println("Temperature: " + String(temp)); 
    sendTemperature(temp); 

    delay(10000); 
} 

void sendTemperature(float temperature) { 
    digitalWrite(7, HIGH); 
    delay(2000); 

    mySerial.println("AT+RST"); 
    WaitForReady(2000); 
    mySerial.println("AT+CWMODE=1"); 
    WaitForOK(2000); 
    mySerial.println("AT+RST"); 
    WaitForReady(2000); 

    mySerial.println("AT+CWJAP=\"Master\",\"#Bennet99*\""); 
    if (WaitForOK(5000)) { 
    digitalWrite(13, HIGH); // Connection succesful 
    } 

    mySerial.println("AT+CIPSTART=\"TCP\",\"server\",80"); 
    WaitForOK(5000); 
    mySerial.println("AT+CIPSEND=123"); 
    WaitForOK(5000); 
    mySerial.print("GET /Intranet/Interface/modules/php/temp/temp.php?sensorid=\"1\"?humidity=\"1\"&temp=" + String(temperature) + " HTTP/1.0\r\n"); 
    mySerial.print("Host: server"); 
    WaitForOK(5000); 
    mySerial.println("AT+CIPCLOSE"); 
    WaitForOK(5000); 

    digitalWrite(13, LOW); 
    digitalWrite(7, LOW); 
} 

float getTemperatureAverage() { 
    Average<float> ave(10); 
    for (int i = 0; i < 10; i++) { 
    ave.push(getTemperature()); 
    delay(500); 
    } 

    float total = 0.0; 
    delay(50); 

    float temperature = ave.mean(); 

    return temperature; 
} 

float getTemperature() { 
    int sensorVal = analogRead(A0); 
    float voltage = (sensorVal/1024.0) * 5.0; 
    float temperature = (voltage - .5) * 100; 

    return temperature; 
} 

boolean WaitForOK(long timeoutamount) { 
    return WaitForResponse("OK", timeoutamount); 
} 

boolean WaitForReady(long timeoutamount) { 
    return WaitForResponse("ready", timeoutamount); 
} 

// Parts used from https://github.com/contractorwolf/ESP8266 
boolean WaitForResponse(String response, long timeoutamount) { 
    unsigned long timeout = millis() + timeoutamount; 

    while (millis() <= timeout) { 
    while (mySerial.available() > 0) { 
     int len = mySerial.readBytesUntil('\n', serialbuffer, sizeof(serialbuffer)); 

     String message = String(serialbuffer).substring(0, len - 1); 

     if (message == response) { 
     return true; 
     } 
    } 
    } 

    return false; 
} 

PHP:

<?php 
$servername = "server"; 
$username = "root"; 
$password = "root"; 
$dbname = "Intranet"; 
$now = new DateTime(); 

$field = $_GET['sensorid']; 
$value = $_GET['temp']; 

$conn = mysql_connect("server","root","root"); 
if (!$conn) 
{ 
    die('Could not connect: ' . mysql_error()); 
} 
$con_result = mysql_select_db("some_database", $conn); 
if(!$con_result) 
{ 
    die('Could not connect to specific database: ' . mysql_error());  
} 

    $datenow = $now->format("Y-m-d H:i:s"); 
    $hvalue = $value; 

    $sql = "INSERT INTO `DataTable`(`logdata`, `field`, `value`) VALUES (\"$datenow\",\"$field\",$value)"; 
    $result = mysql_query($sql); 
    if (!$result) { 
     die('Invalid query: ' . mysql_error()); 
    } 
    //echo "<h1>THE DATA HAS BEEN SENT!!</h1>"; 
    mysql_close($conn); 
?> 

よろしく。

+2

「スクリプトは正しい」いいえ。どこでも私はこれらのArduino/ESP自作のPHPページに行き、SQLインジェクション攻撃を受ける可能性があります。すべて1つ1つ。セキュリティ上の問題を修正してください。質問:あなたはHTTPリクエストを正しく終了しません。 'mySerial.print("ホスト:サーバ ");'はmySerial.print( "ホスト:<実際のIPアドレス/ドメイン> \ r \ n \ r \ n") 'でなければなりません。次に、 'CIPSEND'の値を調整します。また、wiresharkを使用して送信されたHTTPトラフィックをダンプする方法を学びます。この方法で、数百行のコードを通過するよりも簡単にネットワークの問題をデバッグすることができます。 –

答えて

1

問題はあなたのアルゴリズムにあります。 ESPモジュールは時には迅速に対応し、時には遅く応答するのはインターネット接続に依存します。 たとえば、コマンドAT+CIPSTART="TCP","server",80を送信した後、WaitForOK(5000);を送信しました。 ESPはまだOKに返信せず、まだサーバに接続していますが、WaitForOK(5000);はタイムアウトして次のコマンドに進みます。

SERIALを使用してすべてのコマンドを手動で入力し、応答を確認することをお勧めします。

ありがとうございました。 :)

+0

私はおそらく多くのESPをセットアップしなければならないので、最後の選択肢になるでしょうか?コールバックを取得する方法はありますか? –

+0

上記の提案は、ESPがコマンドのシーケンスとうまく連携しているかどうかをチェックすることです。これらのコマンドを処理するのにどれくらいの時間がかかるかを知ったら、 'WaitForOK(5000);と' WaitForResponse(5000); '関数を変更することができます。それに応じて。あなたは 'SERIAL'のすべてのESPをチェックする必要はありません。 私は、EPSが 'AT + CIPSTART =" TCP "、" server "、80'にしようとしていた時にシリアルで' Bussy p ... ' –

関連する問題