main.lua 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "ftpdemo"
  3. VERSION = "1.0.0"
  4. --[[
  5. 本demo需要ftp库, 大部分能联网的设备都具有这个库
  6. ftp也是内置库, 无需require
  7. ]]
  8. -- sys库是标配
  9. _G.sys = require("sys")
  10. --[[特别注意, 使用ftp库需要下列语句]]
  11. _G.sysplus = require("sysplus")
  12. local server_ip = "121.43.224.154" -- 服务器IP
  13. local server_port = 21 -- 服务器端口号
  14. local server_username = "ftp_user" -- 服务器登陆用户名
  15. local server_password = "3QujbiMG" -- 服务器登陆密码
  16. local is_ssl = false -- 非ssl加密连接
  17. -- local is_ssl =true --如果是不带证书的加密打开这句话
  18. -- local ssl_encrypt = {
  19. -- server_cert = "/luadb/server_cert.cert",--服务器ca证书数据
  20. -- client_cert = "/luadb/client_cert.cert",--客户端证书数据
  21. -- client_key = "/luadb/client_key",-- 客户端私钥加密数据
  22. -- client_password = "naovswoivbfpfvjwpojv[pawjb[dsfjb]]"--客户端私钥口令数据
  23. -- }
  24. -- local is_ssl = ssl_encrypt --如果是带证书的加密,请将上述ssl_encrypt内的文件名换成自己的
  25. -- 这里使用模块唯一ID来生成文件名,避免多个模块使用同一ftp服务器时文件名冲突
  26. local self_id = mcu.unique_id():toHex()
  27. local local_name = "/ram/" .. self_id .. ".txt" -- 模块内部文件名及其路径
  28. local remote_name = "/" .. self_id .. "_srv.txt" -- 服务器上的文件名及其路径
  29. sys.taskInit(function()
  30. -----------------------------
  31. -- 统一联网函数, 可自行删减
  32. ----------------------------
  33. if wlan and wlan.connect then
  34. -- wifi 联网, ESP32系列均支持
  35. local ssid = "luatos1234"
  36. local password = "12341234"
  37. log.info("wifi", ssid, password)
  38. wlan.init()
  39. wlan.setMode(wlan.STATION)
  40. wlan.connect(ssid, password, 1)
  41. elseif mobile then
  42. -- Air780E/Air600E系列
  43. -- mobile.simid(2)
  44. -- LED = gpio.setup(27, 0, gpio.PULLUP)
  45. -- device_id = mobile.imei()
  46. end
  47. sys.waitUntil("IP_READY") -- 死等到联网成功
  48. log.info("联网成功")
  49. -- 联网成功后发布联网成功的消息
  50. sys.publish("net_ready")
  51. end)
  52. --[[操作ftp的函数,因为用了sys.wait,请在task内调用
  53. 本函数每隔15S就会进行一次登陆到主动断开的操作,
  54. 如果您不需要断开 或者只需要单次,请修改本函数中的while true do逻辑
  55. ]]
  56. local function ftp_test()
  57. sys.waitUntil("net_ready") -- 死等到联网成功
  58. local result = false
  59. local adapter = nil -- 自动选择网络适配器
  60. ftp.debug(true) -- 打开调试开关, 可以看到和服务器交互的明文命令和返回值
  61. while true do
  62. sys.wait(1000)
  63. log.info("ftp 启动")
  64. log.info("登陆FTP服务器", server_ip, server_port, server_username, server_password, is_ssl)
  65. result = ftp.login(adapter, server_ip, server_port, server_username, server_password, is_ssl).wait()
  66. log.info("ftp 登陆结果", result)
  67. log.info("空操作,防止连接断掉", ftp.command("NOOP").wait())
  68. log.info("报告远程系统的操作系统类型", ftp.command("SYST").wait())
  69. -- TYPE A: ASCII模式传输, TYPE I: 二进制模式传输, 必须指定
  70. log.info("指定文件类型", ftp.command("TYPE I").wait())
  71. -- 显示当前工作目录名, 非必须的操作
  72. log.info("显示当前工作目录名", ftp.command("PWD").wait())
  73. -- 演示创建和删除目录, 非必须的操作
  74. log.info("创建一个目录 目录名为QWER", ftp.command("MKD QWER").wait())
  75. log.info("改变当前工作目录为QWER", ftp.command("CWD /QWER").wait())
  76. log.info("返回上一层目录", ftp.command("CDUP").wait())
  77. log.info("删除名为QWER的目录", ftp.command("RMD QWER").wait())
  78. -- 演示获取当前工作目录下的文件列表, 非必须的操作
  79. log.info("获取当前工作目录下的文件名列表", ftp.command("LIST").wait())
  80. -- 生成至少51KB的测试数据 (52KB = 53248字节)
  81. local target_size = 52*1024
  82. local test_data = ""
  83. -- 使用循环生成足够大的数据
  84. log.info("开始生成测试数据,目标大小:", target_size, "字节")
  85. while #test_data < target_size do
  86. -- 每次生成1KB的随机数据,直到达到目标大小
  87. local chunk_size = math.min(1024, target_size - #test_data)
  88. local chunk = crypto.trng(chunk_size)
  89. test_data = test_data .. chunk
  90. -- log.info("已生成数据:", #test_data, "/", target_size, "字节")
  91. end
  92. log.info("测试数据生成完成,总大小:", #test_data, "字节")
  93. -- 把数据写到本地目录
  94. log.info("在本地创建一个文件", "文件名及其目录为" .. local_name)
  95. io.writeFile(local_name, test_data)
  96. log.info("本地文件大小", #test_data, "字节")
  97. log.info("本地文件大小(KB)", #test_data / 1024, "KB")
  98. -- 把文件上传到服务器去
  99. log.info("上传本地的" .. local_name, "到服务器上并且更名为" .. remote_name)
  100. result = ftp.push(local_name, remote_name).wait()
  101. log.info("上传结果是", result)
  102. -- 打印一下服务器当前目录下的文件列表
  103. log.info("获取当前工作目录下的文件名列表", ftp.command("LIST").wait())
  104. -- 从服务器上下载刚才上传的文件
  105. log.info("下载服务器上的" .. remote_name, "存放在" .. remote_name)
  106. result = ftp.pull(remote_name, remote_name).wait()
  107. log.info("下载结果是", result)
  108. -- 检查下载的文件大小
  109. local downloaded_data = io.readFile(remote_name)
  110. if downloaded_data then
  111. log.info("下载文件实际大小", #downloaded_data, "字节")
  112. log.info("下载文件实际大小(KB)", #downloaded_data / 1024, "KB")
  113. log.info("期望文件大小", #test_data, "字节")
  114. log.info("期望文件大小(KB)", #test_data / 1024, "KB")
  115. if #downloaded_data ~= #test_data then
  116. log.warn("警告:下载文件大小与期望大小不一致!")
  117. log.warn("期望大小:", #test_data, "字节 (", #test_data / 1024, "KB)")
  118. log.warn("实际大小:", #downloaded_data, "字节 (", #downloaded_data / 1024, "KB)")
  119. log.warn("大小差异:", #test_data - #downloaded_data, "字节")
  120. end
  121. else
  122. log.error("无法读取下载的文件")
  123. end
  124. -- 比较一下上传和下载的数据是否一致
  125. local downloaded_data = io.readFile(remote_name)
  126. if downloaded_data and downloaded_data == test_data then
  127. log.info("上传和下载的数据一致性验证通过")
  128. else
  129. log.error("上传和下载的数据一致性验证失败")
  130. if downloaded_data then
  131. log.info("原始数据长度:", #test_data, "字节 (", #test_data / 1024, "KB)")
  132. log.info("下载数据长度:", #downloaded_data, "字节 (", #downloaded_data / 1024, "KB)")
  133. else
  134. log.error("无法读取下载的数据")
  135. end
  136. end
  137. -- 删除服务器上的测试文件
  138. sys.wait(1000) -- 等一秒 防止删除失败
  139. log.info("删除FTP服务器当前目录下的" .. remote_name)
  140. result = ftp.command("DELE " .. remote_name).wait()
  141. log.info("删除结果是", result)
  142. -- 结束测试,关闭和服务器的连接
  143. sys.wait(1000) -- 等一秒 防止关闭失败
  144. log.info("关闭本次和服务器之间链接")
  145. result = ftp.close().wait()
  146. log.info("ftp 结束", result)
  147. -- 把本地的临时文件都删掉
  148. log.info("删除本地的临时文件", local_name, remote_name)
  149. os.remove(local_name)
  150. os.remove(remote_name)
  151. -- 最后, 打印一下内存状态
  152. log.info("打印内存状态")
  153. log.info("meminfo", "lua", rtos.meminfo("lua"))
  154. log.info("meminfo", "sys", rtos.meminfo("sys"))
  155. -- 等15秒, 继续下一轮测试
  156. log.info("等待15秒,继续下一轮测试")
  157. sys.wait(15000)
  158. end
  159. end
  160. sys.taskInit(ftp_test)
  161. -- 用户代码已结束---------------------------------------------
  162. -- 结尾总是这一句
  163. sys.run()
  164. -- sys.run()之后后面不要加任何语句!!!!!