ESPAsyncWebServer

JoKeR_13

✩✩✩✩✩✩✩
12 Окт 2018
6
0
Доброго!
Поделитесь рабочим примером, как со страницы отправить json и обработать его в прошивке.
На стороне прошивки пробую так:
C++:
AsyncCallbackJsonWebHandler* handler = new AsyncCallbackJsonWebHandler("/post-message", [](AsyncWebServerRequest *request, JsonVariant &json) {
  Serial.println("JSON");
  JsonObject jsonObj = json.as<JsonObject>();
  String response;
  serializeJson(jsonObj, response);
  request->send(200, "application/json", response);
  Serial.println(response);
});

  server.addHandler(handler);
Из HTML вот так отправляю:
JavaScript:
 $.ajax({
        url: '/post-message',
        type: 'POST',
        data: JSON.stringify(json),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        async: false,
        success: function(msg) {
            alert(msg);
        }
    });
Но я не попадаю в эту часть кода.

Буду признателен за помощь
 

kDn

★★★★★✩✩
18 Ноя 2019
1,103
437
@JoKeR_13, есть готовый фреймворк берущий на себя весь обмен, берите, изучайте, пользуйтесь. Ну либо читайте исходники для понимания как организован обмен туда-сюда. На этом фреймворке сделана лампа, в теме можете поглядеть как интерфейс выглядит. Ну и ессно все крутится на ESPAsyncWebServer, при этом сам фреймворк работает как на есп8266, так и на есп32.
 

JoKeR_13

✩✩✩✩✩✩✩
12 Окт 2018
6
0
@JoKeR_13, есть готовый фреймворк берущий на себя весь обмен, берите, изучайте, пользуйтесь. Ну либо читайте исходники для понимания как организован обмен туда-сюда. На этом фреймворке сделана лампа, в теме можете поглядеть как интерфейс выглядит. Ну и ессно все крутится на ESPAsyncWebServer, при этом сам фреймворк работает как на есп8266, так и на есп32.
Пробую example из библиотеки и после прошивки получаю циклическую перезагрузку
wdt reset
load 0x4010f000, len 3584, room 16
tail 0
chksum 0xb0
csum 0xb0
v2843a5ac
~ld
Starting test...
UI: Creating system vars
UI CREATE key: (hostname) value: () RAM: 37656
UI CREATE key: (APonly) value: (false) RAM: 37656
UI CREATE key: (APpwd) value: () RAM: 37656
UI CREATE key: (m_host) value: () RAM: 37656
UI CREATE key: (m_port) value: () RAM: 37656
UI CREATE key: (m_user) value: () RAM: 37656
UI CREATE key: (m_pass) value: () RAM: 37656
UI CREATE key: (m_pref) value: () RAM: 37656
UI CREATE key: (m_tupd) value: (30) RAM: 37656
UI CREATE key: (TZSET) value: () RAM: 37656
UI CREATE key: (userntp) value: () RAM: 37656

ets Jan 8 2013,rst cause:4, boot mode:(3,7)

wdt reset
load 0x4010f000, len 3584, room 16
tail 0
chksum 0xb0
csum 0xb0
v2843a5ac
~ld
Starting test...
 

kDn

★★★★★✩✩
18 Ноя 2019
1,103
437
@JoKeR_13, с какого бренча брали фреймворк? Работает ли второй пример? Записали ли ФС предварительно?

