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