Arduino: serial2telnet

lano

Aktives Mitglied
Moin.
Ist das hier überhaupt richtig ?
Naja, egal ...

Ich hab einen ESP-01. Den hab ich jetzt an den seriellen Port meiner Fritzbox gehängt.
Nu hab ich mir gedacht es reicht wenn ich einfach die Zeichen von seriell lese und telnetmäßig sende und umgekehrt.
Zeilenümbrüche und Tabs funktionieren aber irgendwie nicht.
Bisher hab ich noch keine für mich logische erklärung gefunden.

Jemand ne Idee?

telnet2serial.ino:
#include <ArduinoOTA.h>
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>

const char *ssid = "wlan";
const char *password = "passwd";

uint8_t i;
bool ConnectionEstablished; // Flag for successfully handled connection

#define MAX_TELNET_CLIENTS 2

WiFiServer TelnetServer(23);
WiFiClient TelnetClient[MAX_TELNET_CLIENTS];

void setup() {
  Serial.begin(115200);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  // ... Give ESP 10 seconds to connect to station.
  unsigned long startTime = millis();
  while (WiFi.status() != WL_CONNECTED && millis() - startTime < 10000) {
    delay(200);
  }

  if (WiFi.status() != WL_CONNECTED)
    ESP.restart();

  if (!MDNS.begin("esp8266")) {
    while (1) {
      delay(1000);
    }
  }
  // Add service to MDNS-SD
  MDNS.addService("http", "tcp", 80);

  TelnetServer.begin();
  TelnetServer.setNoDelay(true);

  // OTA

  // Port defaults to 8266
  ArduinoOTA.setPort(8266);

  // Hostname defaults to esp8266-[ChipID]
  ArduinoOTA.setHostname("fritz_telnet");

  // No authentication by default
  //ArduinoOTA.setPassword((const char *)"1234");

  ArduinoOTA.onStart([]() {});

  ArduinoOTA.onEnd([]() {});

  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {});
  ArduinoOTA.onError([](ota_error_t error) {});

  ArduinoOTA.begin();
}

void loop() {
  ArduinoOTA.handle(); // Wait for OTA connection
  MDNS.update();
  Telnet(); // Handle telnet connections
}

//void TelnetMsg(String text){
//  for(i = 0; i < MAX_TELNET_CLIENTS; i++)  {
//    if (TelnetClient[i] || TelnetClient[i].connected())    {
//      TelnetClient[i].println(text);
//    }
//  }
//  delay(10);  // to avoid strange characters left in buffer
//}

void Telnet() {
  // Cleanup disconnected session
  for (i = 0; i < MAX_TELNET_CLIENTS; i++) {
    if (TelnetClient[i] && !TelnetClient[i].connected()) {
      TelnetClient[i].stop();
    }
  }

  // Check new client connections
  if (TelnetServer.hasClient()) {
    ConnectionEstablished = false; // Set to false

    for (i = 0; i < MAX_TELNET_CLIENTS; i++) {

      // find free socket
      if (!TelnetClient[i]) {
        TelnetClient[i] = TelnetServer.available();

        TelnetClient[i].flush(); // clear input buffer, else you get strange characters
        TelnetClient[i].println("Welcome to FritzBox Telnet!");
        TelnetClient[i].println("----------------------------------------------------------------");
        TelnetClient[i].println("1. Press n for new script---------------------------------------");
        TelnetClient[i].println("2. Press l to list scripts--------------------------------------");
        TelnetClient[i].println("3. Press d to delete script #x----------------------------------");

        ConnectionEstablished = true;

        break;
      }
    }

    if (ConnectionEstablished == false) {
      TelnetServer.available().stop();
    }
  }

  for (i = 0; i < MAX_TELNET_CLIENTS; i++) {
    if (TelnetClient[i] && TelnetClient[i].connected()) {

      int rxlen = TelnetClient[i].available();
      if (rxlen > 0) {
        char sbuf[rxlen];
        TelnetClient[i].readBytes(sbuf, rxlen);
        Serial.write(sbuf, rxlen);
      }

      int txlen = Serial.available();
      if (txlen > 0) {
        char sbuf[txlen];
        Serial.readBytes(sbuf, txlen);
        TelnetClient[i].write(sbuf, txlen);
      }
    }
  }
}
 
Häng doch mal Wireshark dazwischen, das gibt dir Aufschluss was wie tatsächlich gesendet wird. Kann ich bei Netzwerkverkehr immer nur empfehlen.
 
Erklär mal genauer.

Jahaha Lustig.

Hast du dir die HEX Werte der Zeichen angesehen die du gelesen hast?

Ja meiner Meinung nach past das.

Häng doch mal Wireshark dazwischen, das gibt dir Aufschluss was wie tatsächlich gesendet wird.

