Új hozzászólás Aktív témák

  • Tomika86

    senior tag

    Sziasztok!

    Átírtam és kommenteztem a Nextion webserveres feltöltést. Az átalakítás oka, hogy a programkódban legyen a 3db html oldalkód, eredetileg SPIFFS-re volt feltöltve.

    Lenne kérdésem ezzel kapcsolatban:
    - Mi a különbség, hogy send vagy sendHeader (csak mert eredetileg a sendHeader küldte)
    - Ez így jó e?
    Eredetileg így volt: //server.sendHeader(F("Location"),"/failure.html?reason=" + nextion.statusMessage);
    Erre írtam át (itt is látni, eredetileg senHeader volt):
    nextion_update_server.send(200, "text/html", "failure_html?reason=" + nextion.statusMessage);
    - Ez így a kiválasztott fájl méretét adja a programnak át, jó így?
    // Fogadjuk a fájl méretét egyszer, amikor kiválasztjuk a fájlt.
    nextion_update_server.on("/fs", HTTP_POST, [](){ // Ez mit jelent? "/fs"
    fileSize = nextion_update_server.arg(F("fileSize")).toInt(); // "fileSize" a weboldalról jön
    nextion_update_server.send(200, F("text/plain"), "");
    });

    Köszönöm a segítséget!

    Itt a teljes kód, loop nélkül:
    #include <WiFiClient.h>
    #include <ESPmDNS.h>
    #include <WebServer.h>
    #include <ESPNexUpload.h>
    /*
    ESP32 használja a hardveres soros portot RX:16, TX:17
    Soros port pinek ESPNexUpload.cpp fájlban vannak definiálva
    */

    // Wifi adatok
    const char *host = "ezaz"; // Host név beállítása
    const char *ssid = "ESP"; // Hálózati azonosító név beállítása
    const char *password = "xxx"; // Kapcsolódáshoz jelszó
    IPAddress local_ip(192,168,10,150); // ESP32 IP cím beállítása
    IPAddress local_mask(255,255,255,0); // Maszk cím beállítása
    IPAddress gateway(192,168,10,150); // Átjáró cím beállítása

    // used only internally
    int fileSize = 0;
    bool result = true;

    // Nextion objektum létrehozása
    ESPNexUpload nextion(115200);
    // Webserver objektum létrehozása a megadott portszámmal
    WebServer nextion_update_server(100);

    // Hiba oldal
    char failure_html[] = R"=====(
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <title>Nextion kijelző frissítő</title>
    <script>
    function getUrlVars() { // Ez mit csinál?
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
    vars[key] = value;
    });
    return vars;
    }
    function setReason() { // Ez adja át a reason értékét a weboldalra?
    var reason = getUrlVars()["reason"];
    document.getElementById("reason").innerHTML = decodeURIComponent(reason);
    }
    </script>
    </head>
    <body onLoad="setReason()">
    <h2>Frissítés sikertelen!</h2>
    Üzenet: <strong><span id="reason"></span></strong>
    </body>
    </html>
    )=====";


    // Index oldal
    char index_html[] = R"=====(
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    <title>Nextion kijelző frissítő</title>
    </head>
    <body>
    <h3>Válaszd ki a .tft fájlt a feltöltéshez</h3>
    <form method="post" enctype="multipart/form-data">
    <input type="file" name="name" onchange="valSize(this)">
    <input id="button" type="submit" value="Feltöltés és frissítés" disabled>
    </form>
    <script>
    function valSize(file){ // megszerezzük a kiválasztott fájl méretét és elküldjük az ESP-nek
    var fs = file.files[0].size;
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function(){
    if(this.readyState == 4 && this.status == 200) { // Ha az ESP megkapta a fileSize-t akkor engedélyezzük a gombot(Feltöltés)
    document.getElementById("button").disabled = false;
    }
    };
    xhttp.open("POST", "/fs", true); // Ez a 3 sor mit csinál?
    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhttp.send("fileSize="+fs);
    }
    </script>
    <p>A frissítés sokáig tarthat, ha nagy a .tft fájl. Ellenőrizd a feltöltés folyamatát a kijelzőn.</p>
    </body>
    </html>
    )=====";


    // Sikeres oldal
    char success_html[] = R"=====(
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <title>Nextion kijelző frissítő</title>
    </head>
    <body>
    Frissítés sikeres!
    </body>
    </html>
    )=====";

    //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    // Fájl feltöltés kezelés
    bool handleFileUpload() {
    HTTPUpload& upload = nextion_update_server.upload(); // HTTP alapú fájl feltöltés
    if (!upload.filename.endsWith(F(".tft"))) { // Ellenőrizzük, hogy a fájl .tft végű-e
    nextion_update_server.send(500, F("text/plain"), F("CSAK .TFT FÁJL ENGEDÉLYEZETT!\n")); // Ha nem akkor hibaüzenet kiiratása
    return false; // Visszatérési érték flase
    }
    if (!result) { // Ha result értéke hamis
    nextion_update_server.sendHeader("Connection", "close"); // Átirányítjuk a failure.html oldalra a klienst
    nextion_update_server.send(200, "text/html", "failure_html?reason=" + nextion.statusMessage); // reason hogy megy innét át a html fájlba? Így jó?
    //server.sendHeader(F("Location"),"/failure.html?reason=" + nextion.statusMessage); // Ezt hogy tudom a felső sorba beírni?
    return false; // Visszatérési érték false
    }
    if (upload.status == UPLOAD_FILE_START) { // upload.status értékét vizsgáljuk, értéke 0
    Serial.println(F("\nFajl fogadva. Nextion frissitese..."));
    result = nextion.prepareUpload(fileSize); // Előkészítjük a Nextion kijelző soros küldéshez és elküldjük a fájl pontos méretét
    if (result) { // Ha készen áll a Nextion kijelző a fogadásra
    Serial.print(F("Feltoltes inditasa. A fajl merete: "));
    Serial.print(fileSize); // Fájl méretének kiírása
    Serial.println(F(" bytes"));
    }
    else {
    Serial.println(nextion.statusMessage + "\n"); // Ha végzett akkor kiiratjuk a státusz üzenetet
    return false; // Visszatérési érték false
    }
    }
    else if (upload.status == UPLOAD_FILE_WRITE) { // upload.status értékét vizsgáljuk, értéke 1
    result = nextion.upload(upload.buf, upload.currentSize); // Írjuk a fogadott byte-kat a Nextion kijelzőbe
    if(result) {
    Serial.print(F(".")); // Amíg a feltöltés tart, addig pontokat iratunk ki
    }
    else {
    Serial.println(nextion.statusMessage + "\n"); // Ha végzett akkor kiiratjuk a státusz üzenetet
    return false; // Visszatérési érték false
    }
    }
    else if (upload.status == UPLOAD_FILE_END) { // upload.status értékét vizsgáljuk, értéke 2
    nextion.end(); // Soros kapcsolat bontása és Nextion szoftveres újraindítása
    Serial.println("");
    Serial.println(nextion.statusMessage); // Kiratjuk a státusz üzenetet
    return true; // Visszatérési érték true
    }
    }
    //-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    void setup(void) {
    Serial.begin(115200);
    WiFi.mode(WIFI_AP); // WIFI Access Point módba állítása
    WiFi.softAP(ssid, password, 1, 0, 1); // WIFI konfiguráció: SSID és Jelszó, csatorna, rejtett ssid, maximum csatlakozható eszközök
    delay(500); // Késleltetés
    WiFi.softAPConfig(local_ip,gateway,local_mask); // IP címek beállítása
    Serial.print("AP neve ");
    Serial.println(ssid); // SSID kiírása
    Serial.print("IP cim: ");
    Serial.println(WiFi.softAPIP()); // IP cím kiírása
    if (!MDNS.begin(host)) {
    while (1) {
    delay(1000);
    }
    }
    // Szerver inicializálás
    nextion_update_server.on("/", HTTP_POST, [](){
    Serial.println(F("Succesfully updated Nextion!\n")); // Sikeres Nextion frissítés kiiratása soros monitoron
    nextion_update_server.sendHeader("Connection", "close");
    nextion_update_server.send(200, "text/html", success_html); // Átirányítjuk a klienst a sikeres oldalra, miután kezeltük a fájl feltöltést
    return true;
    },
    handleFileUpload // Fogadás és fájl mentése kijelzőre
    );
    // Fogadjuk a fájl méretét egyszer, amikor kiválasztjuk a fájlt.
    nextion_update_server.on("/fs", HTTP_POST, [](){ // Ez mit jelent? "/fs"
    fileSize = nextion_update_server.arg(F("fileSize")).toInt(); // "fileSize" a weboldalról jön
    nextion_update_server.send(200, F("text/plain"), "");
    });

    nextion_update_server.begin();
    Serial.println(F("\nHTTP szerver elinditva"));
    }

Új hozzászólás Aktív témák

Hirdetés