TI Zigbee中协调器和其他设备固定PANID通信,设置PANID

来源:互联网 发布:伟博安睡宝 知乎 编辑:程序博客网 时间:2024/06/05 19:28

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


0 0
原创粉丝点击