1.對工程設(shè)置NV_RESTORE = TRUE
2.使用如下代碼:
??pan_id?=?u16NewPanid;//你想要的ID ??_NIB.nwkPanId?=?u16NewPanid; ??//_NIB.nwkLogicalChannel?=?; ??NLME_UpdateNV(0x01); ??//HAL_SYSTEM_RESET(); ??SystemReset();
即可實現(xiàn)ZigBee終端切換PANID來連接不同PANID的協(xié)調(diào)器。
貌似下面這樣也可以實現(xiàn)同樣的功能:
/* ?*?Restore?network?memory?items?from?NV. ?*/ extern?byte?NLME_RestoreFromNV(?void?); /* ?*?Write?network?items?to?NV. ?*????????enables?-?bit?mask?of?items?to?save: ?*?????????????????????NWK_NV_NIB_ENABLE ?*?????????????????????NWK_NV_DEVICELIST_ENABLE ?*?????????????????????NWK_NV_BINDING_ENABLE ?*?????????????????????NWK_NV_ADDRMGR_ENABLE ?*/ void?NLME_UpdateNV(?byte?enables?); /*以上來自NWK的NLMEDE.h頭文件,但具體實現(xiàn)的代碼我沒找到*/ ???osal_nv_item_init(ZCD_NV_PANID?,?sizeof(uint16)?,?NULL);?? ??u8BackCode?=?osal_nv_write(?ZCD_NV_PANID?,?0?,?sizeof(uint16)?,?&pan_id);???//寫Flash中和PANID存儲有關(guān)的部分?? ?? ??if(u8BackCode?==?ZSUCCESS) ??{ ????NLME_UpdateNV(0x01);????//指示將網(wǎng)絡(luò)的相關(guān)信息寫入Flash中 ????HAL_SYSTEM_RESET();?????//重啟系統(tǒng)
???????NLME_RestoreFromNV();//重啟后才會啟用新的PAN_ID,不然只是修改了NV里面的數(shù)據(jù)。
? }
3.對于NV_RESTORE的壞處
加入這個宏定義好處肯定是有的,但是問題也來了,如果終端想加入別的協(xié)調(diào)器網(wǎng)絡(luò),既是PANID和頻道都一樣,
不管重啟多少次都不會加入新的協(xié)調(diào)器中,那該怎么辦呢?
其實TI考慮到這個問題了,下面是官方的說明
? application wants to delete the stored NV information It just needs to set the ZCD_NV_STARTUP_OPTION as explained below and do a reset.?
"If the application would like to force a "new" join, the application should set the ZCD_STARTOPT_DEFAULT_NETWORK_STATE bit in the ZCD_NV_STARTUP_OPTION NV item before calling this function. "New" join means to not restore the network state of the device. Use zgWriteStartupOptions() to set these options 。
zgWriteStartupOptions(ZG_STARTUP_SET,?ZCD_STARTOPT_DEFAULT_NETWORK_STATE);
zGlobals.c中有這兩個函數(shù),第二個就是上面所用的函數(shù)
uint8?zgReadStartupOptions(?void?)??//啟動時讀取ZCD_NV_STARTUP_OPTION的值 uint8?zgWriteStartupOptions(?uint8?action,?uint8?bitOptions?)??//修改ZCD_NV_STARTUP_OPTION的值
NV_INIT保存在nv的內(nèi)容主要是網(wǎng)絡(luò)或者節(jié)點的配置參數(shù),在節(jié)點運行中這些參數(shù)很少變化或者幾乎不會有變化。NV_INIT選項保存的所有參數(shù)可以在結(jié)構(gòu)體zgItemTable中查看到。
NV_RESTORE選項保存的內(nèi)容主要是節(jié)點運行過程中的狀態(tài)量,借助這個特性,節(jié)點在掉電或者復位之后不需要無線電通訊就可以恢復到之前的網(wǎng)絡(luò)連接狀態(tài)。NV_RESTORE保存的內(nèi)容主要有網(wǎng)絡(luò)層數(shù)據(jù)庫NIB、設(shè)備關(guān)聯(lián)表、綁定表、路由表等。
4.關(guān)于ZigBee組網(wǎng)的一些函數(shù):
zb_ReadConfiguration() zb_WriteConfiguration() zb_GetDeviceInfo()
這三個函數(shù)貌似在2.5的協(xié)議棧中已經(jīng)被封裝了,找不到了。
osal_nv_item_init() osal_nv_write() osal_nv_read()
這三個函數(shù)可以去初始、寫、讀ZigBee中NV中的數(shù)據(jù),NV中數(shù)據(jù)斷電不擦除