ESP8266 запрашивает несколько HTTP GET одновременно - PullRequest
0 голосов
/ 03 марта 2019

Я начал свой первый проект с ESP8266.

Это монитор температуры, который отображает данные на веб-сервере.

Поскольку я не хочу обновлять страницу вручную, чтобы получитьновые данные, я использую HTTP-запросы для их отображения.

Я отправляю 3 разных запроса, один для текущей температуры, один для самой высокой и один для самой низкой.

Проблема, с которой я сталкиваюсь, заключается в том, что данные не будут обновляться одновременно, хотя я отправляю их все одновременно.

Вот код, который отправляет запросы:

<script>
    function getCurrent() {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
        document.getElementById("current").innerHTML =
        this.responseText;
      }
    };
    xhttp.open("GET", "readCurrent", true);
    xhttp.send();
    }

    function getHigh() {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
        document.getElementById("high").innerHTML =
        this.responseText;
      }
    };
    xhttp.open("GET", "readHigh", true);
    xhttp.send();
    }

    function getLow() {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
        document.getElementById("low").innerHTML =
        this.responseText;
      }
    };
    xhttp.open("GET", "readLow", true);
    xhttp.send();
    }

    setInterval(function() {
      getHigh();
      getLow();
      getCurrent();
    }, 2000);
</script>

И вот код, обрабатывающий их:

float temp;
float hoechst;
float tiefst;

void handleRoot() {
 String s = MAIN_page; //Read HTML contents
 server.send(200, "text/html", s); //Send web page
}

void handleCurrent() {
  float t = temp;
  server.send(200, "text/plane", String(t));
}

void handleHigh() {
  float high = hoechst;
  server.send(200, "text/plane", String(high));
}

void handleLow() {
  float low = tiefst;
  server.send(200, "text/plane", String(low));
}

void setup() {
  [...]
  server.on("/", handleRoot);
  server.on("/readCurrent", handleCurrent);
  server.on("/readHigh", handleHigh);
  server.on("/readLow", handleLow);
  [...]
}

Цикл просто обновляет Температуры с помощью этой функции:

void updateTemperatures() {
  sensor.requestTemperatures();
  yield();
  float low = tiefst;
  float high = hoechst;
  float t = sensor.getTempCByIndex(0);
   if(t < low) {
    low = t;
    } else if(t > high) {
      high = t;
      }
   yield();
   temp = t;
   tiefst = low;
   hoechst = high;
  }

И обрабатывает клиентов (server.handleClient ())

Итак, мой вопрос: как я могу обновить данные одновременно, или это вообще возможно с ESP8266?

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Проще говоря: вы не можете обновлять данные одновременно, потому что есть только одно ядро ​​ЦП.Кроме того, вы должны проектировать с учетом экономии, вам нужно иметь три транзакции, чтобы получить несколько чисел ... Одна из самых простых форм базы данных - это CSV, или «значения, разделенные запятыми»;по существу: значения, разделенные запятыми.

Зная порядок, в котором ваши температуры будут в списке (низкий, текущий, высокий), вы можете просто создать новую переменную или объединить свои переменные в выражении, которое выводитданные, это низкий "," current "," high и который вернет вам что-то вроде -1.23455,23.53556,37.23432, которое вы можете легко разделить на три, посмотрев запятые и используя строковые операторы.

Теперь вы можете получить три значения из одной транзакции с устройства с низкой спецификацией!

Удачи!:)

0 голосов
/ 03 марта 2019

Вы обновляете данные одновременно, возвращая все три значения в одном запросе.

Это был бы способ сделать это с любым веб-сервером, не говоря уже о том, что он работает на чрезвычайно ограниченном процессоре, таком как ESP8266.

Вы можете вернуть все три значения одновременно с помощью кода, который выглядит примерно так:

void handleAll() {
  String results_json = "{ \"temperature\": " + String(temp) + ",", +
                           "\"high\": " + String(hoechst) + "," +
                           "\"low\": " + String(tiefst) + " }";

  server.send(200, "application/json", results_json);
}

Это составляет объект JSON со всеми тремя значениями в нем.JSON - это «объектная нотация JavaScript», и Javascript очень легко собрать и разобрать.

Вам также необходимо обновить код веб-сервера ESP8266, добавив

server.on("/readAll", handleAll);

с помощьюэто изменение позволяет исключить остальные три обработчика / read.

И вам нужно будет обновить ваш Javascript.Вам просто нужно сделать один вызов в Javascript, преобразовать возвращаемый текст в объект Javascript и прочитать каждое из трех значений из него, чтобы установить элементы в DOM.Это то, что jQuery может сделать так тривиально для вас.

И это 'text/plain', а не 'text/plane'.

Вы также можете проверить jQuery - это очень сильноупростите свой код Javascript.

...