• Система автоматизации с открытым исходным кодом на базе 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); 
      }
    }
 
Сверху Снизу