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

Нужна помощь WiFiTelnetToSerial отправить данные

rapidshe

Member
Знатоки подскажите.

как мне отправить данные типа string, int?

Код:
#include <ESP8266WiFi.h>

//how many clients should be able to telnet to this ESP8266
#define MAX_SRV_CLIENTS 2
const char* ssid = "2.4Ghz";
const char* password = "Qmu2vobq2@";

unsigned long currentTime;
unsigned long printtime;

WiFiServer server(23); // --> default port for communication usign TELNET protocol | Server Instance
WiFiClient serverClients[MAX_SRV_CLIENTS]; // --> Client Instanse

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);

  // -->Try to connect to particular host for 20 times, If still not connected then automatically resets.
  Serial.print("\nConnecting to "); Serial.println(ssid);
  uint8_t i = 0;
  while (WiFi.status() != WL_CONNECTED && i++ < 20) delay(500);
  if(i == 21){
    Serial.print("Could not connect to"); Serial.println(ssid);
    while(1);
  }
  //start UART and the server
  Serial.begin(115200);
  server.begin();
  server.setNoDelay(true); // --> Won't be storing data into buffer and wait for the ack. rather send the next data and in case nack is received, it will resend the whole data
 
  Serial.print("Ready! Use 'telnet ");
  Serial.print(WiFi.localIP());
  Serial.println(" 23' to connect");
}

void loop() {
  uint8_t i;
  //check if there are any new clients
  if (server.hasClient())
     {
     for(i = 0; i < MAX_SRV_CLIENTS; i++)
        {
          //find free/disconnected spot
        if (!serverClients[i] || !serverClients[i].connected())
           {
           if(serverClients[i]) serverClients[i].stop();
           serverClients[i] = server.available();
           Serial.print("New client: "); Serial.print(i);
           continue;
           }
        }
     //no free/disconnected spot so reject
     WiFiClient serverClient = server.available();
     serverClient.stop();
     }
  //check clients for data
  for(i = 0; i < MAX_SRV_CLIENTS; i++){
    if (serverClients[i] && serverClients[i].connected()){
      if(serverClients[i].available()){
        //get data from the telnet client and push it to the UART
        while(serverClients[i].available()) Serial.write(serverClients[i].read());
      }
    }
  }
  //check UART for data
  if(Serial.available()){
    size_t len = Serial.available();
    uint8_t sbuf[len];
    Serial.readBytes(sbuf, len);
    //push UART data to all connected telnet clients
    for(i = 0; i < MAX_SRV_CLIENTS; i++){
      if (serverClients[i] && serverClients[i].connected()){
        serverClients[i].write(sbuf, len);
        delay(1);
      }
    }
  }
}

понимаю, что отправка происходит в последнем абзаце
Код:
//check UART for data
  if(Serial.available()){
    size_t len = Serial.available();
    uint8_t sbuf[len];
    Serial.readBytes(sbuf, len);
    //push UART data to all connected telnet clients
    for(i = 0; i < MAX_SRV_CLIENTS; i++){
      if (serverClients[i] && serverClients[i].connected()){
        serverClients[i].write(sbuf, len);
        delay(1);
      }
    }
  }
Но не понимаю, как подготовить данные к отправке.
Отправляются переменные sbuf, len. как преобразовать string и int в sbuf, len для отправки...
 

nikolz

Well-known member
Знатоки подскажите.

как мне отправить данные типа string, int?

Код:
#include <ESP8266WiFi.h>

//how many clients should be able to telnet to this ESP8266
#define MAX_SRV_CLIENTS 2
const char* ssid = "2.4Ghz";
const char* password = "Qmu2vobq2@";

unsigned long currentTime;
unsigned long printtime;

WiFiServer server(23); // --> default port for communication usign TELNET protocol | Server Instance
WiFiClient serverClients[MAX_SRV_CLIENTS]; // --> Client Instanse

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);

  // -->Try to connect to particular host for 20 times, If still not connected then automatically resets.
  Serial.print("\nConnecting to "); Serial.println(ssid);
  uint8_t i = 0;
  while (WiFi.status() != WL_CONNECTED && i++ < 20) delay(500);
  if(i == 21){
    Serial.print("Could not connect to"); Serial.println(ssid);
    while(1);
  }
  //start UART and the server
  Serial.begin(115200);
  server.begin();
  server.setNoDelay(true); // --> Won't be storing data into buffer and wait for the ack. rather send the next data and in case nack is received, it will resend the whole data
 
  Serial.print("Ready! Use 'telnet ");
  Serial.print(WiFi.localIP());
  Serial.println(" 23' to connect");
}

