跳转至

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 服务器访问服务器资源。

功能定义:

1. 登录 FTP 服务器 2. 读取服务器上的文件资源 3. 在 FTP 服务器上创建目录

三、准备硬件环境

3.1 开发板准备

使用 EVB_Air724 开发板,如下图所示:

淘宝购买链接:Air724UG-NFM 开发板淘宝购买链接

此开发板的详细使用说明参考:Air724UG 产品手册 中的《EVB_Air724UG_AXX 开发板使用说明》,写这篇文章时最新版本的使用说明为:《EVB_Air724UG_A14 开发板使用说明》;开发板使用过程中遇到任何问题,可以直接参考这份使用说明文档。

api:https://doc.openluat.com/wiki/21?wiki_page_id=2068

3.2 数据通信线

USB 数据线一根(micro USB)。

3.3 PC 电脑

WIN7 以及以上版本的 WINDOWS 系统。

3.4 SIM 卡

中国大陆环境下,可以上网的 SIM 卡。一般来说,使用移动,电信,联通的物联网卡或者手机卡都行。

3.5 组装硬件环境

USB 数据线插入 USB 口,另一端与电脑相连,拨码开关全部拨到 ON,串口切换开关选择 UART1,USB 供电的 4V 对应开关拨至 ON 档,SIM 卡放到 SIM 卡槽中锁紧,如下图所示。

四、准备软件环境

4.1 下载调试工具

使用说明参考:Luatools 下载和详细使用

4.2 源码及固件

1. 底层 core 下载

下载底层固件,并解压

链接:https://docs.openluat.com/air724ug/luatos/firmware/

如下图所示,红框的是我们要使用到的

1. 本教程使用的 demo 见附件:

https://gitee.com/openLuat/LuatOS-Air724UG/tree/master/script_LuaTask/demo/ftp

4.3 下载固件和脚本到开发板中

打开 Luatools,开发板上电开机,如开机成功 Luatools 会打印如下信息。

点击项目管理测试选项。

进入管理界面,如下图所示。

  • 点击选择文件,选择底层固件,我的文件放在 D:\luatOS\Air724 路径中

  • 点击增加脚本或资源文件,选择之前下载的程序源码,如下图所示。

  • 点击下载底层和脚本,下载完成如下图所示。

4.4 FTP 服务器

本文测试用的服务器的地址,端口号,用户名,密码为 "121.43.224.154",21,"ftp_user","3QujbiMG"。

如果使用其他服务器请自行修改。

五、代码示例介绍

5.1 API 说明

ftp 的 API 在 LuatOS lib 有做封装,建议直接用 lib 的 API 接口。

API接口        描述
ftp.close()        FTP客户端关闭
ftp.command()        FTP客户端命令
ftp.pasv_connect()        连接到PASV接口
ftp.login()        FTP客户端登录
ftp.upload()        FTP客户端文件上传
ftp.download()        FTP客户端文件下载
ftp.checktype()        设置FTP传输类型 A:ascii I:Binary
ftp.pwd()        显示当前工作目录
ftp.cwd()        更改工作目录
ftp.cdup()        回到上级目录
ftp.mkd()        创建目录
ftp.list()        列出目录列表或文件信息
ftp.deletefolder()        删除目录
ftp.deletefile()        删除文件

5.2 ftp_test.lua 代码

系统启动后演示 5 秒,登录 FTP 服务器,等待登录成功后,查看服务器信息、显示目录下文件、显示文件详细信息、显示工作目录、创建目录等操作。

下载 ftp 服务器的文件至 sd 卡目录,/1040K.jpg", "/sdcard0/1040K.jpg"

从 sd 卡目录上传文件至服务器,/sdcard0/ftp_lib_test_up.txt"

在 ftp_test.lua 这个文件中将登录中的地址,端口号,用户名,密码等必要信息修改为自己服务器的。

