• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь TCP сервер

Cuper

Member
Написал простенький TCP сервер, который должен передавать 0 или 1. Залил прошивку в esp и решил подключится к серверу через telnet с помощью консоли Windows. Подключение проходит успешно, сервер выдает приветствие клиенту, но тут же клиент отключается.
Потом написал TCP клиент для esp. Залил в другой модуль esp. Та же ситуация, но теперь, он должен читать не только приветствие, а и 0 или 1. А вместо этого выдается какой-то набор рандомных цифр.
Клиент и сервер ниже
Код:
#include <time.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiServer.h>

bool alreadyConnected = false;
int gpo;
unsigned long seconds;
WiFiServer server(196);

void setup() {
  Serial.begin(115200);
  while (!Serial) {
    delay(10);
  }
  delay(5);
  WiFiinit(); 
  timeSynch();
  server.begin();
  Serial.print(GetTime());
  Serial.println("Wait for first client...");
}
void loop() {
  WiFiClient client = server.available();
  if (client) {
    if (!alreadyConnected) {
      client.flush();
      Serial.print(GetTime());
      Serial.println("We have a new client");
      Serial.print(GetTime());
      client.println("Hello, client!");
      alreadyConnected = true;
    }
  }
  if (client.available() > 0) {
      char thisChar = client.read();
      gpo = digitalRead(2);
      Serial.print(GetTime());
      Serial.print("GPO2 = ");
      Serial.println(gpo);
      server.write(gpo);
   
      Serial.println(thisChar);
  } else if (client.available() < 0) {
      Serial.print(GetTime());
      Serial.println("Lost connection.");
      alreadyConnected = false; 
  } 
  delay(50);
}
Код:
#include "set.h"
int answer;
unsigned long seconds;
WiFiClient client;

void setup() {
 
  delay(100);
  mp3_set_serial (Serial);   
  mp3_set_volume (5);
  delay(100);
  pinMode(0, OUTPUT);
  serialConnect();
  WiFiinit();
  printWifiStatus();
  delay(1000);
  if (client.connect(server, 196)) {
    Serial.println("connected to server");
    return true;
  } else {
    Serial.println("connection failed.");
    return false;
  }
}

void loop() {
  digitalWrite(0, HIGH);
  if (client.available()) {
    answer = client.read();
    Serial.print(answer);
  }
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
   
    if (client.connect(server, 196)) {
    Serial.println("connected to server");
    return true;
  } else {
    Serial.println("connection failed.");
    return false;
  }
 
  }
  if (answer == 0) alert();
  delay(50);
}
 

Алексей.

Active member
А чему вы удивляетесь?
В примере сервера в функции loop(), вы у сервера получаете клиента (вызов WiFiClient client = server.available() ), сохраняете его в стеке, вычитываете данные если они есть (а у вас их нет, просто подключились телнетом и ничего не передали) и через delay(50) завершаете функцию loop() и тот клиент, который построили в стеке благополучно (вполне штатно) закрывается, со стороны телнета видите вроде соединение установилось и тут же разорвалось.
 
Сверху Снизу