2017-09-30 2 views
0

NodeMCU(Lolin v3)ボードを、ハードウェアコードを使用せずにWiFi設定を構成できるようにプログラミングしようとしています。私はWiFiManagerライブラリがあることを知っていますが、自分の実装を行う必要があるので、ライブラリを提供するUIを使用する必要はありません。ユーザーが提供する認証情報は、SPIFFSを使用してファイルに保存され、AP_STAモードまたはSTAモードでのみボードを起動するかどうかを確認するために使用されます。以下はWEFI_AP_STAモードのWiFiをESP8266で設定する

は、私が使用するロジックです:私は新鮮なブートを行うとき

void connectWiFi(String ssid, String password, boolean staOnly = false) { 
    boolean state = true; 
    int i = 0; 
    if(staOnly) 
    WiFi.mode(WIFI_STA); 
    WiFi.begin(ssid.c_str(), password.c_str()); 
    while (WiFi.status() != WL_CONNECTED) { 
    delay(500); 
    if (i > 10) { 
     state = false; 
     break; 
    } 
    i++; 
    } 
    return state; 
} 

void join() { 
    String ssid = setupServer.arg("ssid"); 
    String password = setupServer.arg("password"); 
    result = connectWifi(ssid, password); 
    if(result) { 
    Serial.println("Connected"); 
    // **THIS IS THE PROBLEMATIC PART** 
    setupServer.send(200, "text/plain", WiFi.localIP().toString()); 
    // save credentials to a file 
    Serial.println("Conf saved"); 
    delay(2000); 
    ESP.restart(); 
    } else 
    setupServer.send(200, "text/plain", "fail"); 
    } 

void setup() { 
    Serial.begin(115200); 
    WiFi.disconnect(true); 
    boolean fileExists = SPIFFS.exists(WIFI_CONF_FILE); 
    if(!fileExists) { 
    WiFi.mode(WIFI_AP_STA); 
    WiFi.softAP("AP", "password"); 
    IPAddress myIP = WiFi.softAPIP(); 
    setupServer = ESP8266WebServer(myIP, 8888); 
    setupServer.on("/join", join); 
    setupServer.begin(); 
    } else { 
    // read file contents for ssid and password 
    connectWifi(ssid, password, true); 
    // do some work here 
    } 
} 

void loop() { 
    setupServer.handleClient(); 
} 

はだから今、ボードはAP_STAモードに入り、SSID APから始まります。私はそれに接続し、ブラウザでhttp://192.169.4.1/join?ssid=mywifi&password=12345678を開きます。どういうわけか、接続が終了し、ブラウザに「Destination Unreachable」が表示されます。しかし、シリアルモニタは「接続済み」と「Conf saved」を表示します。

なぜ私はブラウザに成功の応答を返していないのか知りたいです。私はそれがWiFiに接続した後にlocalIPが必要です。失敗した場合、失敗した応答を正しく返します。再起動する前に、接続されているクライアントに割り当てられたIPアドレスを常に返すようにするにはどうすればよいですか?

何か助けていただければ幸いです。

ありがとうございます!

+0

ステーションモードからクライアントモードに切り替わり、おそらく新しいIPアドレスを取得している場合は、もちろん接続が失われます。あなたのブラウザが接続されたIPアドレスはもはや利用できません。 – larsks

+0

ああ、私の謝罪、私はその部分を逃した。私は提供されたコードを修正します。私はそれも含めました。 –

+0

@larsks AP_STAで設定するときに、ステーション専用モードに移行しないコードを修正しました。 STAのみモードは後で有効になります。 –

答えて

0

無線モジュールが2つのモードで共有されているように見えるように見えます。 https://github.com/esp8266/Arduino/issues/3282

これは、STAは、に接続しようとしているAPのチャンネルに切り替えるという事実に関連している、とSoftAPに切り替える必要があります。ここでは、この問題のため、について説明を見つけ

同じチャンネルしたがって、クライアント(SoftAPに接続されたPCまたはスマートフォン)は、新しいチャネルのSoftAPに再接続する必要があります。ほとんどの場合、これによりTCP接続がリセットされます。

関連する問題