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

Нужна помощь Ошибка при запросе

Cuper

Member
Есть 2 модуля. На первом поднимается веб сервер и прием запросов. Второй, при высоком уровне на gpo0 делает запрос на первый. Проблема такая: при первом включении первого модуля все идет хорошо, но когда проходит время, второй делает запрос на первый(При высоком уровне на gpo0), но второй никак не реагирует, и функция errorToString выдает ошибку "connection refused". При запросе из любого браузера, первый отвечает моментально.
 
Последнее редактирование:

Юрий Ботов

Moderator
Команда форума
Задумайтесь что вы написали:
1. первый сервер
2. второй клиент
3. когда клиент обращается к серверу все нормально
4. потом сервер обращается к клиенту и клиент не реагирует...
А в честь чего клиент должен реагировать? Или перепишите по человечески...
 

Cuper

Member
Задумайтесь что вы написали:
1. первый сервер
2. второй клиент
3. когда клиент обращается к серверу все нормально
4. потом сервер обращается к клиенту и клиент не реагирует...
А в честь чего клиент должен реагировать? Или перепишите по человечески...
Да, да. Это моя опечатка. Клиент не должен ни на что реагировать. Извините. Исправил
 

Cuper

Member
все вопросы на форуме напоминают "Следствие вели знатоки"
Есть труп - угадайте , почему умер.
Первый модуль(принимающий запрос):



Код:
ESP8266WebServer HTTP(80);
void datchuk() {
   HTTP.on("/sensor", HTTP_GET, []() {
     String sensor = HTTP.arg("sensor"); // Принимаем запрос в строку sensor
     if (sensor == "TouchOn" && !alertStart) {
        String answer; // Строка для ответа
        Serial.println(sensor); // Выводим в терминал значение запроса
        // Формируем ответ
        countAnswer++;
        answer += "OK ";
        answer += sensor;
        answer += " ";
        answer += countAnswer;
        HTTP.send(200, "text / plain", answer); // Отправляем ответ
        alert();
        Serial.print("Continue ");
        Serial.print(countAnswer);
        Serial.println(" times");
     } else if (sensor == "TouchOn" && alertStart) {
        HTTP.send(200, "text / plain", "busy");
     } else {
        Serial.println(sensor);
        HTTP.send(200, "text / plain", "bad");
    }
  });
}
Второй модуль(делающий запрос):
Функции проверки уровня на gpo0 и запрос на адрес.
Код:
void touchLoop() {
  debouncer.update();
  int value = debouncer.read();
  if(value == LOW) { // Если уровень высокий
    Serial.print("Touch on - ");
    String responce = getURL("http://192.168.1.7/sensor?sensor=TouchOn"); // Делаем запрос к серверу
    Serial.println(responce); // Выводим в терминал ответ
    for(int i = 10; i > 0; i--) {
            Serial.println(i);
            delay(1000);
    }
  }
}
String getURL(String urls) {
  String answer = "";
  HTTPClient http;
  http.begin(urls); //HTTP
  int httpCode = http.GET();
  delay(100);
  if (httpCode == HTTP_CODE_OK) {
    answer = http.getString();
  } else if (httpCode != HTTP_CODE_OK) {
    Serial.print(http.errorToString(httpCode).c_str());
    answer = "no";
  }
  http.end();
  return answer;
}
Код:
void loop() {
  HTTP.handleClient();
  touchLoop();
  delay(50);
}
 

Cuper

Member
а какие сообщения получаете в терминале?
Второй модуль:

Start WIFI
..
WiFi connected
IP address:
192.168.1.4
Start WebServer
Start FS
Setup FileConfig
{"SSDP":"Sensor","ssidAP":"WiFiNotConnected","passwordAP":"uzumymw```_nika","ssid":"Andriy-Max","password":"06071972a","timezone":2}
Setup SSDP
Touch on - OK TouchOn 1
Touch on - connection refusedno
Touch on - connection refusedno
Touch on - connection refusedno
 

