Arduino schreibt Datei auf SAMBA-Share

Hallo,

ich möchte gerne mit einem Arduino Uno und Ethernet auf einem freigegebenen Laufwerk (SAMBA) im lokalen Netzwerk eine Datei anlegen, öffnen, schreiben und schliessen.

In dieser Datei, nennen wir sie mal "data.txt", sollen diverse Werte von den Analog-Eingängen gespeichert werden.

Hat jemand sowas schon gemacht und wenn wie?

Halte ich für unmöglich.

Alternativ: :o Es gibt SD Katen mit Wlan. :o

das wäre keine Alternative für mich.

Aber vielleicht ist es über http möglich? oder ftp?

FTP !

ok, also müsste das in etwa so gehen:

byte mac[] = { 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };
IPAddress ip(192, 168, 2, 231);  // die vom Arduino  
EthernetServer server(21);

void setup()
{
   Ethernet.begin(mac, ip);                
}

void loop()
{
   EthernetClient client = server.available();
   if (client.available())
   {

      client.println(F("????????"));

      client.println(F("data.txt"));

      client.println(F(data));
   }

     client.stop();  
}

was müsste da rein, um FTP zu erreichen/zu verbinden? Kenne mich nicht mit FTP aus (nicht auf dieser Ebene)

habe gerade ein ftp-beispiel probiert, das funktioniert!
Nun heisst es apspecken und anpassen…

/*
   FTP passive client for IDE v1.0.1 and w5100/w5200
   Posted October 2012 by SurferTim
   Modified 6 June 2015 by SurferTim
*/

#include <SD.h>
#include <SPI.h>
#include <Ethernet.h>
// comment out next line to write to SD from FTP server
#define FTPWRITE

// this must be unique
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x59, 0x67 };  

// change to your network settings
IPAddress ip( 192, 168, 2, 231 );    
IPAddress gateway( 192, 168, 2, 1 );
IPAddress subnet( 255, 255, 255, 0 );

// change to your server
IPAddress server( 192, 168, 2, 223 );

EthernetClient client;
EthernetClient dclient;

char outBuf[128];
char outCount;

// change fileName to your file (8.3 format!)
char fileName[13] = "web-io.htm";

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

  digitalWrite(10,HIGH);

  if(SD.begin(4) == 0)
  {
    Serial.println(F("SD init fail"));          
  }

  Ethernet.begin(mac, ip, gateway, gateway, subnet); 
  digitalWrite(10,HIGH);
  delay(2000);
  Serial.println(F("Ready. Press f or r"));
}

void loop()
{
  byte inChar;

  inChar = Serial.read();

  if(inChar == 'f')
  {
    if(doFTP()) Serial.println(F("FTP OK"));
    else Serial.println(F("FTP FAIL"));
  }

  if(inChar == 'r')
  {
    readSD();    
  }

}

File fh;

