разместить данные из узла mcu в базе данных sql

#include <ESP8266WiFi.h>

const char* ssid = "xxxx";
const char* password = "xxxxxxxxxx";

const char* host = "192.168.43.18";
const int ldr = A0;
int val = 0;

void setup()
{
  Serial.begin(9600);
  Serial.println();

  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" connected");
}


void loop()
{
  val = analogRead(ldr);
  WiFiClient client;

  Serial.printf("\n[Connecting to %s ... ", host);
  if (client.connect(host, 80))
  {
    Serial.println("connected]");
    client.println("POST /past.php HTTP/1.1");
    client.println("Host: 192.168.43.10");
    client.print(val);
    Serial.println(val);
    Serial.println("\n[Disconnected]");
  }
  else
  {
    Serial.println("connection failed!]");
    client.stop();
  }
  delay(5000);
}

Я загрузил этот код в node mcu, но он работает, но загруженные данные в моей базе данных не отображаются. Пожалуйста, кто-нибудь, помогите мне.

, 👍0

Обсуждение

Я бы ожидал одну пустую строку после заголовков, а также заголовок Content-Length с фактической длиной val (его строковое представление, а не sizeof int!)., @KIIV

и остановить клиент после запроса, @Juraj

@Juraj В этом случае я бы ожидал, что деструктор позаботится об этом. Если нет, то это определенно ошибка в библиотеке., @KIIV

да, деструктор закрывает соединение. А зачем вы закрываете его в else? :-), @Juraj

IP-адреса не совпадают, @Juraj


3 ответа


0

Вы используете WIFIClient для отправки данных на HTTP-сервер. Я не думаю, что WiFiClient умеет правильно форматировать HTTP-запросы, поэтому вам нужно это сделать. Я думаю, что есть HTTPClient, который может сделать для вас больше.

Между заголовком и телом сообщения есть пустая строка, а также пустая строка в конце тела. Вам нужна строка с надписью `client.println();

Принимает ли "SQL-сервер" сообщение, содержащее только число? Откуда он знает, к чему относится число? Если у вас есть какой-то PHP-сайт на фронте DBS, который всем этим занимается, то, пожалуйста, проигнорируйте этот вопрос.

Возможно, вы захотите проверить, можете ли вы запустить Wireshark (или аналогичный) на своем ПК и посмотреть, что отправляет MCU, вы также можете взглянуть на надстройки Chrome. Я думаю, что есть некоторые, с помощью которых вы можете создавать необработанные пакеты и отправлять их на свой сервер, чтобы убедиться, что он отвечает так, как ожидается.

В качестве последнего средства вы, вероятно, могли бы набросать очень быструю и грязную программу C# с помощью Visual Studio Community Edition (бесплатно ) и заставить ее отправлять пакет на сервер. Использование этого в сочетании с Wireshark может быть проще, чем использование MCU, пока вы не поймете, что вам следует делать.

,

println пишет /r/n, @Juraj

Хорошо, потому что выглядит уродливо со всеми этими \r\ns :) Хотя все еще нужны пустые строки, которых может быть просто две println("");, @Code Gorilla

Да, есть HTTP-клиент, но он не работает, поэтому я использую Wi-Fi-клиент. Wi-Fi-клиент можно использовать для отправки данных с узла MCU на HTTP-сервер, потому что мы заставляем узел MCU действовать как клиент. В этом месте мы называем веб-сайт хостом, потому что, как мы знаем, хост может действовать как сервер или как клиент в зависимости от сервиса. Поэтому в моем исправленном коде вы можете видеть, что я называю его хостом., @vathsalhari

пожалуйста, воспользуйтесь моим исправленным кодом для справки, так как он работает, @vathsalhari


0

На самом деле вы не публикуете никаких данных. После client.println("POST /past.php HTTP/1.1"); Добавьте еще одну(ые) строку(и), например... клиент.println("?myvar=65dcsagh&anothervar=ghsadjkj78");

Также страница на сервере (past.php) должна иметь возможность получать и обрабатывать отправленные данные. Если использовать PHP, то это будет что-то вроде... $data = $_GET[myvar]; А затем PHP-код должен подключиться к вашей базе данных SQL и вставить ее с помощью mySQL

,

есть клиент.print(val);, @Juraj

упс, извините, я этого не увидел, тогда поможет ли вторая часть моего ответа?, @Brian Moreau

он не спрашивает о части php, @Juraj

Нет, но он говорит, что данные не вводятся в базу данных, поэтому, не зная, что находится в past.php, это может быть проблемной частью., @Brian Moreau

Ребята, на самом деле я не объединял данные, вот в чем проблема. Без объединения мы не можем отправить данные, иначе, если мы это сделаем, PHP-код, написанный на другой стороне, не распознает их., @vathsalhari

На самом деле, похоже, это подчеркивает важный момент., @Chris Stratton


1

Мой исправленный код, рабочий код:

#include <ESP8266WiFi.h>

const char* ssid = "vathsal";
const char* password = "1234567890";

const char* host = "wwwkprstaffcom.000webhostapp.com";
const int ldr = A0;
int val = 0;
String data;
void setup()
{
  Serial.begin(9600);
  Serial.println();

  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" connected");
}


void loop()
{
  val = analogRead(ldr);
  data = "ldr=";

  data.concat(val);
  WiFiClient client;

  Serial.printf("\n[Connecting to %s ... ", host);
  if (client.connect(host, 80))
  {
    Serial.println("connected]");
    client.println("POST /add.php HTTP/1.1");
    client.println("Host: wwwkprstaffcom.000webhostapp.com");
    client.println("Content-Type: application/x-www-form-urlencoded");
    client.print("Content-Length: ");
    client.println(data.length());
    client.println();
    client.print(data);
    Serial.println(val);
    Serial.println("\n[Disconnected]");
  }
  else
  {
    Serial.println("connection failed!]");
    client.stop();
  }
  delay(5000);
}
,

Вообще говоря, простое удаление кода не является ответом. Чтобы составить ответ, вам действительно следует начать с объяснения того, что вы изменили и почему., @Chris Stratton