Сбой записи датчика dht11 в mysql с помощью NodeMCU

#php #mysql #arduino #esp8266 #nodemcu

#php #mysql #arduino #esp8266 #nodemcu

Вопрос:

У меня возникли проблемы с записью моих данных, собранных с помощью датчика DHT11, с использованием PHP MYSQL с помощью NodeMCU (ESP8266MCU).

На последовательном мониторе написано, что невозможно подключиться к серверу и не выполнить команду get

 #include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <SimpleDHT.h>

// WiFi - Coloque aqui suas configurações de WI-FI
const char ssid[] = "WIFI-D767480";
const char psw[] = "986557D124D480";

// Site remoto - Coloque aqui os dados do site que vai receber a requisição GET
const char http_site[] = "192.168.23.1";
const int http_port = 80;

// Variáveis globais
WiFiClient client;
IPAddress server(192,168,23,1); //Endereço IP do servidor - http_site
int pinDHT11 = D2;
SimpleDHT11 dht11;

void setup() {
  delay(30000); //Aguarda 30 segundos 
  Serial.begin(9600);
  Serial.println("NodeMCU - writing data in BD via GET");
  Serial.println("Waiting connection");

  // Tenta conexão com Wi-fi
  WiFi.begin(ssid, psw);
  while ( WiFi.status() != WL_CONNECTED ) {
    delay(100);
    Serial.print(".");
  }
  Serial.print("nWI-FI sucefull connection: ");
  Serial.println(ssid);

}

void loop() {

  //Leitura do sensor DHT11
  delay(3000); //delay entre as leituras
  byte temp = 0;
  byte humid = 0;
  if (dht11.read(pinDHT11, amp;temp, amp;humid, NULL)) {
    Serial.print("Fail in sensor.");
    return;
  }

  Serial.println("writing data in BD: ");
  Serial.print((int)temp); Serial.print(" *C, "); 
  Serial.print((int)humid); Serial.println(" %");

  // Envio dos dados do sensor para o servidor via GET
  if ( !getPage((int)temp,(int)humid) ) {
    Serial.println("GET request failed");
  }
}

// Executa o HTTP GET request no site remoto
bool getPage(int temp, int humid) {
  if ( !client.connect(server, http_port) ) {
    Serial.println("Failed to connect to site ");
    return false;
  }
  String param = "?temp="   String(temp)   "amp;humid="   String(humid); //Parâmetros com as leituras
  Serial.println(param);
  client.println("GET /weather/insert_weather.php"   param   " HTTP/1.1");
  client.println("Host: ");
  client.println(http_site);
  client.println("Connection: close");
  client.println();
  client.println();

    // Informações de retorno do servidor para debug
  while(client.available()){
    String line = client.readStringUntil('r');
    Serial.print(line);
  }
  return true;
}
  

Я пытался изменить следующую строку, но безуспешно:

 client.println("GET /weather/insert_weather.php"   param   " HTTP/1.1");
  

для: client.println(«ПОЛУЧИТЬ /weather/insert_weather.php » параметр);
и: client.println(«GET /weather/insert_weather.php? param r n»);

ошибка в прикрепленном изображении,введите описание изображения здесь Я тоже пробовал другой код, но безуспешно.

Мой php-код:

 <?php
$temp = filter_input(INPUT_GET, 'temp', FILTER_SANITIZE_NUMBER_FLOAT);
$humid = filter_input(INPUT_GET, 'humid', FILTER_SANITIZE_NUMBER_FLOAT);
if (is_null($temp) || is_null($humid) ) {
  //Gravar log de erros
  die("Dados inválidos");
} 
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "maker";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
  //Gravar log de erros
  die("Não foi possível estabelecer conexão com o BD: " . $conn->connect_error);
} 
$sql = "INSERT INTO weather (wea_temp, wea_humid) VALUES ($temp,$humid)";

if (!$conn->query($sql)) {
  //Gravar log de erros
  die("Erro na gravação dos dados no BD");
}
$conn->close();
?>
  

Я использую WAMP v. 3.1.17
спасибо тебе!

Комментарии:

1. Предупреждение: Вы широко открыты для SQL-инъекций и действительно должны использовать параметризованные подготовленные инструкции вместо ручного построения ваших запросов. Они предоставляются PDO или MySQLi . Никогда не доверяйте никаким входным данным, особенно тем, которые поступают со стороны клиента. Даже когда ваши запросы выполняются только доверенными пользователями, вы все еще рискуете повредить свои данные .

2. Я использовал фиктивные адреса, но спасибо за предупреждение

Ответ №1:

попробуйте использовать POST-запрос вместо GET и в вашем PHP-коде используйте $_POST[myvariable], чтобы получить содержимое тела HTTP-запроса. Кроме того, существует библиотека HTTP для ESP8266, которую вы можете получить, с функциями, созданными для отправки HTTP-запросов. Вот фрагмент из одного из моих проектов, где я сделал практически то же самое, что вы пытаетесь сделать сейчас

  if(WiFi.status()== WL_CONNECTED){   //Check WiFi connection status

  HTTPClient http;    //Declare object of class HTTPClient

  postData = "reading="   readingData   "amp;data="   ADCData; //create the string that 
  // will be sent in the POST request

  http.begin("http://192.168.0.179:80/phptesting.php");      //Specify request 
  destination
  //send it to a .php file which can extract data from POST requests.

  http.addHeader("Content-Type", "application/x-www-form-urlencoded");  //Specify 
  //  content-type header

  int httpCode = http.POST(postData);   //Send the request
  String payload = http.getString();                  //Get the response payload

  Serial.println(httpCode);   //Print HTTP return code
  Serial.println(payload);    //Print request response payload. If you get anything 
  besides '200' something is up.

  http.end();  //Close connection
  

Попробуйте это, и если это не сработает, дайте мне знать, и я смогу выслать вам остальной код из этого проекта.

Комментарии:

1. Можете ли вы прислать мне полный код этого проекта? У меня давно эта проблема, и я не нахожу решения = (Не могли бы вы также прислать мне PHP-код?? Я также был бы признателен

2. вот ссылка на мой проект. это делает почти именно то, что вы пытаетесь сделать прямо сейчас. дайте мне знать, если вам понадобится дополнительная помощь с этим github.com/Skytrobb/Changing-HTML-Elements-With-Arduino ? files = 1