main.lua 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. -- main.lua文件
  2. -- LuaTools需要PROJECT和VERSION这两个信息
  3. PROJECT = "fota_demo"
  4. -- iot限制,只能上传xxx.yyy.zzz格式的三位数的版本号,但实际上现在只用了XXX和ZZZ,中间yyy暂未使用
  5. -- 需要注意的是,因为yyy不生效,所以111.222.333版本和111.444.333版本,对iot平台来说都一样,所以建议中间那一位永远写000
  6. VERSION = "001.000.000"
  7. -- 使用合宙iot平台时需要这个参数
  8. PRODUCT_KEY = "q01f89YFOFYxluL05jMI6aiIlKJy1SYA" -- 到 iot.openluat.com 创建项目,获取正确的项目key(刚刚剪切板里的校验码就填这里)
  9. libfota2 = require "libfota2"
  10. -- 联网函数, 可自行删减
  11. sys.taskInit(function()
  12. -----------------------------
  13. -- 统一联网函数, 可自行删减
  14. ----------------------------
  15. if wlan and wlan.connect then
  16. -- wifi 联网, Air8101系列均支持
  17. local ssid = "Xiaomi_1100"
  18. local password = "1234567890"
  19. log.info("wifi", ssid, password)
  20. wlan.init()
  21. wlan.setMode(wlan.STATION)
  22. wlan.connect(ssid, password, 1)
  23. --等待WIFI联网结果,WIFI联网成功后,内核固件会产生一个"IP_READY"消息
  24. local result, data = sys.waitUntil("IP_READY")
  25. log.info("wlan", "IP_READY", result, data)
  26. device_id = wlan.getMac()
  27. else
  28. -- 其他不认识的bsp, 循环提示一下吧
  29. while 1 do
  30. sys.wait(1000)
  31. log.info("bsp", "本bsp可能未适配网络层, 请查证")
  32. end
  33. end
  34. log.info("已联网")
  35. sys.publish("net_ready")
  36. end)
  37. -- 循环打印版本号, 方便看版本号变化, 非必须
  38. sys.taskInit(function()
  39. while 1 do
  40. sys.wait(5000)
  41. log.info("降功耗,找合宙")
  42. log.info("fota", "脚本版本号", VERSION, "core版本号", rtos.version())
  43. end
  44. end)
  45. -- 升级结果的回调函数
  46. -- 功能:获取fota的回调函数
  47. -- 参数:
  48. -- result:number类型
  49. -- 0表示成功
  50. -- 1表示连接失败
  51. -- 2表示url错误
  52. -- 3表示服务器断开
  53. -- 4表示接收报文错误
  54. -- 5表示使用iot平台VERSION需要使用 xxx.yyy.zzz形式
  55. local function fota_cb(ret)
  56. log.info("fota", ret)
  57. if ret == 0 then
  58. log.info("升级包下载成功,重启模块")
  59. rtos.reboot()
  60. elseif ret == 1 then
  61. log.info("连接失败", "请检查url拼写或服务器配置(是否为内网)")
  62. elseif ret == 2 then
  63. log.info("url错误", "检查url拼写")
  64. elseif ret == 3 then
  65. log.info("服务器断开", "检查服务器白名单配置")
  66. elseif ret == 4 then
  67. log.info("接收报文错误", "检查模块固件或升级包内文件是否正常")
  68. elseif ret == 5 then
  69. log.info("版本号书写错误", "iot平台版本号需要使用xxx.yyy.zzz形式")
  70. else
  71. log.info("不是上面几种情况 ret为",ret)
  72. end
  73. end
  74. -- 使用合宙iot平台进行升级,不需要管下面这段代码
  75. -- 使用第三方服务器时打开下面这段代码
  76. local ota_opts = {
  77. --url = "",
  78. -- 合宙IOT平台的默认升级URL, 不填就是这个默认值
  79. -- 如果是自建的OTA服务器, 则需要填写正确的URL, 例如 http://192.168.1.5:8000/update
  80. -- 如果自建OTA服务器,且url包含全部参数,不需要额外添加参数, 请在url前面添加 ###
  81. -- 如果不加###,则默认会上传如下参数
  82. -- 1. opts.version string 版本号, 默认是 BSP版本号.x.z格式
  83. -- 2. opts.timeout int 请求超时时间, 默认300000毫秒,单位毫秒
  84. -- 3. opts.project_key string 合宙IOT平台的项目key, 默认取全局变量PRODUCT_KEY. 自建服务器不用填
  85. -- 4. opts.imei string 设备识别码, 默认取IMEI(Cat.1模块)或WLAN MAC地址(wifi模块)或MCU唯一ID
  86. -- 5. opts.firmware_name string 底层版本号
  87. -- 请求的版本号, 合宙IOT有一套版本号体系,不传就是合宙规则, 自建服务器的话当然是自行约定版本号了
  88. --version = ""
  89. -- 其他更多参数, 请查阅libfota2的文档 https://wiki.luatos.com/api/libs/libfota2.html
  90. }
  91. sys.taskInit(function()
  92. -- 这个判断是提醒要设置PRODUCT_KEY的,实际生产请删除
  93. if "123" == _G.PRODUCT_KEY and not ota_opts.url then
  94. while 1 do
  95. sys.wait(1000)
  96. log.info("fota", "请修改正确的PRODUCT_KEY")
  97. end
  98. end
  99. -- 等待网络就行后开始检查升级
  100. sys.waitUntil("net_ready")
  101. log.info("开始检查升级")
  102. sys.wait(500)
  103. libfota2.request(fota_cb, ota_opts)
  104. end)
  105. -- 演示定时自动升级, 每隔4小时自动检查一次
  106. sys.timerLoopStart(libfota2.request, 4 * 3600000, fota_cb, ota_opts)
  107. -- 用户代码已结束---------------------------------------------
  108. -- 结尾总是这一句
  109. sys.run()
  110. -- sys.run()之后后面不要加任何语句!!!!!