ESP-now est-il compatible avec WiFi.mode(WIFI_AP_STA) ?

Bonjour,

Je veux utiliser esp-now pour recevoir des données mais en cas d'une certain valeur reçue lancer une communication soit sur une box (STA) soit sur un smartphone (AP).

Est-ce possible ? Si oui précautions ?
Sinon il me faudra fermer ESPNOW pour ouvrir AP_STA puis fermer ce mode et relancer esp-now ?

Oui c'est possible , d'après ce que j'ai pu lire , à la condition que l'ESPNOW utilise le même canal WiFi que la liaison en STA au point d'accès.
Comment faire ? reste à trouver les bons tutos et/ou se faire aider de l'une des IA .

(N.B je n'ai pas encore pu tester ce fonctionnement ou un ESP32 en station Wifi + ESPNOW sert de passerelle recevant par ESPNOW des données de plusieurs capteurs et relayant les données vers un serveur distant. Quand je le ferai ce sera en tenant compte de la contrainte sur le canal WiFi commun au WiFI et à ESPNOW)

C'est possible et je le fait constamment sans problème ni perte.

En revanche il y a une contrainte très importante qui peut être éliminatoire ou du moins complexe à contourner. Comme l'a dit le commentaire précédent, il faut impérativement que tous les terminaux soient sur le même canal Wifi.

Or, quand tu connectes ton STA sur un AP du genre box internet ou smartphone, il arrive assez souvent que l'AP impose son canal wifi (même si tu en as demandé un spécifique), et du coup tu perds la connexion EspNow avec les autres terminaux. Et une fois le canal imposé au STA par ta box, tu ne peux plus le changer à moins de te déconnecter (enfin tu peux le changer, mais automatiquement il reviendra sur le Canal de la box).

Il existe des solutions pour contourner ça, par exemple les autres terminaux EspNow peuvent dès qu'un message envoyé est en erreur, faire un scan pour retrouver le canal utilisé par le récepteur (et vice versa), mais c'est lourd à gérer et pas très élégant.
Tu peux aussi paramétrer ta box et lui imposé un canal (mais attention si il y a du monde autour qui utilise le même canal, c'est pas bon).

Je te conseil d'utiliser l'event de changement de canal pour voir ce qui se passe lors des connexion STA.

Chez moi je me connecte à mon téléphone, et par miracle c'est toujours le canal 6 qui est choisie en priorité (au pire le canal 1 mais jamais d'autre) ce qui facilité les choses.
Par contre sur une box orange, c'est un peu la loterie, ça m'est même arrivé que le canal change en cours de connexion.

WiFi.setChannel(x, WIFI_SECOND_CHAN_NONE);  //Pour modifier le canal WIfi, remplaces "x" par le canal voulu

WiFi.channel(); //Pour connaitre le canal actuel du Wifi. Renvoi un int32_t

WiFi.STA.connect(const char *ssid, const char *passphrase = __null,
             int32_t channel = 0, const uint8_t *bssid = __null,
             bool connect = true);   // tu peux voir que lors de la connexion de ton STA, tu peux demander un canal particulier (par défaut = 0), mais la box ne répond pas toujours favorablement.

Merci pour ces infos.

Finalement dans mon cas c'est espnow plus smartphone qui se connecte sur l'esp donc en mode AP.

Pratiquement les exemples disent de coder pour espnow


WiFi.mode(WIFI_STA);
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;  }
  esp_now_register_recv_cb(OnDataRecv); 
  //esp_now_register_send_cb(OnDataSent);
  memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  peerInfo.channel = 0;  
  peerInfo.encrypt = false;       
  if (esp_now_add_peer(&peerInfo) != ESP_OK){
    Serial.println("Failed to add peer");
    return;  }

et dans le code sans espnow

WiFi.softAPdisconnect();
      WiFi.mode(WIFI_AP_STA);
      WiFi.softAPConfig(local_ip, gateway, subnet);
      WiFi.softAP("XXXXX");

Comment je mixe les deux ?
En plaçant le second à la place de
WiFi.mode(WIFI_STA); ?

Quand il convient de cesser les échanges entre smartphone et esp32 je faisais

      webserver.stop();
      DEBUG_PRINTLN("Le serveur est stoppé");
      WiFi.disconnect();
      DEBUG_PRINTLN("La wifi déconnectée");
      WiFi.mode(WIFI_OFF);

Est-ce à supprimer ?