فهرست منبع

add: 添加Air8101文件管理系统 project

tuoyiheng 3 ماه پیش
والد
کامیت
bd760bebed

+ 7 - 0
module/Air8000/demo/config_wifi_network/softap/readme.md

@@ -0,0 +1,7 @@
+**本文演示Air8000 softap 联网的使用方式:**
+
+1. Air8000的 softap 联网,详细demo请查看
+   [WLAN/ap_config_net](https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/demo/wlan)
+
+   使用教程请查看
+   [09 WIFI应用 - luatos@air8000 - 合宙模组资料中心](https://docs.openluat.com/air8000/luatos/app/mulu/wifi/)

+ 1 - 0
module/Air8101/project/wifi_ap_read_file/456.txt

@@ -0,0 +1 @@
+test测试测试测试测试测试test

+ 85 - 0
module/Air8101/project/wifi_ap_read_file/main.lua

@@ -0,0 +1,85 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.1
+@date    2025.09.22
+@author  拓毅恒
+@usage
+演示功能概述
+1.1 HTTPSVR 文件管理系统概述
+HTTPSVR 文件管理系统是一种基于Air8000模组的轻量级文件服务器解决方案,通过AP创建WiFi热点并提供HTTP服务,
+使用户可以通过浏览器方便地浏览、管理和下载设备内部存储及SD卡中的文件。
+1.2 系统工作原理
+设备启动后,自动创建AP热点,并初始化SD卡挂载。同时启动HTTP服务器,提供文件列表浏览、文件下载等功能。
+用户只需连接到设备的WiFi热点,通过浏览器访问指定IP地址,即可查看和管理设备中的文件。
+1.3 核心功能特性
+- 任务控制:通过默认配置和boot按键控制是否启停文件管理任务
+- 热点创建:设备自动创建名为`LuatOS_FileHub`的WiFi热点,供用户连接
+- SD卡管理:自动挂载SD卡,支持浏览和下载SD卡中的文件
+- 文件浏览:通过浏览器查看设备内部存储和SD卡中的文件列表
+- 文件下载:支持直接通过URL下载文件,支持大文件下载
+- 用户认证:提供简单的用户名密码认证机制,保护文件安全
+
+本示例基于合宙 Air8000 模组,演示 AP + 文件服务器 的完整实现流程。用户连接到设备WiFi热点后,通过浏览器即可访问文件管理系统,实现文件的浏览和下载功能。
+更多说明参考本目录下的readme.md文件
+]]
+
+
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "WIFI_AP_READ_FILE"
+VERSION = "001.000.000"
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+-- 引入任务控制模块
+require "task_control"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 196 - 0
module/Air8101/project/wifi_ap_read_file/readme.md

