2017-12-29 178 views
7

HTTP/REST APIを使用して機能を提供するIoTデバイスを開発しようとしています。 ESP32チップ( "ESP32 dev board")を使うことにしました。電源投入時にESP32 WPSが再接続する

ここでは、使いやすいWLAN設定を実装したいと考えています。他の多くのサンプルと同じように、私のソースコードに資格情報を格納したくありません。私はWPSを使うことにしました。

ここでは、ソースを使用して基本Webサーバーを実装しようとしました: 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再接続」と同様の用語をWebで検索しましたが、non-wps(SSID +パスワード)接続の再接続戦略しか見つかりませんでした。また、WiFiライブラリのドキュメントとesp_wpsライブラリのドキュメントもチェックしましたが、適切なものは見つかりませんでした。 WLAN WPSの接続元だ

#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

ESP、32と8266の両方が、それが接続された最後のAPを覚えています。したがって、資格情報を持たない単純なコールWiFi.begin();は、その最後のAPに接続します。その後、while(WiFi.status() != WL_CONNECTED)ループでタイムアウトにして、接続しない場合はesp_wifi_wps_start(0);を呼び出してください。

関連する問題