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

Posted

技术标签:

【中文标题】以太网屏蔽arduino上的FTP客户端【英文标题】:FTP client on ethernet shield arduino 【发布时间】:2017-03-13 18:23:51 【问题描述】:

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

这是来自 ftptest 的数据服务器:

状态: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 个证书。 状态:cert[0]: subject='CN=www.cba.pl' issuer='C=US,O=Let\27s Encrypt,CN=Let\27s Encrypt Authority X3' 状态:cert[1]: subject='C=US,O=Let\27s Encrypt,CN=Let\27s Encrypt Authority X3' issuer='O=Digital Signature Trust Co.,CN=DST Root CA X3' 命令:用户 wsalkowski 回复:331 用户wsalkowski OK。要求输入密码 命令:通过 ******** 回复:230-您的带宽使用受到限制 回复:230-OK。当前受限目录是/ 回复:230 最大允许文件大小为 10485760 字节 命令:SYST 回复:215 UNIX 类型:L8 命令:FEAT 回复:211-支持的扩展: 回复:EPRT 回复:空闲 回复:MDTM 回复:尺寸 回复:MFMT 回复:REST STREAM 回复:MLST type*;size*;sizd*;modify*;UNIX.mode*;UNIX.uid*;UNIX.gid*;unique*; 回复:MLSD 回复:AUTH TLS 回复:PBSZ 回复:PROT 回复:UTF8 回复:TVFS 回复:ESTA 回复:PASV 回复:EPSV 回复:SPSV 回复:ESTP 回复:211结束。 命令:PBSZ 0 回复:200 PBSZ=0 命令:PROT P 回复:200 数据保护级别设置为“私人” 命令:密码 回复:257“/”是你的当前位置 状态:当前路径是/ 命令:I型 回复:200 TYPE 现在是 8 位二进制 命令:PASV 回复:227 进入被动模式 (95,211,144,68,218,36) 命令:MLSD 状态:数据连接已建立,正在执行 TLS 握手... 回复:150 接受数据连接 状态:TLS 握手成功,正在验证证书... 状态:从服务器收到 2 个证书。 状态:cert[0]: subject='CN=www.cba.pl' issuer='C=US,O=Let\27s Encrypt,CN=Let\27s Encrypt Authority X3' 状态:cert[1]: subject='C=US,O=Let\27s Encrypt,CN=Let\27s 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 个匹配项 状态:成功 结果 您的服务器正在工作,并且已正确配置了各种路由器/防火墙,以通过此测试执行显式 FTP over TLS。但是有关于兼容性问题的警告,并非所有用户都可以使用您的服务器。 为了获得最大的兼容性,请考虑解决这些警告。

这里是串行监视器 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进入被动模式(95,211,144,65,208,115) 数据端口:53363 数据连接 553 不能打开那个文件:没有那个文件或目录 221-再见。您上传了 0 并下载了 0 KB。 221 注销。 命令已断开 标清关闭 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进入被动模式(95,211,144,65,208,248) 数据端口:53496 数据连接 553 不能打开那个文件:没有那个文件或目录 221-再见。您上传了 0 并下载了 0 KB。 221 注销。 命令已断开 标清关闭 FTP失败

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

