微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > 关于组网,退网的问题,求大牛指教,谢谢!

关于组网,退网的问题,求大牛指教,谢谢!

时间:10-02 整理:3721RD 点击:

组网问题:

1. 如果用zigbee做智能家居,一旦协调器被用户购入,那么,如果用户新增节点(可能来源于不同的商家),那新节点如何知道原有协调器的panid 等参数?(用户不可能再去买一套协调器 + ep吧)

有没有这么一种解决方法:所有的协调器烧写同一套代码,所有ep也烧写默认的panid等参数,那么只要用户购买了ep,直接拿回家,就能组网使用了。

但是,这种做法还有一个问题,就是邻网干扰,即无法控制EP加入自己家的网络,还是邻居的网络。即使加入自己的网络,也无法确认数据包会不会发送到邻网协调器中。

我现在的做法是:

       a.使用 NV_RESTORE 。 这样可以确保ep加入协调器后,保存所有的参数。(如果同时存在第二个相同代码的协调器,由于代码相同,不确定此时会不会串网,如果此时不串网,可以往下看 )
          
       b.修改MAC_SPEC_MIN_RECEIVER_SENSITIVITY       -97  改为   40 ,目的是: 只有ep 靠的很近,才可以入网。入网成功后,则不受该距离限制。

       

这么做的结果是:

       只有新EP靠近协调器时,才可以入网。并且一旦入网成功,所有的信息会通过  NV_RESTORE  存储到ep的flash。到目前为止,测试结果表明,不会加入到相同协调器代码的邻网。————————如果与您测试结果不同,敬请指导。

求大牛指导,这种方法可行性如何,有没有严重纰漏?


退网问题

       参考某些论坛的帖子,他们的做法是:
   //delete flash
   uint8 pg;
   for ( pg = OSAL_NV_PAGE_BEG; pg <= OSAL_NV_PAGE_END; pg++ )
   {
     HalFlashErase(pg);
   }

       这样可以上传所有:nv_restore 存储的信息。
       但是,我测试下来有问题,即删除之后,不能重新入网。

求大牛指教退网问题? 请问该如何操作,才能删除nv-restore存储的信息,又不影响二次入网。

1:zigbee里面一般很少指定PANID去加网,都是通过搜索网络来加网的,如果你们是成套卖产品的话,可以让end device搜到网络后,选择某个特定的网络,事先把协调器的IEEE可以写在节点处。等加网以后可以用NV保存信息了。

另外你的协调器一般情况下把permit join关闭,需要有设备加的时候通过按键等方式开启。这样别家的zigbee也不会随便加到你的网络里面去。

你说的b方法也是一种可行的方法,ZigBee Light Link中入网就是通过RSSI值来确定的

关于退网问题,不能简单把NV中的信息删除,而是要把节点的整个状态改变掉,改到和初始状态一样,在这个初始化的过程中,其中做的一件事情就把NV中的信息删除。

参考uint8 ZDOInitDevice( uint16 startDelay )函数

一个简单且非常有效的方法zgWriteStartupOptions(ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE);

我也为此问题困扰了好久,现在解决了,分享出来,希望对有同样需求的人有帮助。

1.协调器,路由节点,终端节点都开启了NV_INIT跟NV_RESTORE。

   zgWriteStartupOptions(ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE)函数对这三种设备是否都有效?执行此函数并重启后是否会将之前NV里的网络相关信息都删掉?

zigbee的网络层有个api可以让某一个节点退出网络

ZStatus_t NLME_LeaveReq( NLME_LeaveReq_t* req );

请求自己或者其他设备脱离网络,执行此函数不会导致其父节点重新分配设备地址。

req – 脱离请求数据结构:

typedef struct

{

  uint8* extAddr;

  uint8  removeChildren;

  uint8  rejoin;

  uint8  silent;

} NLME_LeaveReq_t;

extAddr -要脱离的设备的扩展地址

removeChildren -true 子设备也脱离,false只脱离当前设备。目前只能用false

rejoin -true 允许设备重新加入网络,false 不允许设备重新加入网络

silent – true will. false if the。

如果别家的协调器开着的情况下,是不是存在终端会连到别家的协调器上的可能?

请教一下这种情况如何解决呢?

谢谢。

我让她脱了里了那有这么加入该网络中呢

路由有这个权限吗

