中文字幕天堂手机版-欧美一区二区色大片在线观看-丰满人妻视频一区二区三区-美女视频黄的免费的91

您的位置:首頁   >  關(guān)于我們  >  新聞動態(tài)

大彩串口屏4G應(yīng)用-OTA升級工程

發(fā)布人:大彩科技發(fā)布日期:2021-08-19



演示視頻


一、適合范圍


本文檔適合大彩PM系列串口屏產(chǎn)品使用。




二、開發(fā)環(huán)境版本


1. VisualTFT軟件版本:V3.0.1.1112及以上的版本。

版本查看:

1) 打開VisualTFT軟件啟動頁面如圖2-1軟件版本,右上角會顯示的軟件版本號;

圖片

圖2-1軟件版本


2) 打開VisualTFT,在軟件右下角可以查看軟件版本圖2-2軟件版本,最新版本可登錄http://gc086.com/進行下載。

圖片

圖2-2軟件版本


2. 串口屏硬件版本:M系列固件 >=V6.3.325.00。

版本查看:

1) 查看屏幕背面版本號貼紙;

2) VisualTFT與屏幕聯(lián)機成功后,右下角顯示的版本號。





三、概述


本例程,介紹4G的HTTP下載文件、OTA升級工程的方法。





四、參考資料


 1  《LUA 腳本API V1.4》可通過以下鏈接下載物聯(lián)型開發(fā)包獲取:

http:/gc086.com/index.php?s=/List/index/cid/19.html

 2  《LUA基礎(chǔ)學(xué)習(xí)》可通過以下鏈接下載物聯(lián)型開發(fā)包獲取:

http:/gc086.com/index.php?s=/List/index/cid/19.html

 3  LUA腳本初學(xué)者可以通過下面鏈接進行學(xué)習(xí)。

http://www.runoob.com/lua/lua-arrays.html





五、教程實現(xiàn)


本文主要將以下2點進行說明:

1. 準(zhǔn)備工程素材;

2. 配置串口屏工程;






5.1 準(zhǔn)備工程素材

5.1.1 準(zhǔn)備工程素材

在實現(xiàn)例程前需要作以下3個準(zhǔn)備:

1. 硬件平臺;

2. 軟件平臺;

3. UI素材;

該例程使用大彩M系列7寸串口屏DC80480M070_1111_0T為驗證開發(fā)平臺。如圖5-1所示:

圖5-1  M系列7寸串口屏

其他尺寸的串口屏均可借鑒此教程。


5.1.2 軟件平臺

使用大彩自主研發(fā)的上位機軟件VisualTFT配置工程,登錄http://gc086.com/下載。如圖5-2所示;

圖5-2下載軟件






5.2 配置串口屏工程

本文主要介紹以下2點:

(1) 畫面配置

(2) LUA編輯


5.2.1 畫面配置

在畫面ID0中,觸發(fā)下載、下載過程、4G信號值及運營商3部分組成。

觸發(fā)下載:3個按鈕控件,作為觸發(fā)下載條件。

  • 控件ID1為工程下載。
  • 下載過程:控件ID4~8作為下載過程的體現(xiàn):
  • 文本控件ID4用于顯示下載速度(min/Kb)
  • 文本控件ID5顯示下載信息
  • 進度條控件ID6為顯示下載進度
  • 文本控件ID7用于顯示下載進度百分比
  • 文本控件ID8顯示 ‘當(dāng)前已下載大小/總下載大小’,單位Kb
  • 4G信號和運營商:圖標(biāo)控件控件ID11作為信號顯示、文本控件ID10用于顯示運營商。畫面配置如圖5-3所示:
  • 串口屏固件版本:文本控件ID13用于顯示固件版本號。

注意:其他非關(guān)鍵控件不在一一介紹,下文不在累述

圖5-3 畫面配置


5.2.2 LUA編輯

本例程中,屏幕上電執(zhí)行初始化操作,如加載4G AT 指令的庫、初始化4G模塊、定時獲取運營商和信號值等。

