Сервер ESP, вызывающий функцию Javascript

Есть ли способ вызывать функции Javascript из ESP?

Я не хочу вызывать запросы AJAX каждые несколько секунд; Я хочу обновлять свои значения только при их изменении.

Может ли это быть сделано?

, 👍0

Обсуждение

гораздо проще: можно подключить и браузер, и mcu к реальному серверу. браузер подключается к нему через веб-сокет, и MCU отправляет обновления на сервер по мере того, как данные становятся доступными., @dandavis

Вы хотите получить доступ к JavaScript из браузера или хотите, чтобы esp вызывал сервер, предоставляющий JavaScript?, @Sim Son

Во первых спасибо за ответы. У меня есть esp в качестве сервера, и он запускает веб-сайт, который я использую в качестве графического интерфейса для моей программы esp. Теперь я использую XMLHttpRequest, чтобы браузер получал данные каждые 5 секунд и обновлял значения в графическом интерфейсе. И я хочу вызывать функцию обновления на странице всякий раз, когда значения в esp изменяются. Это возможно с событием server-push или server send? Мне нужно сначала погуглить. Спасибо, пока., @Tomas

@ Томас Вы видели мой комментарий к моему ответу? Это может помочь вам понять, @Sim Son

Спасибо вам всем. Да, я читал, и это помогло. Я понимаю это сейчас. Извините, что пишу вам только сейчас, но это моя первая ночная смена без реальной работы, а это значит, что я успел прочитать все ваши предложения., @Tomas


2 ответа


Лучший ответ:

2

Если вам нужна отправка сервером, вы можете использовать события, отправленные сервером, или веб-сокет вместо опроса с помощью XMLHttpRequest.

Так что да, это можно сделать, и я реализовал как с помощью Nano 33 IoT с одной стороны, так и с помощью Javascript в браузере с другой. Некоторый пример кода находится здесь: https://github.com/ocrdu/arduino-webinterface-sse и здесь: https://github.com/ocrdu/arduino-webinterface-websocket.

Однако я не знаю, есть ли для этого удобные библиотеки для ESP.

,

Я собираюсь погуглить. Спасибо, @Tomas


1

Я предполагаю, что вы неправильно понимаете, как работает JavaScript. JS выполняется на стороне клиента, поэтому esp может легко обслуживать JS-код так же, как и любой html-контент. Взгляните на примеры веб-сервера и вставьте свой код JavaScript в html-контент, который используется в примерах.

Важно отметить, что esp не выполняет JavaScript, с его точки зрения содержимое представляет собой обычную строку без каких-либо функций.

Самый простой и быстрый способ обновить значения в веб-интерфейсе — это, вероятно, использование веб-сокетов: esp — это сервер веб-сокетов (с использованием библиотеки веб-сокетов link2004). ), а JavaScript привязывается к веб-сокету esp как клиент (это не имеет ничего общего с esp/arduino/C++, но вы найдете там примеры).

,

Я новичок в этом деле. Я знаю или думаю, что мой esp - это сервер веб-сокетов. Но что это значит, я понятия не имею. Чтобы создать графический интерфейс веб-сайта, я изучил spiffs и немного html, css и javascript. Это более сложно, что я сначала имел в виду, когда начинал этот проект. Я стараюсь изучать только то, что мне нужно непосредственно для моих нужд. Я учусь в основном на примерах, и Google — мой лучший друг, но все примеры, которые я нашел, использовали XMLHttpRequest. Или, может быть, я задал Google неправильные вопросы., @Tomas

Ну, я не могу заставить вас понять это за секунду, но важная подсказка: вам все еще нужен веб-сервер, чтобы предоставить клиенту код html/JS. Кроме того, вам также нужно, чтобы esp был сервером веб**сокетов**. Как только клиент веб-сокета (JavaScript, выполняемый браузером, предоставленный esp-Webserver) подключился к серверу веб-сокета, у вас есть полнодуплексное соединение, при котором оба устройства могут отправлять данные в любое время. В JavaScript вы должны анализировать все, что отправляет сервер, и обновлять соответствующие значения. Я добавлю пример для клиента веб-сокета JS., @Sim Son

https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications, @Sim Son

Здесь exampleSocket.onmessage() — это место, куда поступают все сообщения, отправленные сервером., @Sim Son

Это было большим подспорьем. Спасибо, @Tomas