ESP8266, не переподключается к сети

Тема в разделе "ESP8266, ESP32", создана пользователем yden, 19 фев 2018.

  1. yden

    yden Гик

    Здравствуйте.
    Подскажите пожалуйста. ESP8266, не хочет переподключаться при обрыве wifi.
    Где я накосячил?
    Код с интернет частью и mqtt:
    Код (C++):
    #include <Bounce.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <WiFiUdp.h>
    #include <MQTT.h>
    #include <PubSubClient.h>
    #include <ESP8266WiFi.h>
    #include <ESP8266WebServer.h>
    #include <ESP8266mDNS.h>

    // =======================================================================
    // Конфигурация устройства:

    const char* host = "esp8266-banya";
    const char* ssid     = "****";                      // SSID
    const char* password = "******";                    // пароль

    ESP8266WebServer server(80);
    const char* serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Update'></form>";

    const char *mqtt_server = "192.168.1.70"; // Имя сервера MQTT
    const int mqtt_port = 1883; // Порт для подключения к серверу MQTT
    const char *mqtt_user = "****"; // Логи от сервер
    const char *mqtt_pass = "*****"; // Пароль от сервера
    float utcOffset = 8; //поправка часового пояса

    //mqtt
    long previousMillis_mqtt = 0;  // храним время последнего подключения
    long interval_mqtt = 3000;     //интервал 3 сек

    //--------------------------------------------------------------------------------------
    // Функция получения данных от сервера
    void callback(const MQTT::Publish& pub)
    {
      if  (pub.topic() == "ihouse/clock/h")
      {
        hours = String(pub.payload_string());
      }

      if  (pub.topic() == "ihouse/clock/m")
      {
        minutes = String(pub.payload_string());
      }

      if  (pub.topic() == "ihouse/svet/banya/in")
      {
        if (String(pub.payload_string()) == "1") mqtt_light_banya = true;
        if (String(pub.payload_string()) == "0") mqtt_light_banya = false;
      }

      if  (pub.topic() == "ihouse/svet/stolb/in")
      {
        if (String(pub.payload_string()) == "1") mqtt_light_stolb = true;
        if (String(pub.payload_string()) == "0") mqtt_light_stolb = false;
      }

      if  (pub.topic() == "ihouse/rezetka/banya/in")
      {
        if (String(pub.payload_string()) == "1") mqtt_rezetka = true;
        if (String(pub.payload_string()) == "0") mqtt_rezetka = false;
      }
    }

    WiFiClient wclient;
    PubSubClient client(wclient, mqtt_server, mqtt_port);

    //--------------------------------------------------------------------------------------
    void setup()
    {
      // Удаляем предыдущие конфигурации WIFI сети
      WiFi.disconnect(); // обрываем WIFI соединения
      WiFi.softAPdisconnect(); // отключаем отчку доступа(если она была
      WiFi.mode(WIFI_OFF); // отключаем WIFI
      delay(500);

      // присваиваем статичесий IP адрес
      WiFi.mode(WIFI_STA); // режим клиента
      WiFi.config(IPAddress(192, 168, 1, 72), IPAddress(192, 168, 1, 1), IPAddress(255, 255, 255, 0), IPAddress(192, 168, 1, 1));

      if (WiFi.getAutoConnect() != true)    //configuration will be saved into SDK flash area
      {
        WiFi.setAutoConnect(true);   //on power-on automatically connects to last used hwAP
        WiFi.setAutoReconnect(true);    //automatically reconnects to hwAP in case it's disconnected
      }
     
      Serial.begin(115200);
     
      ds.begin();
     
      WiFi.begin(ssid, password);

      //запуск web сервера для удаленной прошивки
      if (WiFi.waitForConnectResult() == WL_CONNECTED) {
        MDNS.begin(host);
        server.on("/", HTTP_GET, []() {
          server.sendHeader("Connection", "close");
          server.send(200, "text/html", serverIndex);
        });
        server.on("/update", HTTP_POST, []() {
          server.sendHeader("Connection", "close");
          server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
          ESP.restart();
        }, []() {
          HTTPUpload& upload = server.upload();
          if (upload.status == UPLOAD_FILE_START) {
            Serial.setDebugOutput(true);
            WiFiUDP::stopAll();
            Serial.printf("Update: %s\n", upload.filename.c_str());
            uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
            if (!Update.begin(maxSketchSpace)) { //start with max available size
              Update.printError(Serial);
            }
          } else if (upload.status == UPLOAD_FILE_WRITE) {
            if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
              Update.printError(Serial);
            }
          } else if (upload.status == UPLOAD_FILE_END) {
            if (Update.end(true)) { //true to set the size to the current progress
              Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
            } else {
              Update.printError(Serial);
            }
            Serial.setDebugOutput(false);
          }
          yield();
        });
        server.begin();
        MDNS.addService("http", "tcp", 80);

        Serial.printf("Ready! Open http://%s.local in your browser\n", host);
      }

      getTime();
      updateTime();

      delay(10000);

    }

    //--------------------------------------------------------------------------------------
    void loop()
    {
      // подключаемся к MQTT серверу
      if (WiFi.status() == WL_CONNECTED)
      {
        if (!client.connected())
        {
          Serial.println("Connecting to MQTT server");
          if (client.connect(MQTT::Connect("esp_banya").set_auth(mqtt_user, mqtt_pass)))
          {
            Serial.println("Connected to MQTT server");
            client.set_callback(callback);
            client.subscribe("ihouse/clock/h"); // подписывааемся по топик
            client.subscribe("ihouse/clock/m"); // подписывааемся по топик
            client.subscribe("ihouse/svet/banya/in"); // подписывааемся по топик
            client.subscribe("ihouse/svet/stolb/in"); // подписывааемся по топик
            client.subscribe("ihouse/rezetka/banya/in"); // подписывааемся по топик
          }
          else
          {
            Serial.println("Could not connect to MQTT server");
          }
        }

        if (client.connected())
        {
          client.loop();
          MQTT_Send();
        }
      }
     
    }

    //--------------------------------------------------------------------------------------
    // Функция отправки в топик
    void MQTT_Send()
    {
      unsigned long currentMillis_mqtt = millis();
     
      if (currentMillis_mqtt - previousMillis_mqtt >= interval_mqtt)
        {
          previousMillis_mqtt = currentMillis_mqtt;
         
          client.publish("ihouse/raw", String(raw)); // отправляем в топик значение освещенности
         
          client.publish("ihouse/climat/t_out", String(t_out)); // отправляем в топик значение температуры улица
          client.publish("ihouse/climat/t_out/delta", String(t_out_delta)); // отправляем в топик значение дельты температуры улица

          client.publish("ihouse/climat/t_banya", String(t_banya)); // отправляем в топик значение температуры баня
          client.publish("ihouse/climat/t_banya/delta", String(t_banya_delta)); // отправляем в топик значение дельты температуры баня

          client.publish("ihouse/svet/stolb/out", String(light_stolb)); // отправляем в топик свет столб включен
          client.publish("ihouse/svet/banya/out", String(light_banya)); // отправляем в топик свет баня включен
          client.publish("ihouse/rezetka/banya/out", String(rezetka_banya)); // отправляем в топик розетка баня включен

          client.publish("ihouse/work/banya", String(random(9))); // отправляем в топик проверку
         
        }
      delay(10);
    }

     
    благодарю
     
  2. SergeiL

    SergeiL Оракул Модератор

    А без MQTT подключается?
     
  3. yden

    yden Гик

    Без mqtt не пробовал. Ее функционал в этом и заключается - чирикать в сеть. Точку доступа отключаю, чириканье естественно прекращается. Включаю - mqtt от есп пуст.
     
  4. SergeiL

    SergeiL Оракул Модератор

    В плане MQTT, не уверен, что у Вас нормально проходит подписка на топики.
    В свое время натыкался на это.
    Между подпиской на топики нужно ставить client.loop();
    Код (C++):
            client.subscribe("ihouse/clock/h"); // подписывааемся по топик  
               client.loop();
            client.subscribe("ihouse/clock/m"); // подписывааемся по топик
               client.loop();
            client.subscribe("ihouse/svet/banya/in"); // подписывааемся по топик
               client.loop();
            client.subscribe("ihouse/svet/stolb/in"); // подписывааемся по топик
              client.loop();
            client.subscribe("ihouse/rezetka/banya/in"); // подписывааемся по топик      
              client.loop();

     
     
  5. yden

    yden Гик

    благодарю, потестю.
    В двух словах, если не трудно, что client.loop(); дает?
     
  6. Oleg_7

    Oleg_7 Гик

    Получилось настороить авто переподключение ?!
     
  7. ildarmustafin

    ildarmustafin Нуб

    Я думаю WiFi.setAutoReconnect нужно прописывать после подключения к точке доступа, а точнее после WiFi.begin(ssid, password);