當(dāng)用戶點擊工程、固件升級按鈕時,調(diào)用air_http_download()開始下載文件。在下載回調(diào)函數(shù)on_ota_http_download_file_cb()里進行數(shù)據(jù)存儲,顯示下載信息等。若該文件單次下載不完,會多次回調(diào)on_ota_http_download_file_cb()函數(shù),直至下載完畢,如圖5-4所示。

特別注意:使用OTA時,每次從云端下載數(shù)據(jù)最大不超過2048字節(jié),每次寫入內(nèi)存最大不超過512字節(jié)。

圖5-4 下載流程


1. 初始化

調(diào)用系統(tǒng)函數(shù)on_init()執(zhí)行代碼如程序清單 1所示:


程序清單 1  初始化

--[[*******************************************************************
** Function name:  on_init
** Descriptions :  系統(tǒng)初始化時,執(zhí)行此回調(diào)函數(shù)。
*******************************************************************--]]
function on_init()
    ota_destroy()             --清楚ota內(nèi)容
    dofile('air724at.lua')  --加載 http.lua 文件
    uart_set_baudrate3(115200)  --設(shè)置與4G模塊通訊的串口3的波特率為115200

    start_timer( timerId_init, timerout_init, 0, 1 )    --初始化定時器,部分內(nèi)容延時一段時間在初始化

    air_set_callback(on_air_send_cb,on_air_resp_callback,on_air_log_cb)     --設(shè)置4G庫函數(shù)的命令發(fā)送函數(shù),命令回調(diào)函數(shù)、調(diào)試信息打印函數(shù)

    air_hw_int()   --4G模塊初始化設(shè)置
end

-- [[*******************************************************************
** Function name:  on_timer
** Descriptions :  定時器超時回到調(diào)函數(shù)。
** @ timer_id    :  定時器ID
*******************************************************************--]]
function on_timer(timer_id)
    on_air_timer(timer_id)          --4G庫函數(shù)的定時處理

    --延時解壓ota文件
    if timer_id == timerId_ota_check_upgrade
    then
        air_log('timer_id == timerId_ota_check_upgrade')
        ota_check_upgrade(1)        --檢查文件,并解壓,參數(shù) 1 表示升級后重啟

    --延時初始化的內(nèi)容
    elseif timer_id == timerId_init
    then
        set_visiable( screen_updata, 6, 0)
    end
end

--[[*******************************************************************
** Function name : at_cops_csq
** Descriptions  : 獲取運營商信息、信號強度
** @return       : nil,無返回值
*******************************************************************--]]
function at_cops_csq()
    air_cmd_add('AT+COPS?','OK',1000) –獲取運營商
    air_cmd_add('AT+CSQ'  ,'OK',1000) –獲取信號
end

