ESP8266 Переключение прошивки на лету

Можете ли вы помочь мне понять, возможно ли это с ESP8266/32?

У меня есть основной двоичный файл, который я загружаю в чип, назовем его A — он сделан из Arduino.

A начинает работать, но каждые пару минут обменивается данными с центральным сервером, опрашивая задачу.

Если есть задача — назовем ее B

А загружает его и сохраняет на SPIFFS.

Теперь должно произойти следующее: A загрузит его, перезагрузится, и B начнет работать.

Когда B завершает работу, он снова загружает A и круг замыкается — этот процесс продолжается вечно.

Вопросы:

1) Возможна ли загрузка на чип бинарного файла, хранящегося на SPIFFS? Как это делает OTA через www.

2) Могу ли я каким-либо образом сохранить A на SPIFFS, чтобы, когда B завершит работу, я повторно загрузил A?

Спасибо за любой вклад

, 👍0

Обсуждение

почему у вас нет единой программы, которая выполняла бы и **A**, и **B**?, @jsotola

Посмотрите, что делает ArduinoOTA., @Majenko

@Маженко - верно, но тогда мне пришлось бы запрашивать прошивку через WWW. Я не разговариваю с веб-сервером, я загружаю двоичный файл из специальной системы сетевых вычислений. Итак, может быть, вы знаете, могу ли я загрузить двоичный файл на SPIFFS и загрузить на чип другим способом, кроме OTA?, @PeeS

@jsotola, поскольку **B** изменяется и отправляется из распределенной системы, не имеет ничего общего с **A**. Двоичные файлы, отправленные из распределенной системы, всегда будут разными., @PeeS

Посмотрите, что делает ArduinoOTA. Я говорю еще раз. Посмотрите, что он делает. Не используйте это. Просто посмотрите, что он делает., @Majenko

@Маженко теперь понял твою точку зрения, спасибо., @PeeS


2 ответа


Лучший ответ:

0

Думаю, я нашел здесь ответ на свой вопрос

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


0

В пакете Arduino esp8266 есть 3 библиотеки для обновления прошивки.

  • ArduinoOTA для загрузки из Arduino IDE
  • ESP8266HTTPUpdateServer для загрузки через веб-браузер
  • Библиотека ESP8266httpUpdate для проверки наличия на веб-сервере новой версии прошивка
,