Как отправить пакет данных 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);
}
Я не мог найти причину этого. Если кто-нибудь знает решение для этого, пожалуйста, помогите мне?
Спасибо!
@CKJ, 👍2
Обсуждение1 ответ
Лучший ответ:
Два сетевых интерфейса (станция и SoftAP) среднего esp8266 должны иметь разные диапазоны IP-адресов. Если у верхней точки доступа 192.168.4.x, установите для точки доступа среднего IP, например, 192.168.5.1. Поскольку с одинаковыми диапазонами IP-адресов esp8266 не знает, в какую сеть вы хотите отправить сообщение UDP.
- Как определить размер Flash?
- В ESP-12E NodeMCU, какой выход PIN A0?
- Esp8266 Vin контакт
- Преобразование byte* в int в Arduino
- Каково использование зарезервированных контактов и контактов SDD2, SDD3 NodeMCU?
- NodeMCU (Arduino IDE) «DynamicJsonBuffer» не был объявлен в этой области
- NodeMCU поддерживает внедрение ключей?
- Датчик движения PIR (HC-SR501) ложные результаты с NodeMCU
у вас есть две сети с одинаковым диапазоном IP. а
шлюз (192,168,3,1);
это что?, @JurajИзвините, это моя ошибка. это должен быть шлюз (192,168,4,8)., @CKJ
Большое спасибо .. Это работает после смены IP-адреса., @CKJ