TCP/IP communication between few ESP32 - memory crash with client.remoteIP()
Posted: Tue Jun 16, 2020 10:36 pm
Hello everyone!
I am trying to find solution to my problem for few days but i almost gave up...
i try to set up communication via TCP/IP between few ESP32 modules, (1 is server and rest are clients sending data). I did it succesfully but when i try to recognize each ESP32 by IP (by calling client.remoteIP()) i got memory crash like this:
Guru Meditation Error: Core 0 panic'ed (InstrFetchProhibited). Exception was unhandled.
Core 0 register dump:
PC : 0x00000000 PS : 0x00060e30 A0 : 0x801100ad A1 : 0x3ffb3d30
A2 : 0x3ffccd7c A3 : 0x3ffccfb0 A4 : 0x3ffcb340 A5 : 0x3ffcb320
A6 : 0x0204a8c0 A7 : 0x0c04a8c0 A8 : 0x8010ff50 A9 : 0x3ffb3cf0
A10 : 0x3ffccd8c A11 : 0x3ffccfb0 A12 : 0x3ffb3d3c A13 : 0x00000044
A14 : 0x00000001 A15 : 0x00000006 SAR : 0x00000010 EXCCAUSE: 0x00000014
EXCVADDR: 0x00000000 LBEG : 0x4000c349 LEND : 0x4000c36b LCOUNT : 0x00000000
Backtrace: 0x00000000:0x3ffb3d30 0x401100aa:0x3ffb3d70 0x4011d011:0x3ffb3d90 0x40122019:0x3ffb3dd0 0x401272b6:0x3ffb3df0 0x401109cf:0x3ffb3e10 0x40088b7d:0x3ffb3e40
Like i said if i dont call for client.remoteIP function i am able to send data - but i need this to recognize every ESP and sord received data properly
When i call client.remoteIP() only once it works properly (but not always, sometimes i need to restart clients few times to stabilize)
I attach code for server:
and code for client:
Maybe there is any working example of communications like this - with many ESP32, or maybe someone can give me a tip how to deal with it
I am trying to find solution to my problem for few days but i almost gave up...
i try to set up communication via TCP/IP between few ESP32 modules, (1 is server and rest are clients sending data). I did it succesfully but when i try to recognize each ESP32 by IP (by calling client.remoteIP()) i got memory crash like this:
Guru Meditation Error: Core 0 panic'ed (InstrFetchProhibited). Exception was unhandled.
Core 0 register dump:
PC : 0x00000000 PS : 0x00060e30 A0 : 0x801100ad A1 : 0x3ffb3d30
A2 : 0x3ffccd7c A3 : 0x3ffccfb0 A4 : 0x3ffcb340 A5 : 0x3ffcb320
A6 : 0x0204a8c0 A7 : 0x0c04a8c0 A8 : 0x8010ff50 A9 : 0x3ffb3cf0
A10 : 0x3ffccd8c A11 : 0x3ffccfb0 A12 : 0x3ffb3d3c A13 : 0x00000044
A14 : 0x00000001 A15 : 0x00000006 SAR : 0x00000010 EXCCAUSE: 0x00000014
EXCVADDR: 0x00000000 LBEG : 0x4000c349 LEND : 0x4000c36b LCOUNT : 0x00000000
Backtrace: 0x00000000:0x3ffb3d30 0x401100aa:0x3ffb3d70 0x4011d011:0x3ffb3d90 0x40122019:0x3ffb3dd0 0x401272b6:0x3ffb3df0 0x401109cf:0x3ffb3e10 0x40088b7d:0x3ffb3e40
Like i said if i dont call for client.remoteIP function i am able to send data - but i need this to recognize every ESP and sord received data properly
When i call client.remoteIP() only once it works properly (but not always, sometimes i need to restart clients few times to stabilize)
I attach code for server:
- #include <WiFi.h>
- WiFiServer server(80); // Set a object server as a WiFiServer class
- IPAddress IP(192,168,4,1); // Select ip and mask
- IPAddress mask = (255, 255, 255, 0);
- void setup() {
- Serial.begin(115200);
- WiFi.mode(WIFI_AP); // Set Wi-Fi as access point/server
- WiFi.softAP("ESP32", "123456789"); // SSID and Password for the AP
- WiFi.softAPConfig(IP, IP, mask); // Set our own desired IP address
- server.begin(); // Begin the server
- Serial.println("Server started.");
- Serial.print("IP: ");
- Serial.println(WiFi.softAPIP()); // .softAPIP calls for the IP of the access point which we set earlier
- Serial.print("MAC:");
- Serial.println(WiFi.softAPmacAddress()); // Calls for the mac address
- }
- void loop() {
- WiFiClient client = server.available(); // Return a client object to the class if there is a client available
- client.setNoDelay(1);
- if (!client) {return;} // Return cuts the function (loop) if client class is not connected
- // String request = client.readStringUntil('\r'); // Reads string received until \r and saves as string
- // Serial.print("From ");
- // Serial.print(client.remoteIP());
- // Serial.print(", port ");
- // Serial.println(client.remotePort());
- if (client.remoteIP()[3] == 2){ // check the last byte of IP adress to check which esp connected
- String request = client.readStringUntil('\r');
- Serial.println(" Dostalem po TCP od 1 : " + request);
- client.println(" Dostalem po TCP: " + request + "\r"); // Send the data with the \r so the client knows when to stop
- }
- if (client.remoteIP()[3] == 3){
- String request = client.readStringUntil('\r');
- Serial.println(" Dostalem po TCP od 2 : " + request);
- client.println(" Dostalem po TCP: " + request + "\r"); // Send the data with the \r so the client knows when to stop
- }
- }
- include <WiFi.h>
- IPAddress ip(192, 168, 4, 1);
- const char* host = "192.168.4.1";
- const uint16_t port = 80;
- int buffer;
- int sygnal[100]; /
- void setup()
- {
- Serial.begin(115200);
- Serial.println();
- WiFi.begin("ESP32", "123456789");
- Serial.print("Connecting");
- while (WiFi.status() != WL_CONNECTED)
- {
- delay(500);
- Serial.print(".");
- }
- Serial.println();
- Serial.print("Connected, IP address: ");
- Serial.println(WiFi.localIP());
- for (int i=0; i <100; i++){
- sygnal[i]=i;
- }
- delay(2500);
- }
- void loop() {
- Serial.print("connecting to ");
- Serial.print(host);
- Serial.print(':');
- Serial.println(port);
- for (int i=0; i <100; i++){ //send 100 times
- buffer=sygnal[i];
- // Use WiFiClient class to create TCP connections
- WiFiClient client;
- if (!client.connect(host, port)) {
- Serial.println("connection failed");
- Serial.println("wait 3 sec...");
- delay(3000);
- return;
- }
- // send buffer to server
- client.print(buffer);
- client.println("\r");
- Serial.print("Wyslalem po TCP: ");
- Serial.println(buffer);
- //odczytaj odpowiedz serwera
- Serial.print("Odpowiedz: ");
- String line = client.readStringUntil('\r');
- Serial.println(line);
- Serial.println("closing connection");
- client.stop();
- }
- //5 seconds delay
- Serial.println("wait 5 sec...");
- delay(5000);
- }