Проверил на дев-ветке, без ФС:
C++:
rd␀d��|␀�l�|␃␄␌␄�␄$�␄c|��␃�␒�;�c�␄c��g'�lng���␌b␜x��l;l{l8�g�␐␃␌␄�␄l␌Ĝ␄␌␌b␌'�|␃�l�␌�b��og�␀l��l`␃�␛␛go␌d`␂␎␃gs�ۓo␌␄#␃$`␃␏;��g␄␌c␃l`␃�c␄␌�␜␃�$r�`␂��n�␃Starting test...
UI: Creating system vars
UI CREATE key: (hostname) value: () RAM: 45888
UI CREATE key: (APonly) value: (false) RAM: 45888
UI CREATE key: (APpwd) value: () RAM: 45888
UI CREATE key: (m_host) value: () RAM: 45888
UI CREATE key: (m_port) value: () RAM: 45888
UI CREATE key: (m_user) value: () RAM: 45888
UI CREATE key: (m_pass) value: () RAM: 45888
UI CREATE key: (m_pref) value: () RAM: 45888
UI CREATE key: (m_tupd) value: (30) RAM: 45888
UI CREATE key: (TZSET) value: () RAM: 45888
UI CREATE key: (userntp) value: () RAM: 45888
UI: Creating application vars
UI: Creating webui vars
UI CREATE key: (lang) value: (0) RAM: 45888
UI REGISTER: settings
UI REGISTER: sh_netw
UI REGISTER: sh_time
UI REGISTER: set_wifi
UI REGISTER: set_wifiAP
UI REGISTER: set_mqtt
UI REGISTER: set_time
UI REGISTER: lang
UI CREATE key: (v1) value: () RAM: 45568
UI REGISTER: demo
UI REGISTER: do_demo
UI CONFIG: {"hostname":"","APonly":"false","APpwd":"","m_host":"","m_port":"","m_user":"","m_pass":"","m_pref":"","m_tupd":"30","TZSET":"","userntp":"","lang":"0","v1":""}
UI READ: key (TZSET) value ()
UI READ: key (userntp) value ()
UI READ: key (hostname) value ()
UI READ: key (APpwd) value ()
UI MAC ID:3C728E
UI WRITE: key (hostname) value (EmbUI-3C728E) UI FREE: 1729
UI WiFi: set AP params to SSID:EmbUI-3C728E, pwd:
UI READ: key (APonly) value (false)
UI WiFi: start in AP/STA mode
UI WiFi: STA reconecting...
UI: Save default main config file
UI: AutoSave
Точка доступа создается и к ней без проблем подключаюсь, при переходе на 192.168.4.1 - Not found (так и должно быть)
Распаковываю \Projects\EmbUI\resources\data.zip в \PlatformIO\Projects\EmbUI\examples\ex_generic\data\ , собираю ФС, заливаю в контроллер - UI доступен.

1611929357553.png
 

JoKeR_13

✩✩✩✩✩✩✩
12 Окт 2018
6
0
Сорри, я уже сделал. Не то запускалось. Сижу штудирую
 

kDn

★★★★★✩✩
18 Ноя 2019
1,103
437
Да без проблем, баги не исключены, в том числе и в примерах, поскольку редко туда заглядываем. :)
 

JoKeR_13

✩✩✩✩✩✩✩
12 Окт 2018
6
0
А можно простой пример как вывести на страничку переменную, скажем с температурой, что бы она обновлялась? Я так понял есть 2 пути сделать в html свой объект с id и указать его в программе, как сделано с часами, версией и памятью, а можно и программно вывести. Интересно програмно
 

kDn

★★★★★✩✩
18 Ноя 2019
1,103
437
А можно простой пример как вывести на страничку переменную, скажем с температурой, что бы она обновлялась? Я так понял есть 2 пути сделать в html свой объект с id и указать его в программе, как сделано с часами, версией и памятью, а можно и программно вывести. Интересно програмно
Поглядите как выводится % обновления по ОТА в лампе и сделайте аналогично. Ну или еще вариант в той же лампе - отложенная загрузка имен эффектов сделана так, что значения контрола лукапа подменяются на другие через 10 секунд. Если по простому - то нужно попросту передать повторно требуемую секцию с контролами и она будет обновлена.

* Накидал простейший пример, где предполагается что функция periodicCall() дергается с некоторой периодичностью.

C++:
void show_info(Interface *interf, JsonObject *data);

void periodicCall(){
    DynamicJsonDocument doc(256);
    JsonObject obj = doc.to<JsonObject>();

    obj["param"] = String("value to show: ") + String(millis());
    CALL_INTF_OBJ(show_info);
}

void show_info(Interface *interf, JsonObject *data){
    if (!interf) return;
    
    interf->json_frame_interface();
        interf->json_section_content();
            interf->comment("Comment");
            interf->text("id", (*data)["param"]);
        interf->json_section_end();
    interf->json_frame_flush();
}
 
Изменено:
  • Лойс +1
Реакции: JoKeR_13