簡體   English   中英

從ESP8266 / Wemos上的傳入HTTP Post請求解析數據

[英]Parsing data from incoming HTTP Post request on ESP8266/Wemos

我正在Android應用程序上向Wemos D1 mini pro發送HTTP Post請求,並想解析傳入的數據(是json)。 我當前的代碼只是打印出整個POST請求,我需要對其進行裁剪,以便僅獲取所需的數據。 那里有幾個例子,但是沒有一個能滿足我的需求或根本無法工作。

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ArduinoJson.h>




const char* ssid = "myssid";
const char* password = "mypassword";
char c;
String readString = String(100);
WiFiServer wifiServer(80);


void setup() {

  Serial.begin(9600);
  delay(1000);

  WiFi.begin(ssid, password);
  WiFi.mode(WIFI_STA);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting..");
  }

  Serial.print("Connected to WiFi. IP:");
  Serial.println(WiFi.localIP());
  wifiServer.begin();

}


//for parsing the actual JSON later  
//you can ignore this at this moment because I don't even get the needed string to parse it from JSON
void handleReceivedMessage(String message){

  StaticJsonBuffer<500> JSONBuffer;                     //Memory pool
  JsonObject& parsed = JSONBuffer.parseObject(message); //Parse message

  if (!parsed.success()) {   //Check for errors in parsing

    Serial.println("Parsing failed");
    return;

  }

  const char * name3 = parsed["name"];           //Get name from HTTP
  Serial.println("name3");
}


void loop() {
  WiFiClient client = wifiServer.available();


  if (client) {
  Serial.println("Client connected");


    while (client.connected()) {

      while (client.available()>0) {
        //instream from mobile device

        char c = client.read();
        if (readString.length() < 100) {

         //store characters to string
         readString.concat(c);
         //Serial.print(c);
}
      Serial.print(c);
//if HTTP request has ended
       if (c == '\n') {
          //Serial.println(readString);   
          delay(50);  
          //handleReceivedMessage(readString);         
          readString = "";
          client.stop();
   }
 }}}}

好吧,首先,您似乎正在使用ArduinoJson lib版本5,現在我可以共享使用的代碼,而對於版本5則從未失敗過。但是我將鼓勵您將庫更新為版本6,並與您共享我的代碼。

當我需要從API獲取信息時,通常會用到它

 DynamicJsonDocument doc(1024);

char* payload1 = (char*)malloc(http.getSize() + 1);
http.getString().toCharArray(payload1, http.getSize() + 1);
Serial.println(payload1);
http.end();

auto error = deserializeJson(doc, payload1);
free(payload1);
if (error) {
  Serial.print(F("deserializeJson() failed with code "));
  Serial.println(error.c_str());
  return;
}
serializeJsonPretty(doc, Serial);

現在,正如您所看到的,我正在使用httpClient lib中的getString方法來填充我的char數組,而不是將其解析為json對象(幾乎與您嘗試的相同,只是區別是內存指針和內存分配。

希望這會與您合作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM