Как отправить пакет данных UDP между двумя точками доступа?

Я новичок в программировании Arduino и платах nodeMcu. У меня есть две платы ESP8266 в качестве точек доступа, и одна плата получает некоторые данные от станций WiFi и повторно отправляет эти данные на другую точку доступа. но проблема в том, что вторая точка доступа не получила никакого пакета данных от первой точки доступа.

Это код точки доступа, которая собирает данные и повторно отправляет их на точку доступа верхнего уровня. Эта точка доступа успешно получила данные от станций WiFi.

const char *ssid1 ="SecondAP"; 
const char *pwd1 = "12345678910";

const char *ssid2 ="FirstAP"; 
const char *pwd2 = "123456789101";

ESP8266WiFiMulti WiFiMulti;

IPAddress local_IP(192,168,4,10); 
IPAddress gateway(192,168,4,9); 
IPAddress subnet(255,255,255,0);
IPAddress NextAP(192,168,4,9);
StaticJsonDocument<200> doc;
unsigned int locPort1 = 1000;
unsigned int locPort2 = 2000;
WiFiUDP udp1; 
WiFiUDP udp2; 
char packetBuffer[100];
IPAddress addrs;

void setup() {

  Serial.begin(9600);
  delay(10);
  Serial.println('\n');

  ConnectToAP();
  delay(1000);
  EnableAP();
  delay(1000);

  udp1.begin(locPort1);
  udp2.begin(locPort2);
}

void loop() {


int Icb = 0;

  Icb = udp1.parsePacket();

  if(Icb > 0){
      GetSensorDataPacket();
      Icb = 0;
    }
}

void EnableAP(){

  WiFi.softAPConfig(local_IP, gateway, subnet);
  WiFi.softAP(ssid2 , pwd2);
  delay(1000);

  Serial.print("Access Point \"");
  Serial.print(ssid2);
  Serial.println("\" started");
  Serial.print("IP address:\t");
  Serial.println(WiFi.softAPIP()); 
}

void ConnectToAP(){

  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP(ssid1, pwd1);

  Serial.print("Connecting to ...........");
  Serial.print(ssid1); Serial.println("...");

  int i = 0;
  while (WiFiMulti.run() != WL_CONNECTED) {    

   delay(1000);
   Serial.print(++i); Serial.print(' ');
  }

  Serial.println('\n');
  Serial.println("Connection established!");  
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());
}

void GetSensorDataPacket(){

  Serial.println("GetSensorDataPacket Function");
  udp1.read(packetBuffer,100);
  DeserializationError error = deserializeJson(doc, packetBuffer);

  IPAddress ClientAddrs = udp1.remoteIP();

  double SensorData = doc["SensorData"];
  int ClientID = doc["ID"];

  delay(1000);
  Serial.println(); 
  Serial.print("Sensor reading = ");
  Serial.println(SensorData);
  Serial.print("Client ID = ");
  Serial.println(ClientID);

  SendDataToNextAP(SensorData,ClientID); 
}

void SendDataToNextAP(double Sensor_Data,int Client_ID){

  StaticJsonDocument<500> jsonBuffr;
  Serial.println("I'm in SendDataToNextAP Function");

  udp2.beginPacket(NextAP, locPort1); //шлюз
  JsonObject Sob1 = jsonBuffr.to<JsonObject>();
  Sob1["SensorData"] = Sensor_Data;
  Sob1["ID"] = Client_ID;
  serializeJson(jsonBuffr, udp2);

  udp2.println();
  udp2.endPacket();

  delay(1000);
}

Это код верхней точки доступа, которая должна получить пакет данных от первой точки доступа, но не получила никаких данных от первой точки доступа.

const char *ssid = "SecondAP";
const char *pwd = "12345678910";
ESP8266WiFiMulti WiFiMulti;

IPAddress local_IP(192,168,4,9); // IP-адрес этого узла
IPAddress gateway(192,168,3,1); 
IPAddress subnet(255,255,255,0);


StaticJsonDocument<200> doc;
unsigned int locPort1 = 1000;
WiFiUDP udp1;
char packetBuffer[100];

void setup() {

  Serial.begin(9600);
  delay(10);
  Serial.println('\n');

  EnableAP(); 
  udp1.begin(locPort1);
  delay(1000);
}

void loop() {

int Icb = 0;

  Icb = udp1.parsePacket();  
  if(Icb > 0){
      Serial.println("Got a Udp packet");
      GetSensorDataPacket();
    }
}

void EnableAP(){

  WiFi.softAPConfig(local_IP, gateway, subnet);
  WiFi.softAP(ssid,pwd);
  delay(1000);

  Serial.print("Access Point \"");
  Serial.print(ssid);
  Serial.println("\" started");
  Serial.print("IP address:\t");
  Serial.println(WiFi.softAPIP()); 
}

void GetSensorDataPacket(){

  Serial.println("GetSensorDataPacket Function");
  udp1.read(packetBuffer,100);
  DeserializationError error = deserializeJson(doc, packetBuffer);

  IPAddress ClientAddrs = udp1.remoteIP();

  double SensorData = doc["SensorData"];
  int ClientID = doc["ID"];

  delay(1000);
  Serial.println(); 
  Serial.print("Sensor reading = ");
  Serial.println(SensorData);
  Serial.print("Client ID = ");
  Serial.println(ClientID);    
}

Я не мог найти причину этого. Если кто-нибудь знает решение для этого, пожалуйста, помогите мне?

Спасибо!

, 👍2

Обсуждение

у вас есть две сети с одинаковым диапазоном IP. а шлюз (192,168,3,1); это что?, @Juraj

Извините, это моя ошибка. это должен быть шлюз (192,168,4,8)., @CKJ

Большое спасибо .. Это работает после смены IP-адреса., @CKJ


1 ответ


Лучший ответ:

0

Два сетевых интерфейса (станция и SoftAP) среднего esp8266 должны иметь разные диапазоны IP-адресов. Если у верхней точки доступа 192.168.4.x, установите для точки доступа среднего IP, например, 192.168.5.1. Поскольку с одинаковыми диапазонами IP-адресов esp8266 не знает, в какую сеть вы хотите отправить сообщение UDP.

,