Здравствуйте. Подскажите пожалуйста. 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); } благодарю
Без mqtt не пробовал. Ее функционал в этом и заключается - чирикать в сеть. Точку доступа отключаю, чириканье естественно прекращается. Включаю - mqtt от есп пуст.
В плане 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();
Я думаю WiFi.setAutoReconnect нужно прописывать после подключения к точке доступа, а точнее после WiFi.begin(ssid, password);