FTP 以太网屏蔽 arduino 上的客户端

FTP client on ethernet shield arduino

我想做一个将数据保存在SD卡上的项目,然后使用以太网屏蔽将这些数据发送到ftp服务器,使用FTP客户端arduino .我有免费托管的服务器。

这是来自ftp测试的数据服务器:


    状态: cba.pl 的解析地址
    状态:连接到 95.211.144.68
    警告:输入的地址未解析为 IPv6 地址。
    状态:已连接,等待欢迎消息...
    回复:220------------ 欢迎使用 Pure-FTPd [privsep] [TLS] ----------
    回复:220-您是允许的 200 个用户中的第 57 个用户。
    回复:220-现在当地时间16:30。服务器端口:21。
    回复:220-这是私有系统-禁止匿名登录
    回复:本服务器也欢迎220-IPv6连接。
    回复:220 您将在 5 分钟不活动后断开连接。
    命令:CLNT https://ftptest.net代表2a02:a311:c020:3200:c10d:18e1:36a5:8e2
    回复:530 您还没有登录
    命令:AUTH TLS
    回复:234 AUTH TLS OK。
    状态:执行 TLS 握手...
    状态:TLS 握手成功,正在验证证书...
    状态:从服务器收到 2 个证书。
    状态:证书[0]:主题='CN=www.cba.pl' 颁发者='C=US,O=Lets Encrypt,CN=Lets Encrypt Authority X3'
    状态:cert[1]: subject='C=US,O=Lets Encrypt,CN=Lets Encrypt Authority X3' issuer='O=Digital Signature Trust Co.,CN=DST Root CA X3'
    命令:USER wsalkowski
    回复:331 用户 wsalkowski OK。需要密码
    命令:通过 *********
    回复:230-您的带宽使用被限制
    回复:230-OK。当前受限目录为/
    回复:230 最大允许文件大小为 10485760 字节
    命令:SYST
    回复:215 UNIX 类型:L8
    命令:专长
    回复:211-支持的扩展:
    回复:EPRT
    回复:空闲
    回复:MDTM
    回复:SIZE
    回复:MFMT
    回复:休息流
    回复:MLST type*;size*;sizd*;modify*;UNIX.mode*;UNIX.uid*;UNIX.gid*;unique*;
    回复:MLSD
    回复:授权 TLS
    回复:PBSZ
    回复:PROT
    回复:UTF8
    回复:TVFS
    回复:ESTA
    回复:PASV
    回复:EPSV
    回复:SPSV
    回复:ESTP
    回复:211结束。
    命令:PBSZ 0
    回复:200 PBSZ=0
    命令:PROT P
    回复:200 数据保护级别设置为 "private"
    命令:PWD
    回复:257“/”为您当前位置
    状态:当前路径是/
    命令:TYPE I
    回复:200 TYPE现在是8位二进制
    命令:PASV
    回复:227 进入被动模式(95,211,144,68,218,36)
    命令:MLSD
    状态:数据连接已建立,正在执行 TLS 握手...
    回复:150 已接受数据连接
    状态:TLS 握手成功,正在验证证书...
    状态:从服务器收到 2 个证书。
    状态:证书[0]:主题='CN=www.cba.pl' 颁发者='C=US,O=Lets Encrypt,CN=Lets Encrypt Authority X3'
    状态:cert[1]: subject='C=US,O=Lets Encrypt,CN=Lets Encrypt Authority X3' issuer='O=Digital Signature Trust Co.,CN=DST Root CA X3'
    状态:传输连接的 TLS 会话已恢复。
    列表:type=cdir;sizd=4096;modify=20160501192730;UNIX.mode=0755;UNIX.uid=0;UNIX.gid=0;unique=803g16f353ca; .
    清单:type=pdir;sizd=4096;modify=20160501192730;UNIX.mode=0755;UNIX.uid=0;UNIX.gid=0;unique=803g16f353ca; ..
    清单:type=dir;sizd=4096;modify=20161031125022;UNIX.mode=0700;UNIX.uid=1098695;UNIX.gid=33;unique=803g2259f68; wsalkowski.cba.pl
    回复:226-选项:-a -l
    回复: 226 共3个匹配项
    状态:成功
    结果
    您的服务器正在运行,并且已正确配置各种 routers/firewalls 以通过 TLS 显式 FTP 执行此测试。但是,有关于兼容性问题的警告,并非所有用户都能使用您的服务器。
    为了获得最大的兼容性,consider 解决了这些警告。

