Использование ESPAsyncWebServer.h с ArduinoJson версии 6 для транзакций мастер-клиент

Я хочу передать два (2) ESP32 с помощью команд Json, используя ESPAsyncWeb.h. Мастер должен иметь определенные операции для выполнения и ответа клиенту, а клиент должен иметь возможность отправлять определенные команды Json, чтобы задавать вопросы и получать ответы. Я попробовал метод, приведенный ниже, но он выдает мне странные ошибки, такие как

невозможно привязать неконстантную ссылку lvalue типа 'ArduinoJson::JSONObject&' {он же 'ArduinoJson6185_91::OBjectRef&'} к rvalue типа 'ArduinoJson6185_91::enable_if<true, ArduinJson6185_91::ObjectRef>::type' {он же 'ArduinoJson6185_91::ObjectRef'}

Я не уверен, как реализовать операции для отправки Json и получения ответа от сервера с помощью ArduinoJson 6. Если бы кто-нибудь мог просветить меня о том, как проводить такие транзакции, я был бы признателен.

 void setup(){

//запуск последовательной связи
// Трансляция как WiFi SoftAP

 server.on("/command", HTTP_POST, [](AsyncWebServerRequest *request, JsonVariant &json) 
          {JsonObject& jsonObj = json.as<JsonObject>();
           uint8_t command = jsonObj["C"];
           String response;
           switch(command){
                           case 0: response = "{\"SCAN\":\"received_scan\"}";
                           request -> send(200, "application/json", response);
                           return;
                           case 1: /*... похожие вещи */

                           case 2: /*...*/
}});
server.begin();
}

, 👍-1

Обсуждение

Пробовали ли вы следовать примерам, приведенным в [ESPAsyncWebServer](https://github.com/me-no-dev/ESPAsyncWebServer#json-body-handling-with-arduinojson ) документация? Код, который вы использовали, отличается от приведенного в примере., @romkey


1 ответ


1

невозможно привязать неконстантную ссылку lvalue типа 'ArduinoJson::JSONObject&' {он же 'ArduinoJson6185_91::ObjectRef&'} к rvalue типа 'ArduinoJson6185_91::enable_if<true, ArduinJson6185_91::ObjectRef>::type' {он же 'ArduinoJson6185_91::ObjectRef'}

Другими словами, "невозможно присвоить JSONObject JSONObject&". Компилятор отказывается сохранять ссылку на временную переменную, потому что ссылка неизбежно будет болтаться.

Чтобы устранить эту проблему, вы должны удалить амперсанд (&) после JSONObject, например:

JsonObject jsonObj = json.as<JsonObject>();

И было бы лучше, если бы вы также сделали то же самое для JsonVariant.

Кстати, приведение из JsonVariant в JSONObject в вашем случае не требуется, поэтому вы можете упростить свою программу до:

server.on("/command", HTTP_POST,
          [](AsyncWebServerRequest* request, JsonVariant json) {
            switch (json["C"].as<uint8_t>()) {
              case 0:
                request->send(200, "application/json",
                              "{\"SCAN\":\"received_scan\"}");
                return;
                
              case 1: /*...similar stuff */

              case 2: /*...*/
            }
          });

Я рекомендую вам ознакомиться с документациейArduinoJson; я слышал, что она довольно хороша ;-)

,