http_download_file.lua 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. --[[
  2. @module http_download_file
  3. @summary http下载文件模块
  4. @version 1.0.0
  5. @date 2025.08.25
  6. @author 王棚嶙
  7. @usage
  8. 本文件演示的功能为通过http下载文件进入TF卡中:
  9. 1. 网络就绪检测,链接wifi
  10. 2. 创建HTTP下载任务并等待完成
  11. 3. 记录下载结果
  12. 4. 获取并记录文件大小
  13. 本文件没有对外接口,直接在main.lua中require "http_download_file"即可
  14. ]]
  15. local function http_download_file_task()
  16. -- 阶段1: 网络就绪检测
  17. -- 要连接的WIFI路由器名称
  18. local ssid ="茶室-降功耗,找合宙!"
  19. -- 要连接的WIFI路由器密码
  20. local password = "Air123456"
  21. log.info("wifi", ssid, password)
  22. wlan.init()
  23. -- 连接WIFI
  24. wlan.connect(ssid, password, 1)
  25. while not socket.adapter(socket.dft()) do
  26. log.warn("HTTP下载", "等待网络连接", socket.dft())
  27. -- 等待IP_READY消息,超时设为1秒
  28. sys.waitUntil("IP_READY", 1000)
  29. end
  30. -- 检测到了IP_READY消息
  31. log.info("HTTP下载", "网络已就绪", socket.dft())
  32. -- TF卡供电控制(AIR8101专用)
  33. gpio.setup(13, 1)
  34. -- 挂载文件系统
  35. local mount_ok = fatfs.mount(fatfs.SDIO , "/sd", 24 * 1000 * 1000)
  36. if not mount_ok then
  37. log.error("HTTP下载", "文件系统挂载失败")
  38. return
  39. end
  40. -- 阶段2: 执行下载任务
  41. log.info("HTTP下载", "开始下载任务")
  42. -- 核心下载操作开始 (支持http和https)
  43. -- local code, headers, body = http.request("GET", "...", nil, nil, {dst = "/sd/1.mp3"}).wait()
  44. -- 其中 "..."为url地址, 支持 http和https, 支持域名, 支持自定义端口。
  45. local code, headers, body_size = http.request("GET",
  46. "https://gitee.com/openLuat/LuatOS/raw/master/module/Air780EHM_Air780EHV_Air780EGH/demo/audio/1.mp3",
  47. nil, nil, {dst = "/sd/1.mp3"}).wait()
  48. -- 阶段3: 记录下载结果
  49. log.info("HTTP下载", "下载完成",
  50. code==200 and "success" or "error",
  51. code,
  52. -- headers是下载的文件头信息
  53. json.encode(headers or {}),
  54. -- body_size是下载的文件大小(字节数)
  55. body_size)
  56. if code == 200 then
  57. -- 获取实际文件大小
  58. local actual_size = io.fileSize("/sd/1.mp3")
  59. log.info("HTTP下载", "文件大小验证", "预期:", body_size, "实际:", actual_size)
  60. if actual_size~= body_size then
  61. log.error("HTTP下载", "文件大小不一致", "预期:", body_size, "实际:", actual_size)
  62. end
  63. end
  64. -- 阶段4: 资源清理
  65. fatfs.unmount("/sd")
  66. log.info("HTTP下载", "资源清理完成")
  67. end
  68. -- 创建下载任务
  69. sys.taskInit(http_download_file_task)