2017-12-29 85 views
7

पर पुन: कनेक्ट करें मैं एक आईओटी डिवाइस विकसित करने की कोशिश कर रहा हूं जो HTTP/REST API का उपयोग करके कुछ कार्यक्षमता प्रदान करे। मैंने ईएसपी 32 चिप ("ईएसपी 32 देव बोर्ड" पर) का उपयोग करने का फैसला किया।ईएसपी 32 डब्ल्यूपीएस पावर-ऑन

अब मैं उपयोग में आसान WLAN कॉन्फ़िगरेशन को कार्यान्वित करना चाहता हूं। मैं अपने स्रोत कोड में क्रेडेंशियल स्टोर नहीं करना चाहता हूं जैसे कई अन्य नमूने करते हैं; तो मैंने डब्ल्यूपीएस का उपयोग करने का फैसला किया।

मैं यहाँ स्रोतों का उपयोग कर एक बुनियादी वेब सर्वर को लागू करने की कोशिश की: https://randomnerdtutorials.com/esp32-web-server-arduino-ide/ - और फिर मैं वाई-फ़ाई/WPS Arduino आईडीई के लिए EPS32 एक्सटेंशन के साथ भेज दिया नमूने से WPS कार्यक्षमता जोड़ा।

अब डब्ल्यूपीएस पहले से ही काम करता है, यानी जब देव-बोर्ड संचालित हो जाता है तो यह डब्ल्यूपीएस कनेक्शन मोड में होता है और राउटर को डब्ल्यूपीएस कनेक्शन स्वीकार करने की प्रतीक्षा करता है। यह सफलतापूर्वक एसएसआईडी प्राप्त करता है और डब्लूएलएएन से जुड़ता है।

लेकिन जब मैं ईएसपी 32 को पावर-ऑफ करता हूं, और फिर से पावर-ऑन करता हूं, तो मुझे फिर से डब्ल्यूपीएस पुन: कनेक्शन प्रक्रिया करना पड़ता है। मैं एक पुन: कनेक्शन की अपेक्षा करता हूं, जो प्रमाण-पत्रों को संग्रहीत करता है और किसी भी समय बाद में ईएसपी 32 डिवाइस संचालित होने पर उसी डब्लूएलएएन से कनेक्ट करने में सक्षम होता है। मुझे लगता है कि मुझे कुछ क्रेडेंशियल्स स्टोर करना होगा और कनेक्शन को दोबारा स्थापित करने के लिए उनका इस्तेमाल करना होगा - लेकिन मुझे क्रेडेंशियल्स कहां मिलेंगे, और मैं फिर से कैसे कनेक्ट करूं?

मैंने "ईएसपी 32 डब्लूएलएएन डब्ल्यूपीएस रीकनेक्ट" और इसी तरह के शब्दों के लिए वेब खोजा, लेकिन गैर-डब्ल्यूपीएस (एसएसआईडी + पासवर्ड) कनेक्शन के लिए केवल रीकनेक्ट रणनीतियों को मिला। मैंने वाईफाई लाइब्रेरी दस्तावेज और 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 dev बोर्ड ( के बिना अपनाने के लिए प्रयास किया, लेकिन और "esp_wps.h" के साथ) - केवल एक बटन दबाए जाने पर WPS युग्मन को कॉल करने के लिए, और डिफ़ॉल्ट प्रारंभ के साथ वाईफाई.बीजिन (वाईफाई.एसएसआईडी()। c_str(), वाईफाई.पीएसके()। c_str()); लेकिन यह काम नहीं किया। मुझे लिंक किए गए नमूने में समझ में नहीं आया, जहां ईईपीरोम को प्रमाण पत्र लिखा गया है? –

+1

वे पहले सहेजे गए थे। टिप्पणी-आउट 'qconfig' कोड की तलाश करें। इस तरह आप क्रेडेंशियल्स को सहेजते हैं। – dda

उत्तर

3

ईएसपी, दोनों 32 और 8266, पिछले एपी इससे जुड़े था याद है। इतनी सरल कॉल WiFi.begin(); बिना किसी प्रमाण-पत्र के इसे अंतिम एपी से कनेक्ट कर देगा। फिर आपके while(WiFi.status() != WL_CONNECTED) लूप में आप इसे टाइमआउट कर सकते हैं और फिर esp_wifi_wps_start(0); पर कॉल कर सकते हैं यदि यह कनेक्ट नहीं होता है।

संबंधित मुद्दे