协调器重启,终端的父节点切换为路由,结果终端的短地址发生变化了。是正常的吗?如何修改能使短地址不改变呢?最新协议栈。
抓包过程:
终端F1AD(最新协议栈)在98行协调器重启重新组网加入路由3F32,107行发出announce短地址变为BD01。在470行终端又切换父节点到协调器短地址变回F1AD。
但是终端A1CC(老协议栈)在协调器重启后在178行加入路由节点,短地址就没有变化。
请问新协议栈要如何修改,使用的是最新1.2.2a zha sw的例程
user4381970:
抓包文件
user4381970:
回复 user4381970:
来人看看抓包数据啊
lemon:
回复 user4381970:
你是不是用的EZMODE?
user4381970:
回复 lemon:
没有使能ezmode
user4381970:
回复 lemon:
我看到最新协议栈ZDConfig_UpdateNodeDescriptor中不论是路由还是终端都初始化为 | CAPINFO_ALLOC_ADDR,这个位是1表示终端由父节点分配短地址,0表示终端字节保存短地址。
终端短地址变化是路由导致还是终端自己导致的呢?老版本协议栈终端初始化没有置1.
VV:
回复 user4381970:
是这个原因导致问题的,你可以看98行的Rejoin Request里面的, Allocate Address是1,所以父设备才会重新分配地址。
但是在新版本的协议栈,如果你的父设备也是新版本的,那就不会出现这个问题,因为在处理Rejoin Request的时候,就不会去关注关于Allocate Address这个位。
这个位主要用于第一次Associate Request的使用的。
你可以在Rejoin Request之前把这个bit去掉。
1)_NIB.CapabilityFlags=_NIB.CapabilityFlags&0x7F
2)NLME_ReJoinRequest,程序里面可以搜索在哪里调用
3)_NIB.CapabilityFlags=_NIB.CapabilityFlags|0x80
wei shi5:
回复 VV:
VV
是这个原因导致问题的,你可以看98行的Rejoin Request里面的, Allocate Address是1,所以父设备才会重新分配地址。
但是在新版本的协议栈,如果你的父设备也是新版本的,那就不会出现这个问题,因为在处理Rejoin Request的时候,就不会去关注关于Allocate Address这个位。
这个位主要用于第一次Associate Request的使用的。
你可以在Rejoin Request之前把这个bit去掉。
1)_NIB.CapabilityFlags=_NIB.CapabilityFlags&0x7F
2)NLME_ReJoinRequest,程序里面可以搜索在哪里调用
3)_NIB.CapabilityFlags=_NIB.CapabilityFlags|0x80
user4381970:
回复 wei shi5:
第一处是路由节点才会执行的代码。
第二处是rejoin模式执行的。也不明白是为了什么。既然是rejoin肯定是陪过网的设备了,没有陪过网的是join。既然陪过网的设备,什么情况会导致地址是无效的呢?如果无效地址则读取nv,如果读不到关联地址就随机生成一个,这样是不是地址就变化了呢?这样做的目的是为了解决一个已经入网的设备在重新入网出现问题的情况下依然能加入原来的网络而设计的吗?
user4381970:
回复 VV:
d第98行也没有什么啊?
全局只有一处使用NLME_ReJoinRequest,在case ZDO_NWK_DISC_CNF:里面。
你是说在NLME_ReJoinRequest之前手动把 Allocate Address的位置0吗?