--[[*******************************************************************
** Function name:  on_air_resp_callback
** Descriptions :  4G模塊-數(shù)據(jù)回調(diào)接口
** @key           :  屏幕向4G模塊的發(fā)送請求
** @value        :  4G模塊返回的數(shù)據(jù)
*******************************************************************--]]
function on_air_resp_callback(key, value)

    if value == nil
    then 
        return              --value為空時退出
    end

    --*********************************************************************
    --功能:    判斷 key
    --          如果 key 為空,則退出函數(shù)。
    --          因為 key 為空時,下方 string.find( key , ) 是不正確的使用。
    --          以下key的處理必須不為空,
    --*****************************************************************
    if key == nil 
    then
        return
    end

    ......

    --*******************************************************************
    --條件:    4G初始化完成
    --功能:    使用使用AT指令獲取信號強度和運營商。
    --          使用 http get 請求天氣、北京時間。
    --調(diào)用函數(shù):at_cops_csq()
    --函數(shù)功能:獲取信號強度和運營商
    --調(diào)用函數(shù):get_wea_and_time()
    --函數(shù)功能:請求天氣、北京時間
    --*******************************************************************
    if string.find(key,'+SAPBR=1,1') ~= nil and string.find(value,'OK') ~= nil 
    then
        set_visiable( screen_updata, 16, 0 )      --畫面‘多媒體下載’的提示清空
        at_cops_csq()                                  --獲取信號強度、運營商
    end

    --****************************************************************
    --條件:    設(shè)置4G模塊波特率成功
    --功能:    設(shè)置串口波特率為 921600 
    --****************************************************************
    if string.find(key,'+IPR=921600') ~= nil and
    string.find(value,'OK') ~= nil 
    then
        uart_set_baudrate3(921600)
    end

    --****************************************************************
    --條件:    設(shè)置4G模塊波特率成功
    --功能:    設(shè)置串口波特率為 115200 
    --****************************************************************
    if string.find(key,'+IPR=115200') ~= nil and
    string.find(value,'OK') ~= nil 
    then
        uart_set_baudrate3(115200)
    end

    --****************************************************************
    --條件:    4G模塊返回運營商信息
    --功能:    設(shè)置顯示運營商
    --****************************************************************
    if string.find(key,'+COPS') ~= nil and string.find(value,'+COPS') ~= nil
    then
        --************************************************************
        --value    : +COPS: 0,2,"46000",7
        --要提取的值:46000
        --正則表達式: '+COPS:.*,.*,"(%d*)"'
        --************************************************************
        local regular_e = '+COPS:.*,.*,"(%d*)"'--正則表達式
        --獲取的值賦給 my_mobile_MCCMNC 
        local my_mobile_MCCMNC = string.match( value, regular_e )
        set_text( screen_main, 2, mobile_MCCMNC[my_mobile_MCCMNC])
    end

    --****************************************************************
    --條件:    4G模塊返回信號強度信息
    --功能:    設(shè)置4G模塊的信號等級
    --****************************************************************
    if string.find(key,'+CSQ')~=nil and string.find(value,'+CSQ')~=nil
    then
        --************************************************************
        --value    : +CSQ: 15,99
        --要提取的值:15
        --正則表達式: '+CSQ: (.*),.*' 
        --***********************************************************
        local regular_e = '+CSQ: (.*),.*' --正則表達式
        local my_csq = tonumber(string.match(value,regular_e))
        if my_csq<=11 
        then
            set_value( screen_main, 1, 1) --設(shè)置信號圖標(biāo)顯示第1幀 
        elseif my_csq>=12 and my_csq<=13 
        then
            set_value(screen_main, 1, 2) --設(shè)置信號圖標(biāo)顯示第2幀 
        elseif my_csq>=14 and my_csq<=15 
        then
            set_value( screen_main, 1, 3) --設(shè)置信號圖標(biāo)顯示第3幀 
        elseif my_csq>=16 
        then
            set_value( screen_main, 1, 4) --設(shè)置信號圖標(biāo)顯示第4幀 
        end
    end
end

--[[******************************************************************
** Function name: on_uart_recv_data3
** Descriptions : 接收串口3數(shù)據(jù)回調(diào)函數(shù),連接4G模塊。
******************************************************************--]]
function on_uart_recv_data3(packet)
    --4G AT指令庫API
    on_air_recv_data(packet)
end

核心API函數(shù)

1) dofile (filename)

加載文件:本例程中加載4G AT 指令的庫

  • filename  : 文件


2) uart_set_baudrate3(speed)

設(shè)置串口3的波特率:串口3為屏幕和4G模塊通訊的串口

  • speed  : 通訊的波特率


3) on_air_recv_data(packet)

串口接收4G模塊的返回數(shù)據(jù)的回調(diào)。

  • packet  : 形參為表,字節(jié)數(shù)據(jù)。


4) air_set_callback (on_air_send_cb,on_air_resp_callback,on_air_log_cb)

設(shè)置4G庫里的回調(diào)函數(shù)。形參類型為函數(shù),參數(shù)依次為命令發(fā)送函數(shù),命令回調(diào)函數(shù)、調(diào)試信息打印函數(shù),可自定義函數(shù)名。

  • on_air_send_cb:屏幕向4G模塊發(fā)送回調(diào)函數(shù)
  • on_air_resp_callback :4G向屏幕返回數(shù)據(jù)回調(diào)函數(shù)
  • on_air_log_cb:用戶調(diào)試信息回調(diào)函數(shù)調(diào)試


