TinyOS通信遵循主动消息(Active Message,AM)通信模型,一般应用于并行分布式处理系统中。为了让主动消息机制更适合于传感器网络的需求,要求主动消息至少提供3中最基本的通信机制:带确认消息的消息传递、有明确的消息地址、消息分发。应用程序可以进一步增加其他通信机制以满足特定要求。
由于TInyOS不支持动态内存分配,所以在主动消息通信组件中保存一个固定尺寸而且预先分配好的缓存队列。TinyOS2.x 中每一个主动消息有一个16bit的目的地址和一个8bit的消息类型。消息结构为message_t,并且仍采用静态包缓冲区。message_t定义如下:
typedef nx_struct message_t{
nx_uint8_t header [sizeof(message_header_t)];
nx_uint8_t data[TOSH_DATA_LENGTH];
nx_uint8_t footer[sizeof(message_footer_t)];
nx_uint8_t metadata[message_metadata_t];
}message_t;
结构中,header、footer和metadata对用户不透明,组件不能直接访问结构的各域,所有缓冲区的访问必须通过接口AMPPackage和Packet实现。这些结构体必须是外部结构(nx_struct),并且他们所有的域必须是外部类型(nx_*)。
结构体中的data如下格式:
目标节点地址 | 链路层源地址 | 消息长度 | 网络组号 | AM类型 | 载荷区(有效数据) | |||||
2字节 | 2字节 | 1字节 | 1字节 | 1字节 | 最大28字节 | |||||
| | | | | | | | | …… | |
而在应用程序中,通常用payload指针指向有效数据段(载荷区)。在程序设计是,需要根据实际情况在模块文件中定义有效数据的格式,如:
TinyOS 2.x中提供了4个主动消息通信组件,即AMSenderC、AMReceiverC、AMSnooperC和AMSnoopingReceiverC。该四个组件中,后三者均提供了Receive、Packet和AMPacket三种接口,但也存在使用上的差异,主要体现在触发Receive.receive事件的机制上:
(1)AMReceiverC:当接收到具有相同的AM类型,并且目的地址是本地节点地址或广播地址的数据包时,触发(signal)AMReceiver.Receive.recive事件。
(2)AMSoonperC:当接收到具有相同的AM类型并且数据包的目的地址既不是本地节点地址也不是广播地址是,触发AMSoonper.Receive.receive事件
(3)AMSooperingReceiverC:当接收到具有相同的AM类型并且不管目的地址是什么都会触发AMSoonperingReceiverC.Receive.receive事件
TInyOS中最重要的组件之一就是无线通信组件,基于TInyOS的无线传感器应用程序多此阿勇支持多跳无线通信组件结构,如下图所示: