針對城鄉(xiāng)公交站牌顯示終端現(xiàn)場升級與維護困難的問題,提出了一種基于應用程序(IAP)技術的嵌入式系統(tǒng)遠程升級設計方案。
通過IAP技術配合改良過的遠程升級程序代替?zhèn)鹘y(tǒng)的現(xiàn)場燒寫調(diào)試,節(jié)約了奔赴現(xiàn)場調(diào)試的時間和成本。
針對遠程升級過程中被惡意攻擊、固件文件安全傳輸和可靠更新等安全性問題,提出利用分包校驗和設置臨時程序存儲區(qū)域的方法。
采用多服務器協(xié)同設計和嚴格權限管理方式,在服務器端通過權限管理來提升升級操作過程中的安全性。
引言
公共交通智能化是當前的大趨勢,安裝于村鎮(zhèn)道路旁的城鄉(xiāng)公交站牌顯示終端能實時顯示公交車到離站信息,到站距離,能極大地方便老百姓的公交出行。
傳統(tǒng)的升級方式通過預留的升級接口,通過切換BOOT模式使用串口或者JLINK接口來進行升級。
城鄉(xiāng)公交站牌安裝點位偏遠、分散,要實現(xiàn)設計缺陷修補、功能改進或
性能提升等需求,需要到現(xiàn)場拆卸設備,增加了維護成本。
本設計在利用城鄉(xiāng)公交站牌顯示終端現(xiàn)有的數(shù)據(jù)鏈路的基礎之上,通過協(xié)議的擴展,實現(xiàn)遠程升級固件。
提高了嵌入式設備的可維護性,并通過多服務器協(xié)同和嚴格的權限管理機制,提升了升級過程中的安全性,通過CRC加密算法和斷點續(xù)傳機制,保證了升級文件的可靠性。
系統(tǒng)組成
本文的升級系統(tǒng)由業(yè)務服務器、站牌顯示終端和升級服務器三部分組成。
業(yè)務服務器通過與站牌顯示終端的網(wǎng)絡連接,實現(xiàn)車輛到站的信息發(fā)布。
升級服務器在業(yè)務服務器發(fā)起升級請求后,響應站牌顯示終端的升級請求,實現(xiàn)升級數(shù)據(jù)的下發(fā)。
站牌顯示終端通過4G網(wǎng)絡登錄業(yè)務服務器,接收業(yè)務服務器下發(fā)的數(shù)據(jù)。
城鄉(xiāng)公交站牌顯示終端由微控制器(MCU GD32F103RB)、4G無線模塊(移遠EC20)、數(shù)碼管顯示驅動單元、實時時鐘、供電單元等組成,主要實現(xiàn)上報數(shù)據(jù)和接收服務器下發(fā)的車輛到離站信息等功能。
遠程升級功能是利用城鄉(xiāng)公交站牌顯示終端本身具有的網(wǎng)絡連接特性,通過網(wǎng)絡協(xié)議的接口,實現(xiàn)對站臺顯示終端的固件程序的更新:即更新微控制器MCU內(nèi)部的程序,以達到改進和提升的目的。
升級原理
GD32F330 MCU是兆易創(chuàng)新公司推出的基于Cortex?-M4內(nèi)核的微控制器[3][4],是國產(chǎn)自主品牌的32位MCU,集成外設單元豐富、性能強勁,成本低廉,是替換STM32系列MCU的首選。本文選擇GD32F330RB作為站牌顯示終端的主控MCU。
微處理器的編程方法通常有兩種:通過串口或者JTAG等接口進行編程的在系統(tǒng)編程(In System Programming,ISP)模式、在應用程序控制下的在應用編程(In Application Programming,IAP)模式。
本設計采用的預先將Bootloader程序+應用程序通過ISP方式下載到終端作為出廠程序,出廠后通過IAP模式對程序進行升級。IAP是用戶自己的程序在運行過程中對User Flash的部分區(qū)域進行燒寫。
本系統(tǒng)設計兩個程序[7]:Bootloader(引導加載程序)和App
(應用程序)。
Bootloader程序不執(zhí)行應用的功能操作,只負責在開機啟動時對系統(tǒng)升級數(shù)據(jù)進行更新,并跳轉到對應的App程序。App程序為用戶功能代碼,執(zhí)行用戶功能操作,同時接收服務器的升級請求,將升級代碼數(shù)據(jù)保存到特定的FLASH位置。
本系統(tǒng)中使用的芯片GD32F330RB的FLASH存儲器大小是128K,此空間被劃分為三大塊,分別用于運行Bootloader程序,APP程序1,APP程序2。
其中0x801E000-0x801f000這4K空間用來存儲升級相關的環(huán)境變量,包括升級標志、數(shù)據(jù)長度,CRC32校驗后的校驗碼。
Bootloader設計
Bootloader程序是本方案的核心,需要完成升級文件檢測,程序校驗,固件更新以及程序跳轉等功能。
- 微處理器上電/復位后,從地址0x08000000開始運行Bootloader程序。
- Bootloader完成MCU的初始化,然后從0x0801E0000地址讀取環(huán)境變量。
- 根據(jù)環(huán)境變量中的升級標志位來判斷是否要進入程序升級模式。
- 如果不需要升級,讀出需要跳轉的程序入口地址,執(zhí)行程序跳轉操作,跳轉到0x08002000(APP1程序區(qū))處開始運行應用APP;如需要升級,進入升級流程,進行APP代碼的更新。
- 在升級流程中,首先讀取環(huán)境變量中的待升級程序的長度和CRC校驗碼,并計算APP2程序區(qū)地址中的存儲的程序的CRC32的校驗碼,與環(huán)境變量中的校驗碼進行比對。
- 校驗碼一致的話進入FLASH操作流程,根據(jù)需要對FLASH扇區(qū)進行擦除,然后從APP2對應的位置讀取程序數(shù)據(jù)寫入APP1對應的位置;校驗碼不一致的話,放棄升級。
- 升級完成或者升級失敗均需要清除升級標志位,然后軟復位MCU。
通信協(xié)議設計
與服務器通信,需要遵循一定的通信協(xié)議,才能正確的進行升級。
當前采用的連接為TCP長連接,大端模式的網(wǎng)絡字節(jié)序。
為了降低遠程傳輸數(shù)據(jù)出現(xiàn)的誤碼率,把升級固件分成小包進行傳輸。
固件數(shù)據(jù)包的分包長度設置為256個字節(jié),分包序號表示當前傳輸?shù)臄?shù)據(jù)包是第幾包,當出現(xiàn)傳輸錯誤,幀數(shù)據(jù)包校驗不正確時,會返回錯誤接收的數(shù)據(jù)包給服務器,服務器根據(jù)分包序號,重新發(fā)送此分包的數(shù)據(jù)包。終端正確接收了當前的分包,給服務器返回成功的應答信號,服務器發(fā)送下一個分包,直到固件數(shù)據(jù)發(fā)送完成。
APP程序設計
APP程序是實現(xiàn)終端功能的軟件。本終端主要實現(xiàn)的功能是驗證登錄業(yè)務服務器和接收服務器下發(fā)的車輛到離站信息,并在終端的LED上顯示公交車到站距離。
將APP2區(qū)的(0x0801E0000)開始的一個扇區(qū)用來存儲升級程序的環(huán)境變量,主要包括程序是否需要升級的標志信息,程序的長度和校驗碼。
Bootloader運行后首先讀取0x0801E000位置處的環(huán)境變量,判斷程序是否需要升級。如果程序需要升級,就需要根據(jù)環(huán)境變量中存儲的程序長度和校驗碼對APP2區(qū)的程序進行CRC校驗,判斷校驗碼是否與環(huán)境變量中的校驗碼一致,若不一致,則清除環(huán)境變量的升級標志,跳轉到APP1執(zhí)行;若一致,則擦除APP1程序區(qū),將APP2程序區(qū)的數(shù)據(jù)拷貝到APP1程序區(qū)??截愅瓿梢院?,清除環(huán)境變量的升級標志,跳轉到APP1執(zhí)行。
固件升級的安全關系到整個系統(tǒng)的安全,因為固件將徹底的替換掉終端正在運行的程序。因此需要從幾個方面來保證新的固件程序在下發(fā)升級以后,不會造成系統(tǒng)的大面積崩潰。文章來源:http://www.zghlxwxcb.cn/news/detail-625142.html
- 需要保證新版本的固件程序經(jīng)過了嚴格的測試才能上傳到服務器中。
- 要保證新版本的固件程序擁有再次升級的功能,這樣在出現(xiàn)bug或者錯誤以后,可以迅速進行升級補救。
- 分批次進行升級,保證升級后的設備運行穩(wěn)定,無故障,再擴大升級規(guī)模。
- 固件程序升級過程中,實行Bin文件加密校驗,保證升級固件的完整性。
- 提升服務器的安全等級,防范內(nèi)部或者外部的惡意攻擊。
終端開機后主動連接業(yè)務服務器,根據(jù)JT808協(xié)議,完成終端設備的注冊、登錄,并根據(jù)業(yè)務服務器下發(fā)的到站信息數(shù)據(jù),在本地LED上實現(xiàn)車輛信息的顯示。如果需要對新版本的固件進行升級,則開啟升級流程。文章來源地址http://www.zghlxwxcb.cn/news/detail-625142.html
- 上傳經(jīng)過測試的BIN文件到業(yè)務服務器,業(yè)務服務器經(jīng)過身份認證和密碼驗證,確認上傳的文件合法,并將BIN文件同步到升級服務器。
- 在業(yè)務服務器的終端升級管理頁面選擇需要升級的終端設備,下發(fā)升級命令,根據(jù)待升級終端的數(shù)量來進行身份認證。在大于5臺待升級設備時,需要請求更高的系統(tǒng)權限。
- 業(yè)務服務器給終端發(fā)送升級命令,包括升級服務器的IP和端口號。
- 終端主動斷開與業(yè)務服務器的網(wǎng)絡連接,根據(jù)下發(fā)的升級服務器IP和端口號,連接升級服務器,連接過程中會發(fā)送自己的終端ID和當前版本給升級服務器。
- 升級服務器確認終端的版本與待升級的版本都正確無誤后,發(fā)送新版本固件程序的固件程序大小,CRC校驗碼等信息給終端,在收到終端的確認信息后,開始分包發(fā)生固件信息給終端。
- 終端根據(jù)協(xié)議,對分包數(shù)據(jù)進行校驗,校驗無誤后,寫入FLASH中對應的存儲區(qū)域。每接收完一幀數(shù)據(jù),向升級服務器請求下一段數(shù)據(jù)。若是校驗出錯或者是網(wǎng)絡中斷,將會重復請求未接收完成的數(shù)據(jù),實現(xiàn)斷點續(xù)傳。
- 在終端接收到最后一幀數(shù)據(jù)并寫入FLASH之后,將根據(jù)最開始接收到的程序大小和CRC校驗碼對整個寫入FLASH的程序文件進行校驗。在校驗無誤后,置位環(huán)境變量中升級標志。
- 斷開與升級服務器的網(wǎng)絡連接,軟復位MCU。復位后執(zhí)行Bootloader里的程序更新操作,程序更新后,跳轉到APP1程序運行。
- 終端連接業(yè)務服務器,在注冊登錄過程中上報自己的終端ID和版本信息。并根據(jù)業(yè)務服務器下發(fā)的命令實現(xiàn)基本功能。此時在業(yè)務服務器上將顯示當前終端的版本信息。
到了這里,關于面向城鄉(xiāng)公交的嵌入式系統(tǒng)遠程升級設計方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!