arduino w5100 ftp

Тема в разделе "Arduino & Shields", создана пользователем Супчик, 7 мар 2018.

  1. Супчик

    Супчик Нуб

    SD opened
    Command connected
    220 Microsoft FTP Service
    331 Password required
    530 User cannot log in.
    221 Goodbye.
    Выдает ошибку, кто как решал
    скетч взял этот
    Настраивал фпт через диспетчер llS
    Код (C++):
    #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, 2 );  
    IPAddress gateway( 192, 168, 2, 1 );
    IPAddress subnet( 255, 255, 255, 0 );

    // change to your server
    IPAddress server( 1, 2, 3, 4 );

    EthernetClient client;
    EthernetClient dclient;

    char outBuf[128];
    char outCount;

    // change fileName to your file (8.3 format!)
    char fileName[13] = "test.txt";

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

      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 myuser"));

      if(!eRcv()) return 0;

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

      if(!eRcv()) return 0;

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

      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();
    }
     
  2. Супчик

    Супчик Нуб

    Получилось войти
    227 Entering Passive Mode (ip).
    Data port: dataport
    Data connection failed
    FTP FAIL
    Все создается все портится, но когда он просит ответ с помощью PASV он выдает ошибку
     
  3. b707

    b707 Гуру

    Что, прям так и выдается строка "dataport" вместо номера порта - целого числа? - если да. то у вас в МК не тот скетч, который вы привели в первом сообщении, разбирайтесь
     
  4. Супчик

    Супчик Нуб

    Код (C++):
    Ready. Press f or r
    SD opened
    Command connected
    220 Microsoft FTP Service
    331 Anonymous access allowed, send identity (e-mail name) as password.
    230 User logged in.
    215 Windows_NT
    200 Type set to I.
    227 Entering Passive Mode (192,168,19,151,221,148).
    Data port: 56724
    Data connection failed
    FTP FAIL