Skocz do zawartości

Żebym wiedział o co zapytać, deserializeJSON prosto do zmiennej...(?)


Pomocna odpowiedź

Dzięki. Implementacja i feedback jutro.

Nie, nie olałem ciepłym, nie znałem źródeł/wyjaśnienia, dzisiaj podałeś na tacy.

Powtórzę więc, dziękuję.

(edytowany)

Ok, wywaliłem z tej funkcji to:

 WCpm1 = suplaGet[0];
 WCpm10 = suplaGet[1];
 WCpm25 = suplaGet[2];
 WCgruntTemp = suplaGet[3];
 WCpressure = suplaGet[4];
 WChumidity = suplaGet[5];

a zamiast wstawiłem to wyżej jako global:

const struct suplaGet {
    int *value;
    const char *varname;
} 
suplaGets[6] = {
    {&WCpm1,"value"},
    {&WCpm10,"value"},
    {&WCpm25,"value"},
    {&WCgruntTemp,"temperature"},
    {&WCpressure,"value"},
    {&WChumidity,"humidity"}
    };

Następnie w zamieniłem linijkę przypisującą JSONa na taką:

    *suplaGets[i].value = doc[suplaGet[i].varname]; 

Szkic się skompilował, dzisiaj nie mam możliwości wgrania i przetestowania, zakładam, że będzie działać.

Co do httpResponseCode

if(httpResponseCode != od czego, od 200?){to co wtedy?}

 

ponawiamy odbieranie? 

Edytowano przez SOYER
2 minuty temu, ethanak napisał:

Jeśli nie 200 to zależy. Jeśli to 4xx to na pewno ponowienie requestu nie pomoże. A błędy są czymś spowodowane.

Ok, to zostawmy na razie i uznajmy że świat jest idealny;)

W tym samy szkicu mam jeszcze dwie funkcje bardzo podobne, ale one tylko wysyłają na serwer, nie potrzeba nic odbierać i zapisywać. No chyba, że responseCode...:))

Oto one:

String httpGETWC(const char* serverName) {
  WiFiClientSecure client1;
  HTTPClient http1;
  client1.setInsecure();
  http1.begin(client1, serverName);
  int httpResponseCode = http1.GET(); 
  String payload = "{}"; 
  
  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http1.getString();
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  
  http1.end();
  return payload;
}
String httpPOSTaqi(const char* serverName) {
  
float AQIpressure = pressure*100;
  WiFiClientSecure client1;
  HTTPClient http1;
  client1.setInsecure();
  http1.begin(client1, serverName);
  http1.addHeader("Content-Type", "application/json");
  int httpResponseCode = http1.POST("{\"esp8266id\": \"123123123\",\"sensordatavalues\":[{\"value_type\":\"PMS_P0\",\"value\":" + String(WCpm1) + "},{\"value_type\":\"PMS_P2\",\"value\":" + String(WCpm25) + "}, {\"value_type\":\"PMS_P1\",\"value\":" + String(WCpm10) + "},{\"value_type\":\"BME280_temperature\",\"value\":" + String(gruntTemp) + "},{\"value_type\":\"BME280_humidity\",\"value\":" + String(WChumidity) + "},{\"value_type\":\"wind_speed\",\"value\":" + String(average_kmh) + "},{\"value_type\":\"rainfall\",\"value\":" + String(mm24h) + "},{\"value_type\":\"BME280_pressure\",\"value\":" + String(AQIpressure) + "}]}");

  String payload = "{}"; 
  
  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http1.getString();
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  
  http1.end();
  return payload;
}

Może tez da się je dołączyć do wyżej zrobionej struktury, tutaj wartości varname nie będzie wprawdzie, ale może jest sposób by to połączyć...

(edytowany)

Po pierwsze: błędne moje rozumowanie, te struktury wcale nie są potrzebne w tych dwóch funkcjach, przecież nie potrzebujemy nic zapisywać, chodzi tylko o dodanie tych dwóch funcji do pętli for, a to mogę teraz zrobić przecież bez problemu, dodając if-a, jeśli będzie się odnosić do funcji wysyłających to nie wstawiamy w funkcji części odczytującej. Chyba, że znów można inaczej.

5 minut temu, ethanak napisał:

Pytanie kontrolne: po co w ogóle zwracasz payload?

Bardzo dobra uwaga, przerabiałem funkcje i zostało...

Edytowano przez SOYER
(edytowany)
1 godzinę temu, SOYER napisał:

te struktury wcale nie są potrzebne w tych dwóch funkcjach

Oczywiście. Ale mogą się przydać w różnych innych miejscach - przecież strukturę możesz rozbudować choćby po to, żeby nie tworzyć tasiemcowego składania request path. Coś w stylu:

const struct suplaGetter {
    int *value;
    const char *varname;
    const char *outname;
} suplaGetters[] = {
    {&WCpm1,"value",NULL},
    {&WCpm10,"value",NULL},
    {&WCpm25,"value",NULL},
    {&WCgruntTemp,"temperature","temp"},
    {&WCpressure,"value","bar"},
    {&WChumidity,"humidity","hum"}};
#define supaGettersCnt (sizeof(suplaGetters) / sizeof(suplaGetters[0]))

I potem gdzieś przy funkcji wysyłania:

    for (i=0;i<suplaGettersCnt;i++) {
        if (suplaGetters[i].outname) { // czyli nie NULL
            serverPathWC += "/" + suplaGetters[i].outname +
            "/" + String(*suplaGetters[i].value);
        }
    }

Ogólnie taką stałą tablicę możesz traktować jako część kodu i dowolnie rozbudowywać.

 

Edytowano przez ethanak
  • Pomogłeś! 1

Dobre, muszę jeszcze nad tym posiedzieć i ułożyć w głowie, ale sukces dla mnie, że wiem o czym piszesz:). Choć z mojego punktu widzenia im prościej tym czytelniej. 

Dzięki.

Na razie spróbuję namówić _LM_ do pomocy przy pierwszej kompilacji we wiadomym temacie. Później tam wiadomo, jakoś sobie poradzę, potrzeby mam niewielkie, a tu będę Cię jeszcze podpytywał.

 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...