睡眠设备接收广播包。
协议栈:Z_stack 2.5.0 ZIGBEE pro
参数:终端 POLL_RATE=1000;协调器NWK_INDIRECT_MSG_TIMEOUT =14
测试实验1:在20个睡眠设备程序与1个协调器的网络中,协调器发送一个广播包,睡眠设备接收到广播包后作出回复。
测试结果:16个睡眠设备作出回复,并且它们在协调器AssociatedDevList的前16个位置中,后面的睡眠就无法接收到该广播包。
测试实验2:2个非睡眠设备先入网,然后20个睡眠设备再入网,协调器发送一个广播包,睡眠设备接收到广播包后作出回复。
测试结果:只有14个睡眠设备作出回复,并且它们在协调器AssociatedDevList的前16个位置中,后面的睡眠就无法接收到该广播包。
问题:为什么出现这问题?如何修改才能让所有AssociatedDevList表中的睡眠设备都能接收到广播包。
#define NWK_MAX_DATABUFS_TOTAL 12 // Total number of buffers这个值在你的程序里面设置为多少?
12个,但是这值,要是满的话,应该所有设备都收不到的。这个情况我抓包也看到过。
#define NWK_MAX_DATABUFS_TOTAL 24 效果和原来的一样
NWK_MAX_INDIRECT_MSG_MAX_PER
在你的协议栈里面是多少,有修改过吗?
测试过7 和14 效果一样。
这个变量和之前那个不一样,是指给每个设备buffer了多少个数据
// Maximum msgs to hold per associated device.
#define NWK_INDIRECT_MSG_MAX_PER 3
#define NWK_MAX_DATABUFS_TOTAL 12
#define NWK_INDIRECT_MSG_MAX_ALL \
(NWK_MAX_DATABUFS_TOTAL - NWK_INDIRECT_MSG_MAX_PER)
我把BUFF改大了,还是一样的效果。
期待更进一步的帮助。
YINGQI li 您好:
请问这个问题您最后是如何解决的?我现在遇到了相同的问题,只有处在关联表前面16个位置的RFD才能收到广播,期待您的回复!
VV:
请问这个帖子怎么破? 我现在测试结果和楼主描述一致,只有处在关联表前面16个位置的RFD可以收到广播,跟入网时间没什么关系。即便是后来才入网的RFD,如果处在了关联表前面16个位置,就可以收到广播,否则收不到。跟网络层的buffer数量应该是没什么关系! 怎么破,期望得到支持,谢谢!
@li guo2
你用的协议栈版本是哪个?
先上mesh1.0 ,后来换了Home1.2.2 ,都是这样的!
我猜想是网络层在给关联表中的节点发indirect广播时,用了一个0xFFFF来标记节点是否已经发送,当关联表中的index超过15时,程序返回的结果都是已经发送,于是只会给RFD发送一个空帧,通过抓包会看到没有payload的mac空帧。
如果我的猜想是正确的,那么在lib中把这个0xFFFF改成0xFFFFFFFF就可以把支持广播接收的RFD提升到32个,可惜我们得不到源码!
既然可以单播,那问题肯定不会在mac层;
基于以上猜测,现准备进一步验证之后抽空在zmac层对数据进行拦截,然后对nwk层的广播行为进行重定义;
在新的core出来之前只能这样应对了,对RFD进行单播的效率实在太低!
不知道在思路上是否有问题,或者VV您这里有更好的建议? O(∩_∩)O~