Использование 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();
}
@Ed Zamper, 👍-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; я слышал, что она довольно хороша ;-)
- Точка доступа ESP32 и веб сервер HTTP, как отправить несколько параметров?
- EspAsyncWebServer обрабатывает HTTPS в HTTP
- HTTP_GET не уточняется в области применения
- Отправка переменной в IFTTT через ESP32 с помощью Асинхронного веб-сервера
- страницы печатаются Json-данные
- ESP32 в Arduino-IDE с FS.h и SPIFFS
- Почему функция server.on() из "ESPAsyncWebServer.h" выполняется на стороне setup(), а не на стороне loop()?
- Интернет-сервер Arduino IDE + ESP32 — как перенаправить на root после нажатия кнопки
Пробовали ли вы следовать примерам, приведенным в [ESPAsyncWebServer](https://github.com/me-no-dev/ESPAsyncWebServer#json-body-handling-with-arduinojson ) документация? Код, который вы использовали, отличается от приведенного в примере., @romkey