Prechádzať zdrojové kódy

Air724配合iot平台请求升级文件传给101,demo

sunzhipeng 4 rokov pred
rodič
commit
205727aefa

+ 137 - 0
demo/ota/Air724_to_Air101/Air101/main.lua

@@ -0,0 +1,137 @@
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "101_UPDATE"
+VERSION = "0.0.1"
+
+-- ota流程就是把update.bin放在根目录(esp为"/spiffs/" 其余为"/"),重启后会自动升级.
+-- update.bin制作方法:luatools中点击生成量产文件,将 SOC量产及远程升级文件 目录中的XXX.ota文件更名为update.bin即可
+log.info("main", PROJECT, VERSION)
+
+-- sys库是标配
+_G.sys = require("sys")
+
+if wdt then
+    -- 添加硬狗防止程序卡死,在支持的设备上启用这个功能
+    wdt.init(15000) -- 初始化watchdog设置为15s
+    sys.timerLoopStart(wdt.feed, 10000) -- 10s喂一次狗
+end
+
+-- 本demo实现了一个简单的串口数据接收对101进行升级,未对同一串口的其他数据进行区分,仅供参考
+-- 注意!!!724串口电平为1.8V,Air101串口电平为3.3V,需要电平转换
+--[[
+    硬件连接
+    Air724UG        Air101
+
+    UART1_TX ------ U1_RX   (PB_07)
+
+    UART1_RX ------ U1_TX   (PB_06)
+
+    GND      ------ GND
+]]
+
+
+local updatePath = "/update.bin" -- 升级数据写入目录
+
+local uartid = 1 -- 根据实际设备选取不同的uartid
+
+-- 初始化
+local result = uart.setup(uartid, 115200, 8, 1)
+
+-- 收取数据会触发回调, 这里的"receive" 是固定值
+local updateSwitch -- 判断是否接收到了升级文件标识
+local checkUniqueId = true -- 等待触发升级
+local rdbuf = "" -- 一个串口数据临时缓存
+local totalSize, stepSize = 0, 0 -- 升级文件总长度和每次接收的升级文件长度
+local updateDataTb = {} -- 升级文件数据临时存放表
+sys.taskInit(function()
+    while true do
+        sys.wait(1000)
+        log.info("测试", checkUniqueId)
+    end
+end)
+local function clearRdbuf() rdbuf = "" end
+uart.on(uartid, "receive", function(id, len)
+    local s = ""
+    repeat
+        -- 如果是air302, len不可信, 传1024
+        -- s = uart.read(id, 1024)
+        s = uart.read(id, len)
+        if #s > 0 then -- #s 是取字符串的长度
+            -- 如果传输二进制/十六进制数据, 部分字符不可见, 不代表没收到
+            -- 关于收发hex值,请查阅 https://doc.openluat.com/article/583
+            sys.timerStopAll(clearRdbuf)
+            log.info("uart", "receive", id, #s, s)
+            if checkUniqueId then
+                rdbuf = rdbuf .. s
+                local h, t = string.find(rdbuf, "CHECK_UNIQUE_ID\r\n")
+                if h then
+                    checkUniqueId = false
+                    log.info("触发升级,将当前版本号、imei和bsp发送给Air724")
+                    uart.write(uartid,"###VER:" .. VERSION .. "BSP:" .. PROJECT.. "_LuatOS-SoC_"..string.upper(rtos.version().."_"..rtos.bsp()) .."IMEI:" .. mcu.unique_id():toHex() .. "&&&")
+                    rdbuf = rdbuf:sub(t + 1)
+                else
+                    rdbuf = rdbuf .. s
+                    sys.timerStart(clearRdbuf, 5000)
+                end
+            else
+                if not updateSwitch then
+                    rdbuf = rdbuf .. s
+                    -- 实现了一个简单的接收数据格式,724发来的升级文件开头有###和&&&的特殊字符,特殊字符中间带有升级文件总长度
+                    local h, t = string.find(rdbuf, "###%d+&&&")
+                    if h then
+                        totalSize = string.match(rdbuf, "###(%d+)&&&")
+                        totalSize = tonumber(totalSize)
+                        updateSwitch = true
+                        rdbuf = rdbuf:sub(t + 1)
+                        if rdbuf ~= "" then
+                            table.insert(updateDataTb, rdbuf)
+                            stepSize = stepSize + #rdbuf
+                        end
+                        rdbuf = ""
+                    else
+                        sys.timerStart(clearRdbuf, 5000)
+                    end
+                else
+                    if stepSize < totalSize then
+                        if stepSize + #s >= totalSize then
+                            table.insert(updateDataTb,
+                                         s:sub(1, totalSize - stepSize))
+                            stepSize = stepSize +
+                                           #s:sub(1, totalSize - stepSize)
+                            updateSwitch = false
+                            checkUniqueId = true
+                            sys.publish("UPDATE_RECV_END")
+                        else
+                            table.insert(updateDataTb, s)
+                            stepSize = stepSize + #s
+                        end
+                    elseif stepSize >= totalSize then
+                        table.insert(updateDataTb,
+                                     s:sub(1, stepSize - totalSize))
+                        -- s = s:sub(stepSize + 1)
+                        checkUniqueId = true
+                        updateSwitch = false
+                        sys.publish("UPDATE_RECV")
+                    end
+                end
+                log.info("uart recv", s)
+            end
+        end
+    until s == ""
+end)
+
+-- 订阅升级文件接收完成的消息,将升级文件写入/目录后,重启
+sys.subscribe("UPDATE_RECV_END", function()
+    -- 将接收的升级数据写入文件,然后重启
+    local file = io.open(updatePath, "wb")
+    file:write(table.concat(updateDataTb))
+    file:close()
+    log.info("重启")
+    rtos.reboot()
+end)
+
+-- 并非所有设备都支持sent事件
+uart.on(uartid, "sent", function(id) log.info("uart", "sent", id) end)
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 65 - 0
demo/ota/Air724_to_Air101/Air724/main.lua

@@ -0,0 +1,65 @@
+--必须在这个位置定义PROJECT和VERSION变量
+--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
+--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
+PROJECT = "101_UPDATE"
+VERSION = "1.0.0"
+
+--加载日志功能模块,并且设置日志输出等级
+--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
+require "log"
+LOG_LEVEL = log.LOGLEVEL_TRACE
+--[[
+如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
+如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
+1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
+2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
+]]
+--log.openTrace(true,1,115200)
+
+require "sys"
+
+require "net"
+--每1分钟查询一次GSM信号强度
+--每1分钟查询一次基站信息
+net.startQueryAll(60000, 60000)
+
+--此处关闭RNDIS网卡功能
+--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
+--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
+--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
+ril.request("AT+RNDISCALL=0,1")
+
+--加载控制台调试功能模块(此处代码配置的是uart2,波特率115200)
+--此功能模块不是必须的,根据项目需求决定是否加载
+--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
+--使用说明参考demo/console下的《console功能使用说明.docx》
+--require "console"
+--console.setup(2, 115200)
+
+--加载网络指示灯和LTE指示灯功能模块
+--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
+--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
+require "netLed"
+pmd.ldoset(2,pmd.LDO_VLCD)
+netLed.setup(true,pio.P0_1,pio.P0_4)
+--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
+--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
+--LTE指示灯功能模块中,配置的是注册上4G网络,灯就常亮,其余任何状态灯都会熄灭
+
+--加载错误日志管理功能模块【强烈建议打开此功能】
+--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
+require "errDump"
+errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
+
+--加载远程升级功能模块【强烈建议打开此功能,如果使用了阿里云的OTA功能,可以不打开此功能】
+--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
+--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
+--require "update"
+--update.request()
+
+--加载串口功能测试模块
+require "uartSentFile"
+
+--启动系统框架
+sys.init(0, 0)
+sys.run()

+ 100 - 0
demo/ota/Air724_to_Air101/Air724/uartSentFile.lua

@@ -0,0 +1,100 @@
+--- 模块功能:对101进行远程升级
+module(..., package.seeall)
+require "utils"
+require "pm"
+require "http"
+local PRODUCT_KEY = "icqZ0TNzOnBrZGuCueVPJFRQ4cXNfvFJ"
+-- 本demo实现了一个简单http请求升级文件,将升级文件从串口发送对101进行升级,仅供参考
+-- 注意!!!724串口电平为1.8V,Air101串口电平为3.3V,需要电平转换
+--[[
+    硬件连接
+    Air724UG        Air101
+
+    UART1_TX ------ U1_RX   (PB_07)
+
+    UART1_RX ------ U1_TX   (PB_06)
+
+    GND      ------ GND
+]]
+local function httpCbFnc(result, prompt, head, body)
+    log.info("result", result)
+    if result then
+        log.info("文件GET成功")
+        sys.publish("HTTP_GET_SUCCESS")
+    else
+        log.info("文件GET失败")
+    end
+end
+
+local uartID = 1
+local checkSwitch
+sys.taskInit(function()
+    uart.on(uartID, "sent", function() sys.publish("UART1_SENT101_OK") end)
+    uart.on(uartID, "receive", function() sys.publish("UART1_DATA_INCOMING") end)
+    uart.setup(uartID, 115200, 8, uart.PAR_NONE, uart.STOP_1, nil, 1)
+    local _, ver, imei, bsp = sys.waitUntil("HTTP_GET_START")
+    log.info("test", _, ver, imei, bsp)
+    local url =
+        "http://iot.openluat.com/api/site/firmware_upgrade?project_key=" ..
+            PRODUCT_KEY .. "&imei=" .. imei .. "&firmware_name=" .. bsp ..
+            "&version=" .. ver
+    http.request("GET", url, nil, nil, nil, 30000, httpCbFnc, "/lua/update.bin")
+    sys.waitUntil("HTTP_GET_SUCCESS")
+    local fileHandle = io.open("/lua/update.bin", "rb")
+    if not fileHandle then
+        log.error("open updateFile error")
+        return
+    end
+    local size = io.fileSize("/lua/update.bin")
+    log.info("打印大小", size)
+    pm.wake("UART1_SENT101")
+    uart.write(uartID, "###" .. size .. "&&&")
+    sys.waitUntil("UART1_SENT101_OK")
+    while true do
+        local data = fileHandle:read(1460)
+        if not data then break end
+        uart.write(uartID, data)
+        sys.waitUntil("UART1_SENT101_OK")
+    end
+
+    uart.close(uartID)
+    pm.sleep("UART1_SENT101")
+    fileHandle:close()
+    os.remove("/lua/update.bin")
+    checkSwitch = false
+end)
+local rdbuf = ""
+
+local function clearRdbuf() rdbuf = "" end
+
+local function proc(s)
+    rdbuf = rdbuf .. s
+    if not rdbuf:find("###VER:.+BSP:.+IMEI:.+&&&") then
+        sys.timerStart(clearRdbuf, 5000)
+    else
+        sys.timerStop(clearRdbuf)
+        local ver, bsp, imei = string.match(rdbuf,
+                                            "###VER:(.+)BSP:(.+)IMEI:(.+)&&&")
+        rdbuf = ""
+        if not checkSwitch then
+            checkSwitch = true
+            sys.publish("HTTP_GET_START", ver, imei, bsp)
+        end
+    end
+end
+sys.taskInit(function()
+    while true do
+        sys.waitUntil("UART1_DATA_INCOMING")
+        while true do
+            local s = uart.read(uartID, 8192)
+            if s and #s > 0 then
+                proc(s)
+            else
+                break
+            end
+        end
+    end
+end)
+
+-- 通知101要升级了,把unique_id发过来
+sys.timerStart(uart.write, 5000, uartID, "CHECK_UNIQUE_ID\r\n")