--- 模块功能:ftp功能测试
-- @module ftp_test
-- @author Dozingfiretruck
-- @license MIT
-- @copyright OpenLuat.com
-- @release 2020.12.08
require "ftp"
module(..., package.seeall)

-- 挂载SD卡
-- io.mount(io.SDCARD)

function ftp_thread()
    local r, n = ftp.login("PASV", "121.43.224.154", 21, "ftp_user", "123456") -- 登录
    log.info("ftp_login", r, n)
    if r ~= "200" then return end

    r, n = ftp.command("SYST") -- 查看服务器信息
    log.info("ftp_command SYST", r, n)
    if r == "426" or r == "503" then return end

    r, n = ftp.list("/") -- 显示目录下文件
    log.info("ftp_list /", r, n)
    if r == "503" or r == "502" or r == "426" then return end

    r, n = ftp.list("/ftp_lib_test_down.txt") -- 显示文件详细信息
    log.info("ftp_list /ftp_lib_test_down.txt", r, n)
    if r == "503" or r == "502" or r == "426" then return end

    r, n = ftp.pwd() -- 显示工作目录
    log.info("ftp_pwd", r, n)
    if r == "426" or r == "503" then return end

    r, n = ftp.mkd("/ftp_test") -- 创建目录
    log.info("ftp_mkd", r, n)
    if r == "426" or r == "503" then return end

    r, n = ftp.cwd("/ftp_test") -- 切换目录
    log.info("ftp_cwd", r, n)
    if r == "426" or r == "503" then return end

    r, n = ftp.pwd() -- 显示工作目录
    log.info("ftp_pwd", r, n)
    if r == "426" or r == "503" then return end

    r, n = ftp.cdup() -- 返回上级工作目录
    log.info("ftp_cdup", r, n)
    if r == "426" or r == "503" then return end

    r, n = ftp.pwd() -- 显示工作目录
    log.info("ftp_pwd", r, n)
    if r == "426" or r == "503" then return end

     r, n = ftp.download("/1040K.jpg", "/sdcard0/1040K.jpg") -- 下载ftp服务器的文件至sd卡目录
     log.info("ftp_download", r, n)
     if r ~= "200" then return end
     r, n = ftp.upload("/ftp_lib_test_up.txt","/sdcard0/ftp_lib_test_up.txt") -- 从sd卡目录上传文件至服务器
     log.info("ftp_download", r, n)
     if r ~= "200" then
         return
     end
    ftp.close()
end

sys.taskInit(ftp_thread)

-- 卸载SD卡
 io.unmount(io.SDCARD)

5.3 main.lua 代码

本代码为主程序脚本,系统启动后首先会对 4G 网络进行配置,然后加载 FTP 测试模块。

六、开机调试

6.1 开发板开机

连接好硬件并下载固件后,启动 Luatools 软件,系统运行信息将显示在界面中。红框中为开发板连接到 PC 机后正常打印的信息,如下图所示。

6.2 FTP 调试

1. FTP 登录服务器,并且获取信息。

1. 显示目录下的文件

1. 创建目录/ftp_test

1. 下载 ftp 服务器的文件

下载成功返回 200。

下载前 FTP 服务器的数据如下:

下载文件的打印日志信息:

1. 上传文件至服务器

上传成功返回 200。

上传成功后 FTP 服务器的数据如下:

上传文件打印日志信息:

七、常见问题

7.1 关于不支持主动模式:

模块 ftp 默认是被动模式,不支持主动模式,无法设置主动模式,公网下要想模块正常连接服务器,服务器肯定不能设置为主动模式,否则哪家模块都不能用。

7.2 发送带 0x0d 0x0a 这些数据会丢失

需要通过 ftp.checktype(“I”,0)设置为二进制方式传输文件,否则传输过程中会丢弃换行符。

给读者的话

本篇文章由杨超开发;

本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题;

请登录合宙技术交流论坛,点击文档找错赢奖金-Air724UG-LuatOS-软件指南-网络驱动-FTP

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

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

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