ESP8266 Переключение прошивки на лету
Можете ли вы помочь мне понять, возможно ли это с ESP8266/32?
У меня есть основной двоичный файл, который я загружаю в чип, назовем его A — он сделан из Arduino.
A начинает работать, но каждые пару минут обменивается данными с центральным сервером, опрашивая задачу.
Если есть задача — назовем ее B
А загружает его и сохраняет на SPIFFS.
Теперь должно произойти следующее: A загрузит его, перезагрузится, и B начнет работать.
Когда B завершает работу, он снова загружает A и круг замыкается — этот процесс продолжается вечно.
Вопросы:
1) Возможна ли загрузка на чип бинарного файла, хранящегося на SPIFFS? Как это делает OTA через www.
2) Могу ли я каким-либо образом сохранить A на SPIFFS, чтобы, когда B завершит работу, я повторно загрузил A?
Спасибо за любой вклад
@PeeS, 👍0
Обсуждение2 ответа
Лучший ответ:
Думаю, я нашел здесь ответ на свой вопрос
https://www.esp8266.com/viewtopic.php?f=32&t =11324
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include "FS.h"
void setup() {
Serial.begin(115200);
Serial.println();
SPIFFS.begin();
Dir dir = SPIFFS.openDir("/");
pinMode(BUILTIN_LED, OUTPUT);
digitalWrite(BUILTIN_LED, LOW);
File file = SPIFFS.open("/blinkESP.bin", "r");
uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
if (!Update.begin(maxSketchSpace, U_FLASH)) { //начинаем с максимально доступного размера
Update.printError(Serial);
Serial.println("ERROR");
}
while (file.available()) {
uint8_t ibuffer[128];
file.read((uint8_t *)ibuffer, 128);
Serial.println((char *)ibuffer);
Update.write(ibuffer, sizeof(ibuffer));
}
Serial.print(Update.end(true));
digitalWrite(BUILTIN_LED, HIGH);
file.close();
}
void loop() {
}
Попробую и вернусь, чтобы подтвердить, ответил ли он на мой вопрос.
Подтверждено, работает как шарм. Прошивает прошивку файлом со SPIFFS., @PeeS
В пакете Arduino esp8266 есть 3 библиотеки для обновления прошивки.
- ArduinoOTA для загрузки из Arduino IDE
- ESP8266HTTPUpdateServer для загрузки через веб-браузер
- Библиотека ESP8266httpUpdate для проверки наличия на веб-сервере новой версии прошивка
- Драйверы для чипа последовательного порта CH9102X
- ESP32: отключить детектор отключения питания
- Преобразование строки в IP-адрес
- Какую плату выбрать в PlatformIO для ESP Wroom 32?
- esp32 Stack canary watchpoint срабатывает
- Постоянная частота дискретизации АЦП на ESP8266 или ESP32
- ESP32S v1.1 NodeMCU vs ESP32 DevKitV1
- esp32-cam публикует изображение в mqtt
почему у вас нет единой программы, которая выполняла бы и **A**, и **B**?, @jsotola
Посмотрите, что делает ArduinoOTA., @Majenko
@Маженко - верно, но тогда мне пришлось бы запрашивать прошивку через WWW. Я не разговариваю с веб-сервером, я загружаю двоичный файл из специальной системы сетевых вычислений. Итак, может быть, вы знаете, могу ли я загрузить двоичный файл на SPIFFS и загрузить на чип другим способом, кроме OTA?, @PeeS
@jsotola, поскольку **B** изменяется и отправляется из распределенной системы, не имеет ничего общего с **A**. Двоичные файлы, отправленные из распределенной системы, всегда будут разными., @PeeS
Посмотрите, что делает ArduinoOTA. Я говорю еще раз. Посмотрите, что он делает. Не используйте это. Просто посмотрите, что он делает., @Majenko
@Маженко теперь понял твою точку зрения, спасибо., @PeeS