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

Обсуждение Создание TCP сервера на прием и передачу через WiFi

valkonik

New member
Есть панель отображения информации типа "Бегущая строка", она расположена в условно недоступном месте. Даная панель понимает UART. Идея такова, поставить на нее ESP8266 ESP-01,
на ЕСПешке поднять WiFi TCP сервер чтобы он принимал от ноутбука информацию по WiFi и передавал ее по последовательному порту на панель.
Начал заниматься ESP8266 недавно, примеры попробовал в принципе все получилось. В итоге написал такой TCP сервер. Но как теперь его связать с приложением на С++ в ПК не знаю. Что то пробовал на сокетах но ничего не получилось. Давайте вместе построим такой проект, думаю не только мне надо.
Код:
#include <ESP8266WiFi.h>

WiFiServer server(8888);
void setup()
{
    Serial.begin(115200);
    WiFi.mode(WIFI_AP);
    WiFi.softAP("Test", "1234567890");
  server.begin();
}
WiFiClient client;
void loop()
{
   if (!client.connected())
   {
       client = server.available();
   } else 
     {
        if (client.available() > 0) 
        {
           Serial.write(client.read());
        }
     }
}
 

fandy

Member
А зачем Вам приложение для ноутбука?
Напишите, чтобы Ваш сервер выдавал в ответ на внешний запрос HTML страницу с простенькой формой ввода строки, пароля и кнопкой "Отправить" и работайте в любом браузере.
 

valkonik

New member
Дело в том, что панель отображает счет матча, время, и таймер секунд который запускает судья. Я переживаю за скорость передачи даных.
 

valkonik

New member
Дописал строку, как я думаю с установкой IP, но ни один IP не пингуется.

Код:
#include <ESP8266WiFi.h>

WiFiServer server(8888);
void setup()
{
    Serial.begin(115200);
    WiFi.config(IPAddress (192,168,4,118), IPAddress (192,168,4,100), IPAddress (255,255,255,0));
    WiFi.mode(WIFI_AP);
    WiFi.softAP("Test", "1234567890");
    server.begin();
    Serial.println("");
    Serial.println(WiFi.localIP());
}
WiFiClient client;
void loop()
{
   if (!client.connected())
   {
       client = server.available();
   }
   else
   {
       if (client.available() > 0)
       {
           Serial.write(client.read());
       }
    }
}
На последовательный порт получаю:
Код:
192.168.4.118
Но адреса 192.168.4.1 и 192.168.4.2 пингуются на ура.
 
Последнее редактирование:

Retrum

New member
Делал TCP подключение, тоже долго мучился, но вскоре заработало.

У мя на вемосе и tcp и web серверы

Код:
WiFiServer tcpserver(3000);
ESP8266WebServer server(80);
WiFiClient client;

....

void loop(void){

  // TCP-шная часть

  if (!client.connected()) {
    client = tcpserver.available();
  } else {
    if (client.available() > 0) {
      mess += char(client.read());}
    else if (mess !="") {
        Serial.println(mess); // сообщение от клиента
        if (mess == "Status") {SendStatus();}

    if (mess == "чтото там") {чёто делаем} 
              
        mess = "";
    }
}

//---Отправка статусов клиенту---//
void SendStatus(){               //
  String msg = "status";         //
  msg += StatusRoom1;            //
  msg += StatusRoom2;            //
  msg += StatusRoom3;            //
  msg += StatusKitchen;          //
  msg += StatusBathroom;         //
  msg += StatusHallway;          //
  msg += "\n\r";                 //
  client.print(msg);             //
}                                //
//-------------------------------//
В DELPHI:
Код:
TIdTCPClient
port = 3000
host = 192.168.1.65 - какой и в WEMOS

подключение:
  try
    Client.Connect;
    Label1.Text:='Подключено...';
    Timer.Enabled:= true;
    CheckStatus;
  except
    Client.Disconnect;
    Label1.Text:='Нет подключения...';
  end;
...
// Запрос показаний
procedure TForm1.CheckStatus;
begin
  send('Status');
end;

----------------
опрос только по таймеру:

// Получение сообщений от сервера ESP
procedure TForm1.TimerTimer(Sender: TObject);
var
  s: string;
  i: integer;
begin
  Client.IOHandler.CheckForDataOnSource();
  i:= Client.Socket.InputBuffer.Size;
  if i > 0 then
  begin
    s:= Client.Socket.ReadLn();
    Client.Socket.InputBuffer.Clear;
    if Copy(s,1,6) = 'status' then ShowStatus(Copy(s,7,6));
  end;
end;
 
Последнее редактирование:
Сверху Снизу