Open4
ESP32のWiFi接続速度が遅い
経緯
PIN割込みでDeepsleepから起動して、WiFiに接続する処理を書いてたら、接続にやけに時間がかかっている事に気づいた。
改善策
色々な方法で高速化できないか調べてみた
-
処理の最後にちゃんと接続を切る
-
WiFi.disconnect()
を挿入する - これが一番大切。ないと、ルーターの設定にもよるが、数秒遅くなる
-
-
DHCPサーバーを利用しないようにする
- DNSサーバーを指定しない場合は0.0.0.0になる
-
BSSID(APのMACアドレス), channel(周波数帯)を指定する
-
WiFi.BSSIDstr()
WiFi.channel()
で調べられる
-
サンプルコード
#include <Arduino.h>
#include <WiFi.h>
const char *SSID = "SSID"; //SSID
const char *password = "PASSWORD"; //PASSWORD
const IPAddress ip(192, 168, 0, 18); //IPv4プライベートアドレス
const IPAddress gateway(192, 168, 0, 1); //デフォルトゲートウェイ
const IPAddress subnet(255, 255, 255, 0); //サブネットマスク
const uint8_t bssid[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //BSSID
const int channel = 11; //WiFiの使用するチャンネル
void setup() {
Serial.begin(9600);
unsigned long start_time = millis(); //実行時間計測用
//WiFi.persistent(true); 接続成功時、WiFiの接続設定を不揮発メモリに保存してくれる。
//WiFi.setAutoConnect(true); 保存された設定を利用してWiFiに接続する。ただ、今回は明示的に設定しているので意味はない
//保存する分、無駄に時間と電力を使うので今回は無効にしておく。
WiFi.mode(WIFI_STA); //APに接続するモード
WiFi.config(ip, gateway, subnet);
WiFi.begin(SSID, password, channel, bssid);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println((double)(millis() - start_time) / 1000.0); //接続完了までの時間
Serial.println(WiFi.localIP());
Serial.println(WiFi.BSSIDstr());
Serial.println(WiFi.channel());
Serial.println(WiFi.dnsIP());
WiFi.disconnect();
//切断されるまで待機する。
while (WiFi.status() == WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
void loop() {
}
ここまでで平均3.5秒かかっていたのが、1.5秒くらいになった。
あとはAPとかルーターの性能次第なので、これ以上プログラム側でやれる事はないと思う