TinyOs无线消息收发问题

最近两天在写nesc程序的时候,遇到了一个让我困扰了很长时间的问题,问题及解决方法如下。

问题:TinyOs 里提供了无线消息收发的组件,最常用的是GennericComm组件,该组件集成了

Send和Receive函数,其中Receive是个事件,当有无线数据报到达时,会触发Receive事件。

假设目前有3个节点,0,1,2 ,2 号节点要向0号节点发送数据包,中间经过1号节点。那么一号

节点的工作就是Receive到2号节点的数据包,然后再Send给0号。

1.一开始2号节点一直发送数据直到一批(10个报文)发送完,但这个时候0号节点没有任何反

应。经过检查以后发现1号节点的确接收到10个报文,但是却没有将这些报文全部转发出去。

然后我降低了2号节点的发送速率,发现1号节点既可以收到10个报文,同时也能将这十个报文

转发出去。

2.但这个时候问题又来了,虽然1号节点能正确运行,但是0号节点却收不到1号节点的任何数据

包。同样,2号节点也收不到1号节点的转发数据包。一开始还是以为是速率的问题,然后我就

试着降低转发速率,但发现毫无作用。有一点需要说明的是:一开始我的send函数是嵌套在

Receive事件里的。即,1号节点一旦收到数据包,将会直接在Receive事件里调用转发函数。

后来为了更方便的实现速率控制,我把send函数放在了定时器里,发现0号节点可以收到1号

节点的数据包。随后我又将速率调到很高,发现0号节点仍然能收到,这就很奇怪,说明了一

个问题:这根本不是速率的问题!

随后 ,我把send函数放在了一个task里,然后每次receive到数

据包的时候,post一个task。实验发现,不管转发有多快,10个

数据包可以全部被0号接收。通过这个实验,总结出一个很细小

的nesc无线收发的注意问题:Receive事件中一定不可以直接调用

send函数!!!这应该是无线收发组件GennericComm调度策略

造成的!


你可能感兴趣的:(TinyOs无线消息收发问题)