So far connection seems to be reliable however the interval in which the messages get sent is very slow sometimes up to 300ms, for my project i would like to send and receive values for motors and servos all concatenated in a single string such as (motor1Value)/(motor2Value)/(servoValue)\r and i would like to send this values with as low of a latency as possible.
For testing purposes i'm sending a value i from the client and sending it back from the access point.
I'm new to using TCP so any help would be greatly appreciated, maybe i'm doing something wrong or maybe it just the limitations of the microcontroller.
Below is my code for the two ESP32's.
Code for the Access point
Code: Select all
#include <WiFi.h>
WiFiServer server(80); // Set a object server as a WiFiServer class
IPAddress IP(192,168,4,15); // Select ip and mask
IPAddress mask = (255, 255, 255, 0);
// The devices that want to connect to our Access Point will need to use the next credentials.
char ssid[] = "****"; // SSID for the Access Point
char pass[] = "****"; // password for the Access Point
byte EspLed = 2; // Built in lED on the ESP32
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_AP); // Set Wi-Fi as access point/server
WiFi.softAP(ssid, pass); // SSID and Password for the AP
WiFi.softAPConfig(IP, IP, mask); // Set our own desired IP address
server.begin(); // Begin the server
pinMode(EspLed, OUTPUT); // Set Buil-in LED as output
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
if (!client) {return;} // Return cuts the function (loop) if client class is not connected
digitalWrite(EspLed, LOW);
String request = client.readStringUntil('\r'); // Reads string received until \r and saves as string
Serial.println(request);
client.flush();
client.println(request + " Aknowledge" + "\r"); // Send the data with the \r so the client knows when to stop
Serial.println(request + "Aknowledge"); // Prints the data that we sent
digitalWrite(EspLed, HIGH);
}
Code: Select all
#include <WiFi.h>
int i = 0;
char ssid[] = "****"; // SSID of your AP
char pass[] = "****"; // password of your AP
IPAddress server(192,168,4,15); // IP address of the AP
WiFiClient client;
byte EspLed = 2; // Built in LED on ESP32
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA); // Wifi as client mode
WiFi.begin(ssid, pass); // Credentials to connect to the Access Point
Serial.println("Connection to the AP");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("Connected");
Serial.print("LocalIP:");
Serial.println(WiFi.localIP());
Serial.println("MAC:" + WiFi.macAddress());
Serial.print("Gateway:");
Serial.println(WiFi.gatewayIP());
Serial.print("AP MAC:");
Serial.println(WiFi.BSSIDstr());
pinMode(EspLed, OUTPUT);
}
void loop() {
if(i > 100){
i = 0;
}
if (!client.connect(server, 80)) { // Connect to the server through the port 80
Serial.println("connection failed"); // If server not connected run connection again
return; // return terminates the function (loop)
}
digitalWrite(EspLed, LOW);
client.print(i);
client.println("\r"); // Send a value to the AP with \r so it knows when to stop
Serial.print(i);
Serial.println("\r");
unsigned long timeout = millis(); // The next block of code handles disconnections from the AP
while (client.available() == 0) {
if (millis() - timeout > 5000) { // If its disconnected for more than 5 seconds then start again
Serial.println(">>> Client Timeout !");
client.stop();
return;
}
}
String answer = client.readStringUntil('\r'); // Receive value from the server until \r
Serial.println(answer);
//client.flush();
client.stop();
digitalWrite(EspLed, HIGH);
i++;
}