So you're a Noob? Post your questions here until you graduate! Don't be shy.

User avatar
By JPM06
#93023 I meet a new problem:
- I have programmed an ESP-01 (#1) as an access point, and ok, I can access it from a smartphone or my PC, and exchange UDP packets,
- I have programmed another ESP-01 (#2) as a station, and it can connect to my box or another network, and I can also exchange UDP packets.
But ESP#2 (STA) definitely refuses to connect to ESP#1 (AP). Any idea why? Thank you!
JPM
User avatar
By JPM06
#93030 This is my programs. They run fine with different exercisers (Packet Sender on PC, UDP terminal on smartphone, etc). But they dont want to connet to each other.
Thank you for any help / track!
Code: Select all// my_ap.ino
// this ESP-01 operates as an access point
//https://siytek.com/esp8266-ap-and-station-mode/
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
// messages to PC through IDE for testing
    #define sp Serial.print
    #define spl Serial.println
// commands received from PC through IDE for testing
    int NbMots;
    String Mots[5];
// access point (normal operation)
    #define AP_SSID "Rascar"
    #define AP_PASS "12345678" 
// UDP packets handling
    const uint16_t PORT = 50000;
    const uint16_t BUFFER_SIZE = 512;
    char buffer[BUFFER_SIZE];
    uint16_t len = 0; // size of received packet
// UDP server
    WiFiUDP udp;
void setup() { // =================================================================================== setup
  // Setup serial port
  Serial.begin(19200);
  spl();
// --------------------------------------------------------------------------- WiFi Access Point
  WiFi.mode(WIFI_AP_STA);
  WiFi.softAPConfig({192,168,4,1}, {192,168,4,1}, {255,255,255,0}); // local IP, gateway, subnet
  WiFi.softAP(AP_SSID, AP_PASS); // démarrage du point d'accès 
  udp.begin(50000); // start listening on port 50000 
  spl(); spl("Connected!");
  sp("IP address for network "); sp(AP_SSID); sp(" : "); spl(WiFi.softAPIP());
  spl("");
}
void loop() { // =================================================================================== loop
    if (udp.parsePacket() > 0) { readPacket(); } // receiving UDP packets
    if (Serial.available() > 0) { SerialReceive(); } // receiving PC commands
}
// ===================================================================================== sous programmes
void SerialReceive(){ // ------------------ réception des octets un par un sur port série, pour tests
char X;
    X = Serial.read(); //réception d'un caractère
    switch (X){ // ********************** trois cas: space, line feed, ou autre caractère
    case (32):{++NbMots;} break; // ********************************************* espace   
    case 10: { // **************************************************** LF = fin de message     
        if (Mots[0] == "?") { // --------------------------------------------- commande ?
            spl("commande ?");
            sp("IP address for network "); sp(AP_SSID); sp(" : "); spl(WiFi.softAPIP());
            sp("");
        }
        if(Mots[0] == "!") { // tests de communication
            spl("commande !");
            sendPacket("test", 4, {192,168,1,100},50000); // test   
        }           
        // ------------------------------------------------------------- fin de commande, reset
        Mots[0]=""; Mots[1]=""; Mots[2]=""; Mots[3]="";
        NbMots = 0; 
        break; // fin de LF                           
        } 
    default:{ // ****************************************** autre caractère: concaténation 
        Mots[NbMots] = Mots[NbMots] + X;};
        break;             
    } 
}
// ==================================================================== récupération et affichage d'un paquet
void readPacket() {
    len = udp.available();   
    udp.read(buffer, len);
    MessageHandling();   
}
// ==================================================================================== envoi d'un paquet UDP
void sendPacket(const char content[], int nbchar, IPAddress ip, uint16_t port) { // avec nbchar en INT
//void sendPacket(char content[], IPAddress ip, uint16_t port) { // avec zéro à la fin
sp("sending ");sp(nbchar);sp(" octets to ");sp(ip);sp(":");spl(port); delay(10);
    udp.beginPacket(ip, port);
    udp.write(content, nbchar);
    udp.endPacket();
}
// =================================================================================== traitement des messages
void MessageHandling(){
    MessageDisplay();
    //sendPacket("received!", 9, udp.remoteIP(), udp.remotePort() ); // ko
    sendPacket("received!\n", 10, udp.remoteIP(), 50000); // ok
    delay(10);                 
}
// ==================================================================================) affichage d'un message
void MessageDisplay() {
    sp("received "); sp(len); sp(" octets from "); sp(udp.remoteIP());
    sp(":"); sp(udp.remotePort()); // <<< this value is corrupted
    sp(" : ");
    for(int i=1; i<=len; i++) {sp(buffer[i-1]); sp(" ");} spl("");
}
// ======================================================================= impression en hexadécimal amélioré
void PrtHex(char X) {
    if (X<16){sp("0");} sp(X,HEX);
}

Code: Select all// my_sta.ino
// this ESP reads octets on the serial port at 19200 bps
// and retransmit them in UDP to ESP8266 AP at 192.168.4.1 port 50000 if available
// or if not, for test and OTA to PC at 192.168.1.10 port 50000
// ============================================================================
// https://www.tala-informatique.fr/wiki/index.php/Esp8266_udp_server
// https://projetsdiy.fr/attribuer-ip-fixe-projet-arduino-esp32-esp8266-esp01/
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
#include <ArduinoOTA.h> // pour OTA
// informations remontées au PC pour affichage
    #define sp Serial.print
    #define spl Serial.println
    const byte LED = 2; // LED externe (impossible de commander la LED interne de l'ESP-01)
    char NbEssais = 10; // 10 essais de connexion à 500ms
// UDP packets handling
    const uint16_t PORT = 50000; // Port d'écoute UDP
    const uint16_t BUFFER_SIZE = 512; // Taille du tampon de réception
    char buffer[BUFFER_SIZE]; // Tampon de réception
    uint16_t len = 0;// Taille du paquet reçu;
// pour réception et découpage des messages reçus
    char LongueurMS;
    char MessageSerie[64];
    byte O1, compte;
    unsigned long previousMillis = 0;
    const long interval = 1000;
    bool EnableRecep = true;
// UDP server
    WiFiUDP udp;
void setup() { // =================================================================================== SETUP   
    pinMode (LED, OUTPUT);
    digitalWrite (LED, HIGH); // Led connectée au plus
    Serial.begin(19200);
    delay(10);
// connect to other ESP8266, otherwise to local network
    setup_sta1(); // try connection to ESP8266 AP
    if (NbEssais == 0) {NbEssais = 10; setup_sta2();}  // connect to local network
    if(WiFi.status() == WL_CONNECTED){       
        udp.begin(PORT); // start listening to UDP packets
        sp("Start listening on port "); spl(PORT);
        delay(100);
        //sendPacket("pret", 10, {192,168,1,10},{50000}); // envoi au PC / Packet Sender
    }
    else {sp("aucune connection!");};
}
void setup_sta1(){ // =================================== connection to ESP8266 (message processing)
const char sta1_ssid[] = "rascar";
const char sta1_password[] = "12345678";
    WiFi.config({192,168,4,100},{192,168,4,1},{192,168,4,1},{255,255,255,0}); // IP, DNS, gateway, subnet   
    WiFi.begin(sta1_ssid, sta1_password);   
    spl("");sp("trying to connect to ");sp(sta1_ssid);sp(" ");
    while (WiFi.status() != WL_CONNECTED && NbEssais > 0 ){ delay(500); sp(NbEssais,DEC);NbEssais--;}
    if(WiFi.status() == WL_CONNECTED){ // if connected:
// connected
        spl(""); sp("Connecté à "); sp(sta1_ssid); // <<<<<<<<<< prendre la vraie valeur
        sp(" avec l'ip "); spl(WiFi.localIP());
        for (char I=1; I<=5; I++){digitalWrite(LED,LOW); delay(200); digitalWrite(LED,HIGH); delay(200);} // cligner 5 fois     
    }
    else {spl("");sp("no connection with ");sp(sta1_ssid);}
    delay(500);
}

void setup_sta2(){ // ============================================= connection to my box in station mode
const char sta2_ssid[] = "box SSID";
const char sta2_password[] = "password";
// always use the same MAC address for tests, otherwise blocked by the box
const uint8_t mac[6] = {0x2C, 0x3A, 0xE8, 0x26, 0xA3, 0x54};  // "2c:3a:e8:26:a3:54"   
// changement de l'adresse MAC cf: https://circuits4you.com/2017/12/31/how-to-change-esp8266-mac-address/   
    spl(""); sp("Old MAC address: "); sp(WiFi.macAddress()); // adresse MAC en cours
    wifi_set_macaddr(0, const_cast<uint8*>(mac));  //changement MAC address pour Livebox     
    sp(" new MAC Address: "); spl(WiFi.macAddress());
// demande d'une adresse IP précise
    WiFi.config({192,168,1,100},{192,168,1,1},{192,168,1,1},{255,255,255,0}); // IP, DNS, gateway, subnet   
    WiFi.begin(sta2_ssid, sta2_password);
    sp("trying to connect to "); sp(sta2_ssid);sp(" "); 
    while (WiFi.status() != WL_CONNECTED && NbEssais >0 ){ delay(500);sp(NbEssais,DEC); NbEssais--;}
    if(WiFi.status() == WL_CONNECTED){ // si connecté:
// initialize OTA
        ArduinoOTA.setHostname("detecteur"); // nom du module
        ArduinoOTA.begin(); // initialisation de l'OTA   
// display status
        delay(500);
        spl("");sp("Connected to "); sp(sta2_ssid); // <<<<<<<<<< prendre la vraie valeur
        sp(" with ip "); spl(WiFi.localIP());
        delay(500);
        for (char I=1; I<=10; I++){digitalWrite(LED,LOW); delay(200); digitalWrite(LED,HIGH); delay(200);} // cligner 10 fois     
    }
    else {spl("");sp("no connection with ");sp(sta2_ssid);}
}
// ===================================================================================================== LOOP
void loop() {
unsigned long currentMillis = millis();
    ArduinoOTA.handle(); // gestion OTA   
    if (udp.parsePacket() > 0) { readPacket(); } // réception des paquets UDP pour test
    if (EnableRecep) {if (Serial.available() > 0) {SerialReceive();}} // serial receive from beacon
}
// ==================================================================== récupération et affichage d'un paquet
void readPacket() {
    len = udp.available();   
    udp.read(buffer, len); // Mise en tampon du paquet
    TraitementMessage(); // traitement du paquet   
}
// ==================================================================================== envoi d'un paquet UDP
void sendPacket(const char content[], char nbchar, IPAddress ip, uint16_t port) { // avec longueur
sp("sending ");sp(nbchar,DEC);sp(" octets to ");sp(ip);sp(":");spl(port); delay(10);
    udp.beginPacket(ip, port);
    udp.write(content, nbchar);
    udp.endPacket();
}
// ===================================================================================== sous programmes
void SerialReceive(){ // ------------------ réception des octets un par un sur port série, pour tests
byte X;
    X = Serial.read(); //réception d'un caractère
    //spl("recieved");   
// ---------------------------------------------------------- réception d'un octet et envoi immédiat
    MessageSerie[0] = X; // seule façon d'assurer la conversion!
    sendPacket(MessageSerie, 1, udp.remoteIP(), 50000 ); // un seul caractère: X
}
// =================================================================================== traitement des messages
void TraitementMessage(){
    AffichageMessage();
    sendPacket("present!\n", 9, udp.remoteIP(), 50000 ); // ok
    //sendPacket("present!\n", 9, udp.remoteIP(), udp.remotePort() ); //  remotePort irrelevant
    delay(10);                 
    }
// ==================================================================================) affichage d'un message
void AffichageMessage() {
    sp("reçu "); sp(len); sp(" octets de "); sp(udp.remoteIP());
    sp(":"); sp(udp.remotePort()); // <<< remote port irrelevant
    sp(" soit: ");
    for(int i=1; i<=len; i++) {sp(buffer[i-1]); sp(" ");} spl("");
    }
// ======================================================================= impression en hexadécimal amélioré
void PrtHex(char X) {
    if (X<16){sp("0");} sp(X,HEX);
}

best regards,
JPM