byte doFTP()
{
#ifdef FTPWRITE
  fh = SD.open(fileName,FILE_READ);
#else
  SD.remove(fileName);
  fh = SD.open(fileName,FILE_WRITE);
#endif

  if(!fh)
  {
    Serial.println(F("SD open fail"));
    return 0;    
  }

#ifndef FTPWRITE  
  if(!fh.seek(0))
  {
    Serial.println(F("Rewind fail"));
    fh.close();
    return 0;    
  }
#endif

  Serial.println(F("SD opened"));

  if (client.connect(server,21)) {
    Serial.println(F("Command connected"));
  } 
  else {
    fh.close();
    Serial.println(F("Command connection failed"));
    return 0;
  }

  if(!eRcv()) return 0;

  client.println(F("USER xxxxxx"));

  if(!eRcv()) return 0;

  client.println(F("PASS nnnnnnn"));

  if(!eRcv()) return 0;

  client.println(F("SYST"));

  if(!eRcv()) return 0;

  client.println(F("PWD"));
  if(!eRcv()) return 0;
  client.println(F("CWD Filme/"));
  if(!eRcv()) return 0;
  client.println(F("PWD"));

  if(!eRcv()) return 0;

  client.println(F("Type I"));

  if(!eRcv()) return 0;

  client.println(F("PASV"));

  if(!eRcv()) return 0;

  char *tStr = strtok(outBuf,"(,");
  int array_pasv[6];
  for ( int i = 0; i < 6; i++) {
    tStr = strtok(NULL,"(,");
    array_pasv[i] = atoi(tStr);
    if(tStr == NULL)
    {
      Serial.println(F("Bad PASV Answer"));    

    }
  }

  unsigned int hiPort,loPort;

  hiPort = array_pasv[4] << 8;
  loPort = array_pasv[5] & 255;

  Serial.print(F("Data port: "));
  hiPort = hiPort | loPort;
  Serial.println(hiPort);

  if (dclient.connect(server,hiPort)) {
    Serial.println(F("Data connected"));
  } 
  else {
    Serial.println(F("Data connection failed"));
    client.stop();
    fh.close();
    return 0;
  }

#ifdef FTPWRITE 
  client.print(F("STOR "));
  client.println(fileName);
#else
  client.print(F("RETR "));
  client.println(fileName);
#endif

  if(!eRcv())
  {
    dclient.stop();
    return 0;
  }

#ifdef FTPWRITE
  Serial.println(F("Writing"));

  byte clientBuf[64];
  int clientCount = 0;

  while(fh.available())
  {
    clientBuf[clientCount] = fh.read();
    clientCount++;

    if(clientCount > 63)
    {
      dclient.write(clientBuf,64);
      clientCount = 0;
    }
  }

  if(clientCount > 0) dclient.write(clientBuf,clientCount);

#else
  while(dclient.connected())
  {
    while(dclient.available())
    {
      char c = dclient.read();
      fh.write(c);      
      Serial.write(c); 
    }
  }
#endif

  dclient.stop();
  Serial.println(F("Data disconnected"));

  if(!eRcv()) return 0;

  client.println(F("QUIT"));

  if(!eRcv()) return 0;

  client.stop();
  Serial.println(F("Command disconnected"));

  fh.close();
  Serial.println(F("SD closed"));
  return 1;
}

byte eRcv()
{
  byte respCode;
  byte thisByte;

  while(!client.available()) delay(1);

  respCode = client.peek();

  outCount = 0;

  while(client.available())
  {  
    thisByte = client.read();    
    Serial.write(thisByte);

    if(outCount < 127)
    {
      outBuf[outCount] = thisByte;
      outCount++;      
      outBuf[outCount] = 0;
    }
  }

  if(respCode >= '4')
  {
    efail();
    return 0;  
  }

  return 1;
}


void efail()
{
  byte thisByte = 0;

  client.println(F("QUIT"));

  while(!client.available()) delay(1);

  while(client.available())
  {  
    thisByte = client.read();    
    Serial.write(thisByte);
  }

  client.stop();
  Serial.println(F("Command disconnected"));
  fh.close();
  Serial.println(F("SD closed"));
}

void readSD()
{
  fh = SD.open(fileName,FILE_READ);

  if(!fh)
  {
    Serial.println(F("SD open fail"));
    return;    
  }

  while(fh.available())
  {
    Serial.write(fh.read());
  }

  fh.close();
}

Du scheinst ja eine permanente Datenanbindung zu haben, warum machst du das nicht bspw. mit MQTT. Überträgst die Daten immer wenn sie abgefragt werden und auf deinem Server lauscht ein Programm auf den jeweiligen MQTT-Topic und speichert die Daten dahin wo du sie hin haben willst.

MQTT sagt mir garnix

In Verbindung z.b. mit Openhab

Siehe z.B. mein Thread.

habe gerade ein ftp-beispiel probiert, das funktioniert!

Ja. danke. Sehr hübsch. Ein ftp client ist ja doch was Einfaches. (Wenn man's einfach hält) Und wenn du dich jetzt noch auf nur Schreiben beschränkst, wird der Code zwar nicht viel kürzer, aber mit weniger Text ohne all die #ifdef FTPWRITE

Viel Erfolg und Danke für's Zeigen deines Fundes.