Hilft mir auch nicht wirklich. Hab ich natürlich schon versucht.

Fritzbox EVA:
ROM VER: 1.1.4
CFG 05
▒<.|[/▒▒▒▒▒▒[-[\H▒▒▒|▒[/]

(AVM) EVA Revision: 1.1964 Version: 2964
(C) Copyright 2005 AVM Date: Nov  8 2013 Time: 15:45:15 (0) 3 0x0-0x740D

[FLASH:] WINBOND Uniform-Flash 1MB 256 Bytes WriteBuffer
[FLASH:](Eraseregion [0] 16 sectors a 64kB)
[NAND:] 128MB MICRON 2048 Pagesize 128k Blocksize 1024 Blocks 8Bit 1 CS HW
[SYSTEM:] VR9 on 500MIz/2▒0MHz/250MH▒

.Atheros 8030/35 detected

Eva_AVM >▒▒▒Ɗhelp
help
       Commands   Description
       --------   -----------
           help   help
             dm   dump mem 32 Bit <addr> <range>
             cm   change mem 32 Bit <addr> <value>
             dh   dump mem 16 Bit <addr> <range>
           00l▒^▒▒▒▒go

Das ist meine Ausgabe. Die sau hängt im Bootloader Fest. help hab ich da mal rein geschrieben, go startet eigentlich den kernel. aber das passiert nicht.

file.ino:
#include <ArduinoOTA.h>
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>

const char *ssid = "lan4lano";
const char *password = "ups";

uint8_t i;
bool ConnectionEstablished; // Flag for successfully handled connection

#define MAX_TELNET_CLIENTS 2

WiFiServer TelnetServer(23);
WiFiClient TelnetClient[MAX_TELNET_CLIENTS];

void setup() {
  Serial.begin(115200);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  // ... Give ESP 10 seconds to connect to station.
  unsigned long startTime = millis();
  while (WiFi.status() != WL_CONNECTED && millis() - startTime < 10000) {
    delay(200);
  }

  if (WiFi.status() != WL_CONNECTED)
    ESP.restart();

  if (!MDNS.begin("esp8266")) {
    while (1) {
      delay(1000);
    }
  }
  // Add service to MDNS-SD
  MDNS.addService("http", "tcp", 80);

  TelnetServer.begin();
  TelnetServer.setNoDelay(true);

  // OTA

  // Port defaults to 8266
  ArduinoOTA.setPort(8266);

  // Hostname defaults to esp8266-[ChipID]
  ArduinoOTA.setHostname("fritz_telnet");

  // No authentication by default
  //ArduinoOTA.setPassword((const char *)"1234");

  ArduinoOTA.onStart([]() {});

  ArduinoOTA.onEnd([]() {});

  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {});
  ArduinoOTA.onError([](ota_error_t error) {});

  ArduinoOTA.begin();
}

void loop() {
  ArduinoOTA.handle(); // Wait for OTA connection
  MDNS.update();
  Telnet(); // Handle telnet connections
}

void Telnet() {
  // Cleanup disconnected session
  for (i = 0; i < MAX_TELNET_CLIENTS; i++) {
    if (TelnetClient[i] && !TelnetClient[i].connected()) {
      TelnetClient[i].stop();
    }
  }

  // Check new client connections
  if (TelnetServer.hasClient()) {
    ConnectionEstablished = false; // Set to false

    for (i = 0; i < MAX_TELNET_CLIENTS; i++) {

      // find free socket
      if (!TelnetClient[i]) {
        TelnetClient[i] = TelnetServer.available();
        ConnectionEstablished = true;
        break;
      }
    }

    if (ConnectionEstablished == false) {
      TelnetServer.available().stop();
    }
  }

  for (i = 0; i < MAX_TELNET_CLIENTS; i++) {
    if (TelnetClient[i] && TelnetClient[i].connected()) {

      int rxlen = TelnetClient[i].available();
      if (rxlen > 0) {
        char sbuf[rxlen];
        TelnetClient[i].readBytes(sbuf, rxlen);
        Serial.write(sbuf, rxlen);
      }

      int txlen = Serial.available();
      if (txlen > 0) {
        char sbuf[txlen];
        Serial.readBytes(sbuf, txlen);
        TelnetClient[i].write(sbuf, txlen);
      }
    }
  }
}

Das ist jetzt die gekürzte fassung.

Ich bin da nen bisschen ratlos, wenn ich mich zum esp verbunden habe und dann die box resette. dann schreibt mir irgendwas auf die serielle schnittstelle. sonst würde der bootloader weiter laufen. guck ich mir die serielle schnittstelle am port monitor an kommt da allerdings nichts.
 
Zuletzt bearbeitet:
Zurück
Oben Unten