我把 f8wConfig.cfg文件中
-DRFD_RCVC_ALWAYS_ON 设置为 TURE
这样当有群组或广播消息时,由于接收机是一直打开着的,终端就可以马上接收到该消息,
而不需要发送data.request到父节点查询是否有发送给自己的数据.这个方法虽然增加了
终端的功耗,但是能达到网络中多有设备接收到组播消息时能同时动作的效果....
但是我发现当我这样设置的后,使发送方与接收方中间放置一个路由器,并确保发送方信号
无法直接到达到发送端,问题就来了.(所有节点使用的配置文件都是同一个f8wConfig.cfg文件)
我发送组播消息,接收方能接收得到,但是发送单播 消息时,接收方却无法接收到了!
组播消息路由器不会保存,而是直接转发,所以终端就能接收的到数据.这很好理解.单播无法接收我猜想是由于上级路由虽然接收到了发送给子节点的消息但是他不是立即发送给终端的,而是由终端发送data.request命令给给该路由,路由器再转发该数据包给终端,
设置后用协议分析仪看了终端发送出来的数据包,发现终端确实没有发送data_request,所以导致了终端无法接收到单播数据.
看过了代码,
在文件ZDConfig.c中
可以看到在终端类型的节点功能描述域使能了
CAPINFO_RCVR_ON_IDLE
继续跟踪CAPINFO_RCVR_ON_IDLE
在函数
函数中有事件类型为
的分支.该分支中对节点功能域进行了判断和处理
-DRFD_RCVC_ALWAYS_ON 设置为 TURE
这样当有群组或广播消息时,由于接收机是一直打开着的,终端就可以马上接收到该消息,
而不需要发送data.request到父节点查询是否有发送给自己的数据.这个方法虽然增加了
终端的功耗,但是能达到网络中多有设备接收到组播消息时能同时动作的效果....
但是我发现当我这样设置的后,使发送方与接收方中间放置一个路由器,并确保发送方信号
无法直接到达到发送端,问题就来了.(所有节点使用的配置文件都是同一个f8wConfig.cfg文件)
我发送组播消息,接收方能接收得到,但是发送单播 消息时,接收方却无法接收到了!
组播消息路由器不会保存,而是直接转发,所以终端就能接收的到数据.这很好理解.单播无法接收我猜想是由于上级路由虽然接收到了发送给子节点的消息但是他不是立即发送给终端的,而是由终端发送data.request命令给给该路由,路由器再转发该数据包给终端,
设置后用协议分析仪看了终端发送出来的数据包,发现终端确实没有发送data_request,所以导致了终端无法接收到单播数据.
看过了代码,
在文件ZDConfig.c中

可以看到在终端类型的节点功能描述域使能了
CAPINFO_RCVR_ON_IDLE
继续跟踪CAPINFO_RCVR_ON_IDLE
在函数

函数中有事件类型为

的分支.该分支中对节点功能域进行了判断和处理

可以发现,由于CAPINFO_RCVR_ON_IDLE域的使能,终端设备的轮询功能都被关闭,
这就是导致终端没有发送 data_request的原因.
把该处的三个函数参数改为 f8wConfig.cfg 中规定的值即可.
这样发送给终端的单播数据就可以正常接收到了,到了这里貌似问题就解决了!
但是这还不是我的目的,在这里终端还是必须向父节点轮询才能接收到数据,但是我想能不能在路由器那里动动手脚,使得路由接收到了属于子节点的数据时不要缓存下来等子节点轮询后才发送数据给它,而是接收到子节点数据后马上能转发(因为终端设备的接收机是一直打开的,所以不会有终端接收不到的情况),这样,终端设备就无需轮询,而能马上接收到数据了!
只是现在路由器那边我还没有思路,不知道该怎么改,只好发帖请教各位大侠了!
ps:
刚试了5个节点,点对点可以收到数据的.
DRFD_RCVC_ALWAYS_ON 设置为 TURE
无polling
楼主是不是编译了"POWER_SAVING",如果编译了,就需要polling 才能收到命令了.