Page 1 of 1

I have a problem of using WPS connection.

Posted: Sun Jul 16, 2017 10:25 am
by Akira Kashihara
Hello, I face a problem on using WPS connection.
I refer to same code of esp-idf repository and create the following.
However I get an error "Guru Meditation Error: Core 0 panic'ed (abort)"
I debug this code and I guess that " ESP_ERROR_CHECK(esp_wifi_start());" makes this error but I cannot understand why this code makes me it.
I'm looking forward to your solution about it.

Code: Select all

#include <Arduino.h>

#include <WiFi.h>
#include <esp_wps.h>
#include <esp_wifi.h>
#include <esp_log.h>
#include <esp_event_loop.h>

#include <HTTPClient.h>

#define USE_SERIAL Serial

static const char *TAG = "example_wps";
#define PIN2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5], (a)[6], (a)[7]
#define PINSTR "%c%c%c%c%c%c%c%c"

static esp_err_t event_handler(void *ctx, system_event_t *event) {
  switch (event->event_id) {
    case SYSTEM_EVENT_STA_START:  //Station Start event
      ESP_LOGI(TAG, "SYSTEM_STA_START");  //log station start event
      break;
    case SYSTEM_EVENT_STA_GOT_IP:             //station ip address get event
      ESP_LOGI(TAG, "SYSTEM_EVENT_STA_GOT_IP"); //log
      ESP_LOGI(TAG, "got ip %s\n", ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip)); //log ip address
      break;
    case SYSTEM_EVENT_STA_DISCONNECTED:     //station disconnected event
      ESP_LOGI(TAG, "SYSTEM_EVENT_STA_DISCONNECTED"); //log disconnect
      ESP_ERROR_CHECK(esp_wifi_connect());            //wifi reconnect after disconnect event
    case SYSTEM_EVENT_STA_WPS_ER_SUCCESS:           //ESO32 station wps succeeds in enrollee mode
      ESP_LOGI(TAG, "SYSTEM_EVENT_STA_WPS_ER_SUCCEESS");  //log esp32 station wps enrollee mode
      ESP_ERROR_CHECK(esp_wifi_wps_disable());        //wps function is disable
      ESP_ERROR_CHECK(esp_wifi_connect());            //wifi connect
      break;
    case SYSTEM_EVENT_STA_WPS_ER_FAILED:  //esp32 wps is failed
      ESP_LOGI(TAG, "SYSTEM_EVENT_STA_WPS_ER_FAILED");    //log that esp32 wps is failed
      ESP_ERROR_CHECK(esp_wifi_wps_disable());  //esp wps is disable
      ESP_ERROR_CHECK(esp_wifi_wps_enable(WPS_TYPE_PBC));    //esp32 wps is push button configuration mode restart
      ESP_ERROR_CHECK(esp_wifi_wps_start(0));             //esp32 wps is started
      break;
    case SYSTEM_EVENT_STA_WPS_ER_TIMEOUT:     //esp32 wps is timeout
      ESP_LOGI(TAG, "SYSTEM_EVENT_STA_WPS_ER_TIMEOUT"); //log timeout
      ESP_ERROR_CHECK(esp_wifi_wps_disable());  //esp wps is disable
      ESP_ERROR_CHECK(esp_wifi_wps_enable(WPS_TYPE_PBC));    //esp32 wps is push button configuration mode restart
      ESP_ERROR_CHECK(esp_wifi_wps_start(0));             //esp32 wps is started
      break;
    case SYSTEM_EVENT_STA_WPS_ER_PIN:                 //ESP32 station wps pin code in enrollee mode
      ESP_LOGI(TAG, "SYSTEM_EVENT_STA_WPS_ER_PIN");   //log
      //show the PIN code here
      ESP_LOGI(TAG, "WPS_PIN = "PINSTR, PIN2STR(event->event_info.sta_er_pin.pin_code));
      break;
    default:
      break;
  }
  return ESP_OK;
}

void setup() {

  tcpip_adapter_init(); //This will initialize TCPIP inside.

  wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); //Initialize WiFi Configuration
  ESP_ERROR_CHECK(esp_wifi_init(&cfg));                //esp wifi initilaize with cfg

  ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));     //wifi mode is station mode
  ESP_ERROR_CHECK(esp_wifi_start());                    //wifi start

  ESP_LOGI(TAG, "start wps...");                        //output log
  ESP_ERROR_CHECK(esp_wifi_wps_enable(WPS_TYPE_PBC));   //wps enable in on Push Button Configuration mode
  ESP_ERROR_CHECK(esp_wifi_wps_start(0));               //wps is started without blocking time

  USE_SERIAL.begin(115200);

  USE_SERIAL.println();
  USE_SERIAL.println();
  USE_SERIAL.println();

  for (uint8_t t = 4; t > 0; t--) {
    USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
    USE_SERIAL.flush();
    delay(1000);
  }
}

void loop() {
  if (esp_wifi_connect() == ESP_OK) {
    HTTPClient http;

    USE_SERIAL.print("[HTTP] begin...\n");
    http.begin("http://example.com/index.html"); //HTTP

    USE_SERIAL.print("[HTTP] GET...\n");
    int httpCode = http.GET();

    if (httpCode > 0) {
      USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);

      if (httpCode == HTTP_CODE_OK) {
        String payload = http.getString();
        USE_SERIAL.println(payload);
      }
    } else {
      USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
    }

    http.end();
  }
  delay(5000);
}