您的位置:首頁   >  關于我們  >  新聞動態

                                                    大彩串口屏4G應用-OTA升級工程

                                                    發布人:大彩科技發布日期:2021-08-19



                                                    演示視頻


                                                    一、適合范圍


                                                    本文檔適合大彩PM系列串口屏產品使用。




                                                    二、開發環境版本


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

                                                    版本查看:

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

                                                    圖片

                                                    圖2-1軟件版本


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

                                                    圖片

                                                    圖2-2軟件版本


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

                                                    版本查看:

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

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





                                                    三、概述


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





                                                    四、參考資料


                                                     1  《LUA 腳本API V1.4》可通過以下鏈接下載物聯型開發包獲取:

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

                                                     2  《LUA基礎學習》可通過以下鏈接下載物聯型開發包獲取:

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

                                                     3  LUA腳本初學者可以通過下面鏈接進行學習。

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





                                                    五、教程實現


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

                                                    1. 準備工程素材;

                                                    2. 配置串口屏工程;






                                                    5.1 準備工程素材

                                                    5.1.1 準備工程素材

                                                    在實現例程前需要作以下3個準備:

                                                    1. 硬件平臺;

                                                    2. 軟件平臺;

                                                    3. UI素材;

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

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

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


                                                    5.1.2 軟件平臺

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

                                                    圖5-2下載軟件






                                                    5.2 配置串口屏工程

                                                    本文主要介紹以下2點:

                                                    (1) 畫面配置

                                                    (2) LUA編輯


                                                    5.2.1 畫面配置

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

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

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

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

                                                    圖5-3 畫面配置


                                                    5.2.2 LUA編輯

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

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

                                                    特別注意:使用OTA時,每次從云端下載數據最大不超過2048字節,每次寫入內存最大不超過512字節。

                                                    圖5-4 下載流程


                                                    1. 初始化

                                                    調用系統函數on_init()執行代碼如程序清單 1所示:


                                                    程序清單 1  初始化

                                                    --[[*******************************************************************
                                                    ** Function name:  on_init
                                                    ** Descriptions :  系統初始化時,執行此回調函數。
                                                    *******************************************************************--]]
                                                    function on_init()
                                                        ota_destroy()             --清楚ota內容
                                                        dofile('air724at.lua')  --加載 http.lua 文件
                                                        uart_set_baudrate3(115200)  --設置與4G模塊通訊的串口3的波特率為115200
                                                    
                                                        start_timer( timerId_init, timerout_init, 0, 1 )    --初始化定時器,部分內容延時一段時間在初始化
                                                    
                                                        air_set_callback(on_air_send_cb,on_air_resp_callback,on_air_log_cb)     --設置4G庫函數的命令發送函數,命令回調函數、調試信息打印函數
                                                    
                                                        air_hw_int()   --4G模塊初始化設置
                                                    end
                                                    
                                                    -- [[*******************************************************************
                                                    ** Function name:  on_timer
                                                    ** Descriptions :  定時器超時回到調函數。
                                                    ** @ timer_id    :  定時器ID
                                                    *******************************************************************--]]
                                                    function on_timer(timer_id)
                                                        on_air_timer(timer_id)          --4G庫函數的定時處理
                                                    
                                                        --延時解壓ota文件
                                                        if timer_id == timerId_ota_check_upgrade
                                                        then
                                                            air_log('timer_id == timerId_ota_check_upgrade')
                                                            ota_check_upgrade(1)        --檢查文件,并解壓,參數 1 表示升級后重啟
                                                    
                                                        --延時初始化的內容
                                                        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模塊-數據回調接口
                                                    ** @key           :  屏幕向4G模塊的發送請求
                                                    ** @value        :  4G模塊返回的數據
                                                    *******************************************************************--]]
                                                    function on_air_resp_callback(key, value)
                                                    
                                                        if value == nil
                                                        then 
                                                            return              --value為空時退出
                                                        end
                                                    
                                                        --*********************************************************************
                                                        --功能:    判斷 key
                                                        --          如果 key 為空,則退出函數。
                                                        --          因為 key 為空時,下方 string.find( key , ) 是不正確的使用。
                                                        --          以下key的處理必須不為空,
                                                        --*****************************************************************
                                                        if key == nil 
                                                        then
                                                            return
                                                        end
                                                    
                                                        ......
                                                    
                                                        --*******************************************************************
                                                        --條件:    4G初始化完成
                                                        --功能:    使用使用AT指令獲取信號強度和運營商。
                                                        --          使用 http get 請求天氣、北京時間。
                                                        --調用函數:at_cops_csq()
                                                        --函數功能:獲取信號強度和運營商
                                                        --調用函數:get_wea_and_time()
                                                        --函數功能:請求天氣、北京時間
                                                        --*******************************************************************
                                                        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
                                                    
                                                        --****************************************************************
                                                        --條件:    設置4G模塊波特率成功
                                                        --功能:    設置串口波特率為 921600 
                                                        --****************************************************************
                                                        if string.find(key,'+IPR=921600') ~= nil and
                                                        string.find(value,'OK') ~= nil 
                                                        then
                                                            uart_set_baudrate3(921600)
                                                        end
                                                    
                                                        --****************************************************************
                                                        --條件:    設置4G模塊波特率成功
                                                        --功能:    設置串口波特率為 115200 
                                                        --****************************************************************
                                                        if string.find(key,'+IPR=115200') ~= nil and
                                                        string.find(value,'OK') ~= nil 
                                                        then
                                                            uart_set_baudrate3(115200)
                                                        end
                                                    
                                                        --****************************************************************
                                                        --條件:    4G模塊返回運營商信息
                                                        --功能:    設置顯示運營商
                                                        --****************************************************************
                                                        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模塊返回信號強度信息
                                                        --功能:    設置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) --設置信號圖標顯示第1幀 
                                                            elseif my_csq>=12 and my_csq<=13 
                                                            then
                                                                set_value(screen_main, 1, 2) --設置信號圖標顯示第2幀 
                                                            elseif my_csq>=14 and my_csq<=15 
                                                            then
                                                                set_value( screen_main, 1, 3) --設置信號圖標顯示第3幀 
                                                            elseif my_csq>=16 
                                                            then
                                                                set_value( screen_main, 1, 4) --設置信號圖標顯示第4幀 
                                                            end
                                                        end
                                                    end
                                                    
                                                    --[[******************************************************************
                                                    ** Function name: on_uart_recv_data3
                                                    ** Descriptions : 接收串口3數據回調函數,連接4G模塊。
                                                    ******************************************************************--]]
                                                    function on_uart_recv_data3(packet)
                                                        --4G AT指令庫API
                                                        on_air_recv_data(packet)
                                                    end

                                                    核心API函數

                                                    1) dofile (filename)

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

                                                    • filename  : 文件


                                                    2) uart_set_baudrate3(speed)

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

                                                    • speed  : 通訊的波特率


                                                    3) on_air_recv_data(packet)

                                                    串口接收4G模塊的返回數據的回調。

                                                    • packet  : 形參為表,字節數據。


                                                    4) air_set_callback (on_air_send_cb,on_air_resp_callback,on_air_log_cb)

                                                    設置4G庫里的回調函數。形參類型為函數,參數依次為命令發送函數,命令回調函數、調試信息打印函數,可自定義函數名。

                                                    • on_air_send_cb:屏幕向4G模塊發送回調函數
                                                    • on_air_resp_callback :4G向屏幕返回數據回調函數
                                                    • on_air_log_cb:用戶調試信息回調函數調試


                                                    5) air_hw_int()

                                                    4G AT 指令的庫函數,初始化4G模塊


                                                    6) at_cops_csq()

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


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

                                                    屏幕向4G模塊發送AT指令

                                                    • sendstr:屏幕向4G模塊發送AT指令
                                                    • ackstr:4G模塊應答屏幕的請求
                                                    • timeou:應答超時
                                                    • retry:超時重發次數,可選
                                                    • callback:應答回調函數,可選

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


                                                    8) on_air_resp_callback(key, value)

                                                    4G應答屏幕回調函數:屏幕發送AT指令,4G應答后均會回調該函數,初始化設置:air_set_callback(on_air_send_cb,on_air_resp_callback,on_air_log_cb)。

                                                    • key:屏幕向4G模塊發送請求的AT指令
                                                    • value:4G模塊返回的數據


                                                    9) ota_destroy()

                                                    清楚上次寫在內存中的OTA數據。


                                                    相關AT指令:

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

                                                    1) 網絡數據是否激活: 

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

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


                                                    2)  獲取運營商:

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

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


                                                    3)  獲取信號值:

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

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

                                                     

                                                    2. HTTP下載

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

                                                    程序清單 2  HTTP下載

                                                    --[[******************************************************************
                                                    ** Function name : on_control_notify
                                                    ** Descriptions  : 系統回調函數,用戶通過觸摸修改控件后,執行此回調函數。
                                                    **                    點擊按鈕控件,修改文本控件、修改滑動條都會觸發此事件。
                                                    ** @ screen       : 控件觸發所在的頁面
                                                    ** @return        : 控件觸發的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)           --設置進度條可見
                                                                set_visiable( screen_updata, 7, 1)           --設置進度文本可見
                                                                set_visiable( screen_updata, 8, 1)           --設置文件大小文本可見
                                                    
                                                                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 : 計算當前寫入(下載)進度
                                                    ** @cur_process : 當前下載進度
                                                    ** @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下載返回標識
                                                    ** @value        : value,4G模塊屏幕  的應答數據 
                                                    ** @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內容
                                                            ota_init_addr = ota_init('0123456789abcdef',otafile_len,ota_addr)  --初始化OTA內存
                                                    
                                                            start_timer_download_speed(file_len)  --開始計算下載時間
                                                            set_text( screen_updata, 4, '')        --速度顯示為空
                                                    
                                                        elseif key=='data'                           --文件數據包
                                                        then
                                                            my_ota_write_filedata('',value,add_write,ota_init_addr)   --分段寫入數據
                                                    
                                                        elseif key=='finish'                        --下載結束
                                                        then
                                                            air_set_baudrate(115200)     --重新設置4G模塊和串口3波特率為115200
                                                            start_timer(timerId_ota_check_upgrade, timerout_ota_check_upgrade , 0, 1)  --定時執行ota_check_upgrade(1)
                                                    
                                                            ota_seek_ops = 0                        --寫的位置,計算下載進度
                                                            file_len           = 0                  --本次下載的文件長度
                                                    
                                                            set_visiable( screen_updata, 6, 0)      --設置進度條不可見
                                                            set_visiable( screen_updata, 7, 0)      --設置進度文本不可見
                                                            set_visiable( screen_updata, 8, 0)      --設置文件大小文本不可見
                                                            set_enable( screen_updata, 1, 1)
                                                    
                                                            local dl_sec,dl_speed = stop_timer_download_speed()     --停止下載計時,比返回總用時秒數,每秒下載速度
                                                            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             --重啟標志位
                                                            air_set_baudrate(115200)      --重新設置4G模塊和串口3波特率為115200
                                                            ota_destroy()                 --清楚ota內容
                                                    
                                                            set_text( screen_updata, 5, '下載超時,發生網絡錯誤,重新設置中...') --提示
                                                            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, '下載超時,發生網絡錯誤,重新設置中...')    --提示
                                                                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, '下載超時,發生網絡錯誤,重新設置中...') --提示
                                                                set_enable( screen_updata, 1, 1)
                                                    
                                                            end
                                                            ota_destroy()
                                                        end
                                                    end
                                                    
                                                    --[[*****************************************************************
                                                    ** Function name : my_ota_write_filedata
                                                    ** Descriptions  : ota數據分段寫入ota升級地址
                                                    ** @file         : 文件路徑
                                                    ** @data         : 待寫入的數據
                                                    ** @open_mode    : 打開文件的方式
                                                    ** @addr         : ota初始化地址
                                                    *****************************************************************--]]
                                                    function my_ota_write_filedata(file, data, open_mode,addr)
                                                    
                                                        local count     = 0     --每次寫的字節數
                                                        local write_cnt = 0     --‘data’數據一共需要寫的次數
                                                    
                                                        --獲取待寫入數據的長度和數據類型
                                                        local wrire_len, data_type = my_getdataLen_Type(data)
                                                    
                                                        local write_byte_Tb = {}
                                                    
                                                        if type(addr) == 'number'
                                                        then
                                                    
                                                            --數據長度大于0
                                                            if wrire_len > 0
                                                            then
                                                                --計算'@data'要寫多少次
                                                                write_cnt =  math.modf(wrire_len / ota_WriteOnceSize)
                                                                -- wrire_len 不是 ota_WriteOnceSize 的整數倍時,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
                                                                    --復位寫字節數組
                                                                    write_byte_Tb = {}
                                                    
                                                                    --計算本次寫的個數
                                                                    count = ota_WriteOnceSize
                                                                    if i == write_cnt
                                                                    then
                                                                        if wrire_len % ota_WriteOnceSize > 0
                                                                        then
                                                                            --最后一次寫入時,count為剩余數據的長度
                                                                            count = wrire_len % ota_WriteOnceSize
                                                    
                                                                        end
                                                                    end
                                                    
                                                                    --計算寫的位置
                                                                    ota_seek_ops = ota_seek_ops + count
                                                    
                                                                    --顯示當前寫入(下載)進度
                                                                    ota_http_download_process( ota_seek_ops )
                                                    
                                                                    my_uart_log('Lua_debug: cur write  -> '..i..'th / wrire count '..count..' rn')
                                                    
                                                                    --填充寫入flash的字節數組
                                                                    for j = 0, count - 1
                                                                    do
                                                                        if data_type == 'string'
                                                                        then
                                                                            --字符串類型,將每個字符轉換為字節數組
                                                                            write_byte_Tb[j - 1] = tonumber(string.byte(data, ((i - 1) * ota_WriteOnceSize + j), ((i - 1) * ota_WriteOnceSize + j)))
                                                    
                                                                        elseif data_type == 'table'
                                                                        then
                                                                            --數組類型,字節賦值
                                                                            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)         --寫數據到內存中
                                                                end
                                                            end
                                                        else
                                                    
                                                        end
                                                    end 

                                                    核心API函數

                                                    1) air_http_download(url,break_size,user_callback)

                                                    4G庫函數,HTTP下載文件。

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


                                                    2) on_ota_http_download_file_cb(key, value)

                                                    用戶自定義函數,HTTP下載回調函數。

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

                                                    - 若key = ‘dl_file_read_retry’,表示 HTTPACTION 查詢讀取數據超時。若超時,內部已經處理了3次重發數據請求。


                                                    3) my_ota_write_filedata(file, data, open_mode)

                                                    用戶自定義函數,寫文件。本例程,將4G HTTP下載返回的數據寫在內存中。

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

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


                                                    4) ota_destroy ( )

                                                    清除OTA數據:對0x800000地址寫入的數據清除。


                                                    5) ota_init (md5,filesize, addr)

                                                    視頻播放回調函數 

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

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


                                                    6) ota_write(writeTb)

                                                    OTA寫入,用戶調用ota_write(writeTb),將writeTb數據寫入到0x800000地址。

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


                                                    7) ota_check_upgrade(state)

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

                                                    • state:1,進入升級狀態。

                                                     

                                                    3. OTA升級

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

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

                                                    --[[**************************************************************
                                                    ** Function name:  on_timer
                                                    ** Descriptions:   定時器超時回調
                                                    ******************************************************************--]]
                                                    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)       --檢查文件,并解壓,參數 1 表示升級后重啟
                                                        end
                                                    
                                                    end
                                                    
                                                    --[[*******************************************************************
                                                    ** Function name: on_ota_progress
                                                    ** Descriptions : 解壓升級
                                                    ** @status      : 解壓狀態
                                                    ** @value       : 對于狀態的具體數值
                                                    **
                                                    ** @開始校驗
                                                    ** @status  =  1
                                                    ** @value   =  0
                                                    **
                                                    ** @校驗結果
                                                    ** @status  =  2
                                                    ** @value   =  0 ,失敗
                                                    **             1 ,成功
                                                    **
                                                    ** @開始解壓
                                                    ** @status  =  3
                                                    ** @value   =  0~100,解壓進度
                                                    **
                                                    ** @解壓結束
                                                    ** @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函數

                                                    1) ota_check_upgrade(state)

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

                                                    • state:1,進入升級狀態。

                                                     

                                                    2) on_ota_progress(status,value)

                                                    OTA校驗、解壓回調。當用戶ota_check_upgrade(state)函數后,會自動回到該API。

                                                    • status:狀態。1-校驗過程,2-校驗結果,3-解壓過程,4解壓結果
                                                    • value:處理結果。
                                                    當state = 1,value 固定為0;
                                                    當state = 2,0-校驗失敗,1-校驗成功;
                                                    當state = 3,0-~100,解壓進度;
                                                    當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量產向導


                                                    5-7拷貝到SD





                                                    免费人成在线观看69式 手机在线看片欧美亚洲a片 欧美成人免费全部 在线观看亚洲精品国产福利片 无码H黄动漫在线观看免费
                                                                                                      日本XXXXX片免费观看 www.seqing 永久免费无码日韩视频 娇小的学生videos16日本 久久国产免费观看精品3 亚洲色偷偷偷综合网另类小说 在线无码成本人视频动漫 久久久久国色AV免费看 十八禁啪啦拍动态图无遮挡 高H猛烈失禁潮喷无码视频 天堂网亚洲AV制服丝袜 丰满少妇一级A片日本 久久青草精品38国产 成在人线av无码免费看 超粉嫩00无码福利视频 在线播放免费人成视频在线观看 无码不卡A片免费视频 免费A片不打码在线观看 亚洲精品中文字幕 日本一级婬片A片免费手机版 东京热无码人妻系列综合网站 亚洲911精品 日韩毛片 情侣民宅偷拍高潮呻吟 媚药受不了中文字幕在线 亚洲人成电影在线观看天堂色 久久伊人精品青青草原vr 欧美人妻少妇精品视频专区 女人爽到高潮潮喷视频大全 好爽好深好硬高潮视频456 91精品资源免费观看 黄色小网站 一本在线 黄色网站在线播放 美女一进一出XX00试看 亚洲中文无码665566综合网 夜夜视频 一级A片自慰女人自慰看片 在教室里强奷美女班主任电影 国产成人综合色在线观看网站 西西人体午夜视频无码 女人寂寞偷人视频A级 久久精品免费观看国产 亚洲第一无码精品 黑人巨大精品欧美一区二区 国产α片免费观看在线人 欧美成人黄色视频 久久人人做人人玩人人妻精品, 日本一级婬片免费放 成+人+亚洲+综合天堂