TI Zigbee中協(xié)調(diào)器和其他設(shè)備固定PANID通信
最近一直在研究zigbee,因為有通過固定PANID通信的需求,因此做了大量的實驗,上了很多論壇,我想我必須總結(jié)一下,以免大家再走一遍我這樣的路。
非常感謝很多寫下技術(shù)文檔和在TI論壇上積極回復(fù)的工程師。
一. 通過配置文件設(shè)置PANID
最簡單的方式是修改
f8wConfig.cfg 中的-DZDAPP_CONFIG_PAN_ID
另外預(yù)定義NV_RESTORE和NV_INIT.
但有兩個問題:
1.當(dāng)協(xié)調(diào)器斷電之后,重新上電時,周圍已經(jīng)有另一協(xié)調(diào)器也是這個PANID,則設(shè)備無法與原協(xié)調(diào)器連接上。
2. 要更換PANID,只能重新修改f8wConfig.cfg
二. 代碼修改:
這是我的按鍵sw3的代碼,供大家參考,通信時,真正起作用的是 _NIB.nwkPanId。
當(dāng)附近有其他協(xié)調(diào)器時,其PANID會自動加1,而不會按照代碼設(shè)置的PANID進(jìn)行設(shè)置,即_NIB.nwkPanId=設(shè)置的PANID值+1;協(xié)調(diào)器組網(wǎng)之后,可以讀取_NIB.nwkPanId的值,以其他方式設(shè)置到路由器和終端設(shè)備。
if ( keys & HAL_KEY_SW_3 )
{
// set specific PANID
#if HOME_AUTO_SET_PANID
uint16 panID;
zb_ReadConfiguration( ZCD_NV_PANID, sizeof(uint16), &panID );
if(panIDSetValue==panID-1)
panIDSetValue=panID+1;
if(_NIB.nwkPanId != panIDSetValue||panID!=panIDSetValue){
panID=panIDSetValue;
panIDSetValue++;
if(panIDSetValue==0x3FFF)
panIDSetValue=0x0001;
//save the panid value for APP
osal_nv_write( ZD_NV_REMOTE_CONTROL_STUDYNUM,0, sizeof(uint16), &panIDSetValue );
//save the panid value for Zigbee Stack
zb_WriteConfiguration( ZCD_NV_PANID, sizeof(uint16), &panID );
_NIB.nwkPanId = panID;
NLME_UpdateNV(NWK_NV_NIB_ENABLE);
#ifdef LCD_SUPPORTED
HalLcdWriteStringValue("New PANID",panID,16, lcdLineCounter );
lcdLineCounter++;
lcdLineCounter=((lcdLineCounter%8)<3)?(3):(lcdLineCounter%8);
#endif
//for Router, can not connetct cordevice, after cordevice's PANID has modify
zgWriteStartupOptions(ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE);
SystemResetSoft();
}
#endif
}