FTP
一、FTP 概述
FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一.FTP 协议包括两个组成部分,其一为 FTP 服务器,其二为 FTP 客户端.其中 FTP 服务器用来存储文件,用户可以使用 FTP 客户端通过 FTP 协议访问位于 FTP 服务器上的资源.在开发网站的时候,通常利用 FTP 协议把网页或程序传到 Web 服务器上.此外,由于 FTP 传输效率非常高,在网络上传输大的文件时,一般也采用该协议.
默认情况下 FTP 协议使用 TCP 端口中的 20 和 21 这两个端口,其中 20 用于传输数据,21 用于传输控制信息.但是,是否使用 20 作为传输数据的端口与 FTP 使用的传输模式有关,如果采用主动模式,那么数据传输端口就是 20;如果采用被动模式,则具体最终使用哪个端口要服务器端和客户端协商决定.
关于 FTP 更详细的理论知识说明,请参考:https://blog.csdn.net/HinsCoder/article/details/130911658
二、演示功能概述
本文教你合宙 4G 模组使用 LuatOS 开发 4G 通信中 ftp 网络协网络协议的应用.
本教程实现的功能定义是:
使用 Air780EP 核心板下载 Air780 的 LuatOS 示例代码中 ftp 的例程进行验证,例程流程为:
1. 登录 FTP 服务器 2. 用 ftp.command 操作 ftp 服务器目录 3. ftp.pull 下载文件 4. ftp.push 上传文件 5. FTP 客户端关闭
三、准备硬件环境
参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。
四、软件环境
“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。
1. Luatools工具;
2. 内核固件文件(底层core固件文件):LuatOS-SoC_V2002_Air780EP;参考项目使用的内核固件;
3. luatos需要的脚本和资源文件
脚本和资源文件点我,查看demo链接
lib脚本文件:使用Luatools烧录时,勾选 添加默认lib 选项,使用默认lib脚本文件;
准备好软件环境之后,接下来查看如何烧录项目文件到Air780EP核心板,将本篇文章中演示使用的项目文件烧录到Air780EP核心板中。
五、API 说明
5.1 ftp.login(adapter,ip_addr,port,username,password)
FTP 客户端
参数
传入值类型 | 解释 |
---|---|
int | 适配器序号, 只能是 socket.ETH0, socket.STA, socket.AP,如果不填,会选择平台自带的方式,然后是最后一个注册的适配器 |
string | ip_addr 地址 |
int | port 端口,默认 21 |
string | username 用户名 |
string | password 密码 |
bool/table | 是否为 ssl 加密连接,默认不加密,true 为无证书最简单的加密,table 为有证书的加密 server_cert 服务器 ca 证书数据 client_cert 客户端 ca 证书数据 client_key 客户端私钥加密数据 client_password 客户端私钥口令数据 |
返回值
返回值类型 | 解释 |
---|---|
bool/string | 成功返回 true 失败返回 string |
例子
ftp_login = ftp.login(nil,"xxx")
5.2 ftp.command(cmd)
FTP 命令
参数
传入值类型 | 解释 |
---|---|
string | cmd 命令 目前支持:NOOP SYST TYPE PWD MKD CWD CDUP RMD DELE LIST |
返回值
返回值类型 | 解释 |
---|---|
string | 成功返回 true 失败返回 string |
例子
-- 空操作,防止连接断掉
print(ftp.command("NOOP").wait())
-- 报告远程系统的操作系统类型
print(ftp.command("SYST").wait())
-- 指定文件类型
print(ftp.command("TYPE I").wait())
-- 显示当前工作目录名
print(ftp.command("PWD").wait())
-- 创建目录
print(ftp.command("MKD QWER").wait())
-- 改变当前工作目录
print(ftp.command("CWD /QWER").wait())
-- 返回上一层目录
print(ftp.command("CDUP").wait())
-- 删除目录
print(ftp.command("RMD QWER").wait())
-- 获取当前工作目录下的文件名列表
print(ftp.command("LIST").wait())
-- 删除文件
print(ftp.command("DELE /1/12222.txt").wait())
5.3 ftp.pull(local_name,remote_name)
FTP 文件下载
参数
传入值类型 | 解释 |
---|---|
string | local_name 本地文件 |
string | remote_name 服务器文件 |
返回值
返回值类型 | 解释 |
---|---|
bool/string | 成功返回 true 失败返回 string |
例子
ftp.pull("/1222.txt","/1222.txt").wait()
5.4 ftp.push(local_name,remote_name)
FTP 文件上传
参数
传入值类型 | 解释 |
---|---|
string | local_name 本地文件 |
string | remote_name 服务器文件 |
返回值
返回值类型 | 解释 |
---|---|
bool/string | 成功返回 true 失败返回 string |
例子
ftp.push("/1222.txt","/1222.txt").wait()
5.5 ftp.close()
FTP 客户端关闭
参数
无
返回值
返回值类型 | 解释 |
---|---|
bool/string | 成功返回 true 失败返回 string |
例子
ftp.close().wait()
5.6 ftp.debug(onoff)
配置是否打开 debug 信息
参数
传入值类型 | 解释 |
---|---|
boolean | 是否打开 debug 开关 |
返回值
返回值类型 | 解释 |
---|---|
nil | 无返回值 |
例子
无
六、实现流程
- 打开 FTP 服务器.记录地址,端口号,用户名,密码等必要信息.
- 改 DEMO,将登录中的地址,端口号,用户名,密码等必要信息修改为自己服务器的.
- 登录 ftp 服务器(ftp 服务器用 vsftpd)
- 等待登录成功
- 执行自己的命令
6.1 例程
示例部分代码如下( 点此链接查看 ftp 的 demo 例子)
sys.taskInit(function()
while true do
sys.wait(1000)
log.info("ftp 启动")
--
print(ftp.login(nil,"121.43.224.154",21,"ftp_user","3QujbiMG").wait())
-- 空操作,防止连接断掉
print(ftp.command("NOOP").wait())
-- 报告远程系统的操作系统类型
print(ftp.command("SYST").wait())
print(ftp.command("TYPE I").wait())
-- print("ftp ",ftp.pwd(30))
print(ftp.command("PWD").wait())
print(ftp.command("MKD QWER").wait())
print(ftp.command("CWD /QWER").wait())
print(ftp.command("CDUP").wait())
print(ftp.command("RMD QWER").wait())
print(ftp.command("LIST").wait())
print(ftp.pull("/122224.txt","/122224.txt").wait())
local f = io.open("/122224.txt", "r")
if f then
local data = f:read("*a")
f:close()
log.info("fs", "writed data", data)
else
log.info("fs", "open file for read failed")
end
print(ftp.command("DELE /12222.txt").wait())
print(ftp.push("/122224.txt","/12222.txt").wait())
print(ftp.close().wait())
log.info("meminfo", rtos.meminfo("sys"))
sys.wait(15000)
end
end)
6.2 例程 log
[2024-11-11 10:20:40.105][000000081.765] I/user.ftp 启动
[2024-11-11 10:20:41.127][000000082.791] true
[2024-11-11 10:20:41.252][000000082.926] 200 NOOP ok.
[2024-11-11 10:20:41.393][000000083.055] 215 UNIX Type: L8
[2024-11-11 10:20:41.487][000000083.156] 200 Switching to Binary mode.
[2024-11-11 10:20:41.689][000000083.350] 257 "/"
[2024-11-11 10:20:41.813][000000083.485] 257 "/QWER" created
[2024-11-11 10:20:41.922][000000083.596] 250 Directory successfully changed.
[2024-11-11 10:20:42.030][000000083.696] 250 Directory successfully changed.
[2024-11-11 10:20:42.124][000000083.795] 250 Remove directory operation successful.
[2024-11-11 10:20:42.603][000000084.261] -rw------- 1 ftp ftp 2918 Jul 22 07:18 1.amr
-rw------- 1 ftp ftp 62 Jul 22 04:09 1.txt
-rw------- 1 ftp ftp 13 Aug 12 03:13 111222.txt
-rw------- 1 ftp ftp 7 Aug 09 09:12 1222.txt
-rw------- 1 ftp ftp 62 Jul 23 02:34 12221.txt
-rw------- 1 ftp ftp 62 Jul 22 06:07 122210.txt
-rw------- 1 ftp ftp 62 Jul 22 06:08 122211.txt
-rw------- 1 ftp ftp 62 Jul 22 06:09 122212.txt
-rw------- 1 ftp ftp 62 Jul 22 06:10 122213.txt
-rw------- 1 ftp ftp 62 Jul 22 06:10 122214.txt
-rw------- 1 ftp ftp 62 Jul 22 04:27 122215.txt
-rw------- 1 ftp ftp 62 Jul 22 04:27 122216.txt
-rw------- 1 ftp ftp 62 Jul 22 04:28 122217.txt
-rw------- 1 ftp ftp 62 Jul 22 04:29 122218.txt
-rw------- 1 ftp ftp 62 Jul 22 04:30 122219.txt
-rw------- 1 ftp ftp 62 Nov 11 02:20 12222.txt
-rw------- 1 ftp ftp 62 Jul 22 04:30 122220.txt
-rw------- 1 ftp ftp 62 Jul 22 04:31 122221.txt
-rw------- 1 ftp ftp 62 Jul 22 04:32 122222.txt
-rw------- 1 ftp ftp 62 Jul 22 04:33 122223.txt
-rw------- 1 ftp ftp 62 Jul 22 04:34 122224.txt
-rw------- 1 ftp ftp 62 Jul 22 04:34 122225.txt
-rw------- 1 ftp ftp 62 Jul 22 04:35 122226.txt
-rw------- 1 ftp ftp 62 Jul 22 04:36 122227.txt
-rw------- 1 ftp ftp 62 Jul 22 04:37 122228.txt
-rw------- 1 ftp ftp 62 Jul 22 04:38 122229.txt
-rw------- 1 ftp ftp 62 Jul 22 06:02 12223.txt
-rw------- 1 ftp ftp 62 Jul 22 04:38 122230.txt
-rw------- 1 ftp ftp 62 Jul 22 04:39 122231.txt
-rw------- 1 ftp ftp 62 Jul 22 04:40 122232.txt
-rw------- 1 ftp ftp 62 Jul 22 04:41 122233.txt
-rw------- 1 ftp ftp 62 Jul 22 04:41 122234.txt
-rw------- 1 ftp ftp 62 Jul 22 04:42 122235.txt
-rw------- 1 ftp ftp 62 Jul 22 04:43 122236.txt
-rw------- 1 ftp ftp 62 Jul 22 04:44 122237.txt
-rw------- 1 ftp ftp 62 Jul 22 04:45 122238.txt
-rw------- 1 ftp ftp 62 Jul 22 04:45 122239.txt
-rw------- 1 ftp ftp 62 Jul 22 06:03 12224.txt
-rw------- 1 ftp ftp 62 Jul 22 04:46 122240.txt
-rw------- 1 ftp ftp 62 Jul 22 04:47 122241.txt
-rw------- 1 ftp ftp 62 Jul 22 04:48 122242.txt
-rw------- 1 ftp ftp 62 Jul 22 04:49 122243.txt
-rw------- 1 ftp ftp 62 Jul 22 04:49 122244.txt
-rw------- 1 ftp ftp 62 Jul 22 04:50 122245.txt
-rw------- 1 ftp ftp 62 Jul 22 04:51 122246.txt
-rw------- 1 ftp ftp 62 Jul 22 04:52 122247.txt
-rw------- 1 ftp ftp 62 Jul 22 04:52 122248.txt
-rw------- 1 ftp ftp 62 Jul 22 04:53 122249.txt
-rw------- 1 ftp ftp 62 Jul 22 06:03 12225.txt
-rw------- 1 ftp ftp 62 Jul 22 04:54 122250.txt
-rw------- 1 ftp ftp 62 Jul 22 04:55 122251.txt
-rw------- 1 ftp ftp 62 Jul 22 04:56 122252.txt
-rw------- 1 ftp ftp 62 Jul 22 04:56 122253.txt
-rw------- 1 ftp ftp 62 Jul 22 04:57 122254.txt
-rw------- 1 ftp ftp 62 Jul 22 04:58 122255.txt
-rw------- 1 ftp ftp 62 Jul 22 04:59 122256.txt
-rw------- 1 ftp ftp 62 Jul 22 05:00 122257.txt
-rw------- 1 ftp ftp 62 Jul 22 05:00 122258.txt
-rw------- 1 ftp ftp 62 Jul 22 05:01 122259.txt
-rw------- 1 ftp ftp 62 Jul 22 06:04 12226.txt
-rw------- 1 ftp ftp 62 Jul 22 05:02 122260.txt
-rw------- 1 ftp ftp 62 Jul 22 05:03 122261.txt
-rw------- 1 ftp ftp 62 Jul 22 05:03 122262.txt
-rw------- 1 ftp ftp 62 Jul 22 05:04 122263.txt
-rw------- 1 ftp ftp 62 Jul 22 05:05 122264.txt
-rw------- 1 ftp ftp 62 Jul 22 05:06 122265.txt
-rw------- 1 ftp ftp 62 Jul 22 05:07 122266.txt
-rw------- 1 ftp ftp 62 Jul 22 05:07 122267.txt
-rw------- 1 ftp ftp 62 Jul 22 05:08 122268.txt
-rw------- 1 ftp ftp 62 Jul 22 05:09 122269.txt
-rw------- 1 ftp ftp 62 Jul 22 06:05 12227.txt
-rw------- 1 ftp ftp 62 Jul 22 06:06 12228.txt
-rw------- 1 ftp ftp 62 Jul 22 06:07 12229.txt
-rw------- 1 ftp ftp 62 Jul 22 04:07 2.txt
-rw------- 1 ftp ftp 62 Jul 22 04:08 3.txt
drwx------ 2 ftp ftp 4096 Sep 21 12:43 MT_T
drwx------ 2 ftp ftp 4096 Aug 14 07:24 OWER
-rw------- 1 ftp ftp 12 Aug 09 09:20 TEST8861.txt
-rw------- 1 ftp ftp 0 Aug 12 06:46 TEST_80.txt
drwx------ 3 ftp ftp 4096 Aug 08 02:11 Test
-rw------- 1 ftp ftp 110592 Oct 27 05:30 V15.bin
-rw------- 1 ftp ftp 31 Oct 24 07:29 ftp_lib_test_up.txt
-rw------- 1 ftp ftp 1038 Jul 23 12:39 ftp_record.amr
drwx------ 2 ftp ftp 4096 Oct 22 10:40 ftp_test
drwx------ 4 ftp ftp 4096 Jul 29 09:39 home
-rw------- 1 ftp ftp 44086 Nov 04 07:23 test.bin
-rw------- 1 ftp ftp 59285 Aug 14 07:29 test.jpg
-rw------- 1 ftp ftp 3617 Aug 14 06:51 yunshanfu.jpg
[2024-11-11 10:20:43.022][000000084.693] false
[2024-11-11 10:20:43.027][000000084.698] I/user.fs writed data 23noianfdiasfhnpqw39fhawe;fuibnnpw3fheaios;fna;osfhisao;fadsfl
[2024-11-11 10:20:43.129][000000084.802] 226 Transfer complete.
250 Delete operation successful.
[2024-11-11 10:20:43.905][000000085.566] true
[2024-11-11 10:20:44.012][000000085.673] 221 Goodbye.
[2024-11-11 10:20:44.017][000000085.675] I/user.meminfo 277872 65072 114032
6.2 打开FTP服务器
在浏览器输入ftp网址,然后输入用户名和密码,即可进入。
可以看到上传文件成功
七、总结
本文档主要介绍 4G 通信中 FTP 通信的应用.结合例程讲解了 FTP 基本原理,介绍了 FTP 主要 API,旨在最简单的上手 Air780 的 LuatOS 的 FTP 开发.
八、常见问题
8.1 关于不支持主动模式:
模块 ftp 默认是被动模式,不支持主动模式,无法设置主动模式,公网下要想模块正常连接服务器,服务器肯定不能设置为主动模式,否则哪家模块都不能用.
8.2 ftp 服务器用 vsftpd
vsftpd 是一个ftp服务端. vsftpd 是very secure FTP daemon的缩写,安全性是它的一个最大的特点。vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、BSD、Solaris、 HP-UNIX等系统上面,是一个完全免费的、开放源代码的ftp服务器软件.
给读者的话
本篇文章由公帅开发;
本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题;
请登录合宙技术交流论坛,点击文档找错赢奖金-Air780EP-LuatOS-软件指南-网络驱动-FTP通信;
用截图标注+文字描述的方式跟帖回复,记录清楚您发现的问题;
我们会迅速核实并且修改文档;
同时也会为您累计找错积分,您还可能赢取月度找错奖金!