Libraries Frage - wie Variable aus der .cpp auslesen..

Hallo Arduino-Freunde,

vielleicht eine blöde Frage.....

Ich versuche mich gerade an einem Projekt um einen FTP-Upload meiner Foscam-IP-Kamera als Trigger zu nutzen. Also die Kamera erkennt eine Bewegung - sendet ein Bild per FTP....

Nun möchte ich auf den Arduino erkennen welcher USER (welche CAM) einen Verbindungsversuch macht um dann per UDP alle Geräte per Broadcast zu informieren.....

Ich habe ein Beispiel gefunden GitHub - nailbuster/esp8266FTPServer: Simple FTP Server for using esp8266/esp32 SPIFFs - wenn ich dort den Debug-Modus aktiviere sehe ich die Kamera und den USER-Namen..... in der LOG.... nur in der LOG!!!

Wie kann ich jetzt den USER-Namen in meinen Sketch übernehmen und dann einen UDP-Broadcast senden?

Irgendwo in der .cpp bekomme ich den USER als Char "c" ..... aber wie kommt der in den Sketch?

int8_t FtpServer::readChar()
{
  int8_t rc = -1;

  if( client.available())
  {
    char c = client.read();
	 // char c;
	 // client.readBytes((uint8_t*) c, 1);
    #ifdef FTP_DEBUG
     Serial.print( c);
    #endif

Wäre super, wenn mir jemand einen Tipp geben könnte.....

Vielen, vielen, vielen DANK!

Tim

esp8266FTP.zip (18.6 KB)

Ich würde in FtpServer::handleFTP() einen Benachrichtiger einbauen, welcher dein Hauptprogramm über eine etablierte FTP Verbindung informiert.

Ich habe ein Beispiel gefunden

Da darf es nur einen User geben.
Sind wohl größere Umbaumaßnahmen nötig....

combie:
Ich würde in FtpServer::handleFTP() einen Benachrichtiger einbauen, welcher dein Hauptprogramm über eine etablierte FTP Verbindung informiert.

Hallo Combie,

danke für den Tipp..... Wie macht man das denn.... ich bräuchte ja einen Benachrichtiger, der die Char's an das Hauptprogramm übergibt.....

Danke!

VG Thomas

Wie kann ich jetzt den USER-Namen in meinen Sketch übernehmen und dann einen UDP-Broadcast senden?

Ich glaube gar nicht. Du Überschätzt um mehrere Größenordnug die Leistungsfähigkeit des Arduino.

Grüße Uwe

Hallo Uwe,

das überrascht mich aber.... ich hab doch viel aufwendigere TCP und UDP-Sachen laufen....

Wenn die Char's doch in der Log angezeigt werden können - sollten doch eine Übergbabe möglich sein...

Viele Grüße

Tom

und dann einen UDP-Broadcast senden

Schauen was die anderen sagen.

Grüße Uwe

danke für den Tipp..... Wie macht man das denn.... ich bräuchte ja einen Benachrichtiger, der die Char's an das Hauptprogramm übergibt.....

Und ich frage mich, warum du das nicht einfach tust....

Läuft der FTP Server bei dir schon?

Irgendwo in der .cpp bekomme ich den USER als Char "c" ..... aber wie kommt der in den Sketch?

Wenn du das denkst wird das nichts. char ist ein Zeichen. C Strings sind Null-terminierte char Arrays. Die Zeichen werden dann Schritt für Schritt daran eingelesen.

Die Debug Ausgabe verwirrt etwas da die Zeichen für Zeichen statt findet. Nicht einmal komplett am Ende.

Danke für Euer Verständnis.....

Ja... ich bin kein Spezi für den Unterschied von Char und String...

Aber noch einmal zu meinen Problem....

Der Server läuft.... der FTP-Client (meine IP-CAM) meldet sich und übergibt USER und PASS und versucht einen Snapshot zu uploaden....

In der Log sehe ich, dass die .cpp die Char's ausgibt und diese Char's würden mir ja reichen um sie im Hauptprogramm zu einem String zu wandeln....

Aber die .cpp gibt die Char's nur aus.... es gibt keine Übergabe ins Hauptprogramm:

Auszug aus der ESP8266FtpServer.cpp (siehe Zip)

// Read a char from client connected to ftp server
//
//  update cmdLine and command buffers, iCL and parameters pointers
//
//  return:
//    -2 if buffer cmdLine is full
//    -1 if line not completed
//     0 if empty line received
//    length of cmdLine (positive) if no empty line received 

int8_t FtpServer::readChar()
{
  int8_t rc = -1;

  if( client.available())
  {
    char c = client.read();
	 // char c;
	 // client.readBytes((uint8_t*) c, 1);
    #ifdef FTP_DEBUG
      Serial.print( c);
	
    #endif
    if( c == '\\' )
      c = '/';
    if( c != '\r' )
      if( c != '\n' )
      {
        if( iCL < FTP_CMD_SIZE )
          cmdLine[ iCL ++ ] = c;
        else
          rc = -2; //  Line too long
      }
      else

Hier noch der Sketch - er funktioniert, bis auf die Übergabe von der .cpp ins Hauptprogramm

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266FtpServer.h>

const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASS";

ESP8266WebServer server(80);
FtpServer ftpSrv;   //set #define FTP_DEBUG in ESP8266FtpServer.h to see ftp verbose on serial



void handleRoot() {
  server.send(200, "text/plain", "hello from esp8266!");

}

void handleNotFound(){
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i=0; i<server.args(); i++){
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}

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

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());


  server.on("/", handleRoot);

  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");

  /////FTP Setup, ensure SPIFFS is started before ftp;  /////////
  
  if (SPIFFS.begin()) {
      Serial.println("SPIFFS opened!");
      ftpSrv.begin("esp8266","esp8266");    //username, password for ftp.  set ports in ESP8266FtpServer.h  (default 21, 50009 for PASV)
  }    
}

void loop(void){
  ftpSrv.handleFTP();        //make sure in loop you call handleFTP()!!  
  server.handleClient();
 
}

DANKE!

Tom

und diese Char's würden mir ja reichen um sie im Hauptprogramm zu einem String zu wandeln....

Nochmal: In C ist ein String (nicht zu verwechseln mit der Arduino String Klasse) ein Array aus char dass hinten als Abschluss ein NULL hat

Auszug aus der ESP8266FtpServer.cpp (siehe Zip)

Erstaunlich, dass du dich so auf die FtpServer::readChar() konzentrierst...
Statt auf die handleFTP(); ....
Denn in der handleFTP(); steht dir der Username quasi vorgekaut auf dem Tablet.

Da ist wohl mein Problem.... es ist zu einfach oder zu schwer für mich ;-(

Ich sehe den Username nicht :frowning: .....

Jetzt mach ich mal den Rechner aus und schlaf mal in Ruhe drüber....

DANKE!

VG Tom

Stimmt...
in FtpServer::userIdentity() wird der Username geprüft.
Dort liegt er in der Eigenschaft "parameter" vor.
(wenn mich nicht alles täuscht)