关于组网,退网的问题,求大牛指教,谢谢!
组网问题:
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,你试验有问题!