add: 添加新的阿里云物联网库-aliyun2库,及搭配的demo, 逐步完善中
[LuatOS.git] / script / libs / libfota2.lua
blob99130a79b58e0398e9a88c608a3fd7b43bb53ccb
1 --[[
2 @module libfota2
3 @summary fota升级v2
4 @version 1.0
5 @date 2024.04.09
6 @author wendal
7 @demo fota2
8 @usage
9 --用法实例
10 local libfota2 = require("libfota2")
12 -- 功能:获取fota的回调函数
13 -- 参数:
14 -- result:number类型
15 -- 0表示成功
16 -- 1表示连接失败
17 -- 2表示url错误
18 -- 3表示服务器断开
19 -- 4表示接收报文错误
20 -- 5表示使用iot平台VERSION需要使用 xxx.yyy.zzz形式
21 function libfota_cb(result)
22 log.info("fota", "result", result)
23 -- fota成功
24 if result == 0 then
25 rtos.reboot() --如果还有其他事情要做,自行决定reboot的时机
26 end
27 end
29 --下方示例为合宙iot平台,地址:http://iot.openluat.com
30 libfota2.request(libfota_cb)
32 --如使用自建服务器,自行更换url
33 -- 对自定义服务器的要求是:
34 -- 若需要升级, 响应http 200, body为升级文件的内容
35 -- 若不需要升级, 响应300或以上的代码,务必注意
36 local opts = {url="http://xxxxxx.com/xxx/upgrade"}
37 -- opts的详细说明, 看后面的函数API文档
38 libfota2.request(libfota_cb, opts)
40 -- 若需要定时升级
41 -- 合宙iot平台
42 sys.timerLoopStart(libfota2.request, 4*3600*1000, libfota_cb)
43 -- 自建平台
44 sys.timerLoopStart(libfota2.request, 4*3600*1000, libfota_cb, opts)
47 local sys = require "sys"
48 require "sysplus"
50 local libfota2 = {}
53 local function fota_task(cbFnc, opts)
54 local ret = 0
55 local code, headers, body = http.request(opts.method, opts.url, opts.headers, opts.body, opts, opts.server_cert, opts.client_cert, opts.client_key, opts.client_password).wait()
56 -- log.info("http fota", code, headers, body)
57 if code == 200 or code == 206 then
58 if body == 0 then
59 ret = 4
60 else
61 ret = 0
62 end
63 elseif code == -4 then
64 ret = 1
65 elseif code == -5 then
66 ret = 3
67 else
68 log.info("fota", code, body)
69 ret = 4
70 end
71 cbFnc(ret)
72 end
74 --[[
75 fota升级
76 @api libfota.request(cbFnc, opts)
77 @table fota参数, 后面有详细描述
78 @function cbFnc 用户回调函数,回调函数的调用形式为:cbFnc(result) , 必须传
79 @return nil 无返回值
80 @usaga
82 -- opts参数说明, 所有参数都是可选的
83 -- 1. opts.url string 升级所需要的URL, 若使用合宙iot平台,则不需要填
84 -- 2. opts.version string 版本号, 默认是 BSP版本号.x.z格式
85 -- 3. opts.timeout int 请求超时时间, 默认300000毫秒,单位毫秒
86 -- 4. opts.project_key string 合宙IOT平台的项目key, 默认取全局变量PRODUCT_KEY. 自建服务器不用填
87 -- 5. opts.imei string 设备识别码, 默认取IMEI(Cat.1模块)或WLAN MAC地址(wifi模块)或MCU唯一ID
88 -- 6. opts.firmware_name string 固件名称,默认是 _G.PROJECT.. "_LuatOS-SoC_" .. rtos.bsp()
89 -- 7. opts.server_cert string 服务器证书, 默认不使用
90 -- 8. opts.client_cert string 客户端证书, 默认不使用
91 -- 9. opts.client_key string 客户端私钥, 默认不使用
92 -- 10. opts.client_password string 客户端私钥口令, 默认不使用
93 -- 11. opts.method string 请求方法, 默认是GET
94 -- 12. opts.headers table 额外添加的请求头,默认不需要
95 -- 13. opts.body string 额外添加的请求body,默认不需要
97 function libfota2.request(cbFnc, opts)
98 if not opts then
99 opts = {}
101 if fota then
102 opts.fota = true
103 else
104 os.remove("/update.bin")
105 opts.dst = "/update.bin"
107 if not cbFnc then
108 cbFnc = function() end
110 -- 处理URL
111 if not opts.url then
112 opts.url = "http://iot.openluat.com/api/site/firmware_upgrade"
114 if opts.url:sub(1, 4) ~= "###" and not opts.url_done then
115 -- 补齐project_key函数
116 if not opts.project_key then
117 opts.project_key = _G.PRODUCT_KEY
118 if not opts.project_key then
119 log.error("fota", "iot.openluat.com need PRODUCT_KEY!!!")
120 cbFnc(5)
121 return
124 -- 补齐version参数
125 if not opts.version then
126 local x,y,z = string.match(_G.VERSION,"(%d+).(%d+).(%d+)")
127 opts.version = rtos.version():sub(2) .. "." .. x.."."..z
129 -- 补齐firmware_name参数
130 if not opts.firmware_name then
131 opts.firmware_name = _G.PROJECT.. "_LuatOS-SoC_" .. rtos.bsp()
133 -- 补齐imei参数
134 if not opts.imei then
135 local imei = ""
136 if mobile then
137 imei = mobile.imei()
138 elseif wlan and wlan.getMac then
139 imei = wlan.getMac()
140 else
141 imei = mcu.unique_id():toHex()
143 opts.imei = imei
146 -- 然后拼接到最终的url里
147 opts.url = string.format("%s?imei=%s&project_key=%s&firmware_name=%s&version=%s", opts.url, opts.imei, opts.project_key, opts.firmware_name, opts.version)
148 else
149 opts.url = opts.url:sub(4)
150 opts.url_done = true
152 -- 处理method
153 if not opts.method then
154 opts.method = "GET"
156 log.info("fota.url", opts.method, opts.url)
157 log.info("fota.imei", opts.imei)
158 log.info("fota.project_key", opts.project_key)
159 log.info("fota.firmware_name", opts.firmware_name)
160 log.info("fota.version", opts.version)
161 sys.taskInit(fota_task, cbFnc, opts)
164 return libfota2