5) air_hw_int()

4G AT 指令的庫函數(shù),初始化4G模塊


6) at_cops_csq()

自定義封裝函數(shù),獲取運行商和信號值


7) air_cmd_add(sendstr,ackstr,timeout,retry,callback)

屏幕向4G模塊發(fā)送AT指令

  • sendstr:屏幕向4G模塊發(fā)送AT指令
  • ackstr:4G模塊應(yīng)答屏幕的請求
  • timeou:應(yīng)答超時
  • retry:超時重發(fā)次數(shù),可選
  • callback:應(yīng)答回調(diào)函數(shù),可選

注:如果沒有設(shè)置超時重發(fā)次數(shù),則超時時直接發(fā)送隊列中的下一條指令。


8) on_air_resp_callback(key, value)

4G應(yīng)答屏幕回調(diào)函數(shù):屏幕發(fā)送AT指令,4G應(yīng)答后均會回調(diào)該函數(shù),初始化設(shè)置:air_set_callback(on_air_send_cb,on_air_resp_callback,on_air_log_cb)。

  • key:屏幕向4G模塊發(fā)送請求的AT指令
  • value:4G模塊返回的數(shù)據(jù)


9) ota_destroy()

清楚上次寫在內(nèi)存中的OTA數(shù)據(jù)。


相關(guān)AT指令:

本例程中,涉及到獲取4G模塊初始化、運營商、信號值等AT交互指令回調(diào)的判斷,在on_air_resp_callback(key, value)回調(diào)函數(shù)中,判斷4G收發(fā)的相關(guān)AT指令,如下所示:

1) 網(wǎng)絡(luò)數(shù)據(jù)是否激活: 

屏幕發(fā)送:AT+SAPBR=1,1。在air_hw_int()函數(shù)里發(fā)送。

屏幕接收:OK。on_air_resp_callback(key, value)函數(shù)里執(zhí)行4G返回數(shù)據(jù)的判斷


2)  獲取運營商:

屏幕發(fā)送:AT+COPS?。在at_cops_csq()函數(shù)了發(fā)送。

屏幕接收:OK。on_air_resp_callback(key, value)函數(shù)里執(zhí)行4G返回數(shù)據(jù)的判斷


3)  獲取信號值:

屏幕發(fā)送:AT+CSQ。在at_cops_csq()函數(shù)了發(fā)送。

屏幕接收:OK。on_air_resp_callback(key, value)函數(shù)里執(zhí)行4G返回數(shù)據(jù)的判斷

 

2. HTTP下載

用戶點擊按鈕控件ID1,HTTP下載對應(yīng)的OTA文件。文件,每次向服務(wù)器讀取2048K大小文件,然后在下載回調(diào)函里,每次以512字節(jié)的數(shù)據(jù)寫入存儲地址,代碼如程序清單2所示:

程序清單 2  HTTP下載

--[[******************************************************************
** Function name : on_control_notify
** Descriptions  : 系統(tǒng)回調(diào)函數(shù),用戶通過觸摸修改控件后,執(zhí)行此回調(diào)函數(shù)。
**                    點擊按鈕控件,修改文本控件、修改滑動條都會觸發(fā)此事件。
** @ screen       : 控件觸發(fā)所在的頁面
** @return        : 控件觸發(fā)的ID
** @return        : 控件值
** @return        : nil,無返回值
******************************************************************--]]
function on_control_notify(screen,control,value)
    --*******************************************************************
    --位置:    ota升級
    --*******************************************************************
    if screen == screen_updata 
    then
        if control == 1 and value == 1
        then

            set_enable( screen_updata, 1, 0)

            set_value( screen_updata, 6, 0)
            set_text( screen_updata, 7, '')
            set_text( screen_updata, 8, '')
            set_text( screen_updata, 4, '')

            set_visiable( screen_updata, 6, 1)           --設(shè)置進度條可見
            set_visiable( screen_updata, 7, 1)           --設(shè)置進度文本可見
            set_visiable( screen_updata, 8, 1)           --設(shè)置文件大小文本可見

            file_len           = 0
            file_curt_dl_perct = 0

            air_set_baudrate(921600)

            --開始下載
            air_http_download(ota_HttpDownFile_URITb, 
                              ota_dlOnceSize,
                              on_ota_http_download_cb)
        end
    end
