TI Zigbee中協調器和其他設備固定PANID通信
最近一直在研究zigbee,因為有通過固定PANID通信的需求,因此做了大量的實驗,上了很多論壇,我想我必須總結一下,以免大家再走一遍我這樣的路。
非常感謝很多寫下技術文檔和在TI論壇上積極回復的工程師。
一. 通過配置文件設置PANID
最簡單的方式是修改
f8wConfig.cfg 中的-DZDAPP_CONFIG_PAN_ID
另外預定義NV_RESTORE和NV_INIT.
但有兩個問題:
1.當協調器斷電之后,重新上電時,周圍已經有另一協調器也是這個PANID,則設備無法與原協調器連接上。
2. 要更換PANID,只能重新修改f8wConfig.cfg
二. 代碼修改:
這是我的按鍵sw3的代碼,供大家參考,通信時,真正起作用的是 _NIB.nwkPanId。
當附近有其他協調器時,其PANID會自動加1,而不會按照代碼設置的PANID進行設置,即_NIB.nwkPanId=設置的PANID值+1;協調器組網之后,可以讀取_NIB.nwkPanId的值,以其他方式設置到路由器和終端設備。
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
}