Bonjour
Après deux jours de tests et recherches intenses, j'arrive à un résultat encourageant, mais pas encore totalement satisfaisant.
La bonne nouvelle est que j'arrive à me connecter au réseau wifi depuis un wemos D1 mini en 160 ms !
Le programme démo (ajustez les premières lignes selon votre configuration locale)
#include <ESP8266WiFi.h>
#define myWiFi_ssid "xxxxxxxxxxxx"
#define myWiFi_password "xxxxxxxxxx"
const uint8_t myWiFi_bssid[]= {0x00, 0x26, 0x44, 0xF7, 0x5C, 0xAB}; //adresse MAC de la box
const uint8_t myWiFi_channel= 11; //channel WIFI utilisé par la box
#define myWiFi_subnetMask IPAddress(255,255,255,0)
#define myWiFi_gatewayIP IPAddress(192,168,1,254)
#define myWiFi_dnsIP IPAddress(192,168,1,254)
#define myWiFi_localIP IPAddress(192,168,1,31)
void setup()
{
uint32_t init, start, end;
init = millis();
WiFi.config(myWiFi_localIP, myWiFi_gatewayIP, myWiFi_subnetMask, myWiFi_dnsIP);
//et pas de WiFi.begin() : on laisse l'ESP se connecter tout seul avec les derniers identifiants enregistrés
Serial.begin(115200);
start = millis();
while (!WiFi.isConnected() && millis() - start < 5000) yield();
end = millis();
if (WiFi.isConnected())
{
Serial.print("\nAuto Connect : ");
Serial.print(end - start);
Serial.println(" ms");
}
else
{
if (!WiFi.getAutoConnect()) WiFi.setAutoConnect(true);
if (!WiFi.getPersistent()) WiFi.persistent(true);
WiFi.begin(myWiFi_ssid, myWiFi_password, myWiFi_channel, myWiFi_bssid, true);
start = millis();
while (!WiFi.isConnected() && millis() - start < 10000) yield();
end = millis();
if (WiFi.isConnected())
{
Serial.print("\nStatic Connect : ");
Serial.print(end - start);
Serial.println(" ms");
}
else
{
Serial.println("\nConnect failed !");
}
}
Serial.print("Total time : ");
Serial.print(millis() - init);
Serial.println(" ms");
if (WiFi.isConnected())
{
String s;
Serial.print(F("SSID : "));
Serial.println(WiFi.SSID());
Serial.print(F("psk : "));
Serial.println(WiFi.psk());
s = WiFi.BSSIDstr();
Serial.print(F("BSSID : "));
Serial.println(s);
Serial.print(F("channel : "));
Serial.println(WiFi.channel());
Serial.print(F("RSSI : "));
Serial.println(WiFi.RSSI());
s = WiFi.hostname();
Serial.print(F("hostname : "));
Serial.println(s);
s = WiFi.macAddress();
Serial.print(F("macAddress : "));
Serial.println(s);
Serial.print(F("localIP : "));
Serial.println(WiFi.localIP());
Serial.print(F("subnetMask : "));
Serial.println(WiFi.subnetMask());
Serial.print(F("gatewayIP : "));
Serial.println(WiFi.gatewayIP());
Serial.print(F("dnsIP : "));
Serial.println(WiFi.dnsIP());
}
Serial.println("Reset your board to restart");
}
void loop()
{
}
La plupart du temps, la connexion se fait en 160 ms.
Parfois c'est plus lent. Les traces debug de l'ESP, lorsqu'elles sont activées, montrent alors des soucis de connexion au réseau, lancement de scan etc.
On va dire que ce sont les aléas de l'environnement radio.
Jusqu'ici tout va bien, mais c'est après que ça se gâte : si on enchaîne immédiatement par une connexion à un serveur sur le réseau local (en l'occurrence un raspberry pi qui héberge un serveur mqtt), celle-ci à tendance à patatouiller.
J'ai pu isoler le problème, localisé sur l'instruction client.connect(serveur, port)
Celle-ci prend la plupart du temps 800 ms, et parfois significativement plus (> 2000 ms)
J'arrive alors à un temps total de 160 + 800 = environ 1000 ms pour atteindre le raspi à partir du démarrage de l'ESP.
Tous les tests que j'ai pu effectuer montrent clairement que le serveur distant et le réseau sont hors de cause. Le problème est bien à l'intérieur de l'ESP.
Si j'intercale un delay(500) juste après la connexion au WiFi, le client.connect(serveur, port) dure moins de 10 ms.
Ce qui donne alors un temps total de 160 + 500 + 10 = 670 ms
500 ms semble être la valeur minimum du delay, sous laquelle le temps du client.connect se dégrade considérablement.
Le programme démo avec connexion à un serveur
#include <ESP8266WiFi.h>
#define myWiFi_ssid "xxxxxxxxxxxx"
#define myWiFi_password "xxxxxxxxxx"
const uint8_t myWiFi_bssid[]= {0x00, 0x26, 0x44, 0xF7, 0x5C, 0xAB}; //adresse MAC de la box
const uint8_t myWiFi_channel= 11; //channel WIFI utilisé par la box
#define myWiFi_subnetMask IPAddress(255,255,255,0)
#define myWiFi_gatewayIP IPAddress(192,168,1,254)
#define myWiFi_dnsIP IPAddress(192,168,1,254)
#define myWiFi_localIP IPAddress(192,168,1,31)
#define myWiFi_mqttServerIP IPAddress(192,168,1,48)
#define myWiFi_mqttServerPort 1883
void setup()
{
uint32_t init, start, end;
init = millis();
WiFi.config(myWiFi_localIP, myWiFi_gatewayIP, myWiFi_subnetMask, myWiFi_dnsIP);
//et pas de WiFi.begin() : on laisse l'ESP se connecter tout seul avec les derniers identifiants enregistrés
Serial.begin(115200);
start = millis();
while (!WiFi.isConnected() && millis() - start < 5000) yield();
end = millis();
if (WiFi.isConnected())
{
Serial.print("\nAuto Connect : ");
Serial.print(end - start);
Serial.println(" ms");
}
else
{
if (!WiFi.getAutoConnect()) WiFi.setAutoConnect(true);
if (!WiFi.getPersistent()) WiFi.persistent(true);
WiFi.begin(myWiFi_ssid, myWiFi_password, myWiFi_channel, myWiFi_bssid, true);
start = millis();
while (!WiFi.isConnected() && millis() - start < 10000) yield();
end = millis();
Serial.print(WiFi.isConnected() ? "\nStatic Connect : " : "\nConnect failed ! ");
Serial.print(end - start);
Serial.println(" ms");
}
if (WiFi.isConnected())
{
//Le gros problème ici !!!!!!!
//il faut un delay(minimum 500) pour que le prochain client->connect() soit rapide
uint32_t wait = 500;
Serial.print("Wait ");
Serial.print(wait);
Serial.println(" ms");
delay(wait);
WiFiClient* client = new WiFiClient;
start = millis();
bool clientIsConnected = client->connect(myWiFi_mqttServerIP, myWiFi_mqttServerPort);
end = millis();
Serial.print(clientIsConnected ? "Client connected : " : "Client failed ! ");
Serial.print(end - start);
Serial.println(" ms");
}
Serial.print("Total time : ");
Serial.print(millis() - init);
Serial.println(" ms");
Serial.println("Reset your board to restart");
}
void loop()
{
}
Résultats types :
Auto Connect : 161 ms
Wait 1 ms
Client connected : 815 ms
Total time : 977 ms
Reset your board to restart
Auto Connect : 159 ms
Wait 500 ms
Client connected : 7 ms
Total time : 667 ms
Reset your board to restart
Un comble : c'est plus rapide avec un delay(500) !!!
Je pense qu'il doit y avoir un machin qui tourne en arrière-plan au niveau du core de l'ESP, pendant une grosse demi-seconde après démarrage, et qui gêne les communications.
J'ai fouillé dans les libs du core, dans les traces debug, dans la doc : pas moyen de mettre le doigt sur le machin, pour savoir s'il est possible de le neutraliser.