end

--[[*********************************************************************
** Function name: ota_http_download_process
** Descriptions : 計算當(dāng)前寫入(下載)進度
** @cur_process : 當(dāng)前下載進度
** @return       : nil, 無返回值
*********************************************************************--]]
function ota_http_download_process( cur_process )

    local allsize =  string.format('%0.2f', (file_len    / 1024))
    local cursize =  string.format('%0.2f', (cur_process / 1024))
    local file_curt_dl_perct = (cur_process/file_len)*100

    file_curt_dl_perct = string.format('%0.1f',file_curt_dl_perct)

    set_value(screen_updata, 6, file_curt_dl_perct)
    set_text(screen_updata , 7, '下載進度: '..file_curt_dl_perct..' %')
    set_text(screen_updata ,  8, '文件大小: '..cursize..' KB / '..allsize..' KB')
end

--[[*********************************************************************
** Function name: on_ota_http_download_cb
** Descriptions : 下載文件
** @key           : key, HTTP下載返回標(biāo)識
** @value        : value,4G模塊屏幕  的應(yīng)答數(shù)據(jù) 
** @return       : nil, 無返回值
*********************************************************************--]]
function on_ota_http_download_cb(key, value)

    if key=='data_len' 
    then
        local otafile_len = value               --獲取文件長度
        file_len = otafile_len

        ota_destroy()      --清楚ota內(nèi)容
        ota_init_addr = ota_init('0123456789abcdef',otafile_len,ota_addr)  --初始化OTA內(nèi)存

        start_timer_download_speed(file_len)  --開始計算下載時間
        set_text( screen_updata, 4, '')        --速度顯示為空

    elseif key=='data'                           --文件數(shù)據(jù)包
    then
        my_ota_write_filedata('',value,add_write,ota_init_addr)   --分段寫入數(shù)據(jù)

    elseif key=='finish'                        --下載結(jié)束
    then
        air_set_baudrate(115200)     --重新設(shè)置4G模塊和串口3波特率為115200
        start_timer(timerId_ota_check_upgrade, timerout_ota_check_upgrade , 0, 1)  --定時執(zhí)行ota_check_upgrade(1)

        ota_seek_ops = 0                        --寫的位置,計算下載進度
        file_len           = 0                  --本次下載的文件長度

        set_visiable( screen_updata, 6, 0)      --設(shè)置進度條不可見
        set_visiable( screen_updata, 7, 0)      --設(shè)置進度文本不可見
        set_visiable( screen_updata, 8, 0)      --設(shè)置文件大小文本不可見
        set_enable( screen_updata, 1, 1)

        local dl_sec,dl_speed = stop_timer_download_speed()     --停止下載計時,比返回總用時秒數(shù),每秒下載速度
        set_text(screen_updata,4,'下載速度:'.. string.format('%0.2f',dl_speed) ..'KB/s 總用時:'..dl_sec..'s ')

        set_text( screen_updata, 5, '文件等待校驗,請稍等...')
    elseif key=='timeout'             --下載超時
    then
        reset_4G()                    --重啟4G
        dl_reset_flag = 1             --重啟標(biāo)志位
        air_set_baudrate(115200)      --重新設(shè)置4G模塊和串口3波特率為115200
        ota_destroy()                 --清楚ota內(nèi)容

        set_text( screen_updata, 5, '下載超時,發(fā)生網(wǎng)絡(luò)錯誤,重新設(shè)置中...') --提示
        stop_timer_download_speed()       --停止下載計時
        set_enable( screen_updata, 1, 1)

    elseif key=='dl_file_read_retry'     -- HTTPREAD 重下
    then
        --*************************************************************
        --value:            retry: -1,601
        --要提取的值:       -1
        --                   601
        --正則表達式:       'retry: (%d*),(%d*)'
        --*************************************************************
        local httpread_retry=''
        local status=''
        local regular_e = 'retry: (.*),(%d*)'      --正則表達式
        local httpread_retry,status = string.match(value,regular_e)   --獲取的值賦給 
        if httpread_retry == '-1' and ( status == '408' or status == '601' or status == '603' )
        then
            reset_4G()
            dl_reset_flag = 1

            stop_timer_download_speed()      --停止下載計時
            set_text( screen_updata, 5, '下載超時,發(fā)生網(wǎng)絡(luò)錯誤,重新設(shè)置中...')    --提示
            set_enable( screen_updata, 1, 1)

        end
        ota_destroy()
    elseif key=='dl_file_head_retry'       -- HTTPHEAD 重下
    then
        --**************************************************************
        --value:            retry: -1,601
        --要提取的值:       -1
        --                   601
        --正則表達式:       'retry: (%d*),(%d*)'
        --**************************************************************
        local httphead_retry=''
        local status=''
        local regular_e = 'retry: (.*),(%d*)'      --正則表達式
        local httphead_retry,status = string.match(value,regular_e)            --獲取的值賦給 
        if httphead_retry == '-1' and ( status == '408' or status == '601' or status == '603' )
        then
            reset_4G()
            dl_reset_flag = 1

            stop_timer_download_speed()             --停止下載計時
            set_text( screen_updata, 5, '下載超時,發(fā)生網(wǎng)絡(luò)錯誤,重新設(shè)置中...') --提示
            set_enable( screen_updata, 1, 1)

        end
        ota_destroy()
    end
