Re: ESP8266 SoftAP with UDP
Posted:
Thu Dec 09, 2021 12:34 pm
by JPM06
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
Re: ESP8266 SoftAP with UDP
Posted:
Fri Dec 10, 2021 1:47 am
by JurajA
you initialized it wrong. maybe show your sketch
Re: ESP8266 SoftAP with UDP
Posted:
Sat Dec 11, 2021 4:52 am
by JPM06
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
Re: ESP8266 SoftAP with UDP
Posted:
Mon Dec 13, 2021 1:19 am
by JurajA
did you try to give it more time to connect to other esp?
you could turn on logging