什么是OTA
OTA全稱Over-the-Air Technology,意為空中下載技術。是通過移動通信的空中接口實現對移動終端設備進行遠程管理的技術
OTA的出現
假如說一個公司的產品大批量出貨了,發現了一個偶發性的BUG。這意味著,所有賣出去的產品,都得退回來重新燒錄程序。這樣不切實際,影響用戶使用是一方面,召回設備的過程中所耗費的人力物力和時間成本對企業來講是一筆很大的開銷。
正是因為有這樣的問題存在,所以OTA技術應運而生, OTA升級是一種無線遠程固件升級技術,作用就是為了修改程序的bug,或者升級程序功能,像手機系統更新,還有就是我們現在很多車,也支持OTA固件升級。
以前單片機開發時,壓力特別大,產品一定要在大批量上市前,進行系統測試,保證
出去以后不能有問題。畢竟不能像電腦或者手機上的軟件那樣,功能有BUG,直接遠程升級就好了。以前單片機類的產品,大多數都不支持OTA升級,程序出現問題,就得讓客戶退回來改,后面隨著物聯網技術的發展,讓傳統硬件能夠接入互聯網,OTA升級才開始流行。其實OTA技術并沒有想象中的那么難以理解,在大家有一定單片機技術的基礎上還是很好接受和學習的。
OTA的認識
OTA升級,說簡單點,就是對我們單片機Flash里面的程序進行更新,就和我們用燒錄工具去更新程序一樣,只是燒錄方式,變成了我們先把程序(Bin文件)先上傳到服務器,然后由服務器給每個設備下發程序更新指令和數據。
OTA升級的兩種方式
方式1:
個方式將單片機的FLash分成了3塊,分別是BootLoader、程序塊A、程序塊B。BootLoader是引導程序,假設FLASH-A是應用程序(程序塊A),FLASH-B是備份程序區(程序塊B)。單片機上電后,先進入啟動程序bootLoader,然后根據bootLoader程序邏輯,再跳轉到程序
塊A或者B。程序塊A和程序塊B都是有效的程序,但同一時間,只能運行其中的一個,另外一塊作為備份塊。
假如當前程序運行的是A部分的代碼,那我們固件升級的時候,就升級程序塊B部分的代碼,如果程序B升級OK,則由bootLoader程序,指向程序塊B區的起始位置,下次程序重啟,則執行程序塊B。這種方式,需要單片機Flash的容量空間足夠大,應用的程序代碼不能超過Flash容量的50%,因為要存儲3個程序。
方式2:
這種方式Flash空間由2部分組成,分別是BootLoader和FIASH(程序區),但需要外掛Flash芯片,用來保存新下載的程序。有固件升級的時候,先把升級的固件下載保存到外掛的Flash中,下載的程序驗證OK后,由BootLoader將外部Flash中的固件更新到程序區,更新完跳轉執行。
服務器和MCU的通訊機制
固件升級的服務器和單片機的通訊機制很重要,如果通訊機制設計的不夠合理,會影響通
訊的穩定性。通訊機制這塊的設計,我大概分為通訊流程和協議設計兩部分,兩者是相輔相成的,協議設計越好,通訊流程就越簡單。
1.通訊流程:
首先,把要更新的固件上傳到云平臺,版本號要比原來的高。另外固件一般是bin格式文件。
如何生成bin 文件?
要生產bin 文件,需要在Keil按照下圖配置:
fromelf.exe --bin -o "$L@L.bin" "#L"
單片機定時查詢服務器的固件狀態,看是否有新的固件需要更新。
有新的固件,需要先獲取固件的版本,判斷是否比主機當前的版本號高,如果是,則更新固件。
同時,還會獲取最新固件的大小(字節的個數),數據包的個數,固件的校驗值等。
主機按照數據包的ID,向服務器獲取固件,每獲取一包數據就立即校驗數據,校驗通過,再獲取下一包的數據。所有固件都下載完成后,"需要對下載固件進行整體校驗,校驗通過,則說明下載的固件有效。
重啟設備,程序自動跳轉到啟動程序,更新程序區部分的固件,固件升級成功。
大致通訊流程設計好以后,我們還要設計一個
通訊協議:
OTA 固件升級協議:
OTA 固件升級,共包括兩部分:查詢是否有最新固件 獲取固件數據:
查詢服務器是否有新的固件版本 0x32 0x33
MCU發送->服務器
單片機程序設計
單片機要寫兩個程序,一個是bootLoader程序,一個是產品應用程序 (APP..)。
1.bootLoader程序
設備每次上電前,會先執行BootLoader程序該程序會判斷產品應用程序,是否需要更新,
更新完后,重新跳轉到新的產品應用程序執行,下面是跳轉代碼。
2.產品應用程序
主要是產品的功能。