最近一直在研究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
}