跳转至

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通信

用截图标注+文字描述的方式跟帖回复,记录清楚您发现的问题;

我们会迅速核实并且修改文档;

同时也会为您累计找错积分,您还可能赢取月度找错奖金!