Cuper

Member
На дурине не пишу, поэтому дам совет если бы писал на СИ
Надо вынести за loop т е сделать глобальными
  1. String answer = "";
  2. HTTPClient http;
  3. http.begin(urls); //HTTP
Сделал глобальными эти строки, но появилась ошибка:

datchuk:6: error: 'http' does not name a type
http.begin(url); //HTTP
^
exit status 1
'http' does not name a type

Код:
#include "set.h"

  String url = "http://192.168.1.7/sensor?sensor=TouchOn";
  String answer = "";
  HTTPClient http;
  http.begin(url); //HTTP
 
void setup() {
  Serial.begin(115200);
  delay(5);
  Serial.println("");
  Serial.println("Start WIFI");
  //Запускаем WIFI
  WIFIinit();
  Serial.println("Start WebServer");
  HTTP_init();
  touchInit();
  ////////////////////////////
  Serial.println("Start FS");
  FS_init();
  ////////////////////////////
  Serial.println("Setup FileConfig");
  configSetup = readFile("config.json", 4096);
  jsonWrite(configJson, "SSDP", jsonRead(configSetup, "SSDP"));
  Serial.println(configSetup);
  /////////////////////////////
  //Настраиваем и запускаем SSDP интерфейс
  Serial.println("Setup SSDP");
  SSDP_init();
}

void loop() {
  HTTP.handleClient();
  touchLoop();
  delay(50);
}
 

Cuper

Member
В дурине скетч организуется в виде двух функций
setup
и loop
переменные и структуры которые вы используете в различных своих функция объявляете вне функций
а вызов функций которые надо вызвать лишь один раз (обычно это настройка пинов настройка связи )вызываются в setup
предполагал что Вы хотя бы азы дурины знаете
Нельзя же что то писать не изучив азбуки
Азы "дурины" я знаю, но, как говорится, опыт приходит со временем. Я уже исправил эту ошибку.
 

Cuper

Member
Объявил глобально:
Код:
  #include "set.h"

  String url = "http://192.168.1.7/sensor?sensor=TouchOn";
  String answer = "";
  HTTPClient http;
 
void setup() {
  Serial.begin(115200);
  delay(5);
  Serial.println("");
  Serial.println("Start WIFI");
  //Запускаем WIFI
  WIFIinit();
  Serial.println("Start WebServer");
  HTTP_init();
  touchInit();
  ////////////////////////////
  Serial.println("Start FS");
  FS_init();
  ////////////////////////////
 
  Serial.println("Setup FileConfig");
  configSetup = readFile("config.json", 4096);
  jsonWrite(configJson, "SSDP", jsonRead(configSetup, "SSDP"));
  Serial.println(configSetup);
  /////////////////////////////
  http.begin(url); //HTTP
  //Настраиваем и запускаем SSDP интерфейс
  Serial.println("Setup SSDP");
  SSDP_init();
}

void loop() {
  HTTP.handleClient();
  touchLoop();
  delay(50);
}
Изменил функцию touchLoop():
Код:
void touchLoop() {
  debouncer.update();
  int value = debouncer.read();
  if(value == LOW) { // Если уровень высокий
    Serial.print("Touch on: ");
    int httpCode = http.GET(); // Делаем запрос
    String responce = http.getString(); //Получаем ответ
    delay(100);
    Serial.print("Error:");
    Serial.print(http.errorToString(httpCode).c_str()); // Выводим в терминал ошибку, если нету - просто пустая строка
    Serial.print(" Responce: ");
    Serial.println(responce); // Выводим в терминал ответ
    for(int i = 10; i > 0; i--) {
            Serial.println(i);
            delay(1000); 
    }
  }
}
Но все-равно работает через раз и выдает ошибку connection refused. Даже не знаю в чем проблема...
 
Сверху Снизу