• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь ESP8266 подключить в роли клиента по Telnet

MSapogov

New member
В сети много информации как на ESP8266 поднять Telnet сервер...
А я никак не могу найти примеров подключения ESP8266 как клиента к Telnet серверу.
Необходимо подключится к серверу по протоколу телнет (порт 23 или можно другой), отправить туда комманду например"00:00:00:00:00:1f pause", получить ответ и проанализировав его принять какое либо решение...
Пока проблемма только в ESP как клиент Telnet.
Уж направьте в нужное русло....
 

MSapogov

New member
Пробую использывать WifiClient , думал что его можно использывать только для www на 80 порту :)
Получилось что-то типа этого:
Код:
#include <ESP8266WiFi.h>
#include <string>
#include <Arduino.h>
const char* ssid     = "sssiddd";
const char* password = "tralyalya";

IPAddress server(192,168,11,1);

//--------Connecting WiFi
void connectWifi() {
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  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());
  }

// Use WiFiClient class to create TCP connections
WiFiClient Client;

void setup() {
  delay(1000);
  Serial.begin(115200);
  delay(1000);
  Serial.println("Sync,Sync,Sync,Sync,Sync");
  delay(500);
  Serial.println ( "Connect to Router requested" );
  connectWifi(); // signal WiFi connected

  Serial.print("Free Heap[B]: ");
  Serial.println(ESP.getFreeHeap());

  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.print("connecting to ");
  Serial.print(server); 
  Serial.print(":");
  Serial.println("9090");

  const int Port = 9090;
  if (!Client.connect(server, Port)) {
    Serial.println("connection failed");
    return;
  }
  Serial.println("connection OK");
  //Client.println("\r\n");
  delay(10);
} // setup()

void loop() {
  delay(2000);

  // We now create a URI for the request
  String scheme = ("00:00:00:00:00:1f pause");
  Serial.print("Sending URI: ");
  Serial.print(scheme + "\r\n");

  // This will send the request to the server
  Client.print(scheme + "\r\n");
}
но после 6-и циклов, что-то происходит...
7-й цикл пауза зедерживается на секунд 6-7 в сериал выдается команда (но в телнет уже нет),
последующие циклы с задержкой 2сек и выдается в сериал, а в телнет уже нет...

Что делаю не так.
 
Последнее редактирование:

MSapogov

New member
Получилось.
Спасибо за правильное направление меня к нужному месту.
Вот, что получилось в итоге:
Код:
#include <ESP8266WiFi.h>
#include <string>
#include <Rotary.h>           // Rotary-master
#include <OneButton.h>        // OneButton

Rotary encoder = Rotary(D1, D2);
OneButton button(D5, true);

const char* ssid     = "sssiddd";
const char* password = "tralyalya";

const char* server   = "192.168.11.1";
const int port       = 9090;

const char* player   = "00:00:00:00:00:1f ";

// Use WiFiClient class to create TCP connections
WiFiClient client;

