HELP PLS esp8266 client not connecting to other esp8266 server (TCP)

Hi!

For the past week, I've been trying to connect two esp8266 boards (wemos D1 mini) together in my local network with static IP but I'm stuck and I'd really appreciate it if anyone knowledgeable in this area could help.

I've managed to create a webserver that can toggle the built-in LED on and off in two different ways: through an HTML page with a submit button; through a "\LINK" page (I'm very sorry if I'm explaining this all wrong I'm still a beginner)

So for the webserver I have this code:

Code Server
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266mDNS.h>
#include <ESP8266WebServer.h>

ESP8266WiFiMulti wifiMulti;     // Create an instance of the ESP8266WiFiMulti class, called 'wifiMulti'

ESP8266WebServer server(80);    // Create a webserver object that listens for HTTP request on port 80

const int led = 2;

void handleRoot();              // function prototypes for HTTP handlers
void handleLED();
void handleNotFound();

void setup(void) {
  Serial.begin(115200);         // Start the Serial communication to send messages to the computer
  delay(10);
  Serial.println('\n');

  pinMode(led, OUTPUT);

  wifiMulti.addAP("TP-Link_****", "********");   // add Wi-Fi networks you want to connect to (I put "*" for privacy reasons )
  wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2");
  wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3");

  Serial.println("Connecting ...");
  int i = 0;
  while (wifiMulti.run() != WL_CONNECTED) { // Wait for the Wi-Fi to connect: scan for Wi-Fi networks, and connect to the strongest of the networks above
    delay(250);
    Serial.print('.');
  }
  Serial.println('\n');
  Serial.print("Connected to ");
  Serial.println(WiFi.SSID());              // Tell us what network we're connected to
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());           // Send the IP address of the ESP8266 to the computer

  if (MDNS.begin("esp8266")) {              // Start the mDNS responder for esp8266.local
    Serial.println("mDNS responder started");
  } else {
    Serial.println("Error setting up MDNS responder!");
  }

  server.on("/LINK", HTTP_GET, handleLink);
  server.on("/", HTTP_GET, handleRoot);     // Call the 'handleRoot' function when a client requests URI "/"
  server.on("/LED", HTTP_POST, handleLED);  // Call the 'handleLED' function when a POST request is made to URI "/LED"
  server.onNotFound(handleNotFound);        // When a client requests an unknown URI (i.e. something other than "/"), call function "handleNotFound"

  server.begin();                           // Actually start the server
  Serial.println("HTTP server started");
}

void loop(void) {
  server.handleClient();                    // Listen for HTTP requests from clients
}

void handleRoot() {                         // When URI / is requested, send a web page with a button to toggle the LED
  server.send(200, "text/html", "<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"Toggle LED SITE\"></form>");
}

void handleLink() {
  digitalWrite(led, !digitalRead(led));     // Change the state of the LED
  server.sendHeader("Location", "/");       // Add a header to respond with a new location for the browser to go to the home page again
  server.send(200);
}

void handleLED() {                          // If a POST request is made to URI /LED
  digitalWrite(led, !digitalRead(led));     // Change the state of the LED
  server.sendHeader("Location", "/");       // Add a header to respond with a new location for the browser to go to the home page again
  server.send(303);                         // Send it back to the browser with an HTTP status 303 (See Other) to redirect
}

void handleNotFound() {
  server.send(404, "text/plain", "404: Not found"); // Send HTTP status 404 (Not Found) when there's no handler for the URI in the request
}

The idea was for the Client to send a GET request to http://192.168.0.109/LINK and that would toggle the LED (something that works when I try it in the browser). So, for the HTTP client I've used this code:

Code Client
/*
    This sketch establishes a TCP connection to a "quote of the day" service.
    It sends a "hello" message, and then prints received data.
*/

#include <ESP8266WiFi.h>

#ifndef STASSID
#define STASSID "TP-Link_****"
#define STAPSK  "********"
#endif

const char* ssid     = STASSID;
const char* password = STAPSK;

const char* host =  "192.168.0.109";     
const uint16_t port =  80;             

