• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Решено простая передача данных-2

golgofa_rus

New member
Проблема один в один как у @AlexRyg в конце первой страницы "решённой" темы https://esp8266.ru/forum/threads/prostaja-peredacha-dannyx.1037/
вот только он не написал каким именно образом решил проблему...

Моя ситуация:
Коннектится к сети без проблем, но не передаёт ничего в add.php. Вообще не обращается на сервер - логи пустые.
Если запустить сервер на самой плате, то всё работает, но передавать на удалённый сервер никак не хочет.
Причём не получается ни на WeMos D1 ни на CH340 Node MCU V3.
Какая-то обидная ошибка в коде, но я её в упор не вижу. Видать за вторые сутки глаз замылился((

Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
const char* ssid = "Wi-Fi"; //задаем имя точки доступа, к которой будем подключаться
const char* password = "12341234"; //и пароль от этой точки доступа
const char* host = "test.site.ru";
long Pressure = 24425;
float temp_21 = 22;
float temp_22 = 33;
float t = 38;
float h = 87;
void setup() {
Serial.begin(9600); //отладочную информацию будем выводить в терминал
delay(100);
//WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password); //подключаемся к точке доступа с заданными именем и паролем
while (WiFi.status() != WL_CONNECTED) //ожидаем подключение, статус WL_CONNECTED означает что соединение установлено
  {
  delay(500);
  Serial.print(".");
  }
Serial.println("");
Serial.println("WiFi connected"); //оповещение в терминал, что соединение с точкой доступа установлено
Serial.println("Server started");
Serial.println(WiFi.localIP()); //получаем IP WeMos
Serial.println(WiFi.macAddress()); //получаем MAC-адрес WeMos
Serial.println(WiFi.subnetMask()); //маску подсети
Serial.println(WiFi.gatewayIP()); //IP- шлюза
Serial.println(WiFi.SSID());// имя сети, к которой подключен WeMos
Serial.println(WiFi.RSSI()); //и уровень сигнала
}
void loop() {
WiFiClient client;
  
if (client.connect(host, 80)) {
  Serial.println("Sending...");
  client.print("GET /add.php?");
  client.print("code=hSb2va8");
  client.print("&");
  client.print("press180=");
  client.print(Pressure);
  client.print("&");
  client.print("Dallas21=");
  client.print(temp_21);
  client.print("&");
  client.print("Dallas22=");
  client.print(temp_22);
  client.print("&");
  client.print("t=");
  client.print(t);
  client.print("&");
  client.print("h=");
  client.print(h);
  client.println(" HTTP/1.1\r\n");
  client.print( "Host: " );
  client.println(host);
  client.println( "Connection: close" );
  client.println();
  client.println();
  client.flush();
  client.stop();
  Serial.println("End sending!");
  delay(10000);
}
}
Спасибо!
 
Последнее редактирование:

CodeNameHawk

Moderator
Команда форума
Не делайте длинных задержок в main.
Используйте millis().
Если попробовать const char* host = "http://test.site.ru";
В начале цикла проверяйте есть ли подключение к сети. if ( WiFi.status() == WL_CONNECTED )

Я делал так
Код:
  if (t_old == 0)
  {
    t_old = millis();
  } else
  {
    t_now = millis();
    if ((t_now - t_old) > 60000)
    {
      Serial.println();
      snprintf ( temp, 1600, "http://kmhesp8266.nf/temp.php?A=%s&B=%s&C=%s&D=%s&E=%d&F=%s&G=%s&H=%d&I=%s&J=%s&K=%d&Data=%04d-%02d-%02d&Time=%02d:%02d:%02d&Mode=%d", koc_pod_s, koc_obr_s, pod_pod_s, pod_obr_s, pod_on_byte, bat_pod_s, bat_obr_s, bat_on_byte, bol_pod_s, bol_obr_s, bol_on_byte, rok, miesiac, dzien, hr, minut , sec, work_mode_sait);
      t_old = millis();
      Serial.print(temp);
      Serial.println();

     HTTPClient http;

     Serial.print("[HTTP] begin...\n");
     // configure traged server and url

     //sprawdzic podlaczenie do sieci, jezeli nie podlaczony - podlaczyc sie
     sprawdzic_podlaczenie_do_sieci();

     http.begin(temp); //HTTP

     int httpCode = http.GET();

     // httpCode will be negative on error
     if (httpCode > 0)
     {
       // HTTP header has been send and Server response header has been handled
       Serial.printf("[HTTP] GET... code: %d\n", httpCode);

       // file found at server
       if (httpCode == HTTP_CODE_OK)
       {
         String payload = http.getString();
         Serial.println(payload);
       }
     } else
     {
       Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
     }

     http.end();
    }

  }
Преобразование float в String

dtostrf(kociol_podacza, 0, 1, koc_pod_s);

где float kociol_podacza; char koc_pod_s[7];
 
Последнее редактирование:

golgofa_rus

New member
1. Если добавить http:// то код вообще не работает
2. добавил
Код:
if ( WiFi.status() == WL_CONNECTED ) {
    Serial.println(WiFi.localIP());
  }
Подключение есть. Вот с чем нет проблем, так это как раз с подключением.
Снимок294.jpg

Причём, этот код на изернет шилде (ну с некоторыми поправками разумеется) работает без проблем и данные чётко передаются на сервер.

Может что-то с библиотекой?
Две платы и у обоих одна и та же проблема. Всё, что их объединяет - библиотека.
Какая однозначно рабочая?
Наустановлено встроенных... Несколько неизвестных...
Может поудалять все и установить одну нужную?
Снимок296.jpg
 

CodeNameHawk

Moderator
Команда форума
  • client.print("GET /add.php?");
  • client.print("code=hSb2va8");
  • client.print("&");
  • client.print("press180=");
Попробуйте сначала собрать строку и отправить одним махом.
Есть готовый пример WiFiClient.
Код:
  // We now create a URI for the request
  String url = "/input/";
  url += streamId;
  url += "?private_key=";
  url += privateKey;
  url += "&value=";
  url += value;
 
  Serial.print("Requesting URL: ");
  Serial.println(url);
 
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
 

golgofa_rus

New member
Попробуйте сначала собрать строку и отправить одним махом.
В точку!
Я как раз уже сделал это и приготовился постить свои заключения для тех, кто столкнётся с такой же ерундой))

Итог такой: то, что 8266ethernet прекласно работает с кучей client.print, вовсе не означает, что 8266wifi тоже их переварит в таком количестве. Он хочет почему-то только один, заранее собранный client.print.

Заработало в таком виде:

Код:
Serial.println("Sending...");
 
  String url = "/add.php?";
  url += "k=752hSb2va887";
  url += "&";
  url += "press180=";
  url += Pressure;
  url += "&";
  url += "Dallas21=";
  url += temp_21;
  url += "&";
  url += "Dallas22=";
  url += temp_22;
  url += "&";
  url += "t=";
  url += t;
  url += "&";
  url += "h=";
  url += h;

  Serial.print("Requesting URL: ");
  Serial.println(host+url);

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
             "Host: " + host + "\r\n" +
             "Connection: close\r\n\r\n");

  client.flush();
  client.stop();
 
Serial.println("End sending!");
Можно ставить "РЕШЕНО".
 
Последнее редактирование:

golgofa_rus

New member
Да это пока копипастил кусками весь день так получилось. У меня нормально - стоп последний)
 
Сверху Снизу