2017-03-08 6 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

'Script is correct' no. 어디서나 나는이 Arduino/ESP 자체 PHP 페이지에서 SQL 인젝션 공격에 취약합니다. 매 하나마다. 보안 문제를 해결하십시오. 질문 : 당신은 HTTP 요청을 올바르게 종료하지 않습니다. mySerial.print ("호스트 : <실제 IP 주소/도메인> \ r \ n \ r \ n")''mySerial.print ("호스트 : 서버"); 그런 다음'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 ...' –