end

--[[*****************************************************************
** Function name : my_ota_write_filedata
** Descriptions  : ota數(shù)據(jù)分段寫入ota升級地址
** @file         : 文件路徑
** @data         : 待寫入的數(shù)據(jù)
** @open_mode    : 打開文件的方式
** @addr         : ota初始化地址
*****************************************************************--]]
function my_ota_write_filedata(file, data, open_mode,addr)

    local count     = 0     --每次寫的字節(jié)數(shù)
    local write_cnt = 0     --‘data’數(shù)據(jù)一共需要寫的次數(shù)

    --獲取待寫入數(shù)據(jù)的長度和數(shù)據(jù)類型
    local wrire_len, data_type = my_getdataLen_Type(data)

    local write_byte_Tb = {}

    if type(addr) == 'number'
    then

        --數(shù)據(jù)長度大于0
        if wrire_len > 0
        then
            --計算'@data'要寫多少次
            write_cnt =  math.modf(wrire_len / ota_WriteOnceSize)
            -- wrire_len 不是 ota_WriteOnceSize 的整數(shù)倍時,wrire_len = wrire_len + 1
            if wrire_len % ota_WriteOnceSize > 0
            then
                write_cnt = write_cnt + 1
            end
            my_uart_log('Lua_debug: need write allcnt -> '..write_cnt..' rn')


            for i = 1, write_cnt
            do
                --復(fù)位寫字節(jié)數(shù)組
                write_byte_Tb = {}

                --計算本次寫的個數(shù)
                count = ota_WriteOnceSize
                if i == write_cnt
                then
                    if wrire_len % ota_WriteOnceSize > 0
                    then
                        --最后一次寫入時,count為剩余數(shù)據(jù)的長度
                        count = wrire_len % ota_WriteOnceSize

                    end
                end

                --計算寫的位置
                ota_seek_ops = ota_seek_ops + count

                --顯示當(dāng)前寫入(下載)進度
                ota_http_download_process( ota_seek_ops )

                my_uart_log('Lua_debug: cur write  -> '..i..'th / wrire count '..count..' rn')

                --填充寫入flash的字節(jié)數(shù)組
                for j = 0, count - 1
                do
                    if data_type == 'string'
                    then
                        --字符串類型,將每個字符轉(zhuǎn)換為字節(jié)數(shù)組
                        write_byte_Tb[j - 1] = tonumber(string.byte(data, ((i - 1) * ota_WriteOnceSize + j), ((i - 1) * ota_WriteOnceSize + j)))

                    elseif data_type == 'table'
                    then
                        --數(shù)組類型,字節(jié)賦值
                        write_byte_Tb[j] = data[((i - 1) * ota_WriteOnceSize + j)]
                    end
                end

                if i == write_cnt
                then
                    if wrire_len % ota_WriteOnceSize > 0
                    then
                        for y=count,ota_WriteOnceSize-1 do
                            write_byte_Tb[y] = 0
                        end
                    end
                end

                ota_write(write_byte_Tb)         --寫數(shù)據(jù)到內(nèi)存中
            end
        end
    else

    end