/* 用于 IDE v1.0.1 和 w5100/w5200 的 FTP 被动客户端 由 SurferTim 于 2012 年 10 月发布 由 SurferTim 于 2015 年 6 月 6 日修改 */ #包括 #包括 #包括 // 注释掉下一行以从 FTP 服务器写入 SD #define FTPWRITE // 这必须是唯一的 字节 mac[] = 0x90, 0xA2, 0xDA, 0x00, 0x59, 0x67 ; // 更改为您的网络设置 IPAddress ip(192, 168, 0, 25); IPAddress 网关(192、168、0、1); IPAddress 子网( 255, 255, 255, 0 ); // 切换到你的服务器 IP地址服务器(95、211、144、65); 以太网客户端客户端; EthernetClient dclient; 字符输出缓冲区[128]; 字符计数; // 将文件名更改为您的文件(8.3 格式!) 字符文件名[13] = "POMIARY.txt"; 无效设置() 序列号.开始(9600); 数字写入(10,高); 如果(SD.开始(4)== 0) Serial.println(F("SD 初始化失败")); Ethernet.begin(mac, ip, gateway, gateway, 子网); 数字写入(10,高); 延迟(2000); Serial.println(F("准备好。按 f 或 r")); 无效循环() 字节 inChar; inChar = Serial.read(); 如果(inChar == 'f') if(doFTP()) Serial.println(F("FTP OK")); 否则 Serial.println(F("FTP 失败")); 如果(inChar == 'r') 读SD(); 文件 fh; 字节 doFTP() #ifdef FTPWRITE fh = SD.open(fileName,FILE_READ); #别的 SD.remove(文件名); fh = SD.open(文件名,FILE_WRITE); #万一 如果(!fh) Serial.println(F("SD 打开失败")); 返回0; #ifndef FTPWRITE 如果(!fh.seek(0)) Serial.println(F("倒带失败")); fh.close(); 返回0; #万一 Serial.println(F("SD 打开")); 如果(client.connect(服务器,21)) Serial.println(F("命令已连接")); 别的 fh.close(); Serial.println(F("命令连接失败")); 返回0; 如果(!eRcv())返回0; // 更改为您的用户名和密码 client.write("USER wsalkowski\r\n"); 如果(!eRcv())返回0; client.write("PASS pass\r\n"); 如果(!eRcv())返回0; client.write("SYST\r\n"); 如果(!eRcv())返回0; client.write("PASV\r\n"); 如果(!eRcv())返回0; char *tStr = strtok(outBuf,"(,"); int array_pasv[6]; 对于 (int i = 0; i 63) dclient.write(clientBuf,64); 客户端计数 = 0; if(clientCount > 0) dclient.write(clientBuf,clientCount); #别的 而(dclient.connected()) 而(dclient.available()) 字符 c = dclient.read(); fh.write(c); Serial.write(c); #万一 dclient.stop(); Serial.println(F("数据断开")); 如果(!eRcv())返回0; client.println(F("QUIT")); 如果(!eRcv())返回0; 客户端.stop(); Serial.println(F("命令断开")); fh.close(); Serial.println(F("SD 关闭")); 返回 1; 字节 eRcv() 字节响应码; 字节 thisByte; while(!client.available()) 延迟(1); respCode = client.peek(); outCount = 0; 同时(client.available()) thisByte = client.read(); Serial.write(thisByte); 如果(outCount = '4') 失败(); 返回0; 返回 1; 无效失败() 字节 thisByte = 0; client.println(F("QUIT")); while(!client.available()) 延迟(1); 同时(client.available()) thisByte = client.read(); Serial.write(thisByte); 客户端.stop(); Serial.println(F("命令断开")); fh.close(); Serial.println(F("SD 关闭")); 无效读取SD() fh = SD.open(fileName,FILE_READ); 如果(!fh) Serial.println(F("SD 打开失败")); 返回; 而(fh.available()) Serial.write(fh.read()); fh.close();

如果有人告诉我会发生什么以及我做错了什么?

我可以使用 filezilla 将文件扔到文件夹 wsalkowski.cba.pl

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

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

【问题讨论】:

【参考方案1】:

让我们尝试更改您的 FTP 服务器。如果您登录 FTP,则可能是服务器出现问题。

【讨论】:

以上是关于以太网屏蔽arduino上的FTP客户端的主要内容,如果未能解决你的问题,请参考以下文章

ARP 地址解析协议

VB6 winsock服务器和多个arduino客户端问题

ftp客户端工具,ftp客户端工具实现的方法及连接管理方法

centos7 ftp怎么检查

Python连载54-FTP编程

Arduino以太网屏蔽不起作用