Загрузка файла с ftp сервера

Тема в разделе "Проводная и беспроводная связь", создана пользователем dexterx, 11 июл 2016.

  1. dexterx

    dexterx Нуб

    Доброго временни суток. Простите за "нубость" перерыл кучу статей и гугла но так и не смог найти ответ на свой вопрос. Вопрос заключается в следующем, есть куча скечей с помощю которых можно выгружать файл с SD карты подключенной к ардуино к примеру
    #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, 0, 19 );
    IPAddress gateway( 192, 168, 0, 1 );
    IPAddress subnet( 255, 255, 255, 0 );

    // change to your server
    IPAddress server( 93, 189, 45, 35 );

    EthernetClient client;
    EthernetClient dclient;

    char outBuf[128];
    char outCount;

    // change fileName to your file (8.3 format!)
    char fileName[13] = "2016.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 dexter-x@mail.ru"));

    if(!eRcv()) return 0;

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

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


    как сделать обратное, тоесть загрузить файл на SD карту ардуино с ftp сервера
     
  2. AlexU

    AlexU Гуру

    Код (C++):
    // comment out next line to write to SD from FTP server
    #define FTPWRITE
    Ни о чём не говорит?
     
  3. dexterx

    dexterx Нуб

    нет не говорит
     
  4. DIYMan

    DIYMan Guest

    А если прочитать?
     
  5. dexterx

    dexterx Нуб

    я понимаю что эта библиотека отвечает за отправку файла с ардуино на фтп. как скачать с фтп на сд?
    #define FTPREAD ?
     
  6. DIYMan

    DIYMan Guest

    Написано же:
    Вы перевести эту фразу можете?
     
  7. dexterx

    dexterx Нуб

    Закомментируйте следующую строку для записи SD с FTP- сервера. Извените за "тупняк" но я не понимаю как сделать то что мне нужно. строку я закоментирую и что?
     
  8. DIYMan

    DIYMan Guest

    И то, что у вас скомпилируется код так, что будет записывать данные с FTP-сервера прямо на SD-карту, вы же этого хотели?
     
  9. dexterx

    dexterx Нуб

    Спасибо понял свою ошибку!