@@ -0,0 +1,196 @@
+## 演示功能概述
+
+### 1.1 HTTPSVR 文件管理系统概述
+
+HTTPSVR 文件管理系统是一种基于Air8101模组的轻量级文件服务器解决方案,通过AP创建WiFi热点并提供HTTP服务,使用户可以通过浏览器方便地浏览、管理和下载设备内部存储及SD卡中的文件。
+
+### 1.2 系统工作原理
+
+设备启动后,自动创建AP热点(可选为手动按键控制),并初始化SD卡挂载。同时启动HTTP服务器,提供文件列表浏览、文件下载等功能。用户只需连接到设备的WiFi热点,通过浏览器访问指定IP地址,即可查看和管理设备中的文件。
+
+### 1.3 核心功能特性
+
+- **任务控制**:通过默认配置和GPIO按键控制是否启停文件管理任务
+- **热点创建**:设备自动创建名为`LuatOS_FileHub`的WiFi热点,供用户连接
+- **SD卡管理**:自动挂载SD卡,支持浏览和下载SD卡中的文件
+- **文件浏览**:通过浏览器查看设备内部存储和SD卡中的文件列表
+- **文件操作**:支持文件浏览、下载和删除功能
+- **用户认证**:提供简单的用户名密码认证机制,保护文件安全
+
+本示例基于合宙 Air8101 模组,演示 **AP + 文件服务器** 的完整实现流程。用户连接到设备WiFi热点后,通过浏览器即可访问文件管理系统,实现文件的浏览和下载功能。
+
+#### 1、系统控制方式
+
+- **自动启动模式**:在task_control.lua中设置`AUTO_START=true`,系统开机后会自动创建AP热点、初始化SD卡并启动HTTP文件服务器
+- **手动控制模式**:默认设置`AUTO_START=false`,通过短按GPIO5来控制系统的启动和停止
+
+#### 2、初始化AP热点
+
+使用 wlan.createAP() 创建WiFi AP热点,默认配置为名称"LuatOS_FileHub",密码"12345678"。
+
+#### 3、SD卡初始化与挂载
+
+- 配置SPI接口,初始化SD卡
+- 将SD卡挂载到文件系统,挂载点为`/sd`
+- 检测SD卡可用空间,列出根目录文件
+
+#### 4、启动HTTP服务器
+
+- 配置服务器端口为80
+- 实现文件列表、文件下载和删除等API
+- 支持直接文件URL访问和通过explorer.html界面操作
+
+#### 5、文件访问路径映射
+
+- 访问普通文件(如 `http://192.168.4.1/explorer.html/456.txt`)映射到内部存储 `/luadb/456.txt`
+- 访问SD卡文件(如 `http://192.168.4.1/explorer.html/sd/readme.md`)映射到SD卡路径 `/sd/readme.md`
+
+#### 6、安全认证机制
+
+- 默认用户名:admin
+- 默认密码:123456
+- 支持通过Cookie保持会话
+- 支持通过URL参数进行一次性认证
+
+#### 7、运行效果
+
+- **WiFi创建成功**:手机/电脑可搜索到`LuatOS_FileHub`热点
+- **服务器启动成功**:连接热点后访问`http://192.168.4.1/explorer.html`可进入文件管理界面
+- **文件浏览**:可查看设备内部存储和SD卡中的文件列表
+- **文件下载**:点击文件或通过直接URL可下载文件到本地
+
+#### 8、快速上手
+
+- **自动启动模式**:当 task_control.lua 中设置`AUTO_START=true`时,设备上电后会自动创建AP热点、初始化SD卡并启动HTTP文件服务器,无需手动操作
+- **手动控制模式**:默认设置`AUTO_START=false`,设备上电后仅初始化按键功能,等待用户操作
+
+**手动控制模式操作步骤:**
+1. 烧录固件后上电,设备初始化按键功能,等待按键初始化完毕日志中会输出"系统已就绪,等待按键触发"的打印
+2. 通过拉低GPIO5,设备自动创建WiFi热点并启动文件服务器
+3. 使用手机或电脑连接到`LuatOS_FileHub`热点(密码:12345678)
+4. 打开浏览器,输入`http://192.168.4.1/explorer.html`访问文件管理系统
+5. 使用用户名`admin`和密码`123456`登录
+6. 浏览文件列表,点击文件可直接下载
+7. 再次拉低GPIO5可停止文件服务器服务
+
+**自动启动模式操作步骤:**
+1. 修改task_control.lua文件,将`AUTO_START`值设置为`true`
+2. 烧录固件后上电,设备会自动初始化并启动所有服务
+3. 使用手机或电脑连接到`LuatOS_FileHub`热点(密码:12345678)
+4. 打开浏览器,输入`http://192.168.4.1/explorer.html`访问文件管理系统
+5. 使用用户名`admin`和密码`123456`登录
+6. 浏览文件列表,点击文件可直接下载
+
+## 演示硬件环境
+
+1、Air8101核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、micro SD卡一张(可选,用于扩展存储)
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8101最新版本固件](https://docs.openluat.com/air8101/luatos/firmware/)(需确保固件版本≥V1004)
+
+## 演示核心步骤
+
+1、搭建好硬件环境,如果需要测试SD卡功能,需要外挂SD卡来测试。
+
+2、确保explorer.html文件已烧录到设备中,这是文件管理系统界面的必要文件。
+
+3、通过Luatools将本工程代码与固件烧录到Air8101核心板中
+
+4、烧录完成后,给设备上电,观察串口日志确认系统正常启动
+
+**两种启动模式效果说明:**
+
+- **自动启动模式**(默认AUTO_START=true):上电后系统会自动创建AP热点、初始化SD卡并启动HTTP服务器,无需手动拉低GPIO5即可使用文件管理系统功能。
+- **手动控制模式**(需修改AUTO_START=false):上电后系统仅初始化按键功能,日志显示"系统已就绪,等待按键触发",需要手动拉低GPIO5才会启动文件管理系统服务。
+
+手动控制模式下的启动日志示例:
+
+```lua
+[000000000.497] I/user.main 系统已就绪,等待按键触发
+```
+
+5、拉低GPIO5,启动文件管理系统。
+
+```lua
+系统启动,创建AP:
+[000000000.434] I/user.main WIFI_AP_READ_FILE 001.000.000
+[000000000.441] I/user.WIFI 创建AP热点: LuatOS_FileHub
+[000000000.496] I/user.执行AP创建操作 true 正常吗?
+
+AP创建成功,开始挂载SD卡:
+[000000000.511] I/user.SDCARD 开始初始化SD卡
+[000000000.511] SPI_HWInit 552:spi1 speed 400000,400000,32
+[000000000.512] I/user.sdcard_init open spi 0
+[000000000.512] D/fatfs init sdcard at spi=1 cs=20
+[000000000.678] D/SPI_TF 卡容量 15558144KB
+[000000000.678] D/SPI_TF sdcard init OK OCR:0xc0ff8000!
+[000000000.684] I/user.SDCARD 挂载SD卡结果: true
+[000000000.685] I/user.fatfs 可用空间 {"free_sectors":31098752,"total_kb":15549952,"free_kb":15549376,"total_sectors":31099904}
+[000000000.685] I/user.SDCARD SD卡初始化完成
+
+SD卡挂载完毕,开始启动系统:
+[000000002.632] I/httpsrv http listen at 192.168.4.1:80
+[000000002.632] I/user.HTTP 文件服务器已启动
+[000000002.632] I/user.HTTP 请连接WiFi: LuatOS_FileHub,密码: 12345678
+[000000002.633] I/user.HTTP 然后访问: http://192.168.4.1:80
+
+```
+
+6、在手机或电脑的WiFi设置中,搜索并连接名为`LuatOS_FileHub`的热点,密码为`12345678`
+
+7、连接成功后,打开浏览器,在地址栏输入`http://192.168.4.1/explorer.html`,进入文件管理系统登录页面
+
+8、输入默认用户名`admin`和密码`123456`,点击登录
+
+9、登录成功后,即可查看设备内部存储和SD卡中的文件列表
+
+10、点击文件列表中文件名后的 **`下载`** 或 **`删除`** 按钮,进行相应操作
+
+11、也可以在地址栏直接输入文件URL(如`http://192.168.4.1/456.txt`)下载文件到本地
+
+12、如需要访问SD卡中的文件,点击网页左上角的 `TF/SD目录` ,即可切换到SD卡目录中
+
+13、在手动控制模式下,再次拉低GPIO5按键,可停止文件管理系统服务,日志会输出停止状态信息
+
+## 系统参数说明
+
+### AP参数
+
+- SSID:LuatOS_FileHub
+- 密码:12345678
+- 信道:6
+- 最大连接数:4
+- IP地址:192.168.4.1
+
+### 认证参数
+
+- 默认用户名:admin
+- 默认密码:123456
+- 会话超时:3600秒(1小时)
+
+### HTTP服务器参数
+
+- 端口:80
+- 支持范围:文件浏览、文件下载
+- 访问地址:<http://192.168.4.1/explorer.html>
+
+## 注意事项
+
+1、本示例默认使用内部存储路径`/luadb/`和SD卡路径`/sd/`,请确保文件确实存在于对应路径
+
+2、使用SD卡时,请确保卡片格式为FAT32格式,实测最大容量支持1T
+
+3、确认LuatOS/script/libs扩展库目录下**explorer.html**文件烧录到设备中,否则**无法启动**SERVER服务器;
+
+4、SD卡目录下文件夹名称不能为中文,否则会识别失败,无法下载文件夹中文件
+
+5、如需修改WiFi名称、密码或认证信息,请修改`exremotefile.open()`配置文件中的相关参数
+
+6、如遇到无法连接WiFi热点或访问文件系统的情况,请检查设备电源和固件是否正常

+ 94 - 0
module/Air8101/project/wifi_ap_read_file/task_control.lua

@@ -0,0 +1,94 @@
+--[[
+@module  task_control
+@summary 远程文件管理系统控制模块
+@version 1.0
+@date    2025.11.4
+@author  拓毅恒
+@usage
+-- 远程文件管理系统控制模块使用方法
+-- 功能:控制远程文件管理系统的启动、停止以及操作模式切换
+
+-- 控制模式配置:
+-- 1. 自动启动模式:设置AUTO_START=true(默认),系统开机后自动创建AP热点、初始化SD卡并启动HTTP文件服务器
+-- 2. 手动控制模式:设置AUTO_START=false,通过拉低GPIO5控制系统的启停
+
+-- 手动控制操作指南:
+-- - 功能:控制远程文件管理系统的启动与停止
+-- - 引脚:GPIO5
+-- - 触发方式:短按(下降沿触发)
+-- - 防抖处理:因杜邦线测试时脉冲无法控制,所以暂无设计。实际设计板子时,根据自己的需求可以更改防抖配置以及打开防抖
+-- - 状态切换:短按一次切换一次系统运行状态
+
+-- 使用示例:
+-- 1. 自动启动系统:在代码中将AUTO_START设置为true(默认)
+-- 2. 手动控制系统:在代码中将AUTO_START设置为false,通过拉低GPIO5切换系统状态
+-- 3. 查看状态:通过日志查看系统启动和停止的状态信息
+
+-- 注意:本模块需要在main.lua中通过require方式引入,无需额外调用接口
+]]
+
+-- 导入exremotefile库
+local exremotefile = require "exremotefile"
+local AUTO_START = true -- 默认使用自动启动方式
+
+-- 系统状态变量
+local is_running = false -- 标记系统是否正在运行
+
+
+-- 启动系统服务
+local function start_services()
+    if not is_running then
+        log.info("main", "启动系统服务")
+        
+        -- 自定义参数启动(使用8101核心板)
+        -- 启动后连接默认AP热点,访问日志中的地址"http://192.168.4.1:80/explorer.html"来访问文件管理服务器。
+        exremotefile.open(nil, {is_sdio = true})
+        -- exremotefile.open()
+
+        is_running = true
+        log.info("main", "系统服务启动完成")
+    end
+end
+
+-- 停止系统服务
+local function stop_services()
+    if is_running then
+        log.info("main", "停止系统服务")
+
+        -- 关闭远程文件管理系统
+        exremotefile.close()
+
+        is_running = false
+        log.info("main", "系统服务已停止")
+    end
+end
+
+-- 初始化按键,这里选取GPIO5作为功能键
+local function press_key()
+    log.info("GPIO press")
+    sys.publish("PRESS", true)
+end
+gpio.setup(5, press_key, gpio.PULLUP, gpio.BOTH)
+-- gpio.debounce(0, 100, 1) -- 实际设计板子时,根据自己的需求可以更改防抖配置以及打开防抖
+
+local function config_services()
+    -- 根据配置决定是否自动启动服务
+    if AUTO_START then
+        start_services()
+    else
+        log.info("main", "系统已就绪,等待按键触发")
+    end
+
+    while 1 do
+        sys.waitUntil("PRESS")
+        -- 切换系统状态
+        if is_running then
+            stop_services()
+        else
+            start_services()
+        end
+    end
+end
+
+
+sys.taskInit(config_services)

+ 2 - 0
script/libs/exremotefile.lua

@@ -120,6 +120,8 @@ local function init_sdcard(sdcard_opts)
         -- 挂载SD卡到文件系统,指定挂载点为"/sd"
         mount_result = fatfs.mount(fatfs.SPI, "/sd", sdcard_opts.spi_id, sdcard_opts.spi_cs, 24 * 1000 * 1000)
     else
+        -- gpio13为8101TF卡的供电控制引脚,在挂载前需要设置为高电平,不能省略
+        gpio.setup(13, 1)
         mount_result = fatfs.mount(fatfs.SDIO, "/sd", 24 * 1000 * 1000)
     end
     log.info("SDCARD", "挂载SD卡结果:", mount_result)