Z-Stack協議棧有一個MAC定時器為操作系統提供計時。該定時器以每1ms為單位,更新系統的定時器事件鏈表。定時器事件鏈表如圖5所示,鏈表的每一個結點記錄了任務號(task_id),事件號(event_flag)與計時時間( timeout )和下一個結點地址(*next)。圖中ZCL_OTA_MT_READn定義為每個請求節點對應的事件號,Response Spacing即為節點請求的響應間隔,把兩者添加到鏈表當中。當計時時間減為0后,系統自動設定對應的事件號,從而使OTA服務器循環地向OTA應用控制臺索取鏡像塊數據,并向節點發送鏡像塊響應。
以下是OTA服務器處理鏡像頁請求的部分代碼段:
typedef struct
{
uint32 SeverfileOffset; //OTA服務器讀取鏡像的偏移量,與OTA客戶端的同步
afAddrType_t Psourceaddress; //OTA客戶端短地址
zclOTA_FileID_t FileID; //鏡像信息,包括鏡像類型,制造商ID與版本號
uint16 ResponseTime; //響應間隔時間
uint8 Length; //鏡像塊大小
uint8 Count; //鏡像頁計數
} zclOTA_Address_Index; //鏡像頁請求屬性結構體
zclOTA_Address_Index Address_index[]; //鏡像頁請求屬性結構體數組
if ( events & ZCL_OTA_MT_READn ) //處理OTA客戶端鏡像頁請求事件
{
ZStatus_t status = ZFailure; //初始化狀態值
Address_index[n].Count--; //自減鏡像頁計數變量
if(Address_index[n].SeverfileOffset 》= Imagesize) //判斷鏡像偏移量是否超出鏡像大小
{
return ( events ^ ZCL_OTA_MT_READn ); //如果超出直接退出事件處理
}
//OTA服務器根據OTA客戶端的鏡像頁請求信息,向應用控制臺索取鏡像塊數據
Status = MT_OtaFileReadReq(&(Address_index[n].Psourceaddress), &(Address_index[n].FileID), Address_index[n].Length, Address_index[n].SeverfileOffset);
if (status == ZSuccess) //假如索取成功,累加已請求的鏡像偏移量
{
Address_index[n].SeverfileOffset += Address_index[n].Length;
}
if(Address_index[n].Count 》 0) //判斷累計的請求鏡像塊大小是否超出鏡像頁大小
{
//假如沒超出,把該鏡像頁處理時間繼續添加到定時器鏈表,等待下一輪的處理
osal_start_timerEx(zclOTA_TaskID, ZCL_OTA_MT_READn,Address_index[n].ResponseTime);
}
//結束處理事件,并清除該事件號
return ( events ^ ZCL_OTA_MT_READn );
}
4. 驗證與分析
4. 1功能驗證
為了驗證OTA功能,在CC2530F256平臺上搭建一個小型樹狀網絡,并使用Packet Sniffer[13]對OTA更新時的節點進行抓包分析。如圖6(a)所示,四個傳感節點的當前固件并沒有添加溫度采集功能,所以溫度顯示為0;在新的固件中添加了溫度采集函數,用于驗證OTA更新成功。
對于某些特定應用,需要節點更新固件后能夠保持原來的網絡拓撲結構。內部Flash的NV區能夠保存節點的網絡信息,只要在工程添加NV_INIT與NV_RESTORE預編譯項,節點在掉電后還能恢復原來網絡信息。
對四個傳感節點進行OTA更新。如圖6(b)所示,OTA更新后,溫度采集功能成功添加,而且傳感節點的網絡短地址沒有發生變化,網絡拓撲結構保持完整,驗證了進行OTA鏡像升級過程中,并不會對NV區進行擦除,有利于節點網絡信息的恢復。
在OTA更新過程中,應用層的數據幀格式如圖7所示。OTA服務器被配置為路由器(0x06BC),對傳感節點(0x0002)進行點對點更新。第一條短幀是子路由向OTA服務器發送Image Block Request,應用層載荷從第4字節開始記錄了新鏡像的制造商ID(0x5678),鏡像類型(0x1234),版本號(0x00000002)和鏡像塊偏移量。最后1個字節記錄了每次傳送最大鏡像塊大小(OTA_MAX_MTU),默認為0x20,即為32字節。第二條長幀是OTA服務器發送的Image Block Response,載荷記錄格式與前者類似,并在最大鏡像塊大小字節后面附上32字節鏡像塊信息,從而完成一個鏡像塊傳輸周期。
評論
查看更多