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.
,服务器可能会出现问题
我想做一个将数据保存在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.
,服务器可能会出现问题