This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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

组网问题:

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,你试验有问题!