天天看點

固件更新(DFU/OTA)

· DFU = Device Firmware Update (裝置固件更新)

· OTA = Over The Air (空中更新)

(wikipedia)用于智能硬體的更新,包括軟體更新、固件更新和裝置管理等功能。起初,固件更新需要到裝置廠商指服務中心進行。接收更新的另一種方法是将裝置連入電腦端進行更新。但這兩種方法的缺點是很不友善。是以,現在很多的移動裝置制造商和營運商已經采納FOTA技術為裝置進行更新。如果移動裝置具有FOTA功能,移動裝置制造商和營運商可以将新固件通過網絡向裝置“推送”更新消息,這降低了固件更新的成本,提高了消費者的滿意度。

本次固件更新采用的是 Secure Device Firmware Update。

安全裝置固件更新(DFU)服務公開了在裝置上執行裝置固件更新的必要資訊。該服務是由北歐半導體公司定義的專有服務,用于示範nRF5裝置上的典型裝置固件更新。

首先要更改藍牙設别的狀态,在藍牙的service的characteristic中寫入參數,此時藍牙裝置斷開,進入Bootloader狀态,并且MAC位址發生變化,末尾+1(敲黑闆)

固件更新(DFU/OTA)

model.png

然後重新連接配接裝置裝置出現如下兩個characteristic

固件更新(DFU/OTA)

servicechar.png

DFU Control Point

固件更新(DFU/OTA)

DFUControl.png

下表列出了作為響應的一部分發送的結果代碼:

固件更新(DFU/OTA)

resultcode.png

傳輸init packet

DFU控制器首先檢查init資料包是否已經成功傳輸。如果沒有,DFU控制器将檢查是否已部分傳輸。如果一些資料已經被轉移,傳輸将繼續。否則,DFU控制器發送一個建立指令來建立一個新的資料對象,然後傳輸init包。當初始包可用時,DFU控制器發出一個執行指令來啟動init包的驗證。

固件更新(DFU/OTA)

msc_inline_mscgraph_5.png

傳輸firmware image

一個固件鏡像被分割成幾個連續傳輸的資料對象。如果資料對象的傳輸失敗(例如,由于斷電),則可以繼續傳輸而不是重新啟動。是以,DFU控制器首先選擇所發送的最後一個資料對象,并檢查它是否完整和有效。如果是,控制器将發出執行指令,然後繼續使用下一個資料對象進行傳輸。否則,DFU控制器發送一個Create指令來建立一個新的資料對象(是以,如果這個資料對象的傳輸還沒有開始,或者接收到的資料被破壞了),然後傳輸下一個資料對象。

當所有資料包被傳輸時,DFU控制器發出一個執行指令來觸發實際固件更新。

DFU控制器負責跟蹤進度。對每個Select指令的響應包含關于最大對象大小、目前偏移量和CRC的資訊。例如,如果圖像大小為10kb,最大對象大小為4 kB,則必須傳輸3個資料對象。如果傳回的偏移量是6kb,DFU控制器知道目前對象是轉移的第二個對象,并且該對象沒有被完全傳輸。

固件更新(DFU/OTA)

msc_inline_mscgraph_6.png

Talk is cheap,show you the code.

最近根據NordicSemiconductor的Android-DFU-Library寫的一個最簡單的更新案例:

https://github.com/ftc300/DFU_Demo_With_NordicsemiLib

參考資料:

Library documentation

nordicsemi

作者:ftc300_carl

連結:https://www.jianshu.com/p/67ef0208d935

來源:簡書

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

DFU