HoloCubic_AIO FTP服务完整指南:文件管理器APP背后的工作原理
【免费下载链接】HoloCubic_AIOHoloCubic超多功能AIO固件 基于esp32-arduino的天气时钟、相册、视频播放、桌面投屏、web服务、bilibili粉丝等项目地址: https://gitcode.com/GitHub_Trending/ho/HoloCubic_AIO
HoloCubic_AIO是一款基于 ESP32 的多功能 AIO 固件,其中的FTP 服务是「文件管理器(File Manager)APP」的核心:小电视开机后变成一个小型 FTP 服务器,你在电脑上用任意 FTP 客户端就能直接读写它 TF 卡里的图片、视频和字体文件,整个过程无需拆机、无需编程。本文带你完整看懂这套 FTP 服务背后的实现原理与使用方法。
文件管理器APP能做什么 🚀
进入File Manager应用后,屏幕会显示当前设备的WiFi 名称、IP 地址和端口(21),并提示 "Wait connect....":
- 上传文件:把 PC 上的图片(.bin/.jpg)、视频(.mjpeg)、字体直接传到 TF 卡
- 下载备份:把卡里的文件取回电脑
- 增删改目录:新建文件夹、删除文件、改名
这个 APP 本身不做任何文件解析,它只是"把 FTP 服务亮出来"的入口界面,真正干活的是一套内置的 FTP 服务器。
FTP服务的工作原理:两个端口 + 一台状态机 ⚙️
21 端口:命令通道(控制连接)
FTP 协议天然分为"控制"和"数据"两条链路。在 ESP32FtpServer.h 中可以看到关键定义:
| 宏定义 | 值 | 作用 |
|---|---|---|
FTP_CTRL_PORT | 21 | 命令端口,接收 USER/PASS/RETR/STOR 等指令 |
FTP_DATA_PORT_PASV | 50009 | 被动模式下的数据端口,真正传文件 |
FTP_TIME_OUT | 5 分钟 | 客户端无操作自动断开 |
FTP_BUF_SIZE | 1024 字节 | 文件读写缓冲区大小 |
客户端连上 21 端口后,会先收到一条220--- Welcome to FTP for ESP8266 ---的欢迎语,然后进入USER → PASS两步认证。认证凭据在 file_manager.cpp 中硬编码:
- 用户名:
holocubic - 密码:
aio
50009 端口:数据通道(被动模式)
文件本体不走 21 端口。客户端发送PASV命令后,服务器回复自己的 IP 和 50009 端口(见 ESP32FtpServer.cpp 中的PASV分支),客户端再单独建立一条数据连接到该端口。
- 下载(RETR):
doRetrieve()从 TF 卡按 1KB 一块读出,逐块写入数据连接 - 上传(STOR):
doStore()反向进行,把收到的字节写回 TF 卡 - 列目录(LIST / MLSD / NLST):遍历当前目录,把文件名、大小、
<DIR>标记按标准 FTP 格式发回
handleFTP() 里的状态机
整个服务是非阻塞的:file_manager_app的主循环每轮都会调用一次ftpSrv.handleFTP()(file_manager.cpp)。它内部用一个cmdStatus状态机推进:
- 等待连接→ 2.空闲→ 3.等待用户名→ 4.等待密码→ 5.执行命令
命令执行部分(processCommand())完整实现了常用 FTP 指令:CWD(切换目录,还专门做了兼容 xftp 和 Windows 自带 ftp 客户端的处理)、CDUP、PWD、DELE(删除)、MKD(建目录)、TYPE、ABOR、QUIT等,并带 5 分钟超时踢人机制,非常适合小内存的 ESP32 环境。
底层:SdCard 驱动读写 TF 卡 💾
FTP 服务不直接操作文件系统,而是通过 sd_card.cpp 里的SdCard类封装 TF 卡(基于SD_MMC),提供了一组干净的接口:
listDir()—— 目录树遍历(返回双向链表节点)createDir()/removeDir()—— 建目录 / 删目录writeFile()/readFileLine()—— 文本读写readBinFromSd()/writeBinToSd()—— 二进制读写
所以你在 FTP 里看到的/image/、/movie/、/weather/等目录,其实就对应 TF 卡根目录下这些文件夹,仓库里 放置到内存卡/ 目录给出了各文件夹的标准内容模板。
连接步骤:手把手接入 HoloCubic FTP 服务 📡
- 小电视开机,进入File Manager应用
- 固件收到
APP_MESSAGE_WIFI_CONN消息后开启 WiFi,并把 IP 显示在屏幕上;此时ftpSrv.begin("holocubic", "aio")被调用,两个端口开始监听 - 手机/电脑连上热点(默认热点名为
HoloCubic_AIO,见 network.cpp) - 打开任意 FTP 客户端(如 FileZilla、Xftp),填入:
- 主机:屏幕显示的 IP
- 端口:
21 - 用户名:
holocubic,密码:aio
- 之后即可像管理本地磁盘一样拖拽上传下载文件
💡 小知识:APP 每 20 秒会向系统发送一次
APP_MESSAGE_WIFI_ALIVE心跳(见 file_manager.cpp),防止空闲的 WiFi 连接被系统自动回收。
代码导航:相关文件都在哪里 📁
| 模块 | 路径 |
|---|---|
| FTP 服务器实现 | AIO_Firmware_PIO/src/app/file_manager/ESP32FtpServer.cpp |
| FTP 服务器接口 | AIO_Firmware_PIO/src/app/file_manager/ESP32FtpServer.h |
| 文件管理器 APP 逻辑 | AIO_Firmware_PIO/src/app/file_manager/file_manager.cpp |
| 文件管理器界面 | AIO_Firmware_PIO/src/app/file_manager/file_manager_gui.c |
| TF 卡驱动 | AIO_Firmware_PIO/src/driver/sd_card.cpp |
| WiFi/热点管理 | AIO_Firmware_PIO/src/network.cpp |
常见问题 ❓
Q:连接一直卡在 "Wait connect...."?先确认手机/电脑已连上HoloCubic_AIO热点,且 IP 与屏幕显示一致;WiFi 就绪后界面会自动变为 "Connect succ"。
Q:可以用 Web 浏览器直接访问吗?不行。21 端口是 FTP 控制协议,不是 HTTP,请一定使用 FTP 客户端。
Q:上传的文件放在哪里?TF 卡根目录,即SD挂载点/下。建议按 放置到内存卡/ 的目录规范分类存放,相册、视频、天气动画才能被对应 APP 识别。
Q:长时间不操作会怎样?5 分钟无指令会被handleFTP()判定超时(530 Timeout)并主动断开,重新连接即可。
从 21 端口认证到 50009 端口传文件,再到 SdCard 驱动落盘 TF 卡——HoloCubic_AIO 用一个约千行的轻量 FTP 服务器,就实现了完整的文件管理能力。理解了这个原理,你也可以为自己的 ESP32 项目移植同样的「屏幕显示地址 + FTP 传输」方案。
【免费下载链接】HoloCubic_AIOHoloCubic超多功能AIO固件 基于esp32-arduino的天气时钟、相册、视频播放、桌面投屏、web服务、bilibili粉丝等项目地址: https://gitcode.com/GitHub_Trending/ho/HoloCubic_AIO
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考