end 

核心API函數(shù)

1) air_http_download(url,break_size,user_callback)

4G庫函數(shù),HTTP下載文件。

  • url:HTTP下載資源連接。
  • break_size:單次網(wǎng)絡(luò)下載的包大小,單位字節(jié)(BYTE),本例程中為7K。
  • user_callback:改形參是一個函數(shù)變量,HTTP下載應(yīng)答屏幕的回調(diào)函數(shù)。名稱可自定義命名,如本例程為on_http_download_file_cb。


2) on_ota_http_download_file_cb(key, value)

用戶自定義函數(shù),HTTP下載回調(diào)函數(shù)。

  • key:HTTP響應(yīng)數(shù)據(jù)類型
  • value:HTTP響應(yīng)的內(nèi)容
- 若key = ‘data_len’,表示HTTP下載的文件大?。籿alue 表示為文件大小,單位byte。
- 若key = ‘data’,表示HTTP響應(yīng)數(shù)據(jù)內(nèi)容;value為數(shù)據(jù)內(nèi)容,類型為字節(jié)數(shù)組,大小為air_http_download(url,break_size,user_callback)設(shè)置的break_size。
- 若key = ‘finish’,表示HTTP下載完成;value為文件總大小,單位byte
- 若key = ‘timeout’,表示HTTP下載超時。
- 若key = ‘dl_file_head_retry’,表示 HTTPACTION 查詢頭信息超時。若超時,內(nèi)部已經(jīng)處理了3次重發(fā)數(shù)據(jù)請求。

- 若key = ‘dl_file_read_retry’,表示 HTTPACTION 查詢讀取數(shù)據(jù)超時。若超時,內(nèi)部已經(jīng)處理了3次重發(fā)數(shù)據(jù)請求。


3) my_ota_write_filedata(file, data, open_mode)

用戶自定義函數(shù),寫文件。本例程,將4G HTTP下載返回的數(shù)據(jù)寫在內(nèi)存中。

  • file:存儲路徑,本例程中,為空。
  • data:存儲的數(shù)據(jù),類型可以是‘?dāng)?shù)組’或‘字符串’,本例程中,4G HTTP下載返回的數(shù)據(jù)類型是數(shù)組
  • open_mode:文件打開模式:本例程中,每次寫文件,將數(shù)據(jù)寫在文件尾。

注意:本文不再闡述文件讀寫的詳細(xì)說明,可參考相應(yīng)的資料,如《Lua應(yīng)用-文件讀寫V1.0.pdf》


4) ota_destroy ( )

清除OTA數(shù)據(jù):對0x800000地址寫入的數(shù)據(jù)清除。


5) ota_init (md5,filesize, addr)

視頻播放回調(diào)函數(shù) 

  • md5:字符串,固定為‘0123456789abcdef’
  • filesize:ota.bin文件的大小,單位:byte
  • addr:固定為0x800000(16進制)

如ota.bin文件大小為17542byte,則ota_init(‘0123456789abcdef’, 17542, 0x800000)。


6) ota_write(writeTb)

OTA寫入,用戶調(diào)用ota_write(writeTb),將writeTb數(shù)據(jù)寫入到0x800000地址。

  • writeTb:寫入字節(jié)數(shù)據(jù),寫入大小為2048 byte,不足2048byte補零。寫入該地址的數(shù)據(jù)掉電后不清除。


