news 2026/10/2 16:22:04

HoloCubic_AIO FTP服务完整指南:文件管理器APP背后的工作原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HoloCubic_AIO FTP服务完整指南:文件管理器APP背后的工作原理

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_PORT21命令端口,接收 USER/PASS/RETR/STOR 等指令
FTP_DATA_PORT_PASV50009被动模式下的数据端口,真正传文件
FTP_TIME_OUT5 分钟客户端无操作自动断开
FTP_BUF_SIZE1024 字节文件读写缓冲区大小

客户端连上 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状态机推进:

  1. 等待连接→ 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 服务 📡

  1. 小电视开机,进入File Manager应用
  2. 固件收到APP_MESSAGE_WIFI_CONN消息后开启 WiFi,并把 IP 显示在屏幕上;此时ftpSrv.begin("holocubic", "aio")被调用,两个端口开始监听
  3. 手机/电脑连上热点(默认热点名为HoloCubic_AIO,见 network.cpp)
  4. 打开任意 FTP 客户端(如 FileZilla、Xftp),填入:
    • 主机:屏幕显示的 IP
    • 端口:21
    • 用户名:holocubic,密码:aio
  5. 之后即可像管理本地磁盘一样拖拽上传下载文件

💡 小知识: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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 16:21:14

买门窗贪便宜吃大亏!门窗漏风漏雨,主要是这几种原因!

买门窗贪便宜吃大亏! 门窗漏风漏雨,主要是这几种原因! 很多业主一开口就说,你的门窗为什么这么贵?别人家的300元,而你家门窗要700元,你这个价格太坑爹了吧? 当劣质门窗开始漏风漏雨的时候,贪图便宜的客户就知道后悔了,下面一些劣质门窗漏风漏雨的基础常识,我们来…

作者头像 李华
网站建设 2026/10/2 16:20:43

Spring Event远程化改造的四大陷阱与轻量级替代方案

双十一那会儿我们团队做过一个库存扣减项目&#xff0c;单体应用内部大量使用 Spring Event 做领域事件解耦&#xff0c;代码清爽得不得了。后来业务量上来&#xff0c;系统拆成订单、库存、营销三个服务&#xff0c;我第一反应就是把 Spring Event 直接“搬”到远程调用——用…

作者头像 李华
网站建设 2026/10/2 16:20:42

干货:点击即校验

点击即校验&#xff1a;目录/引擎状态的三段式拦截 第一性原理&#xff1a;错误要趁早拦 点"开始处理"&#xff0c;如果目录不存在、引擎没启动&#xff0c;这些是马上能判断的错误&#xff0c;就该在点击时立刻拦住&#xff0c;返回提示&#xff0c;别等后台跑一段时…

作者头像 李华
网站建设 2026/10/2 16:20:16

深度学习基础|第R2周 医疗成本预测

第R2周&#xff1a;医疗成本预测 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊编译器&#xff1a;jupyterlab 一、前期准备 1. 数据导入 2. 探索热力图 numeric_cols df.select_dtypes(include[int64, …

作者头像 李华
网站建设 2026/10/2 16:20:08

把模型切换交给平台:我用一层网关统一管 5 个模型的 API

把模型切换交给平台&#xff1a;我用一层网关统一管 5 个模型的 API 项目做到第三个月&#xff0c;我发现自己攒了一堆「临时方案」。 代码里散着五处模型调用&#xff0c;写法各不相同&#xff1a;有两处是 if model "a" 硬分支&#xff0c;有一处把 key 直接写在配…

作者头像 李华
网站建设 2026/10/2 16:20:01

switch语句:多分支选择的利器

switch语句:多分支选择的利器 想象你走进一家奶茶店,店员问你要什么口味:芒果、抹茶、芋泥、红豆……如果你用 if-else 来写,要写一串 else if,很啰嗦。switch 语句就是为这种"一个变量对应多个选项"的场景量身定做的。 一、基本语法 switch (表达式) {case …

作者头像 李华