2017-12-29 49 views
7

HTTP/REST API를 사용하여 일부 기능을 제공해야하는 IoT 장치를 개발하려고합니다. ESP32 칩 ("ESP32 dev board")을 사용하기로 결정했습니다.전원 공급시 ESP32 WPS가 다시 연결됩니다.

이제는 사용하기 쉬운 WLAN 구성을 구현하고 싶습니다. 다른 많은 샘플처럼 소스 코드에 자격 증명을 저장하고 싶지 않습니다. 그래서 나는 WPS를 사용하기로 결정했다.

소스를 사용하여 기본 웹 서버를 구현하려했습니다 : https://randomnerdtutorials.com/esp32-web-server-arduino-ide/ - 그런 다음 Arduino IDE 용 EPS32 확장과 함께 제공되는 Wifi/WPS 샘플에서 WPS 기능을 추가했습니다.

이제 WPS가 작동합니다. 즉, 개발 보드에 전원이 공급되면 WPS 연결 모드에 있으며 라우터가 WPS 연결을 수락 할 때까지 기다립니다. 그것은 성공적으로 SSID를 얻고 WLAN에 연결합니다.

그러나 ESP32의 전원을 껐다가 다시 켜면 WPS 재 연결 절차를 다시 수행해야합니다. 재 연결을 기대할 수 있습니다. ESP32 장치의 전원이 켜지면 나중에 언제든지 자격 증명을 저장하고 동일한 WLAN에 다시 연결할 수 있습니다. 내가 몇 가지 자격 증명을 저장하고 연결을 다시 설정하는 데 사용하는 것 같아요 -하지만 어디서 자격 증명을 어떻게해야합니까 다시 연결합니까?

웹에서 "ESP32 WLAN WPS reconnect"및 이와 유사한 용어를 검색했지만 non-wps (SSID + 암호) 연결에 대한 재 연결 전략 만 찾았습니다. 또한 WiFi 라이브러리 설명서 및 esp_wps 라이브러리 설명서를 확인했지만 적합한 내용을 찾지 못했습니다.

ESP를
#include <WiFi.h> 
#include "esp_wps.h" 

#define ESP_WPS_MODE WPS_TYPE_PBC 

esp_wps_config_t config = WPS_CONFIG_INIT_DEFAULT(ESP_WPS_MODE); 

String wpspin2string(uint8_t a[]){ 
    //... 
} 

void WiFiEvent(WiFiEvent_t event, system_event_info_t info){ 
    switch(event){ 
    case SYSTEM_EVENT_STA_START: 
    Serial.println("Station Mode Started"); 
    break; 
    case SYSTEM_EVENT_STA_GOT_IP: 
    Serial.println("Connected to :" + String(WiFi.SSID())); 
    Serial.print("Got IP: "); 
    Serial.println(WiFi.localIP()); 
    break; 
    case SYSTEM_EVENT_STA_DISCONNECTED: 
    Serial.println("Disconnected from station, attempting reconnection"); 
    WiFi.reconnect(); 
    break; 
    case SYSTEM_EVENT_STA_WPS_ER_SUCCESS: 
    Serial.println("WPS Successfull, stopping WPS and connecting to: " +  String(WiFi.SSID())); 
    esp_wifi_wps_disable(); 
    delay(10); 
    WiFi.begin(); 
    break; 
    case SYSTEM_EVENT_STA_WPS_ER_FAILED: 
    Serial.println("WPS Failed, retrying"); 
    esp_wifi_wps_disable(); 
    esp_wifi_wps_enable(&config); 
    esp_wifi_wps_start(0); 
    break; 
    case SYSTEM_EVENT_STA_WPS_ER_TIMEOUT: 
    Serial.println("WPS Timedout, retrying"); 
    esp_wifi_wps_disable(); 
    esp_wifi_wps_enable(&config); 
    esp_wifi_wps_start(0); 
    break; 
    case SYSTEM_EVENT_STA_WPS_ER_PIN: 
    Serial.println("WPS_PIN = " + wpspin2string(info.sta_er_pin.pin_code)); 
    break; 
    default: 
    break; 
    } 
} 

// some GPIO stuff, removed for SO question 

void setup() { 
    // initialize some GPIO for status etc. - removed for SO 

    //Initialize serial and wait for port to open: 
    Serial.begin(115200); 
    while(!Serial) { 
    ; // wait for serial port to connect. Needed for native USB port only 
    } 

    // We start by connecting to a WiFi network 

    WiFi.onEvent(WiFiEvent); 
    WiFi.mode(WIFI_MODE_STA); 

    Serial.println("Starting WPS"); 

    esp_wifi_wps_enable(&config); 
    esp_wifi_wps_start(0); 

    // attempt to connect to Wifi network: 
    while(WiFi.status() != WL_CONNECTED) { 
    // Connect to WPA/WPA2 network. Change this line if using open or WEP  network: 
    delay(700); 
    Serial.print("."); 
    } 
    Serial.println("WiFi connected"); 
    Serial.println("IP address: "); 
    Serial.println(WiFi.localIP()); 

    server.begin(); 
} 

void loop() { 
    //irrelevant for SO question 
} 
+0

나는 https://github.com/esp8266/Arduino/issues/2628의 스크립트를 ESP32 개발 보드 (가없고, 및 "esp_wps.h"가없는 스크립트)로 채택하려고 시도했다.) - 버튼이 눌려져 있고 기본 초기화가있는 경우에만 WPS 페어링을 호출합니다. WiFi.begin (WiFi.SSID(). c_str(), WiFi.psk(). c_str()); 하지만 작동하지 않았습니다. 자격 증명이 EEPROM에 쓰여지는 링크 된 샘플에서는 이해가되지 않습니까? –

+1

이전에 저장되었습니다. 주석 처리 된'qconfig' 코드를 찾으십시오. 이것이 자격 증명을 저장하는 방법입니다. – dda

답변

3

, 32 및 8266, 그것은 마지막으로 연결되었던 AP를 기억 무선 랜 WPS 연결 소스의

. 따라서 간단한 자격 증명없이 WiFi.begin();을 호출하면 마지막 AP에 연결됩니다. 그런 다음 while(WiFi.status() != WL_CONNECTED) 루프에서 시간 제한을 설정 한 다음 연결하지 않으면 esp_wifi_wps_start(0);을 호출 할 수 있습니다.