Search code examples
javascripthtmlhttparduinoesp32

How can I retrieve plane text data from one local ip to another in javascript?


I am using an ESP32 Wifi module as a master to host a webpage displaying the values of a number of binary data points in a table as either OK or FAILED. I need to have this device retrieve data from another ESP32 client on a local IP i.e 192.168.138.50/readVal1 this address will display simply plane text either OK or FAILED. I would like to take this value and display it in the table produced by my master module. How should I go about doing this?

I have tried using an HTTP get request as follows in the Arduino code.

void runTest6(){
    String payload;
    HTTPClient http;
    http.begin("192.168.137.50/readBatt1");

    int httpCode = http.GET();
    if(httpCode > 0) {
        payload = http.getString();
        Serial.println(payload);
    }else{
        Serial.println("HTTP request error");
    }
    http.end();
    String batt6val = payload;
    server.send(200, "text/plane", batt6val);
}

Here is my Javascript on the root that handles the updates\

function getData(){
    try{
        console.log("Getting Data...");
        for(var i = 1;i<=NUMOFUNITS;i++){
            (function (i){
                setTimeout(function () {
                    console.log("(debug msg)in loop #: " + i)
                        var xhttp = new XMLHttpRequest();
                        var current = "batt" + i + "val";
                        var dataRead = "readBatt" + i;
                        xhttp.onreadystatechange = function(){
                            if (this.readyState == 4 && this.status == 200){
                                console.log("updating innerHTML for data value: " + i);
                                document.getElementById(current).innerHTML = this.responseText;
                            }else if(this.readyState == 4 && this.status == 404){
                                console.log("no battery @ " + i);
                                document.getElementById(current).innerHTML = "None found";
                            }
                        };
                        xhttp.open("GET", dataRead, true);
                        xhttp.send();
                        if(i == 1){
                            updateTime();
                        console.log("Updated times.")
                        }   
                    }, 400*i);
                })(i);
            };
            console.log("Data update complete.");
        }
        catch(err){
            alert(err.name);
            throw err;
            getData(); //try to get data again 
        }
        finally{
            console.log("DONE");
        }
    }

Solution

  • Using and HTTP server I am able to send the information between ESP32's. Using the WebServer I have set server.on("/status/{}", sendData); where the {} hold the pathArg aka a number representing which data is being asked for. The function senData() takes the pathArg and sends the appropriate data as follows.

    void sendData(){
        String battString = server.pathArg(0);
        Serial.println("Sending Data... PathArg= " + battString);
        int battNum = battString.toInt();
        int arrayNum = battNum - 1;
        server.send(200, "text/plane", battStatus[arrayNum]);
    }
    

    Here an array called battStatus holds the status of each.