void setup() {
  Serial.begin(115200);
  Serial.setDebugOutput(true);

  // We start by connecting to a WiFi network

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

  /* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default,
     would try to act as both a client and an access-point and could cause
     network-issues with your other WiFi-devices on your WiFi-network. */
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  static bool wait = false;

  Serial.print("connecting to ");
  Serial.print(host);
  Serial.print(':');
  Serial.println(port);

  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  if (!client.connect(host, port)) {
    Serial.println("connection failed");
    delay(5000);
    return;
  }

  // This will send a string to the server
  Serial.println("sending data to server");
  if (client.connected()) {
    client.println("hello from ESP8266");
  }

  // wait for data to be available
  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 5000) {  //
      Serial.println(">>> Client Timeout !");
      client.stop();
      delay(60000);
      return;
    }
  }

  // Read all the lines of the reply from server and print them to Serial
  Serial.println("receiving from remote server");
  // not testing 'client.connected()' since we do not need to send data here
  while (client.available()) {
    char ch = static_cast<char>(client.read());
    Serial.print(ch);
  }

  // Close the connection
  Serial.println();
  Serial.println("closing connection");
  client.stop();

  if (wait) {
    delay(300000); // execute once every 5 minutes, don't flood remote service
  }
  wait = true;
}

Besides this problem both modules I have seem to be working fine. I've tried connecting the client to "www.djxmmx.net" and it worked fine and the server is accessible through the browser on all of it's pages and works fine on it's own. I'm 100% sure they're connected to the router, and I've checked that on the router's page.

However, whenever I try to get the client board to connect with the server I get server timeouts. It seems they can't establish a TCP connection I really can't figure out why.

I've also tried this code too as but to no avail : (

Code Client 2
/**
   BasicHTTPClient.ino

    Created on: 24.05.2015

*/

#include <Arduino.h>

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

#include <ESP8266HTTPClient.h>

#include <WiFiClient.h>

ESP8266WiFiMulti WiFiMulti;

void setup() {

  Serial.begin(115200);
  // Serial.setDebugOutput(true);

  Serial.println();
  Serial.println();
  Serial.println();

  for (uint8_t t = 4; t > 0; t--) {
    Serial.printf("[SETUP] WAIT %d...\n", t);
    Serial.flush();
    delay(1000);
  }

  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP("TP-Link_****", "*******");

}

void loop() {
  // wait for WiFi connection
  if ((WiFiMulti.run() == WL_CONNECTED)) {

    WiFiClient client;

    HTTPClient http;

    Serial.print("[HTTP] begin...\n");
    if (http.begin(client, "http://jigsaw.w3.org/HTTP/connection.html")) {  // HTTP


      Serial.print("[HTTP] GET...\n");
      // start connection and send HTTP header
      int httpCode = http.GET();

      // httpCode will be negative on error
      if (httpCode > 0) {
        // HTTP header has been send and Server response header has been handled
        Serial.printf("[HTTP] GET... code: %d\n", httpCode);

        // file found at server
        if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
          String payload = http.getString();
          Serial.println(payload);
        }
      } else {
        Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
      }

      http.end();
    } else {
      Serial.printf("[HTTP} Unable to connect\n");
    }
  }

  delay(10000);
}

Thanks in advance! :grinning:

Maybe this example will clear up the problem area.

ESP32 Static/Fixed IP Address | Random Nerd Tutorials

I prefer to use the server with DHCP so client gets an automatic address passed from server.

I'm sorry but doesn't really help me :frowning:

The problem I have usually appears on this part of the client code:

  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  if (!client.connect(host, port)) {
    Serial.println("connection failed");  <--- this always appears on the serial monitor 
    delay(5000);
    return;
  }

I'm unsure whether it's a client code problem or a server code problem though

Have you looked into an alternative configuration:

Getting Started with ESP-NOW (ESP8266 NodeMCU with Arduino IDE) | Random Nerd Tutorials

I did, thank you. However it doesn't provide me with the range I am looking for :frowning:

I'm just really confused with my situation because there seems to be very little that can go wrong in my code (having in mind that a connection to my WiFi is something I know is working), the only thing that's breaking is the TCP connection :frowning:

Range for ESPNOW has been reported to be 220 Meters board-board with PCB antennas. Of course, that was an open field with ideal weather.
ESPNOW Two-Way Communication Between ESP32 Boards | Random Nerd Tutorials

You do realize that you can test with an old router that has no Internet, just use it as an AP. You may wish to check to see if your primary router is patched with the most recent firmware.

Also, your 2 ESP modules should be in the same plane and facing each other. There are external antenna options. You may wish to load a WiFi analyzer on your cellphone or notebook to view the ESP32 RSSI.

The purpose of my project really needed the signal to go through walls that an espnow connection can't do (By doing the connection through wifi like I'm trying I can use the router as a "bridge" to get more range).

I eventually did get the code working by avoiding the webserver library in my server code. I'll have to live that for now.

Thanks for the help though :smiley:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.