2017-12-29 142 views
7

Tôi đang cố gắng phát triển một thiết bị IoT sẽ cung cấp một số chức năng sử dụng API HTTP/REST. Tôi quyết định sử dụng chip ESP32 (trên "ESP32 dev board").ESP32 WPS kết nối lại khi bật nguồn

Bây giờ tôi muốn triển khai cấu hình WLAN dễ sử dụng. Tôi không muốn lưu trữ thông tin đăng nhập trong mã nguồn của mình giống như nhiều mẫu khác; vì vậy tôi quyết định sử dụng WPS.

Tôi đã cố gắng triển khai máy chủ web cơ bản bằng cách sử dụng các nguồn ở đây: https://randomnerdtutorials.com/esp32-web-server-arduino-ide/ - và sau đó tôi đã thêm chức năng WPS từ các mẫu Wifi/WPS đi kèm với phần mở rộng EPS32 cho Arduino IDE.

Bây giờ WPS đã hoạt động, tức là khi bảng mạch điện được cấp nguồn, nó đang ở chế độ kết nối WPS và đợi router chấp nhận kết nối WPS. Nó đã nhận thành công SSID và kết nối với mạng WLAN.

Nhưng khi tắt nguồn ESP32, và bật nguồn lại, tôi phải thực hiện lại thủ tục kết nối WPS. Tôi mong đợi một kết nối lại, lưu trữ các thông tin đăng nhập và có thể kết nối với cùng một mạng WLAN một lần nữa khi thiết bị ESP32 được bật nguồn bất cứ lúc nào sau đó. Tôi đoán tôi phải lưu trữ một số thông tin đăng nhập và sử dụng chúng để thiết lập lại kết nối - nhưng tôi lấy thông tin đăng nhập ở đâu và làm cách nào để kết nối lại?

Tôi đã tìm kiếm trên web cho "ESP32 WLAN WPS kết nối lại" và các thuật ngữ tương tự, nhưng chỉ tìm thấy các chiến lược kết nối lại cho các kết nối không phải wps (SSID + mật khẩu). Tôi cũng đã kiểm tra tài liệu thư viện WiFi và tài liệu thư viện esp_wps, nhưng không tìm thấy bất cứ điều gì phù hợp.

Đó là WLAN nguồn kết nối 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

Tôi đã cố gắng áp dụng tập lệnh từ https://github.com/esp8266/Arduino/issues/2628 cho bảng dev ESP32 (không có , nhưng với và "esp_wps.h") - để gọi ghép nối WPS chỉ khi một nút được đẩy và với khởi tạo mặc định WiFi.begin (WiFi.SSID(). c_str(), WiFi.psk(). c_str()); nhưng không hoạt động. Tôi không hiểu trong mẫu được liên kết, nơi các thông tin đăng nhập được ghi vào EEPROM? –

+1

Chúng đã được lưu trước đó. Tìm mã nhận xét 'qconfig'. Đó là cách bạn lưu thông tin đăng nhập. – dda

Trả lời

3

ESP, cả hai 32 và 8266, nhớ AP cuối cùng nó được kết nối tới. Vì vậy, đơn giản gọi WiFi.begin(); mà không có bất kỳ thông tin đăng nhập sẽ làm cho nó kết nối với AP cuối cùng. Sau đó, trong vòng lặp while(WiFi.status() != WL_CONNECTED) của bạn, bạn có thể làm cho nó hết thời gian chờ và sau đó gọi số esp_wifi_wps_start(0); nếu nó không kết nối.

Các vấn đề liên quan