void connectWifi() {
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  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 clitx(String cmd) {
  Serial.print("Get LMS ststus: ");
  Serial.print(player + cmd + "\r\n");
  // This will send the request to the server
  client.print(player + cmd + "\r\n");
}

void clisubscribe(){
  client.connect(server, port);
  clitx("subscribe mixer,pause,power");  // подписываемся на оповещение об изменении статуса
  delay(100);
  clitx("mixer volume ?");               // получаем текущюю
  delay(100);
  clitx("power ?");                     
  delay(100);
  clitx("pause ?");      
}

void setup() {
  pinMode(D3, INPUT_PULLUP);    //enc button
  pinMode(D8, OUTPUT);          //Red led
  pinMode(D6, OUTPUT);          //Green led


  Serial.begin(115200);
  delay(10);
  Serial.println("Sync,Sync,Sync,Sync,Sync");
  Serial.println ( "Connect to Router requested" );
  connectWifi(); // signal WiFi connected

  Serial.print("Free Heap[B]: ");
  Serial.println(ESP.getFreeHeap());

  // give the WiFi a second to initialize:
  delay(500);
  Serial.print("connecting to ");
  Serial.print(server); 
  Serial.print(":");
  Serial.println("9090");

  
  if (!client.connect(server, port)) {
    Serial.println("connection failed");
    return;
  }
  Serial.println("connection OK");
  delay(10);

  // 00:00:00:00:00:1f subscribe mixer,pause,power
  clisubscribe();
  delay(100);
  client.println();
  delay(200);
  if (client.available()) Serial.println("CLI available...");

          
  digitalWrite(D6, LOW);
  digitalWrite(D8, LOW);                 

} // setup()


void loop() {

while(client.available()){
  String clirx = client.readStringUntil('\r\n');
    if ( clirx == ("00%3A00%3A00%3A00%3A00%3A1f power 1 \r")) digitalWrite(D8, HIGH);
    if ( clirx == ("00%3A00%3A00%3A00%3A00%3A1f power 0 \r")) digitalWrite(D8, LOW);
    // тут можно проверки делать еще...
  Serial.println("Recieving: " + clirx);
  }
  String clirx="";

  // проверка что есть соединение, если нет, то перезапуск
  if (client.connected() != 1 || WiFi.status() != WL_CONNECTED)
      {
         Serial.print("Reconnect to CLI ");
         client.connect(server, port);
         while (!client.connect(server, port)) {
           delay(500);
           Serial.print(".");
         }
         Serial.println(".");
         Serial.println("Reconnect OK.");
         //ESP.reset();
         clisubscribe();
       }
  // идем дальше...
}
Теперь появилась другая проблема:
Получив String clirx, мне необходимо произвести его анализ...
При старте модуля мы подписываемся на изменения громкости и получаем ее текущее состояние, в ответ получаем
Код:
Recieving: 00%3A00%3A00%3A00%3A00%3A1f mixer volume 34
текущюю громкость с сервера, нам необходимо запомнить значение 34 в пременой vol.
Получая состояние громкости, оно приходит в виде текстовой строки
Код:
Recieving: 00%3A00%3A00%3A00%3A00%3A1f mixer volume %2B1
Recieving: 00%3A00%3A00%3A00%3A00%3A1f mixer volume %2B2
Recieving: 00%3A00%3A00%3A00%3A00%3A1f mixer volume %2B2
Recieving: 00%3A00%3A00%3A00%3A00%3A1f mixer volume %2B2
Recieving: 00%3A00%3A00%3A00%3A00%3A1f mixer volume -2
Recieving: 00%3A00%3A00%3A00%3A00%3A1f mixer volume -2
Recieving: 00%3A00%3A00%3A00%3A00%3A1f mixer volume -2
Recieving: 00%3A00%3A00%3A00%3A00%3A1f mixer volume -2
Recieving: 00%3A00%3A00%3A00%3A00%3A1f mixer volume 60
Recieving: 00%3A00%3A00%3A00%3A00%3A1f mixer volume 30
Recieving: 00%3A00%3A00%3A00%3A00%3A1f mixer volume 70
В дальнейшем при приеме команд мы должны или прибавлять (если mixer volume %2B2) или убавлять (если mixer volume -2) текущее значение vol. А если получен (mixer volume 30), то задаеть ей это значение.
Пока не пойму как из принятой строки String забрать значение громкости и поместить ее числовую переменную, что бы можно было потом отображать на дисплее.
Думаю, что нужно сначала отбросить 00%3A00%3A00%3A00%3A00%3A1f, т.к. это MAC адрес плеера, а от задан в переменной pleer.
Весь StringObject прочитал, но так ничего и не понял.
Кто подскажет как правильно разобрать строку?
 
Последнее редактирование:

MSapogov

New member
Так будет оптимально, или есть более лучший способ?
Код:
if (clirx.startsWith(player + " mixer volume")) {
      Serial.println("Change mixer volume " + clirx.substring(41));
      if (clirx.substring(41).startsWith("-")) {
      Serial.println("Volume -" + clirx.substring(42));
      if (vol >= 0) vol = vol-clirx.substring(42).toInt();
      if (vol < 0) vol =0;
      drawProgressBarVolume(vol);
      }
      if (clirx.substring(41).startsWith("%2B")) {
      Serial.println("Volume +" + clirx.substring(44));
      if (vol <= 100) vol = vol+clirx.substring(44).toInt();
      if (vol > 100) vol = 100;
      drawProgressBarVolume(vol);
      }
      if (!clirx.substring(41).startsWith("-") && !clirx.substring(41).startsWith("%2B")) {
      Serial.println("Volume set to " + clirx.substring(41));
      vol = clirx.substring(41).toInt();
      drawProgressBarVolume(vol); 
      }
    }
 
Сверху Снизу