http_download_file.lua 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. 网络就绪检测
  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. while not socket.adapter(socket.dft()) do
  18. log.warn("HTTP下载", "等待网络连接", socket.dft())
  19. -- 等待IP_READY消息,超时设为1秒
  20. sys.waitUntil("IP_READY", 1000)
  21. end
  22. -- 检测到了IP_READY消息
  23. log.info("HTTP下载", "网络已就绪", socket.dft())
  24. -- 进行SPI初始化,Air8000开发板TF卡的CS脚为:SPI1,GPIO20
  25. local spi_id, pin_cs = 1, 20
  26. spi.setup(spi_id, nil, 0, 0, 400 * 1000)
  27. -- 同一spi总线上的所有从设备在初始化时必须要先拉高CS脚,防止从设备之间互相干扰。
  28. -- 在air8000开发板上,TF卡和ch390共用SPI1总线。
  29. gpio.setup(pin_cs, 1)
  30. -- 挂载文件系统
  31. local mount_ok = fatfs.mount(fatfs.SPI, "/sd", spi_id, pin_cs, 24 * 1000 * 1000)
  32. if not mount_ok then
  33. log.error("HTTP下载", "文件系统挂载失败")
  34. fatfs.unmount("/sd")
  35. spi.close(spi_id)
  36. return
  37. end
  38. -- 阶段2: 执行下载任务
  39. log.info("HTTP下载", "开始下载任务")
  40. -- 核心下载操作开始 (支持http和https)
  41. -- local code, headers, body = http.request("GET", "...", nil, nil, {dst = "/sd/3_23MB.bin"}).wait()
  42. -- 其中 "..."为url地址, 支持 http和https, 支持域名, 支持自定义端口。
  43. local code, headers, body_size = http.request("GET",
  44. "https://cdn.openluat-erp.openluat.com/erp_site_file/product_file/AirM2M_780EHT_V2017_LTE_AT.dfota.bin",
  45. nil, nil, {dst = "/sd/3_23MB.bin"}).wait()
  46. -- 阶段3: 记录下载结果
  47. log.info("HTTP下载", "下载完成",
  48. code==200 and "success" or "error",
  49. code,
  50. -- headers是下载的文件头信息
  51. json.encode(headers or {}),
  52. -- body_size是下载的文件大小(字节数)
  53. body_size)
  54. if code == 200 then
  55. -- 获取实际文件大小
  56. local actual_size = io.fileSize("/sd/3_23MB.bin")
  57. log.info("HTTP下载", "文件大小验证", "预期:", body_size, "实际:", actual_size)
  58. if actual_size~= body_size then
  59. log.error("HTTP下载", "文件大小不一致", "预期:", body_size, "实际:", actual_size)
  60. end
  61. end
  62. -- 阶段4: 资源清理
  63. fatfs.unmount("/sd")
  64. spi.close(spi_id)
  65. log.info("HTTP下载", "资源清理完成")
  66. end
  67. -- 创建下载任务
  68. sys.taskInit(http_download_file_task)