7) ota_check_upgrade(state)

ota.bin文件校驗、解壓。當(dāng)用戶將ota.bin文件傳輸完畢后,調(diào)用ota_check_upgrade(state)對ota.bin進行先校驗在解壓,解壓成功后即已經(jīng)升級完成,屏幕自動重啟。

  • state:1,進入升級狀態(tài)。

 

3. OTA升級

OTA文件下載完成,則調(diào)用ota_check_upgrade(1)開始進入校驗解壓過程,代碼如程序清單 3所示:

程序清單 3 文件校驗、解壓

--[[**************************************************************
** Function name:  on_timer
** Descriptions:   定時器超時回調(diào)
******************************************************************--]]
function on_timer(timer_id)

    ......
    --延時解壓ota文件
    if timer_id == timerId_ota_check_upgrade
    then
        air_log('timer_id == timerId_ota_check_upgrade')
        ota_check_upgrade(1)       --檢查文件,并解壓,參數(shù) 1 表示升級后重啟
    end

end

--[[*******************************************************************
** Function name: on_ota_progress
** Descriptions : 解壓升級
** @status      : 解壓狀態(tài)
** @value       : 對于狀態(tài)的具體數(shù)值
**
** @開始校驗
** @status  =  1
** @value   =  0
**
** @校驗結(jié)果
** @status  =  2
** @value   =  0 ,失敗
**             1 ,成功
**
** @開始解壓
** @status  =  3
** @value   =  0~100,解壓進度
**
** @解壓結(jié)束
** @status  =  4
** @value   =  0 ,失敗
**             1 ,成功
**
** @return      : nil, 無返回值
******************************************************************--]]
function on_ota_progress(status,value)

    if status == 1
    then
        set_text(screen_updata , 5, '開始校驗')
        set_value(screen_updata, 6, 0)
    elseif status == 2
    then
        if value == 0
        then
            set_text(screen_updata , 5, '校驗失敗,文件錯誤,請檢查下載文件')
        elseif value == 1
        then
            set_text(screen_updata , 5, '校驗成功')
        end
    elseif status == 3
    then
        set_value(screen_updata, 6, value)
        set_text(screen_updata , 5, '文件解壓進度: '..value..' %')
    elseif status == 4
    then
        if value == 0
        then
            set_text(screen_updata , 5, '解壓失敗')

        elseif value == 1
        then
            set_text(screen_updata , 5, '解壓成功')
            set_value(screen_updata, 6, 100)

        end
    end
    refresh_screen()                        --刷新畫面

end

核心API函數(shù)

1) ota_check_upgrade(state)

ota.bin文件校驗、解壓。當(dāng)用戶將ota.bin文件傳輸完畢后,調(diào)用ota_check_upgrade(state)對ota.bin進行先校驗在解壓,解壓成功后即已經(jīng)升級完成,屏幕自動重啟。

  • state:1,進入升級狀態(tài)。

 

2) on_ota_progress(status,value)

OTA校驗、解壓回調(diào)。當(dāng)用戶ota_check_upgrade(state)函數(shù)后,會自動回到該API。

  • status:狀態(tài)。1-校驗過程,2-校驗結(jié)果,3-解壓過程,4解壓結(jié)果
  • value:處理結(jié)果。
當(dāng)state = 1,value 固定為0;
當(dāng)state = 2,0-校驗失敗,1-校驗成功;
當(dāng)state = 3,0-~100,解壓進度;
當(dāng)state = 4,0-解壓失敗,1-解壓成功。

 

3) refresh_screen()

刷新屏幕。







5.3 下載工程

工程編譯成功后在輸出窗口會提示編譯成功,如圖5-5所示;

圖5-5編譯成功


在菜單欄中,文件→打開工程目錄,在‘dciot_build’目錄的‘private’拷貝到SD卡中,如圖5-6和圖5-7所示;把SD卡接上串口屏后重新上電,等到提示燒錄工程成功后,拔掉SD卡重新上電即可。

圖5-6量產(chǎn)向?qū)?/span>


5-7拷貝到SD