Отправка XMLHttpRequests периодически вызывает непредвиденные ответы и приводит к путанице веб-страницы в Arduino - PullRequest
0 голосов
/ 16 мая 2019

Так что в основном я работаю над небольшим проектом с использованием Arduino, где ESP32 выступает в качестве веб-сервера. Я начинающий веб-разработчик, поэтому извините за невежество, когда я читаю описание проблемы ниже:

Идея состоит в том, что на одной из веб-страниц "dashboards.html" отображается значок сигнала Wi-Fi, который периодически обновляется каждые 500 мс (я знаю, что это излишне малый период, но это не имеет отношения к моей проблеме), и он показывает сигнал сила между ESP32 и маршрутизатором. Ниже приведен фрагмент кода javascript с веб-страницы «dashboards.html», который запрашивает сигнал Wi-Fi для обновления значка на его основе:

setInterval(function() {
  getData();
}, 500);

function getData() {
   var xhttp = new XMLHttpRequest();
   xhttp.onreadystatechange = function() {
   if (this.readyState == 4 && this.status == 200) {
        var receivedString = this.responseText;
        var signal = parseInt(receivedString);

        //update wifi signal image based on signal strength
        var wifiImage = document.getElementById("wifi_img");


        if(signal < -55){
            wifiImage.src="signal_wifi_2.png"
        }else{
            wifiImage.src="signal_wifi_3.png"
        }


    }
  };
  xhttp.open("GET", "updatewifisignal", true);
  xhttp.send();


}

Связь между сигналом и изображением, очевидно, далека от точной, но это только для того, чтобы протестировать код, который отлично работает. Теперь вот код на стороне сервера, который получает запрос и отправляет сигнал Wi-Fi:

if (strcmp(file_name, "updatewifisignal") == 0) {

            int rssi = WiFi.RSSI();

            Serial.println(rssi);

            client->println(rssi);

} 

где "имя_файла" - это имя запрошенного ресурса в запросе GET, отправленном клиентом.

До этого момента все работало гладко, и сигнал обновлялся каждые полсекунды. Однако, если мне случится запросить другую веб-страницу, используя гиперссылку в «dashboards.html» сразу после того, как был отправлен запрос на обновление значка wifi, то есть большая вероятность того, что браузер отобразит недавно запрошенную веб-страницу в беспорядке.

Я пытался решить эту проблему безуспешно уже 3 дня подряд. Вы, вероятно, можете выяснить причину, по которой это происходит так же, как и я, но вот что вызывает это последовательно:

  • сервер получает запрос на сигнал wifi
  • сервер отправляет сигнал Wi-Fi
  • как раз вовремя, клиент отправляет запрос на новую веб-страницу
  • клиент получает сигнал Wi-Fi вместо
  • сервер получает запрос на новую веб-страницу
  • сервер отправляет новую веб-страницу
  • клиент отображает странно выглядящую веб-страницу

поэтому мой мыслительный процесс пошел так:

  • Как я могу попросить клиента отменить ранее отправленный запрос, когда он делает запрос на новую веб-страницу?

    Я подумал, что не могу этого сделать, потому что после отправки запроса вы ничего не можете с этим поделать.

  • Хорошо, поэтому мне нужно указать серверу отбросить запрос на обновление сигнала, как только он получит запрос веб-страницы.

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

  • Поэтому установите таймер, если сервер получает запрос на обновление сигнала и запрос веб-страницы в течение очень короткого периода времени, отбросьте первый.

    Сервер может отправлять сигнал Wi-Fi прямо по истечении таймера, а клиент запрашивает веб-страницу. Так что это возвращает нас к самому началу.

Может быть, есть другие виды запросов, о которых я не знаю, может быть, это просто очень старая реализация. Буду признателен за любую помощь, которую вы можете предложить.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...