我做了个实验:

1.让终端节点以孤节点方式加入网络;在ZDApp.c中对全局变量devStartMode进行了初始化.

  • #if ( ZG_BUILD_RTRONLY_TYPE ) || ( ZG_BUILD_ENDDEVICE_TYPE ) 
  • // devStartModes_t devStartMode = MODE_JOIN;     // Assume joining 
  •   devStartModes_t devStartMode = MODE_RESUME; // if already "directly joined" 
  •                         // to parent. Set to make the device do an Orphan scan. 
  • #else       //当设备类型为协调器时 
  •   // Set the default to coodinator 
  •   devStartModes_t devStartMode = MODE_HARD; 
  • #endif 

2.先把终端从已经加入的路由上移除:

NLME_LeaveReq_t zaddr;       zaddr.extAddr=device_address;   

    zaddr.removeChildren=true;       zaddr.rejoin=true;       zaddr.silent=true;       ZStatus_t   zStatus_t=NLME_LeaveReq((NLME_LeaveReq_t *)&zaddr );       HalUARTWrite ( 0,(uint8 *)&zStatus_t, 1);

3 .终端加入新的路由节点:

  • uint8 device_address[8]={0x00,0x12,0x4B,0x00,0x03,0xA5,0x4C,0xDC}; 
  • byte  rfd_type = CAPINFO_DEVICETYPE_RFD;  //设置设备类型为精简版设备 
  • …… 
  • #if ( ZG_BUILD_COORDINATOR_TYPE )//如果是协调器则将终端加入网络中 
  •     NLME_DirectJoinRequest(device_address,rfd_type); 
  • #endif 

这样的实验结果是:能从路由1上移除该节点,但是就是加不上新的路由节点,这是为什么呢?

请各位大神帮忙看看

我试了把permit join关闭,这样终端节点掉电了后需要permit join打开才能重新入网。这样也很不方便啊

VV  终端设备回复原厂设置, 离开网络时,是否需要告知他的 父节点?

如何 告知,直接使用ZDOInitDevice(0)吗?

父节点如何感知 子节点 离开网络?

我在回复原厂设置中 使用了zstack 原本的code,离开网络时父节点没有感知到, 重新加入网络后,分配的短地址还是一样的

   NLME_LeaveReq_t leaveReq;
   
   //delete the user item
   osal_nv_delete( ZONE_CIEADDRESS_AND_ENROLL_INFO, NV_CIEADDR_LEN+NV_EXTDATA_LEN);
   
  // Set every field to 0
  osal_memset( &leaveReq, 0, sizeof( NLME_LeaveReq_t ) );
 
  // This will enable the device to rejoin the network after reset.
  leaveReq.rejoin = TRUE;
 
  // Set the NV startup option to force a "new" join. //3
  zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE | ZCD_STARTOPT_DEFAULT_CONFIG_STATE );    
 
  // Leave the network, and reset afterwards
  if ( NLME_LeaveReq( &leaveReq ) != ZSuccess )
  {
    // Couldn't send out leave; prepare to reset anyway
    ZDApp_LeaveReset( FALSE );
  }

 

协议栈里面是如何做到 是否同意加入呢? 难道他有自己的MAC黑名单。

请问 这条函数呢ZDP_MgmtLeaveReq

在HA 的规范中      回复原厂设置时候,好像两个都需要

Return to Factory Defaults
In support of a return to factory default capability, HA devices shall implement
the ZDO Management Leave server service. When invoked with a unicast address
and the DeviceAddress set to NULL=0x00000000, the device shall implement a
NWK Leave. When invoked with a broadcast address and the DeviceAddress set
to NULL=0x00000000, the device shall wait the broadcast timeout period to
allow the message to propagate through network, then the device shall implement
a NWK Leave. Prior to execution of the NWK Leave in either case, processing in
the device shall ensure all operating parameters are reset to allow a reset to factory
defaults.

你好!你这种方式根本就不行啊,我没开启nv_restore,但是按照你的方法把MAC_SPEC_MIN_RECEIVER_SENSITIVITY修改后,改为-20 根本就不行,该多远入网还是多远入网,请问你当时是怎么测试的。

permit join 只是针对未入网的节点,如果节点入网了,也加了NV功能,那节点即使掉电重启,不需要开permit join,你试验有问题!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top