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.....
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.
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();
}
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.