移植到zigbee home 1.2.2 协议栈碰到的问题
我有一些智能家居很成熟的产品(市场上运行稳定) ,这些产品原来运行在2.5.1.a 协议栈上
最近老板要求移植到 zigbee home 1.2.2上面
移植后发现一个严重问题 路由设备有概率会删除他的enddevice 导致低功耗设备通信失效 (方向: enddevice 发给0x0000 是没有问题的,但是0x0000下发给enddevice就会有问题)
但是某些时候enddevice 要求长时间双向通信 比如OTA升级的时候
具体现象
终端节点无法 收到广播 他的父亲节点不转发给他
跟踪路由设备的关联表 发现 这个东西会被删除
0x0000 不认为有数据要发给终端节点
删除后,关联表 全表中是短地址是ffff
Ti 只提供了一个函数删除AssocRemove()
搜索所有的调用点 断点都没有停下
void ZDO_ProcessDeviceAnnce( zdoIncomingMsg_t *inMsg )
void ZDO_ProcessParentAnnce( zdoIncomingMsg_t *inMsg )
void ZDO_ProcessParentAnnceRsp( zdoIncomingMsg_t *inMsg )
汇编级调试发现调用点在 下面这个函数里面
Nwk_data_cnf_processing()//这个函数ti文档 与google都搜索不到
他的触发条件是 enddevice 进行了设备宣告(比如enddevice 断网了进行了rejoin) 0x0013(设备宣告),他的父节点收到了,但是 不是每次宣告父亲都会调用Nwk_data_cnf_processing
只要不发过设备宣告 enddevice都是可以双向通信的(不睡眠的时候)
但是父节点并没有在函数 ZDO_ProcessDeviceAnnce 执行走走到清除 关联表
而是在ZDO_ProcessDeviceAnnce 执行前首先执行到了Nwk_data_cnf_processing
之后enddevice都不能通信了
查阅了一下zigbee 2.5.1.a 到home 1.2.2的升级note 发现最可能的就是加了 child aging机制 但是这个是默认不启动的 而且就算启动也是4h 不轮询了才删除
调试了一下child aging 确实没有启动
请问大家都怎么解决这个问题的
@vv
zigbee home 1.2.2 还有个漏洞是 enddevice 的rejoin 在关闭加密的情况下
存在概率 很难入网
NV_RESTORE
NV_INIT
SECURE=0
xTC_LINKKEY_JOIN
NUM_DISC_ATTEMPTS=0
RFD_RCVC_ALWAYS_ON=FALSE
xZCL_EZMODE
配置是这样的
有这么多问题啊,我只把znp从2.5.1a升级到1.2.2了,感觉不到有明显的改善,并且占用了更大的Memory,
内存不够 你可以这么做
INT_HEAP_LEN=2810 改这个 稍微改小一点点 100个B 就出来了 我试验了一下不影响使用
mark,关注这个问题。
你好,
这个问题主要是因为在Z-Stack Home 1.2.2里面fix了下面这个改动所引起的。
- [6079] Improved handling of the situation where the original parent of a
sleeping End-Device misses the Device Announcement when the child changes
its parent. This provides faster recovery than waiting for Child Aging.
TI 刚刚发布了Z-Stack Home 1.2.2a版本,建议使用最新的版本就可以了,谢谢!
好 不过现在ti的东西要难下载 ,要什么审核 还要等几天 ,能否发个到百度网盘,谢谢 @VV
还有就是rejoin 加网困难 这个解决了没 新父节点 发了很多次 rejoin response 给他的孩子
孩子存在概率就是不加入 (关闭所有加密选项SECURE=0 xTC_LINKKEY_JOIN)
Rejoin问题到没有发现过。
建议你在注册申请的时候,填写真实的公司信息,然后用公司邮箱,审批比较快的。
@VV
Z-Stack Home 1.2.2a 也发现上面的情况。
开了 Child Aging 使用 Date request 的模式。
复现方法:
一个协调器, 下面有两个路由设备, 另外路由设备下有 4个终端设备(休眠的)。
间隔一段时间 ,将其中一个路由设备 断电, 使其终端设备 切换 路由设备 为父节点、
反复操作一段时间后, 出现以下3个问题:
1. 当两个路由设备都 上电的时候, 协调器发消息给 其中的一个终端设备, 消息经过路由1缓存起来,
但是 此时终端设备 data request是发给路由2.
于是导致了, 终端设备发消息给 协调器,协调器可以收到。
但是协调器发消息给终端设备, 发错父节点。终端设备获取不到消息。
2. 协调器发消息给终端设备, 终端设备收得到,
但 终端设备发消息经过路由设备 给协调器, 协调器MAC 回复ACK ,但应用层无法解析出来
3. 经过一段时间切换后, 终端设备只能在 将路由设备 作为 父节点 切换。
当两个路由设备 都断电时, 终端设备发出orphan notification 后 就一直入不了网(无法将 协调器作为 父节点 进行切换)
期间 发出的beacon request, 协调器也有 反馈beacon。
但就是无法 入网。
谢谢!