ftp over wifi

Тема в разделе "Проводная и беспроводная связь", создана пользователем fisheye, 12 ноя 2013.

  1. fr0ster

    fr0ster Гик


    В принципе все ожидаемо и так оно и должно быть. TCP не гарантирует доставку пакета, он гарантирует, что вы при желании узнаете о потере и повторите отправку.

    Откуда оригинальный скетч был взят можете сказать?
    Как указывается режим передачи файла?
    Вы к фтп серверу пробовали подключаться telnet`ом и передать файл?
    Может вы передаете в бинарном моде, а сервер считает, что в текстовом.
    Плюс никак не проверяете успешность передачи байта.
    Дальше код
    Код (Text):
          dclient.write(clientBuf,32);
          clientCount = 0;

          while(dclient.write(clientBuf,32) != 32)
          Serial.println("Write error!");

          Serial.print("Packet number: ");
          Serial.println(packNum);
          packNum++;
    Опять таки вы передаете буфер два раза и второй раз с проверкой размера переданного буфера.
    Но это не значит, что сервер столько же и принял. И вы в любом случае причисляете пакет к успешно переданным.
    Еще, вы перевели сервер в режим ожидания потока данных.
    Сервер не знает сколько байт в файле.
    Возможно потому читает до получения символа, который понимает как символ конца файла и рвет коннект. Если он ждет текстовый файл, это более чем реально.

    Начните с проверки режима передачи, который ждет сервер, возможно надо ему указать бинарный режим, раз байты шлете, а не символы. Или отсылайте не байты, а символьные строки, все равно же текстовый файл шлете.

    Ну и почитайте про FTP чего и про написание сетевых приложений.
     
  2. fisheye

    fisheye Нуб

    Мой скетч составлен из двух частей, обе взяты с arduino.cc:
    http://playground.arduino.cc/Code/FTP - часть, касающаяся FTP;
    http://arduino.cc/en/Tutorial/ConnectWithWPA - WiFi. Путём несложного сложения двух скетчей, о чём написано в комментариях в начале моего скетча, планировалось получить рабочий вариант для прикладной задачи. Что-то не задалось.
     
  3. fr0ster

    fr0ster Гик

    Что то мне шепчет, что в вашем случае и код с ардуино.сс в чистом виде не пошел бы.
    Хотя он рассчитан на ethernet и размер пакета в 64 байта взят не с потолка, а из минимального размера ethernet-кадра. Да и вероятность потери пакета в ethernet ниже. Попробуйте все же для начала указать режим передачи данных.
     
  4. fisheye

    fisheye Нуб

    Я получаю ответ от сервера о готовности к записи:
    Код (Text):

    ...
    Data port: 7786
    Data connected
    150 Ok to send data.
    ...
     
    Да, не знает. А должен?
    Почему тогда соединение разрывается всегда в разные моменты? Соединение разрывает Arduino, сервер продолжает ждать данные и разрывает соединение по таймауту минут через пять примерно:
    Код (Text):

    ...
    byte: 105
    byte: 111
    Stop here...
    Data disconnected
    421 Data timeout. Reconnect. Sorry.
     
     
  5. fisheye

    fisheye Нуб

    Согласен, что режим передачи может иметь в данном случае очень существенное значение, но вот только уровень моих знаний в области программирования не позволяет мне вставить в скетч соответствующие указания. Буду весьма благодарен за прямые подсказки. Наверное, смогу обойтись и без них, но примерно через месяц, который надо будет посвятить изучению вопроса без отрыва от производства.
     
  6. fr0ster

    fr0ster Гик

    Не должен, но может.
    Если вы отошлете размер файла.
    Правда это в бинарном режиме работает, если склероз не изменяет.

    Это вам ардуино так говорит.
    Чаще всего это значит, что сервер внезапно отвалился, и даже гавкнуть не успел.
    Посмотрите логи фтп-сервера, там должна быть истинная причина отключения.
    Вообще в такой ситуации первым делом логи сервера смотрят, потом клиента, потом думают и делают предположения и выводы.
     
  7. fisheye

    fisheye Нуб

    Логи ftp-сервера:
    Код (Text):

    pi@raspberrypi ~ $ tail /var/log/vsftpd.log
    Tue Dec 10 15:59:55 2013 [pid 2] CONNECT: Client "192.168.0.107"
    Tue Dec 10 15:59:56 2013 [pid 1] [pi] OK LOGIN: Client "192.168.0.107"
    Tue Dec 10 16:15:53 2013 [pid 2] CONNECT: Client "192.168.0.107"
    Tue Dec 10 16:15:54 2013 [pid 1] [pi] OK LOGIN: Client "192.168.0.107"
    Tue Dec 10 16:24:17 2013 [pid 2] CONNECT: Client "192.168.0.107"
    Tue Dec 10 16:24:18 2013 [pid 1] [pi] OK LOGIN: Client "192.168.0.107"
    Tue Dec 10 16:39:10 2013 [pid 2] CONNECT: Client "192.168.0.107"
    Tue Dec 10 16:39:11 2013 [pid 1] [pi] OK LOGIN: Client "192.168.0.107"
    Tue Dec 10 17:13:39 2013 [pid 2] CONNECT: Client "192.168.0.107"
    Tue Dec 10 17:13:40 2013 [pid 1] [pi] OK LOGIN: Client "192.168.0.107"
    pi@raspberrypi ~ $
     
    Насколько я могу судить, разрывов связи по инициативе сервера нет. Или я что-то не так понимаю?
     
  8. fr0ster

    fr0ster Гик

    Во-первых запустите сервер в режиме подробных логов. С ключом -vvv.
    Во-вторых это выходит, что клиент не получает ожидаемого ответа от сервера, а причина в подробных логах будет лучше видна. Ведь если клиент отдаст команду выход, то в логах напишет, что соединение разорвал клиент, а тут все не так, клиент считает, что передача продолжается, а сервер считает, что передача окончена, но разрыва еще нет. Можно после каждой отсылки пакета читать ответ сервера. Если до окончания передачи файла придет ответ о получении файла, значит косяк в передаваемых данных и неверной интерпретации этих данных на сервере.
    В-третьих в каком режиме сервер по умолчанию передает файлы? Что пишет, если через telnet на фтп зайти и запросить файл на скачку или залить файл?
     
  9. fisheye

    fisheye Нуб

    В /etc/vsftpd.conf добавил строку log_ftp_protocol=YES (судя по man'у эта опция заставляет сервер писать подробные логи).
    В скетч добавил следующий код:
    Код (Text):

    ...

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

      if(!eRcv()) return 0;

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

      if(!eRcv()) return 0;

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

      if(!eRcv()) return 0;

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

      if(!eRcv()) return 0;

      client.println(F("TYPE I")); //добавлена команда перехода в бинарный режим

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

        }
      }
    ...

     
    Результат выполнения:
    Код (Text):

    ...
    Command connected
    220 (vsFTPd 2.3.5)
    331 Please specify the password.
    230 Login successful.
    215 UNIX Type: L8
    227 Entering Passive Mode (192,168,0,7,30,52).
    200 Switching to Binary mode.
    Bad PASV Answer
    Bad PASV Answer
    Bad PASV Answer
    Bad PASV Answer
    Bad PASV Answer
    Bad PASV Answer
    Data port: 0
    Data connection failed
    FTP FAIL
     
    Содержание лог-файла:
    Код (Text):

    pi@raspberrypi ~ $ sudo tail /var/log/vsftpd.log
    Mon Dec 16 16:51:02 2013 [pid 2] [pi] FTP command: Client "192.168.0.101", "PASS <password>"
    Mon Dec 16 16:51:02 2013 [pid 1] [pi] OK LOGIN: Client "192.168.0.101"
    Mon Dec 16 16:51:02 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "230 Login successful."
    Mon Dec 16 16:51:02 2013 [pid 3] [pi] FTP command: Client "192.168.0.101", "SYST"
    Mon Dec 16 16:51:02 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "215 UNIX Type: L8"
    Mon Dec 16 16:51:02 2013 [pid 3] [pi] FTP command: Client "192.168.0.101", "PASV"
    Mon Dec 16 16:51:02 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "227 Entering Passive Mode (192,168,0,7,30,52)."
    Mon Dec 16 16:51:03 2013 [pid 3] [pi] FTP command: Client "192.168.0.101", "TYPE I"
    Mon Dec 16 16:51:03 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "200 Switching to Binary mode."
    Mon Dec 16 16:56:03 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "421 Timeout."
    pi@raspberrypi ~ $
     
    Помогите, пожалуйста, разобраться в причине отказа скетча работать после перехода в бинарный режим передачи. Что в данном случае может означать "Bad PASV Answer"?
     
  10. fr0ster

    fr0ster Гик

    ИМХО перевод в бинарный режим в воткнули между переводом в пассивный режим и разбором ответа на перевод в пассивный режим. Вместо
    Код (Text):
    client.println(F("PASV"));

      if(!eRcv()) return 0;

      client.println(F("TYPE I")); //добавлена команда перехода в бинарный режим

      if(!eRcv()) return 0;
    Попробуйте написать
    Код (Text):
      client.println(F("TYPE I")); //добавлена команда перехода в бинарный режим

      if(!eRcv()) return 0;

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

      if(!eRcv()) return 0;
     
  11. fr0ster

    fr0ster Гик

    И похоже пока после PASV сервер ждет подключения на порт данных, вы как раз пытаетесь разобрать ответ на TYPE I как ответ на PASV.

    PS После PASV сервер как раз ждет STOR после PORT на канале данных. В вашем примере dclient.println(F("PORT <айпи и порт присланный в ответ на PASV>"))

    PSS Тут подробно описано
     
    Последнее редактирование: 16 дек 2013
  12. fisheye

    fisheye Нуб

    Поправил, спасибо.
    Лог:
    Код (Text):
    pi@raspberrypi ~ $ sudo tail /var/log/vsftpd.log
    Mon Dec 16 18:42:43 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "230 Login successful."
    Mon Dec 16 18:42:43 2013 [pid 3] [pi] FTP command: Client "192.168.0.101", "SYST"
    Mon Dec 16 18:42:43 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "215 UNIX Type: L8"
    Mon Dec 16 18:42:43 2013 [pid 3] [pi] FTP command: Client "192.168.0.101", "TYPE I"
    Mon Dec 16 18:42:43 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "200 Switching to Binary mode."
    Mon Dec 16 18:42:45 2013 [pid 3] [pi] FTP command: Client "192.168.0.101", "PASV"
    Mon Dec 16 18:42:45 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "227 Entering Passive Mode (192,168,0,7,30,114)."
    Mon Dec 16 18:42:45 2013 [pid 3] [pi] FTP command: Client "192.168.0.101", "STOR test.txt"
    Mon Dec 16 18:45:44 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "421 Data timeout. Reconnect. Sorry."
    Mon Dec 16 18:45:44 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "150 Ok to send data."
    pi@raspberrypi ~ $
     
    Между "STOR..." и "421 Data timeout..." проходит три минуты. И если происходит дисконнект, то почему следующий ответ от сервера "150 Ok to send data.", после чего начинается передача? Как это можно интерпретировать? Передалось, кстати, чуть больше половины файла, 14 строк из 25, 224 байта из 398. Что же это может такое быть?
     
  13. fr0ster

    fr0ster Гик

    Попробуйте закомментить
    Код (Text):
    client.println(F("PASV"));

      if(!eRcv()) return 0;
    Чтоб так стало
    Код (Text):
    //client.println(F("PASV"));

    //  if(!eRcv()) return 0;
    и напишите, что вернет сервер и что в его логах будет.
     
  14. fisheye

    fisheye Нуб

    Лог:
    Код (Text):
    pi@raspberrypi ~ $ sudo tail /var/log/vsftpd.log
    Wed Dec 18 17:08:04 2013 [pid 2] FTP response: Client "192.168.0.101", "220 (vsFTPd 2.3.5)"
    Wed Dec 18 17:08:04 2013 [pid 2] FTP command: Client "192.168.0.101", "USER pi"
    Wed Dec 18 17:08:04 2013 [pid 2] [pi] FTP response: Client "192.168.0.101", "331 Please specify the password."
    Wed Dec 18 17:08:04 2013 [pid 2] [pi] FTP command: Client "192.168.0.101", "PASS <password>"
    Wed Dec 18 17:08:05 2013 [pid 1] [pi] OK LOGIN: Client "192.168.0.101"
    Wed Dec 18 17:08:05 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "230 Login successful."
    Wed Dec 18 17:08:05 2013 [pid 3] [pi] FTP command: Client "192.168.0.101", "SYST"
    Wed Dec 18 17:08:05 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "215 UNIX Type: L8"
    Wed Dec 18 17:08:05 2013 [pid 3] [pi] FTP command: Client "192.168.0.101", "TYPE I"
    Wed Dec 18 17:08:05 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "200 Switching to Binary mode."
    pi@raspberrypi ~ $
     
    Консоль:
    Код (Text):

    ...
    SD opened
    Command connected
    220 (vsFTPd 2.3.5)
    331 Please specify the password.
    230 Login successful.
    215 UNIX Type: L8
    200 Switching to Binary mode.
    Bad PASV Answer
    Bad PASV Answer
    Bad PASV Answer
    Bad PASV Answer
    Bad PASV Answer
    Bad PASV Answer
    Data port: 0
    Data connection failed
    FTP FAIL
     
    Не совсем понимаю (или совсем не понимаю) к чему Вы клоните. Пока просто делаю, что говорят.
     
  15. fr0ster

    fr0ster Гик

    Раскомментируйте
    Код (Text):
    //client.println(F("PASV"));

    //  if(!eRcv()) return 0;
    У вас фтп-сервер на ip 192.168.0.106 же?
    А после PASV возвращает "227 Entering Passive Mode (192,168,0,7,30,114)."

    Попробуйте подключиться telnet`ом или другим фтп-клиентом и логи покажите.
    Возможно у фтп-сервера неверный конфиг, посмотрите в нем какой IP у сервера обозначен, 192.168.0.106 или 192.168.0.7?
     
  16. fisheye

    fisheye Нуб

    И как только я сам этого не заметил? Да, действительно, в конфиге сервера был неправильно прописан адрес, 192.168.0.107 вместо 192.168.0.106. Спасибо. Исправил, но на результах это никак не сказалось: хвост файла пропадает.
    Другой клиент (из Total Commander'а) работает безукоризненно, ниже лог:
    Код (Text):

    Thu Dec 19 18:39:20 2013 [pid 3] [pi] FTP command: Client "192.168.0.104", "PORT 192,168,0,104,200,212"
    Thu Dec 19 18:39:20 2013 [pid 3] [pi] FTP response: Client "192.168.0.104", "200 PORT command successful. Consider using PASV."
    Thu Dec 19 18:39:20 2013 [pid 3] [pi] FTP command: Client "192.168.0.104", "LIST"
    Thu Dec 19 18:39:20 2013 [pid 3] [pi] FTP response: Client "192.168.0.104", "150 Here comes the directory listing."
    Thu Dec 19 18:39:20 2013 [pid 3] [pi] FTP response: Client "192.168.0.104", "226 Directory send OK."
    Thu Dec 19 18:39:21 2013 [pid 3] [pi] FTP command: Client "192.168.0.104", "CDUP"
    Thu Dec 19 18:39:21 2013 [pid 3] [pi] FTP response: Client "192.168.0.104", "250 Directory successfully changed."
    Thu Dec 19 18:39:21 2013 [pid 3] [pi] FTP command: Client "192.168.0.104", "PWD"
    Thu Dec 19 18:39:21 2013 [pid 3] [pi] FTP response: Client "192.168.0.104", "257 "/home/pi""
    Thu Dec 19 18:39:52 2013 [pid 3] [pi] FTP command: Client "192.168.0.104", "TYPE I"
    Thu Dec 19 18:39:52 2013 [pid 3] [pi] FTP response: Client "192.168.0.104", "200 Switching to Binary mode."
    Thu Dec 19 18:39:52 2013 [pid 3] [pi] FTP command: Client "192.168.0.104", "PORT 192,168,0,104,200,215"
    Thu Dec 19 18:39:52 2013 [pid 3] [pi] FTP response: Client "192.168.0.104", "200 PORT command successful. Consider using PASV."
    Thu Dec 19 18:39:52 2013 [pid 3] [pi] FTP command: Client "192.168.0.104", "STOR WiFi_FTP.ino"
    Thu Dec 19 18:39:52 2013 [pid 3] [pi] FTP response: Client "192.168.0.104", "150 Ok to send data."
    Thu Dec 19 18:39:52 2013 [pid 3] [pi] OK UPLOAD: Client "192.168.0.104", "/home/pi/WiFi_FTP.ino", 7754 bytes, 107.19Kbyte/sec
    Thu Dec 19 18:39:52 2013 [pid 3] [pi] FTP response: Client "192.168.0.104", "226 Transfer complete."
    Thu Dec 19 18:39:52 2013 [pid 3] [pi] FTP command: Client "192.168.0.104", "SIZE WiFi_FTP.ino"
    Thu Dec 19 18:39:52 2013 [pid 3] [pi] FTP response: Client "192.168.0.104", "213 7754"
    Thu Dec 19 18:39:52 2013 [pid 3] [pi] FTP command: Client "192.168.0.104", "TYPE A"
    Thu Dec 19 18:39:52 2013 [pid 3] [pi] FTP response: Client "192.168.0.104", "200 Switching to ASCII mode."
    Thu Dec 19 18:39:52 2013 [pid 3] [pi] FTP command: Client "192.168.0.104", "PORT 192,168,0,104,200,216"
    Thu Dec 19 18:39:52 2013 [pid 3] [pi] FTP response: Client "192.168.0.104", "200 PORT command successful. Consider using PASV."
    Thu Dec 19 18:39:52 2013 [pid 3] [pi] FTP command: Client "192.168.0.104", "LIST"
    Thu Dec 19 18:39:52 2013 [pid 3] [pi] FTP response: Client "192.168.0.104", "150 Here comes the directory listing."
    Thu Dec 19 18:39:52 2013 [pid 3] [pi] FTP response: Client "192.168.0.104", "226 Directory send OK."
    Thu Dec 19 18:40:07 2013 [pid 3] [pi] FTP command: Client "192.168.0.104", "DELE WiFi_FTP.ino"
    Thu Dec 19 18:40:07 2013 [pid 3] [pi] OK DELETE: Client "192.168.0.104", "/home/pi/WiFi_FTP.ino"
    Thu Dec 19 18:40:07 2013 [pid 3] [pi] FTP response: Client "192.168.0.104", "250 Delete operation successful."
    Thu Dec 19 18:40:07 2013 [pid 3] [pi] FTP command: Client "192.168.0.104", "PORT 192,168,0,104,200,217"
    Thu Dec 19 18:40:07 2013 [pid 3] [pi] FTP response: Client "192.168.0.104", "200 PORT command successful. Consider using PASV."
    Thu Dec 19 18:40:07 2013 [pid 3] [pi] FTP command: Client "192.168.0.104", "LIST"
    Thu Dec 19 18:40:07 2013 [pid 3] [pi] FTP response: Client "192.168.0.104", "150 Here comes the directory listing."
    Thu Dec 19 18:40:07 2013 [pid 3] [pi] FTP response: Client "192.168.0.104", "226 Directory send OK."
     
    Почему-то мне кажется, что сервер работает как надо, а вот со стороны Ардуино что-то не так, нет?
     
  17. fisheye

    fisheye Нуб

    Попробовал вставить запрос размере переданного файла сразу после окончания передачи.
    Код (Text):

      сlient.println(F("SIZE test.txt"));
      if(!eRcv()) return 0;

      Serial.println("Stop here...");
      dclient.stop();
      Serial.println(F("Data disconnected"));
      if(!eRcv()) return 0;
     
    Ответа сервера не дождался. Как бы узнать, чем он в это время занят?
    Лог:
    Код (Text):

    Thu Dec 19 19:00:10 2013 [pid 2] CONNECT: Client "192.168.0.101"
    Thu Dec 19 19:00:10 2013 [pid 2] FTP response: Client "192.168.0.101", "220 (vsFTPd 2.3.5)"
    Thu Dec 19 19:00:10 2013 [pid 2] FTP command: Client "192.168.0.101", "USER pi"
    Thu Dec 19 19:00:10 2013 [pid 2] [pi] FTP response: Client "192.168.0.101", "331 Please specify the password."
    Thu Dec 19 19:00:10 2013 [pid 2] [pi] FTP command: Client "192.168.0.101", "PASS <password>"
    Thu Dec 19 19:00:10 2013 [pid 1] [pi] OK LOGIN: Client "192.168.0.101"
    Thu Dec 19 19:00:10 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "230 Login successful."
    Thu Dec 19 19:00:11 2013 [pid 3] [pi] FTP command: Client "192.168.0.101", "SYST"
    Thu Dec 19 19:00:11 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "215 UNIX Type: L8"
    Thu Dec 19 19:00:11 2013 [pid 3] [pi] FTP command: Client "192.168.0.101", "TYPE I"
    Thu Dec 19 19:00:11 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "200 Switching to Binary mode."
    Thu Dec 19 19:00:11 2013 [pid 3] [pi] FTP command: Client "192.168.0.101", "PASV"
    Thu Dec 19 19:00:11 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "227 Entering Passive Mode (192,168,0,6,30,52)."
    Thu Dec 19 19:00:11 2013 [pid 3] [pi] FTP command: Client "192.168.0.101", "STOR test.txt"
    Thu Dec 19 19:00:11 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "150 Ok to send data."
     
     
  18. fr0ster

    fr0ster Гик

    Он явно ждет данных от клиента.
    Приведите, плиз полный лог работы с фтп тотального командера и ардуины.
    Вызывает смущение отсутствие в логах фтп в случае ардуины строки типа "FTP command: Client "192.168.0.104", "PORT 192,168,0,104,200,215"" обратите внимание, в команде IP клиента. То есть тотал коммандер не в пассивном режиме работает ИМХО.

    В логах тотального командера не видно строки типа "FTP command: Client "192.168.0.101", "PASV"". Ее нет или в вырезанный кусок не попала?

    И от ардуины свежие логи покажите, плиз.
    ИМХО проблема в подключении ардуины на порт, который фтп шлет в ответ на PASV.
     
    Последнее редактирование: 20 дек 2013
    fisheye нравится это.
  19. fisheye

    fisheye Нуб

    Предновогодняя суета не давала заняться делом.
    Сеанс Arduino - ftp-сервер, /var/log/vsftpd.log
    Код (Text):

    Sat Dec 28 16:57:05 2013 [pid 2] CONNECT: Client "192.168.0.101"
    Sat Dec 28 16:57:05 2013 [pid 2] FTP response: Client "192.168.0.101", "220 (vsFTPd 2.3.5)"
    Sat Dec 28 16:57:06 2013 [pid 2] FTP command: Client "192.168.0.101", "USER pi"
    Sat Dec 28 16:57:06 2013 [pid 2] [pi] FTP response: Client "192.168.0.101", "331 Please specify the password."
    Sat Dec 28 16:57:06 2013 [pid 2] [pi] FTP command: Client "192.168.0.101", "PASS <password>"
    Sat Dec 28 16:57:06 2013 [pid 1] [pi] OK LOGIN: Client "192.168.0.101"
    Sat Dec 28 16:57:06 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "230 Login successful."
    Sat Dec 28 16:57:06 2013 [pid 3] [pi] FTP command: Client "192.168.0.101", "SYST"
    Sat Dec 28 16:57:06 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "215 UNIX Type: L8"
    Sat Dec 28 16:57:07 2013 [pid 3] [pi] FTP command: Client "192.168.0.101", "TYPE I"
    Sat Dec 28 16:57:07 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "200 Switching to Binary mode."
    Sat Dec 28 16:57:07 2013 [pid 3] [pi] FTP command: Client "192.168.0.101", "PASV"
    Sat Dec 28 16:57:07 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "227 Entering Passive Mode (192,168,0,6,30,117)."
    Sat Dec 28 16:57:07 2013 [pid 3] [pi] FTP command: Client "192.168.0.101", "STOR test.txt"
    Sat Dec 28 16:57:07 2013 [pid 3] [pi] FTP response: Client "192.168.0.101", "150 Ok to send data."
     
    Файл передался целиком (такое тоже бывает, но очень редко).
    Вывод в консоль закончился как обычно: "Stop here..." и "Data disconnected"
    Теперь попробую передать файл с помощью встроенного ftp-клиента Windows 7, т.к. ftp-клиент Total Commander'а не переходит в пассивный режим.
     
    Последнее редактирование: 28 дек 2013
  20. fisheye

    fisheye Нуб

    Продолжение.
    Код (Text):

    Sat Dec 28 17:55:56 2013 [pid 2] CONNECT: Client "192.168.0.105"
    Sat Dec 28 17:55:56 2013 [pid 2] FTP response: Client "192.168.0.105", "220 (vsFTPd 2.3.5)"
    Sat Dec 28 17:55:59 2013 [pid 2] FTP command: Client "192.168.0.105", "USER pi"
    Sat Dec 28 17:55:59 2013 [pid 2] [pi] FTP response: Client "192.168.0.105", "331 Please specify the password."
    Sat Dec 28 17:56:05 2013 [pid 2] [pi] FTP command: Client "192.168.0.105", "PASS <password>"
    Sat Dec 28 17:56:05 2013 [pid 1] [pi] OK LOGIN: Client "192.168.0.105"
    Sat Dec 28 17:56:05 2013 [pid 3] [pi] FTP response: Client "192.168.0.105", "230 Login successful."
    Sat Dec 28 17:56:21 2013 [pid 3] [pi] FTP command: Client "192.168.0.105", "SYST"
    Sat Dec 28 17:56:21 2013 [pid 3] [pi] FTP response: Client "192.168.0.105", "215 UNIX Type: L8"
    Sat Dec 28 17:56:46 2013 [pid 3] [pi] FTP command: Client "192.168.0.105", "TYPE i"
    Sat Dec 28 17:56:46 2013 [pid 3] [pi] FTP response: Client "192.168.0.105", "200 Switching to Binary mode."
    Sat Dec 28 17:57:01 2013 [pid 3] [pi] FTP command: Client "192.168.0.105", "PASV"
    Sat Dec 28 17:57:01 2013 [pid 3] [pi] FTP response: Client "192.168.0.105", "227 Entering Passive Mode (192,168,0,6,30,81)."
    Sat Dec 28 17:57:10 2013 [pid 3] [pi] FTP command: Client "192.168.0.105", "PORT 192,168,0,105,196,182"
    Sat Dec 28 17:57:10 2013 [pid 3] [pi] FTP response: Client "192.168.0.105", "200 PORT command successful. Consider using PASV."
    Sat Dec 28 17:57:10 2013 [pid 3] [pi] FTP command: Client "192.168.0.105", "STOR test_ftp_win.txt"
    Sat Dec 28 17:57:10 2013 [pid 3] [pi] FTP response: Client "192.168.0.105", "150 Ok to send data."
    Sat Dec 28 17:57:10 2013 [pid 3] [pi] OK UPLOAD: Client "192.168.0.105", "/home/pi/test_ftp_win.txt", 145 bytes, 9.13Kbyte/sec
    Sat Dec 28 17:57:10 2013 [pid 3] [pi] FTP response: Client "192.168.0.105", "226 Transfer complete."
    Sat Dec 28 17:57:51 2013 [pid 3] [pi] FTP command: Client "192.168.0.105", "QUIT"
    Sat Dec 28 17:57:51 2013 [pid 3] [pi] FTP response: Client "192.168.0.105", "221 Goodbye."
     
    Вот так работает встроенный клиент в семёрке.
    Файл передался целиком, без всяких потерь.
    Команды набирались вручную.
    Действительно, после перехода в пассивный режим виндовый клиент самостоятельно, без какого-либо воздействия с моей стороны, дал команду PORT, ардуино этого не делает. Заставить?
    В скетче есть фрагмент, смысл которого я не понимаю, но, судя по тексту, он как-то связан с определением порта для связи:
    Код (Text):

    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;
      }
     
    Может с ним что-то не так?
     
    Последнее редактирование: 28 дек 2013