Skocz do zawartości

cJSON analiza danych


_LM_

Pomocna odpowiedź

Mam dane które przekazuję do esp32 jako ciąg cJSON:
 

From taskNew Data: {
    "COMMAND": "WRITE",
    "DATA": {
        "wifipass": "abc",
        "wifissid": "abc",
        "mqtturi": "www.test.com",
        "mqttport": "0000",
        "mqttusrname": "tester01",
        "mqttpass": "password",
        "devname": "esp",
        "devserialnumber": "12345"
    }
}

Wstępna funkcja która zajmuje się obróbką danych:
 

int decode_json(const char * buf, uint16_t lenght)
{
					const cJSON * header = NULL; // COMMAND
				    const cJSON * devname = NULL;
				    const cJSON *resolutions = NULL;
				    const cJSON *name = NULL;
					int status = 0;

  cJSON * btDataJson = cJSON_ParseWithLength(buf,lenght);

    if (btDataJson == NULL)
    {
        const char *error_ptr = cJSON_GetErrorPtr();
        if (error_ptr != NULL)
        {
            fprintf(stderr, "Error before: %s\n", error_ptr);
        }
        status = 0;
        goto end;
    }

  header = cJSON_GetObjectItemCaseSensitive(btDataJson, "COMMAND");

    if (cJSON_IsString(header) && (header->valuestring != NULL))
    {
        printf("Checking RW \"%s\"\n", header->valuestring);
        if(0 == strcmp("WRITE", header->valuestring))
        {
        	//printf("TRUE\n");

        }else  if(0 == strcmp("READ", header->valuestring))
        {
        	printf("FALSE\n");
        	status = 1;
        	goto end;
        }
    }
					end:
					    cJSON_Delete(btDataJson);
					    return status;
}

Pytanie jest następujące w jaki sposób mogę dostać się do pola "DATA" i czy ciąg powyżej jest w miarę dobrze z formatowany? Tj: czy powinienem go inaczej obudować na przykład tam gdzie pola się powtarzają?

EDIT: Proszę mnie nie besztać za "goto" sklejam to z przykładu z githuba 🙂 później usunę to diabelstwo
 

Edytowano przez _LM_
Link do komentarza
Share on other sites

/* return 1 if the monitor supports full hd, 0 otherwise */
int supports_full_hd(const char * const monitor)
{
    const cJSON *resolution = NULL;
    const cJSON *resolutions = NULL;
    const cJSON *name = NULL;
    int status = 0;
    cJSON *monitor_json = cJSON_Parse(monitor);
    if (monitor_json == NULL)
    {
        const char *error_ptr = cJSON_GetErrorPtr();
        if (error_ptr != NULL)
        {
            fprintf(stderr, "Error before: %s\n", error_ptr);
        }
        status = 0;
        goto end;
    }

    name = cJSON_GetObjectItemCaseSensitive(monitor_json, "name");
    if (cJSON_IsString(name) && (name->valuestring != NULL))
    {
        printf("Checking monitor \"%s\"\n", name->valuestring);
    }

    resolutions = cJSON_GetObjectItemCaseSensitive(monitor_json, "resolutions");
    cJSON_ArrayForEach(resolution, resolutions)
    {
        cJSON *width = cJSON_GetObjectItemCaseSensitive(resolution, "width");
        cJSON *height = cJSON_GetObjectItemCaseSensitive(resolution, "height");

        if (!cJSON_IsNumber(width) || !cJSON_IsNumber(height))
        {
            status = 0;
            goto end;
        }

        if ((width->valuedouble == 1920) && (height->valuedouble == 1080))
        {
            status = 1;
            goto end;
        }
    }

end:
    cJSON_Delete(monitor_json);
    return status;
}

Z dokumentacji 😉 

Po prostu robisz

cJSON* dataObjRef = cJSON_GetObjectItemCaseSensitive(btDataJson, "DATA");

A potem coś w stylu

cJSON* wifiPasswdJsonRef = cJSON_GetObjectItemCaseSensitive(dataObjRef, "wifipass");

To tak na sucho bez testowania (od czego bym zaczął).

  • Pomogłeś! 1
Link do komentarza
Share on other sites

(edytowany)

aa dobre, bo ja to próbowałem przypisać pod zajęty wskaźnik, zaraz sprawdzę

Edytowano przez _LM_
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

Działa, ale mam zagwozdkę pisząc teraz obie aplikacje na esp i android staram się uwzględnić wszystkie opcje przesyłanych danych. Co jeśli będzie potrzeba obsługi ciągów json z innymi polami klucz wartość? W aplikacji android to proste. W ESP32 będzie trzeba aktualizować każdy moduł, innej możliwości nie widzę 

Edytowano przez _LM_
Link do komentarza
Share on other sites

 Nie wiem dokładnie co chcesz zrobić ale pewnie się da... W C to trochę pisaniny... możesz przybliżyć o co chodzi?

Link do komentarza
Share on other sites

To tak: z aplikacji w telefonie przesyłam dane do konfiguracji urządzenia, dane dostępowe do wifi, ustawienia mqtt, dodatkowe pola które jeszcze nie są oprogramowane definiujace zachowanie urządzenia w konkretnych przypadkach. Na teraz wiem że ma to być powiadomienie o limicie czasu pracy, ilość załączeń nadzorowanej maszyny itd. Mamy to z grubsza obgadane z zamawiającym ale... Co jeśli w czasie użytkowania klient poprosi o dodatkowe funkcje? Tych modułów na początek ma być kilkanaście później się zobaczy. Także to trochę mi zaprząta głowę, niby dostęp to sieci będzie bo dane i tak muszą być wysyłane na serwer tyle że jeszcze nie testowałem ale obsługa wifi i bt zajmuje spro miejsca także może być problem z implementacją OTA. Takie tam rozkminy. 

Link do komentarza
Share on other sites

1 godzinę temu, _LM_ napisał:

Co jeśli w czasie użytkowania klient poprosi o dodatkowe funkcje? Tych modułów na początek ma być kilkanaście

No dobra... nie wiem co robi taki moduł ale po mojemu jak ma mieć jakąś dodatkową funkcjonalność to trzeba ją dopisać...

Natomiast do operowania na takim fragmencie tego jsona klucz(text)=>wartość(text) wygodniejsze może być przekształcenie tego na zwykłą listę bo się łatwiej po niej iteruje. Poza tym jeśli ten json ma zawsze taką postać to pokusiłbym się o napisanie własnego uproszczonego parsera.

A co do rozmiaru kodu... zawsze możesz użyć czegoś innego zamiast wrooma (swego czasu kupiłem parę WROVER-ów z 16 MB flasha).

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.