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 默认是被动模式,不支持主动模式,无法设置主动模式,公网下要想模块正常连接服务器,服务器肯定不能设置为主动模式,否则哪家模块都不能用。
二、本教程实现的功能概述
本文教你合宙 Air8101 开发板使用 luatos 命令连接 FTP 服务器,实现模组和服务器之间数据的传输!
本教程实现的功能定义是:
- 准备公网 FTP 服务器。
- Air8101 开发板开机,连接 WIFI 热点,把开发板作为 FTP 客户端去连接服务器。
- 分步演示 FTP 控制命令,包括目录操作,文件操作如上传文件 下载文件 删除文件等。
- 演示完毕关闭连接。
三、搭建测试环境
3.1 Air8101 开发板
本文使用 Air8101 开发板做演示
3.2 准备硬件环境
“古人云:‘工欲善其事,必先利其器。’在深入介绍本功能示例之前,我们首先需要确保以下硬件环境的准备工作已经完成。”
参考:硬件环境清单 - luatos@air8101 - 合宙文档中心,准备以及组装好硬件环境。
3.3 准备软件环境
“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。
1. Luatools 工具;
2. 内核固件文件(底层 core 固件文件):LuatOS-SoC_V1003_Air8101.soc;参考项目使用的内核固件;
3. luatos 需要的脚本和资源文件
脚本和资源文件:https://gitee.com/openLuat/LuatOS-Air8101/tree/master/demo/ftp/main.lua
lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;
准备好软件环境之后,接下来查看如何烧录项目文件到 Air8101 开发板 - luatos@air8101 - 合宙文档中心,将本篇文章中演示使用的项目文件烧录到 Air8101 开发板中。
4. 合宙 FTP 测试服务器
四、测试 FTP
4.1 下载 FTP demo 固件
打开工具软件 Luatools,确认版本 3.0.14 及以上。
勾选通用串口打印,选择串口,允许打印输出,点击“项目管理测试”
ftp demo文件相对路径
选择内核core,点击“增加脚本或资源文件”,选择main.lua, 点击“下载底层和脚本”
4.2 验证执行结果
回到 luatools 日志窗口
右侧 ftp 服务器端 12222.txt 时间戳与 Air8101 模块对应,ftp 文件下载、读写、上传成功。
五、demo luat 代码
LuatOS-Air8101 ftp demo 功能测试脚本
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "ftpdemo"
VERSION = "1.0.0"
--[[
本demo需要ftp库, 大部分能联网的设备都具有这个库
ftp也是内置库, 无需require
]]
-- sys库是标配
_G.sys = require("sys")
--[[特别注意, 使用ftp库需要下列语句]]
_G.sysplus = require("sysplus")
sys.taskInit(function()
-----------------------------
-- 统一联网函数, 可自行删减
----------------------------
if wlan and wlan.connect then
-- wifi 联网, 支持Air8101
local ssid = "luatos1234"
local password = "12341234"
log.info("wifi", ssid, password)
wlan.init()
wlan.setMode(wlan.STATION)
wlan.connect(ssid, password, 1)
local result, data = sys.waitUntil("IP_READY", 30000)
log.info("wlan", "IP_READY", result, data)
device_id = wlan.getMac()
-- TODO 获取mac地址作为device_id
end
-- -- 打印一下支持的加密套件, 通常来说, 固件已包含常见的99%的加密套件
-- if crypto.cipher_suites then
-- log.info("cipher", "suites", json.encode(crypto.cipher_suites()))
-- end
while true do
sys.wait(1000)
log.info("ftp 启动")
log.info("ftp Air8101 Start ...")
--print(ftp.debug(on))
print(ftp.login(nil,"121.43.224.154",21,"ftp_user","3QujbiMG").wait())
--空操作,防止连接断掉
print(ftp.command("NOOP").wait())
--报告远程系统的操作系统类型
print(ftp.command("SYST").wait())
--设置 FTP 数据传输类型
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())
-- 向文件写一段测试数据,打印日志检查是否一致
-- io.writeFile("/12222.txt", "23noianfdiasfhnpqw39fhawe;fuibnnpw3fheaios;fna;osfhisao;fadsfl")
-- print(ftp.push("/12222.txt","/12222.txt").wait())
--FTP 文件下载 本地文件名1222.txt, 服务器端文件名1222.txt
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
--删除FTP服务器端文件
print(ftp.command("DELE /12222.txt").wait())
--FTP上传文件 本地文件名122224.txt, 服务器端文件名12222.txt
print(ftp.push("/122224.txt","/12222.txt").wait())
--关闭FTP连接
print(ftp.close().wait())
log.info("meminfo", rtos.meminfo("sys"))
sys.wait(15000)
end
end)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
六、总结
本文介绍 了 Air8101 工业引擎 WIFI 通信场景 FTP 的应用示范,结合例程讲解了 FTP 基本原理,介绍了 FTP 主要 API,旨在最简单的上手 Air8101 的 LuatOS 的 FTP 开发。
七、常见问题
7.1 关于不支持主动模式
模块 ftp 默认是被动模式,不支持主动模式,无法设置主动模式,公网下要想模块正常连接服务器,服务器肯定不能设置为主动模式,否则哪家模块都不能用.
7.2 ftp 服务器用 vsftpd
vsftpd 是一个 ftp 服务端. vsftpd 是 very secure FTP daemon 的缩写,安全性是它的一个最大的特点。vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、BSD、Solaris、 HP-UNIX 等系统上面,是一个完全免费的、开放源代码的 ftp 服务器软件.
给读者的话
本文章由'徐亚卿'开发;
本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题;
用截图标注 + 文字描述的方式跟帖回复,记录清楚您发现的问题;
我们会迅速核实并且修改文档;
同时也会为您累计找错积分,您还可能赢取月度找错奖金!