Добрый день коллеги!
У меня есть веб страничка на ESP, которая содержит форму отправки файла.
Мне необходимо побить этот файл по 4 килобайта и засунуть в серийник, к которому подключен экранчик Nextion. Вариант скачать файл целиком, к примеру, в SPIFFS, а потом присунуть в экранчик - не подходит. Файл прошивки слишком жирный. Надо читать файл и писать его в серийник "на лету", управляя передачей файла со стороны ЕСП. Вот такая у меня красивая фиолетовая страничка:
А вот такой обработчик дергания за ссылку /updateHMI
Не робит, зараза! спотыкаюсь на самом начале, когда хочу узнать размер файла. Он начинает расти вместе с закачкой, а мне его надо знать сразу. Ну и похоже браузер хочет мне весь файл целиком в память впихнуть, на что ЕСПшке становится очень очень плохо.....
Что делать, куда копать?
В качестве альтернативы я поднял телнет мост к порту экранчика, думаю теперь при помощи какой технологии с веб странички впихнуть прошивку хотя бы в телнетовский порт...
У меня есть веб страничка на ESP, которая содержит форму отправки файла.
Мне необходимо побить этот файл по 4 килобайта и засунуть в серийник, к которому подключен экранчик Nextion. Вариант скачать файл целиком, к примеру, в SPIFFS, а потом присунуть в экранчик - не подходит. Файл прошивки слишком жирный. Надо читать файл и писать его в серийник "на лету", управляя передачей файла со стороны ЕСП. Вот такая у меня красивая фиолетовая страничка:
Код:
html_header= "<!DOCTYPE html><html lang='ru'><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/><meta name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1.0 user-scalable=no'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='msapplication-tap-highlight' content='no'/><meta name='theme-color' content='#5c6bc0'/><title>Home</title><style>body {background-color:#5c6bc0; color:#ffffff; text-shadow: 0px 2px 6px rgba(0,0,0,0.4); font-family: Sans-Serif, Arial, Helvetica;}</style></head>";
serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Обновить контроллер'></form><br>"
"<form method='POST' action='/updateHMI' enctype='multipart/form-data'><input type='file' name='updatehmi'><input type='submit' value='Обновить экран'></form><br>"
"<form method='POST' action='/wifisettings'enctype='application/x-www-form-urlencoded'>"
"SSID: <input type='text' name='ssid' value='"+station_ssid+"'><br>"
"Пароль:<input type='password' name='password' value='"+station_psk+"'><br><br>"
"<input type='submit' value='Применить'><br>"
"</form>";
Код:
void updatehmi(void)
{
HTTPUpload& hmiupload = httpserver.upload();
int len = hmiupload.totalSize;
FileSize = len;
//SendToTelnet("Contacting Nextion...");
//SendToTelnet((String)FileSize);
int Parts = (len/4096) + 1;
int c;
uint8_t buff[128] = {};
if (hmiupload.status == UPLOAD_FILE_START) {
Serial.flush();
//SendToTelnet("Contacting Nextion...");
Serial.printf("%sconnect%s", ter, ter );
//delay(500);
Serial.printf("whmi-wri %u,9600,0",FileSize); //whmi-wri 666,9600,0
Serial.write(ter,3);
//delay(500);
ackString = "";
} else if (hmiupload.status == UPLOAD_FILE_WRITE) {
//SendToTelnet("Starting Download...\n");
while((len > 0 || len == -1)) {
// get available data size
size_t sizehmi = hmiupload.currentSize;
//SendToTelnet((String)sizehmi);
if(sizehmi) {
// read up to 128 byte
//int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size));
// write it to Serial
c=hmiupload.currentSize;
count += hmiupload.currentSize;
Serial.write(hmiupload.buf, hmiupload.currentSize);
if (count == 4096) {
partNum ++;
total += count;
pCent = (total * 100) / FileSize;
count = 0;
delay (250);
SendToTelnet("Part: %u Bytes: %u Progress %u%%\n");
SendToTelnet(partNum+"\n");
SendToTelnet(total+"\n");
SendToTelnet(pCent+"\n");
}
if(len > 0) {
len -= c;
}
}
delay(1);
}
partNum ++;
delay (250);
total += count;
//SendToTelnet("Last Part: %d Total Bytes: %d Progress 100%%\n\n");
//SendToTelnet(partNum+"\n");
//SendToTelnet(total+"\n");
//SendToTelnet("Size request: %d\n\n");
} else if (hmiupload.status == UPLOAD_FILE_END) {
SendToTelnet((String)FileSize);
if (total == FileSize) SendToTelnet("Server Byte count is Good !\n\n");
else SendToTelnet("Oh no, somethin' went wrong :(\n\n");
SendToTelnet("[HTTP] connection closed or file end.\n\n");
}
}
Что делать, куда копать?
В качестве альтернативы я поднял телнет мост к порту экранчика, думаю теперь при помощи какой технологии с веб странички впихнуть прошивку хотя бы в телнетовский порт...