演示視頻
本文檔適合大彩PM系列串口屏產(chǎ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
本文主要將以下2點進行說明:
1. 準(zhǔn)備工程素材;
2. 配置串口屏工程;
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下載軟件
本文主要介紹以下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 = ‘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é)果。
3) refresh_screen()
刷新屏幕。
工程編譯成功后在輸出窗口會提示編譯成功,如圖5-5所示;
圖5-5編譯成功
在菜單欄中,文件→打開工程目錄,在‘dciot_build’目錄的‘private’拷貝到SD卡中,如圖5-6和圖5-7所示;把SD卡接上串口屏后重新上電,等到提示燒錄工程成功后,拔掉SD卡重新上電即可。
圖5-6量產(chǎn)向?qū)?/span>
圖5-7拷貝到SD卡