· DFU = Device Firmware Update (裝置固件更新)
· OTA = Over The Air (空中更新)
(wikipedia)用于智能硬體的更新,包括軟體更新、固件更新和裝置管理等功能。起初,固件更新需要到裝置廠商指服務中心進行。接收更新的另一種方法是将裝置連入電腦端進行更新。但這兩種方法的缺點是很不友善。是以,現在很多的移動裝置制造商和營運商已經采納FOTA技術為裝置進行更新。如果移動裝置具有FOTA功能,移動裝置制造商和營運商可以将新固件通過網絡向裝置“推送”更新消息,這降低了固件更新的成本,提高了消費者的滿意度。
本次固件更新采用的是 Secure Device Firmware Update。
安全裝置固件更新(DFU)服務公開了在裝置上執行裝置固件更新的必要資訊。該服務是由北歐半導體公司定義的專有服務,用于示範nRF5裝置上的典型裝置固件更新。
首先要更改藍牙設别的狀态,在藍牙的service的characteristic中寫入參數,此時藍牙裝置斷開,進入Bootloader狀态,并且MAC位址發生變化,末尾+1(敲黑闆)
model.png
然後重新連接配接裝置裝置出現如下兩個characteristic
servicechar.png
DFU Control Point
DFUControl.png
下表列出了作為響應的一部分發送的結果代碼:
resultcode.png
傳輸init packet
DFU控制器首先檢查init資料包是否已經成功傳輸。如果沒有,DFU控制器将檢查是否已部分傳輸。如果一些資料已經被轉移,傳輸将繼續。否則,DFU控制器發送一個建立指令來建立一個新的資料對象,然後傳輸init包。當初始包可用時,DFU控制器發出一個執行指令來啟動init包的驗證。
msc_inline_mscgraph_5.png
傳輸firmware image
一個固件鏡像被分割成幾個連續傳輸的資料對象。如果資料對象的傳輸失敗(例如,由于斷電),則可以繼續傳輸而不是重新啟動。是以,DFU控制器首先選擇所發送的最後一個資料對象,并檢查它是否完整和有效。如果是,控制器将發出執行指令,然後繼續使用下一個資料對象進行傳輸。否則,DFU控制器發送一個Create指令來建立一個新的資料對象(是以,如果這個資料對象的傳輸還沒有開始,或者接收到的資料被破壞了),然後傳輸下一個資料對象。
當所有資料包被傳輸時,DFU控制器發出一個執行指令來觸發實際固件更新。
DFU控制器負責跟蹤進度。對每個Select指令的響應包含關于最大對象大小、目前偏移量和CRC的資訊。例如,如果圖像大小為10kb,最大對象大小為4 kB,則必須傳輸3個資料對象。如果傳回的偏移量是6kb,DFU控制器知道目前對象是轉移的第二個對象,并且該對象沒有被完全傳輸。
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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。