TinyOS网络协议---分发路由协议

分发路由协议的主要目的是:通过一段时间使得网络中的所有节点的消息变量的一致。 分发协议要求在有链路连接的情况下保证某个消息变量值的一致性。

分发协议使用的接口:

DisseminationValue (t代表数据类型)。该接口的目的是为了使节点接受分发来的数据。通过get()命令获取分发数据。通过set(const t*)命令来改变当前变量的值,并帮助节点给变量配上初值。changed()触发改变节点变量值的事件。

DisseminationUpdate(t代表数据类型)。该接口的目的是产生分发的数据。通过唯一的命令函数change(t* ONE newVal);(t代表数据类型)来产生分发数据。

分发协议使用的接口均来自DisseminatorC(typedef t,dip_key_t key)组件,其中参数t,代表数据包的类型,大小必须包含单个message_t包,参数key,允许创建不同的DisseminatorC实例组件,类似于AM的标识号。且该键值一般由unique()函数生成。


分发协议举例:使用分发协议进行小数据的发送与接收,当节点接收到分发者发送的数据时点亮LED灯。具体内容如下:

分发协议的逻辑代码如下:

#include "Timer.h"
#include "MyDissemination.h"
module MyDisseminationC
{
	uses
	{
		interface Boot;
		interface Timer as Timer0;
		interface AMSend;
		interface Packet;
		interface SplitControl as RadioControl;
		interface StdControl as DisseminationControl;
		interface Receive;
		interface DisseminationValue as Value;
		interface DisseminationUpdate as Update;
	}
}

implementation
{
	uint16_t counter;
	message_t pkt;
	bool  busy=FALSE;

	task void ShowCounter()
	{
		if(counter&0x1)
			dbg("MyDisseminationC","Led0_ON\n");
		if(counter&0x2)
			dbg("MyDisseminationC","Led1_ON\n");
		if(counter&0x4)
			dbg("MyDisseminationC","Led2_ON\n");
	}
	event void Boot.booted()
	{
		call RadioControl.start();
	}

	event void RadioControl.startDone(error_t error)
	{
		if(error!=SUCCESS)
		{
			call RadioControl.start();
		}
		else
		{
			call DisseminationControl.start();
			counter=0;
			call Timer0.startPeriodic(250);
		}
	}

	event void RadioControl.stopDone(error_t result)
	{}
	event void Timer0.fired()
	{
		counter++;
		if(!busy)
		{
			fenfaMsg* bkt=(fenfaMsg*)(call Packet.getPayload(&pkt,sizeof(fenfaMsg)));
			call Update.change(&counter);
			bkt->nodeid=TOS_NODE_ID;
			bkt->num=counter;
			if(call AMSend.send(AM_BROADCAST_ADDR,&pkt,sizeof(fenfaMsg))==SUCCESS)
			{
				dbg("MyDisseminationC","Message Sending\n");
				busy=TRUE;
			}
		}
	}

	event void AMSend.sendDone(message_t* msg,error_t error)
	{
		dbg("MyDisseminationC","Led3ON\n");
		if(&pkt==msg)
			busy=FALSE;
	}

	event void Value.changed()
	{
		const uint16_t* newValue = call Value.get();
		counter = *newValue;
	}

	event message_t* Receive.receive(message_t* msg,void* payload,uint8_t len)
	{
		dbg("MyDisseminationC","Packet Received\n");
		if(len==sizeof(fenfaMsg))
		{
			fenfaMsg* tem = (fenfaMsg*)payload;
			counter = tem->num;
			post ShowCounter();
			
		}
		return msg;
	}
}
分发协议的配置文件代码如下:

#include "MyDissemination.h"
configuration MyDisseminationAppC
{}
implementation
{
	components MainC;
	components MyDisseminationC;
	components ActiveMessageC;
	components new DisseminatorC(uint16_t,0x2345) as Dis;
	components DisseminationC;
	components new AMSenderC(6);
	components new AMReceiverC(6);
	components new TimerMilliC() as Timer0;

	MyDisseminationC.Boot->MainC;
	MyDisseminationC.Timer0->Timer0;
	MyDisseminationC.AMSend->AMSenderC;
	MyDisseminationC.Receive->AMReceiverC;
	MyDisseminationC.Packet->ActiveMessageC;
	MyDisseminationC.RadioControl->ActiveMessageC;
	MyDisseminationC.DisseminationControl->DisseminationC;
	MyDisseminationC.Value->Dis;
	MyDisseminationC.Update->Dis;

}
另外在makefile文件中要添加drip库。

另,可以参考无线传感器网络操作系统TinyOS的266页的例程,通过源节点产生的消息分发给其余节点。更加理解分发协议的内容与作用。

你可能感兴趣的:(TinyOS操作系统)