Now I used the last hour to make two lighter versions of the code, so you can have a compileable version.
Client NodeMCU code
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
IPAddress serversIP(...,...,...,...);
const uint32_t serversPort = 1337;
IPAddress myIP(...,...,...,...);
const uint32_t localPort = 1337;
IPAddress mySubnet(...,...,...,...);
IPAddress myGateway(...,...,...,...);
const char* WiFissid = "...";
const char* WiFipass = "...";
WiFiUDP Udp;
void startWiFi(){
WiFi.disconnect();
delay(20);
WiFi.config(myIP,myGateway,mySubnet);
WiFi.mode(WIFI_STA);
Serial.println("init WiFi:");
WiFi.begin(WiFissid, WiFipass);
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(500);
}
Serial.print("Connected! IP address: ");
Serial.println(WiFi.localIP());
Serial.print("UDP server on port "); Serial.println(localPort);
Udp.begin(localPort); //start UDP-Server
}
int checkUDPServer()
{
// if there's data available, read a packet
int packetSize = Udp.parsePacket();
if (packetSize) {
char incomingPacket[UDP_TX_PACKET_MAX_SIZE];
Serial.print("Received "); Serial.print(packetSize);
Serial.print(" from IP "); Serial.print(Udp.remoteIP());
Serial.print(" Port "); Serial.println(Udp.remotePort());
// read the packet into packetBufffer
int len = Udp.read(incomingPacket, 255);
for(byte i = 0; i<len;i++) {
Serial.print(incomingPacket[i], HEX); Serial.print(" ");
}
Serial.println();
for(byte i = 0; i<len;i++) {
Serial.print(incomingPacket[i]);
}
Serial.println();
incomingPacket[len] = 0;
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write("OK");
Udp.endPacket();
}
}
void setup() {
Serial.begin(9600);
startWiFi();
Udp.beginPacket(serversIP, serversPort);
Udp.write("HI21");
Udp.endPacket();
}
void loop() {
checkUDPServer();
}
Server NodeMCU code:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
IPAddress myIP(...,...,...,...);
IPAddress mySubnet(...,...,...,...);
IPAddress myGateway(...,...,...,...);
const uint32_t localPort = 1337;
IPAddress clientA(...,...,...,...);
const uint32_t portClientA = 1337;
const char* WiFissid = "...";
const char* WiFipass = "...";
WiFiUDP Udp;
void startWiFi(){
WiFi.disconnect();
delay(20);
WiFi.config(myIP,myGateway,mySubnet);
WiFi.mode(WIFI_STA);
Serial.print(F("init WiFi:"));
WiFi.begin(WiFissid, WiFipass);
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(500);
}
Serial.print(F("Connected! IP address: "));
Serial.println(WiFi.localIP());
Serial.printf("UDP server on port %d\n", localPort);
Udp.begin(localPort);
}
char* udp_BufferSend[] = {" ", " ", " ", " ", " ", " "}; //buffer which holds outgoing data
byte udp_CurrBuffSendPos = 0; //nr of elements in bufferSend
bool udp_TxBufferBusy = false;
void handleUDPtx(){
static uint32_t previousSend = 0;
if(udp_CurrBuffSendPos>0){
//if mssg in buffer...
if (millis() - previousSend > 200){
Serial.println(udp_BufferSend[0]);
Udp.beginPacket(clientA, portClientA);
Udp.write(udp_BufferSend[0]);
Udp.endPacket();
previousSend = millis();
}
}
}
void sendUDP(char massage[]){
if(!udp_TxBufferBusy){
udp_BufferSend[udp_CurrBuffSendPos] = &massage[0];
udp_CurrBuffSendPos++;
if(udp_CurrBuffSendPos==5){
udp_TxBufferBusy = true;
}
}
}
void handleUDPrx(){
// if there's data available, read a packet
int packetSize = Udp.parsePacket();
if (packetSize) {
// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE + 1];// buffer to hold incoming packet,
char ReplyBuffer[] = "OK";
Serial.printf("Received packet of size %d from %s:%d\n (to %s:%d, free heap = %d B)\n",
packetSize,
Udp.remoteIP().toString().c_str(), Udp.remotePort(),
Udp.destinationIP().toString().c_str(), Udp.localPort(),
ESP.getFreeHeap());
// read the packet into packetBufffer
int n = Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
packetBuffer[n] = 0;
Serial.println(packetBuffer);
//handle received mssg
if(packetBuffer[0] == 'O' && packetBuffer[1] == 'K'){
//confirmation message "OK"
Serial.println(F("OK mssg arrived")); //DEBUG
if(udp_CurrBuffSendPos>0){
char space[] = " ";
//push every mssg forward
udp_BufferSend[0] = udp_BufferSend[1];
udp_BufferSend[1] = udp_BufferSend[2];
udp_BufferSend[2] = udp_BufferSend[3];
udp_BufferSend[3] = udp_BufferSend[4];
udp_BufferSend[4] = udp_BufferSend[5];
udp_BufferSend[5] = &space[0];
udp_CurrBuffSendPos--;
udp_TxBufferBusy = false;
}
return;
}
if(packetBuffer[0] == 'H' && packetBuffer[1] == 'I'){
if(packetBuffer[2] == '2' && packetBuffer[3] == '1'){
char mssg[]="SM05xxxx";
sendUDP(mssg);
}
}
}
}
void setup() {
Serial.begin(115200);
Serial.println();
startWiFi();
}
void loop() {
handleUDPrx();
delay(50);
handleUDPtx();
delay(50);
}
First start the server NodeMCU. Afterwards the client NodeMCU. The Client will send one message "HI21" and the server will answer with the problem I showed (see handleUDPrx at server code)