• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Хочу зашить экранчик Nextion при помощи ESP8266WebServer

capsolo

New member
Добрый день коллеги!
У меня есть веб страничка на 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>";
А вот такой обработчик дергания за ссылку /updateHMI
Код:
 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");
 
}
}
Не робит, зараза! спотыкаюсь на самом начале, когда хочу узнать размер файла. Он начинает расти вместе с закачкой, а мне его надо знать сразу. Ну и похоже браузер хочет мне весь файл целиком в память впихнуть, на что ЕСПшке становится очень очень плохо.....

Что делать, куда копать?
В качестве альтернативы я поднял телнет мост к порту экранчика, думаю теперь при помощи какой технологии с веб странички впихнуть прошивку хотя бы в телнетовский порт...
 

capsolo

New member
Экранчик сам не может. На ESP вебсервер крутится с формой пост запроса. У меня не получается корректно обработать пост запрос, чтобы узнать размер предлагаемого клиентом файла и по 4к залить в серийник экранчика.
 
Сверху Снизу