void loop() {
  uint8_t i;
  //check if there are any new clients
  if (server.hasClient())
     {
     for(i = 0; i < MAX_SRV_CLIENTS; i++)
        {
          //find free/disconnected spot
        if (!serverClients[i] || !serverClients[i].connected())
           {
           if(serverClients[i]) serverClients[i].stop();
           serverClients[i] = server.available();
           Serial.print("New client: "); Serial.print(i);
           continue;
           }
        }
     //no free/disconnected spot so reject
     WiFiClient serverClient = server.available();
     serverClient.stop();
     }
  //check clients for data
  for(i = 0; i < MAX_SRV_CLIENTS; i++){
    if (serverClients[i] && serverClients[i].connected()){
      if(serverClients[i].available()){
        //get data from the telnet client and push it to the UART
        while(serverClients[i].available()) Serial.write(serverClients[i].read());
      }
    }
  }
  //check UART for data
  if(Serial.available()){
    size_t len = Serial.available();
    uint8_t sbuf[len];
    Serial.readBytes(sbuf, len);
    //push UART data to all connected telnet clients
    for(i = 0; i < MAX_SRV_CLIENTS; i++){
      if (serverClients[i] && serverClients[i].connected()){
        serverClients[i].write(sbuf, len);
        delay(1);
      }
    }
  }
}

понимаю, что отправка происходит в последнем абзаце
Код:
//check UART for data
  if(Serial.available()){
    size_t len = Serial.available();
    uint8_t sbuf[len];
    Serial.readBytes(sbuf, len);
    //push UART data to all connected telnet clients
    for(i = 0; i < MAX_SRV_CLIENTS; i++){
      if (serverClients[i] && serverClients[i].connected()){
        serverClients[i].write(sbuf, len);
        delay(1);
      }
    }
  }
Но не понимаю, как подготовить данные к отправке.
Отправляются переменные sbuf, len. как преобразовать string и int в sbuf, len для отправки...
очевидно отправка предполагается в виде текста
значит - строки посылаете как есть определив их длину а int преобразуете в строку
 

rapidshe

Member
мне мозгов не хватает...

пробую так
Код:
currentTime = millis();
if (currentTime >= printtime)
   {
   printtime = currentTime+3000;
     {
     String priv = "privet";
     size_t len = priv.length(); //пробовал еще  int len = priv.length(); 


    for(i = 0; i < MAX_SRV_CLIENTS; i++){
      if (serverClients[i] && serverClients[i].connected()){
        serverClients[i].write(priv, len);
        delay(1);
           }
        }
     }
   }
при компиляции ошибка
Код:
In file included from C:\Users\MACHINE\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.2.0-rc1\libraries\ESP8266WiFi\src/ESP8266WiFi.h:39:0,

                 from C:\Users\MACHINE\Downloads\ESP8266-Series-master\ESP8266-Series-master\WiFiTelnetToSerial\WiFiTelnetToSerial.ino:30:

C:\Users\MACHINE\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.2.0-rc1\libraries\ESP8266WiFi\src/WiFiClient.h: In instantiation of 'size_t WiFiClient::write(T&, size_t) [with T = String; size_t = unsigned int]':

C:\Users\MACHINE\Downloads\ESP8266-Series-master\ESP8266-Series-master\WiFiTelnetToSerial\WiFiTelnetToSerial.ino:119:41:   required from here

C:\Users\MACHINE\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.2.0-rc1\libraries\ESP8266WiFi\src/WiFiClient.h:123:36: error: 'class String' has no member named 'available'

     size_t left = source.available();

                                    ^

C:\Users\MACHINE\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.2.0-rc1\libraries\ESP8266WiFi\src/WiFiClient.h:127:5: error: 'class String' has no member named 'read'

     source.read(buffer.get(), will_send);

     ^

exit status 1
Ошибка компиляции для платы NodeMCU 1.0 (ESP-12E Module).
 
Сверху Снизу