本文屬于裝糊涂的豬原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處作者
文中的Demo地址位于:https://github.com/ftc300
· DFU = Device Firmware Update (設(shè)備固件更新)
· OTA = Over The Air (空中升級(jí))
(wikipedia)用于智能硬件的升級(jí)足淆,包括軟件更新然评、固件更新和設(shè)備管理等功能农猬。起初赚爵,固件更新需要到設(shè)備廠商指服務(wù)中心進(jìn)行蜀撑。接收更新的另一種方法是將設(shè)備連入電腦端進(jìn)行升級(jí)看铆。但這兩種方法的缺點(diǎn)是很不方便徽鼎。因此,現(xiàn)在很多的移動(dòng)設(shè)備制造商和運(yùn)營(yíng)商已經(jīng)采納FOTA技術(shù)為設(shè)備進(jìn)行更新弹惦。如果移動(dòng)設(shè)備具有FOTA功能否淤,移動(dòng)設(shè)備制造商和運(yùn)營(yíng)商可以將新固件通過(guò)網(wǎng)絡(luò)向設(shè)備“推送”更新消息,這降低了固件更新的成本棠隐,提高了消費(fèi)者的滿意度石抡。
本次固件升級(jí)采用的是 Secure Device Firmware Update。
安全設(shè)備固件更新(DFU)服務(wù)公開了在設(shè)備上執(zhí)行設(shè)備固件更新的必要信息助泽。該服務(wù)是由北歐半導(dǎo)體公司定義的專有服務(wù)啰扛,用于演示nRF5設(shè)備上的典型設(shè)備固件更新。
首先要更改藍(lán)牙設(shè)別的狀態(tài)嗡贺,在藍(lán)牙的service的characteristic中寫入?yún)?shù)隐解,此時(shí)藍(lán)牙設(shè)備斷開,進(jìn)入Bootloader狀態(tài)诫睬,并且MAC地址發(fā)生變化煞茫,末尾+1(敲黑板)
然后重新連接設(shè)備設(shè)備出現(xiàn)如下兩個(gè)characteristic
DFU Control Point
下表列出了作為響應(yīng)的一部分發(fā)送的結(jié)果代碼:
傳輸init packet
DFU控制器首先檢查init數(shù)據(jù)包是否已經(jīng)成功傳輸。如果沒(méi)有摄凡,DFU控制器將檢查是否已部分傳輸续徽。如果一些數(shù)據(jù)已經(jīng)被轉(zhuǎn)移,傳輸將繼續(xù)架谎。否則炸宵,DFU控制器發(fā)送一個(gè)創(chuàng)建命令來(lái)創(chuàng)建一個(gè)新的數(shù)據(jù)對(duì)象,然后傳輸init包谷扣。當(dāng)初始包可用時(shí)土全,DFU控制器發(fā)出一個(gè)執(zhí)行命令來(lái)啟動(dòng)init包的驗(yàn)證。
傳輸firmware image
一個(gè)固件鏡像被分割成幾個(gè)連續(xù)傳輸?shù)臄?shù)據(jù)對(duì)象会涎。如果數(shù)據(jù)對(duì)象的傳輸失敗(例如裹匙,由于斷電),則可以繼續(xù)傳輸而不是重新啟動(dòng)末秃。因此概页,DFU控制器首先選擇所發(fā)送的最后一個(gè)數(shù)據(jù)對(duì)象,并檢查它是否完整和有效练慕。如果是惰匙,控制器將發(fā)出執(zhí)行命令技掏,然后繼續(xù)使用下一個(gè)數(shù)據(jù)對(duì)象進(jìn)行傳輸。否則项鬼,DFU控制器發(fā)送一個(gè)Create命令來(lái)創(chuàng)建一個(gè)新的數(shù)據(jù)對(duì)象(因此哑梳,如果這個(gè)數(shù)據(jù)對(duì)象的傳輸還沒(méi)有開始,或者接收到的數(shù)據(jù)被破壞了)绘盟,然后傳輸下一個(gè)數(shù)據(jù)對(duì)象鸠真。
當(dāng)所有數(shù)據(jù)包被傳輸時(shí),DFU控制器發(fā)出一個(gè)執(zhí)行命令來(lái)觸發(fā)實(shí)際固件更新龄毡。
DFU控制器負(fù)責(zé)跟蹤進(jìn)度吠卷。對(duì)每個(gè)Select命令的響應(yīng)包含關(guān)于最大對(duì)象大小、當(dāng)前偏移量和CRC的信息沦零。例如祭隔,如果圖像大小為10kb,最大對(duì)象大小為4 kB蠢终,則必須傳輸3個(gè)數(shù)據(jù)對(duì)象序攘。如果返回的偏移量是6kb,DFU控制器知道當(dāng)前對(duì)象是轉(zhuǎn)移的第二個(gè)對(duì)象,并且該對(duì)象沒(méi)有被完全傳輸寻拂。
Talk is cheap程奠,show you the code.
最近根據(jù)NordicSemiconductor的Android-DFU-Library寫的一個(gè)最簡(jiǎn)單的升級(jí)案例:
https://github.com/ftc300/DFU_Demo_With_NordicsemiLib
參考資料:
Library documentation
nordicsemi