这里的结果来自串行监视器 arduino ide


    准备好。按 f 或 r
    kkksdsSD 打开
    命令已连接
    220------------ 欢迎使用 Pure-FTPd [privsep] [TLS] ----------
    220-您是允许的 200 个用户中的第 52 个用户。
    220-现在当地时间 15:32。服务器端口:21。
    220-这是一个私人系统-不能匿名登录
    此服务器也欢迎 220-IPv6 连接。
    220 您将在 5 分钟不活动后断开连接。
    331 用户 wsalkowski 正常。需要密码
    230-您的带宽使用受到限制
    230-好的。当前受限目录为/
    230 允许的最大文件大小为 10485760 字节
    215 UNIX 类型:L8
    227进入被动模式(9521114465208115)
    数据端口:53363
    数据连接
    553 无法打开那个文件:没有那个文件或目录
    221-再见。您上传了 0 字节并下载了 0 字节。
    221 注销。
    命令断开
    SD关闭
    FTP失败
    标清打开
    命令已连接
    220------------ 欢迎使用 Pure-FTPd [privsep] [TLS] ----------
    220-您是允许的 200 个用户中的第 53 个用户。
    220-现在当地时间 15:32。服务器端口:21。
    220-这是一个私人系统-不能匿名登录
    此服务器也欢迎 220-IPv6 连接。
    220 您将在 5 分钟不活动后断开连接。
    331 用户 wsalkowski 正常。需要密码
    230-您的带宽使用受到限制
    230-好的。当前受限目录为/
    230 允许的最大文件大小为 10485760 字节
    215 UNIX 类型:L8
    227进入被动模式(9521114465208248)
    数据端口:53496
    数据连接
    553 无法打开那个文件:没有那个文件或目录
    221-再见。您上传了 0 字节并下载了 0 字节。
    221 注销。
    命令断开
    SD关闭
    FTP失败

这里是arduino代码(我从http://playground.arduino.cc/Code/FTP得到的代码)

/*


     FTP IDE v1.0.1 和 w5100/w5200 的被动客户端
       由 SurferTim 于 2012 年 10 月发布
       SurferTim 于 2015 年 6 月 6 日修改
    */

    #包括
    #包括
    #包括
    // 注释掉从 FTP 服务器写入 SD 的下一行
    #define FTP写入

    // 这必须是唯一的
    字节 mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x59, 0x67 } ;

    // 更改您的网络设置
    IP 地址 ip( 192, 168, 0, 25 );
    IP 地址网关(192、168、0、1);
    IP 地址子网(255、255、255、0);

    // 更改为您的服务器
    IP 地址服务器(95、211、144、65);

    EthernetClient客户端;
    以太网客户端;

    字符输出缓冲区[128];
    炭化计数;

    // 将 fileName 更改为您的文件(8.3 格式!)
    字符文件名[13] = "POMIARY.txt";

    无效设置()
    {
      Serial.begin(9600);

      数字写入(10,高);

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

      Ethernet.begin(mac, ip, 网关, 网关, 子网);
      数字写入(10,高);
      延迟(2000);
      Serial.println(F("Ready. Press f or r"));
    }

    无效循环()
    {
      字符中的字节;

      inChar = Serial.read();

      如果(inChar == 'f')
      {
        如果(做FTP())Serial.println(F("FTP OK"));
        否则 Serial.println(F("FTP FAIL"));
      }

      如果(inChar == 'r')
      {
        读SD();
      }

    }

    文件 fh;

    字节做FTP()
    {
    #ifdef FTP写入
      fh = SD.open(文件名,FILE_READ);
    #别的
      SD.remove(文件名);
      fh = SD.open(文件名,FILE_WRITE);
    #万一

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

    #ifndef FTP写入
      如果(!fh.seek(0))
      {
        Serial.println(F("Rewind fail"));
        fh.close();
        return 0;
      }
    #万一

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

      如果(client.connect(服务器,21)){
        Serial.println(F("Command connected"));
      }
      别的 {
        fh.close();
        Serial.println(F("Command connection failed"));
        return 0;
      }

      如果(!eRcv()) return 0;

    // 更改为您的用户名和密码
      client.write("USER wsalkowski\r\n");

      如果(!eRcv()) return 0;

      client.write("PASS pass\r\n");

      如果(!eRcv()) return 0;

      client.write("SYST\r\n");

      如果(!eRcv()) return 0;

      client.write("PASV\r\n");

      如果(!eRcv()) return 0;


      char *tStr = strtok(outBuf,"(,");
      整数 array_pasv[6];
      对于(整数 i = 0;i 63)
        {
          dclient.write(clientBuf,64);
          客户数 = 0;
        }
      }

      如果(clientCount > 0)dclient.write(clientBuf,clientCount);

    #别的
      while(dclient.connected())
      {
        而(dclient.available())
        {
          字符 c = dclient.read();
          fh.write(c);
          Serial.write(c);
        }
      }
    #万一

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

      如果(!eRcv()) return 0;

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

      如果(!eRcv()) return 0;

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

      fh.close();
      Serial.println(F("SD closed"));
      return1个;
    }

    字节 eRcv()
    {
      字节响应码;
      字节这个字节;

      同时(!client.available())延迟(1);

      respCode = client.peek();

      输出计数 = 0;

      而(client.available())
      {
        这个字节 = client.read();
        Serial.write(这个字节);

        如果(outCount = '4')
      {
        失败();
        return 0;
      }

      return1个;
    }


    无效失败()
    {
      字节thisByte = 0;

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

      同时(!client.available())延迟(1);

      而(client.available())
      {
        这个字节 = client.read();
        Serial.write(这个字节);
      }

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

    void 读取 SD()
    {
      fh = SD.open(文件名,FILE_READ);

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

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

      fh.close();
    }

如果有人告诉我可以做什么以及我做错了什么?

我可以使用 filezilla 发送文件,但只能发送到 wsalkowski 文件夹。cba.pl

问题是否是无法从 ftp 客户端 arduino 访问路径 /wsalkowski。cba.pl?也就是把默认sd卡的文件丢到根目录/,没有权限chmod?

请帮助我,对不起我的英语

让我们尝试更改您的 FTP 服务器。如果您登录 FTP.

,服务器可能会出现问题