MakerGram Logo

    MakerGram

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Popular
    • Tags
    • Users
    • Groups

    cJson Library error in ESP-IDF

    Development Boards
    2
    5
    1158
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • rafitc99
      rafitc99 last edited by rafitc99

      I'm trying to parse Json using cJson Library
      But getting error Core 0 register dump: and the microcontroller is resetting.
      I'm using ESP8266 and its on SDK for writing firmware. (ESP-IDF)

      Below I'm adding complete error log and code.

      In below code this part is causing for this error and reset

              json = cJSON_Parse(version);
              out = cJSON_Print(json);
              cJSON_Delete(json);
              printf("%s\n", out);
              free(out);
      
      I (10824) example: ... socket send success
      I (10828) example: ... set socket receiving timeout success
      I (11234) example: JSon Parser calling
      Guru Meditation Error: Core  0 panic'ed (LoadProhibited). Exception was unhandled.
      Core 0 register dump:
      PC      : 0x4000bf80  PS      : 0x00000030  A0      : 0x4022f684  A1      : 0x3fff70e0  
      0x4022f684: _puts_r at /home/dongheng/workspace/espressif/newlib_xtensa-2.2.0-bin/newlib_xtensa-2.2.0/xtensa-lx106-elf/newlib/libc/stdio/../../../.././newlib/libc/stdio/puts.c:90
      
      A2      : 0x00000000  A3      : 0xfffffffc  A4      : 0x000000ff  A5      : 0x0000ff00  
      A6      : 0x00ff0000  A7      : 0xff000000  A8      : 0x401078a0  A9      : 0x0000010c  
      A10     : 0x402559f0  A11     : 0x50545448  A12     : 0x00000000  A13     : 0x40106458  
      A14     : 0x00000000  A15     : 0x3ffeaaf8  SAR     : 0x0000001d  EXCCAUSE: 0x0000001c  
      
      Backtrace: 0x4000bf80:0x3fff70e0 0x4022f684:0x3fff70e0 0x4022f724:0x3fff7110 0x4022dc31:0x3fff7120 
      0x4022f684: _puts_r at /home/dongheng/workspace/espressif/newlib_xtensa-2.2.0-bin/newlib_xtensa-2.2.0/xtensa-lx106-elf/newlib/libc/stdio/../../../.././newlib/libc/stdio/puts.c:90
      
      0x4022f724: puts at /home/dongheng/workspace/espressif/newlib_xtensa-2.2.0-bin/newlib_xtensa-2.2.0/xtensa-lx106-elf/newlib/libc/stdio/../../../.././newlib/libc/stdio/puts.c:139
      
      0x4022dc31: http_get_task at /Users/rafi/Desktop/hawk/ESP8266_RTOS_SDK/examples/protocols/http_request/main/http_request_example_main.c:208
      
      @?Z-nP?M
              'γ?	%[
                        )Q
      ?O??T5??)?))??e5??
                        ?L?C?
      	I?TZ
                  ??TR?enB?[
      	??Q
                ?ؚ?P9?)?N9?Ɇ	)dг	5?P
      NRA?)ڻ^?)?N9?B??JA?
                         %Y.??+????D	W?	??ZQH???~?N??))GD?@
                                                                %Y.?^Z1O????Eؓ?  PF???J[	!d?TP?HP'i
                                        3mʉOC??JC?%YB7օ+k?))GD?@5
                                                                %Y	J+?1mG?A??JA?
      %?                   %^u@?
      5%ʃ?E???J	M
                       %
                        ƣ??[?P?TQ+E???J	
                                              %
                                               ??C?T?nV??@
                                                          -??\)DV?Q?NX????
               %[
                 -Z?IP?L
      ?E?)??JCB??q!
      1iGq?P#??
      %??MC??JA@!%Y%.?M%,?i
                           !XG?)!Eؑ?  h?
                                       %^u???	1?Ls?Y?P??Q?A??J	?
                                                                #??C?5dԵ1?LT?P?????????m
                             \?]eFL?))E???J	?D????5l?V?1NT?
                                                             PE??M????@P?\9'??
                   +??+)GD?@?F@J??I?7?n
                                       9)5NT?,R?e7??E@@)IJ?+
      YЛ?     ?EBH??A?Z5dֵ?LT??G?1?1??mP#?EFB?CH?)!Eؑ? `n
                                                       #???7nʋ?1DT?
      ? XU?MTՋ9E??5????@
       )R}?OC??JC%YY?V?P%?1?LL[
                               !?ֳ\ZQ?N?I (306) system_api: Base MAC address is not set, read default base MAC address from EFUSE
      I (312) system_api: Base MAC address is not 
      

      /* HTTP GET Example using plain POSIX sockets
      
         This example code is in the Public Domain (or CC0 licensed, at your option.)
      
         Unless required by applicable law or agreed to in writing, this
         software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
         CONDITIONS OF ANY KIND, either express or implied.
      */
      
      #include <string.h>
      
      #include "freertos/FreeRTOS.h"
      #include "freertos/task.h"
      #include "freertos/event_groups.h"
      
      #include "esp_wifi.h"
      #include "esp_event_loop.h"
      #include "esp_log.h"
      
      #include "nvs_flash.h"
      
      #include <netdb.h>
      #include <sys/socket.h>
      #include "cJSON.h"
      
      /* The examples use simple WiFi configuration that you can set via
         'make menuconfig'.
      
         If you'd rather not, just change the below entries to strings with
         the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid"
      */
      #define EXAMPLE_WIFI_SSID CONFIG_WIFI_SSID
      #define EXAMPLE_WIFI_PASS CONFIG_WIFI_PASSWORD
      
      /* FreeRTOS event group to signal when we are connected & ready to make a request */
      static EventGroupHandle_t wifi_event_group;
      
      /* The event group allows multiple bits for each event,
         but we only care about one event - are we connected
         to the AP with an IP? */
      const int CONNECTED_BIT = BIT0;
      
      /* Constants that aren't configurable in menuconfig */
      #define WEB_SERVER "hawk-ota.herokuapp.com"
      #define WEB_PORT 80
      #define WEB_URL "http://hawk-ota.herokuapp.com/api/get-json"
      
      static const char *TAG = "example";
      
      static const char *REQUEST = "GET " WEB_URL " HTTP/1.0\r\n"
          "Host: "WEB_SERVER"\r\n"
          "User-Agent: esp-idf/1.0 esp32\r\n"
          "\r\n";
      char version[50];
      char *out;
      cJSON *json;
      /*
      void Parse_Json(char *text)
      {
          
          if (!json) {
              printf("Error before: [%s]\n", cJSON_GetErrorPtr());
          } else {
              out = cJSON_Print(json);
              cJSON_Delete(json);
              ESP_LOGI(TAG,"\n here");
              puts(out);
              free(out);
          }
      }*/
      static esp_err_t event_handler(void *ctx, system_event_t *event)
      {
          /* For accessing reason codes in case of disconnection */
          system_event_info_t *info = &event->event_info;
      
          switch(event->event_id) {
          case SYSTEM_EVENT_STA_START:
              esp_wifi_connect();
              break;
          case SYSTEM_EVENT_STA_GOT_IP:
              xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);
              break;
          case SYSTEM_EVENT_STA_DISCONNECTED:
              ESP_LOGE(TAG, "Disconnect reason : %d", info->disconnected.reason);
              if (info->disconnected.reason == WIFI_REASON_BASIC_RATE_NOT_SUPPORT) {
                  /*Switch to 802.11 bgn mode */
                  esp_wifi_set_protocol(ESP_IF_WIFI_STA, WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G | WIFI_PROTOCOL_11N);
              }
              esp_wifi_connect();
              xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);
              break;
          default:
              break;
          }
          return ESP_OK;
      }
      
      static void initialise_wifi(void)
      {
          tcpip_adapter_init();
          wifi_event_group = xEventGroupCreate();
          ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );
          wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
          ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
          ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) );
          wifi_config_t wifi_config = {
              .sta = {
                  .ssid = EXAMPLE_WIFI_SSID,
                  .password = EXAMPLE_WIFI_PASS,
              },
          };
          ESP_LOGI(TAG, "Setting WiFi configuration SSID %s...", wifi_config.sta.ssid);
          ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
          ESP_ERROR_CHECK( esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) );
          ESP_ERROR_CHECK( esp_wifi_start() );
      }
      
      static void http_get_task(void *pvParameters)
      {
          const struct addrinfo hints = {
              .ai_family = AF_INET,
              .ai_socktype = SOCK_STREAM,
          };
          struct addrinfo *res;
          struct in_addr *addr;
          int s, r, j = 0;
          char recv_buf[64];
      
          while(1) {
              /* Wait for the callback to set the CONNECTED_BIT in the
                 event group.
              */
              xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT,
                                  false, true, portMAX_DELAY);
              ESP_LOGI(TAG, "Connected to AP");
      
              int err = getaddrinfo(WEB_SERVER, "80", &hints, &res);
      
              if(err != 0 || res == NULL) {
                  ESP_LOGE(TAG, "DNS lookup failed err=%d res=%p", err, res);
                  vTaskDelay(1000 / portTICK_PERIOD_MS);
                  continue;
              }
      
              /* Code to print the resolved IP.
      
                 Note: inet_ntoa is non-reentrant, look at ipaddr_ntoa_r for "real" code */
              addr = &((struct sockaddr_in *)res->ai_addr)->sin_addr;
              ESP_LOGI(TAG, "DNS lookup succeeded. IP=%s", inet_ntoa(*addr));
      
              s = socket(res->ai_family, res->ai_socktype, 0);
              if(s < 0) {
                  ESP_LOGE(TAG, "... Failed to allocate socket.");
                  freeaddrinfo(res);
                  vTaskDelay(1000 / portTICK_PERIOD_MS);
                  continue;
              }
              ESP_LOGI(TAG, "... allocated socket");
      
              if(connect(s, res->ai_addr, res->ai_addrlen) != 0) {
                  ESP_LOGE(TAG, "... socket connect failed errno=%d", errno);
                  close(s);
                  freeaddrinfo(res);
                  vTaskDelay(4000 / portTICK_PERIOD_MS);
                  continue;
              }
      
              ESP_LOGI(TAG, "... connected");
              freeaddrinfo(res);
      
              if (write(s, REQUEST, strlen(REQUEST)) < 0) {
                  ESP_LOGE(TAG, "... socket send failed");
                  close(s);
                  vTaskDelay(4000 / portTICK_PERIOD_MS);
                  continue;
              }
              ESP_LOGI(TAG, "... socket send success");
      
              struct timeval receiving_timeout;
              receiving_timeout.tv_sec = 5;
              receiving_timeout.tv_usec = 0;
              if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &receiving_timeout,
                      sizeof(receiving_timeout)) < 0) {
                  ESP_LOGE(TAG, "... failed to set socket receiving timeout");
                  close(s);
                  vTaskDelay(4000 / portTICK_PERIOD_MS);
                  continue;
              }
              ESP_LOGI(TAG, "... set socket receiving timeout success");
      
              /* Read HTTP response */
              do {
                  bzero(recv_buf, sizeof(recv_buf));
                  r = read(s, recv_buf, sizeof(recv_buf)-1);
                  
                  for(int i = 0; i < r; i++) {
                      //putchar(recv_buf[i]);
                      version[j++] = recv_buf[i];
                  }
              } while(r > 0);
              version[j++] = '\0';
              ESP_LOGI(TAG, "JSon Parser calling");
              
              json = cJSON_Parse(version);
              out = cJSON_Print(json);
              cJSON_Delete(json);
              printf("%s\n", out);
              free(out);
              j=0;
              ESP_LOGI(TAG, "... done reading from socket. Last read return=%d errno=%d\r\n", r, errno);
              close(s);
              for(int countdown = 10; countdown >= 0; countdown--) {
                  ESP_LOGI(TAG, "%d... ", countdown);
                  vTaskDelay(1000 / portTICK_PERIOD_MS);
              }
              ESP_LOGI(TAG, "Starting again!");
          }
      }
      
      
      
      
      void app_main()
      {
          ESP_ERROR_CHECK( nvs_flash_init() );
          initialise_wifi();
          xTaskCreate(&http_get_task, "http_get_task", 16384, NULL, 5, NULL);
      }
      ///Users/rafi/desktop/hawk/ESP8266_RTOS_SDK/examples/protocols/http_request
      
      1 Reply Last reply Reply Quote 0
      • salmanfaris
        salmanfaris last edited by

        @rafitc99 Are you able to fix this issue!

        rafitc99 1 Reply Last reply Reply Quote 0
        • rafitc99
          rafitc99 @salmanfaris last edited by

          @salmanfaris Yes. I fixed it. But no idea about the reason for this error.

          salmanfaris 1 Reply Last reply Reply Quote 0
          • salmanfaris
            salmanfaris @rafitc99 last edited by

            @rafitc99 How did you solved?

            rafitc99 1 Reply Last reply Reply Quote 0
            • rafitc99
              rafitc99 @salmanfaris last edited by

              @salmanfaris Actually I'm not sure what was that Core 0 register dump:
              But I parsed the JSON. Refer Here for cJSON example. But while working this one, faced another problem. HTTP response includes the whole headers, status code, and body. JSON parser only work if the whole response in the form of JSON. So, Initially stored all responses into a char buffer and cleaned all headers. By using if(response[i] == '{' ) and some flags.

              1 Reply Last reply Reply Quote 1
              • First post
                Last post

              Recent Posts

              • @binishmatheww All the best. Let us know if you need any help.

                • read more
              • @salmanfaris thanks a lot. 👍😁

                • read more
              • @binishmatheww There will be a single device, but I can't find one for now that has both GPS, GSM, BLE and USB Support.

                @binishmatheww said in I need help in making a GPS module:

                Also, can we have all these data transfer modes in a single module?

                You can make the priority and depending on that it can switch different modes.

                @binishmatheww said in I need help in making a GPS module:

                Transfer the data via Bluetooth if is connected.

                This can be achieved with BLE transfer.

                @binishmatheww said in I need help in making a GPS module:

                Transfer the data via a USB cable if it is plugged in.

                It can be achieved via Serial communication or USB HID profile.

                @binishmatheww said in I need help in making a GPS module:

                Transfer the data over the internet.

                here, we can route the data to the cloud over the phone or directly to the cloud via a GSM module or WiFi. I think it will be overkill if we use an external modem, better to cache the data and push to the cloud via phone and BLE if the live data is not needed.

                • read more
              • @salmanfaris thanks for the reply Salman 🙂.
                Is it difficult to transfer the data via a USB cable instead of Bluetooth?
                Also, can we have all these data transfer modes in a single module ?

                Transfer the data via Bluetooth if is connected. Transfer the data via a USB cable if it is plugged in. Transfer the data over the internet.

                If we have all these modes in a single module, will it increase the processor load ?

                • read more
              • Hi @binishmatheww , Welcome to Makergram.

                I see you want to build a GPS Logger. For that, you can use any basic GPS module available in the market such as NEO-6M GPS Module or any from the list here.

                After that, you need to choose a microcontroller, which can communicate with the GPS module read the GPS and translate the NMEA (data format for GPS packets) to a more usable format (you can do the post-processing in the phone too).

                Then you can send the data to hone via BLE, for this you can use a BLE-supported microcontroller or use a standalone BLE co-processor. My suggestion is to go with esp32 as it has BLE support and other cores can be used for the GPS data acquisition. To do the post-processing and other things you can do with the mobile app.

                You can split the project into different parts.

                GPS Data Acquisition. (You can use Arduino IDE + ESP32/Pico W + GPS module of your choice) GPS data translation (There will be Arduino lib which can make the translation easier) Send Data to the mobile app via BLE (Arduino IDE + ESP32/Pico W + BLE LIB + Mobile application).

                Hope you get an idea, please check and let us know. Happy building.

                • read more
              By MakerGram | A XiStart Initiative | Built with ♥ NodeBB
              Copyright © 2023 MakerGram, All rights reserved.
              Privacy Policy | Terms & Conditions | Disclaimer | Code of Conduct