一.基本通信接口:
 
Packet:提供了对message_t抽象数据类型的基本访问。这个接口的命令有:清空消息内容,获得消息的有效载荷区长度,获得消息有效载荷区的指针。

//tos/interfaces/Packet.nc:

#include

interface Packet {

command void clear(message_t* msg); //清空数据包,将msg的数据清空重新使用

command uint8_t payloadLength(message_t* msg); //返回信息负载的长度

command void setPayloadLength(message_t* msg, uint8_t len); //设置负载长度

command uint8_t maxPayloadLength(); //返回最大负载

command void* getPayload(message_t* msg, uint8_t len); //获取负载,len为需要的负载长度

}

Send:提供基本的自由地址的消息发送接口。这个接口提供的命令有:发送消息,取消未成功发出的消息。接口还提供了事件来指示一条消息是否成功发送。它也提供了一些便利的函数,来获得消息的最大有效载荷区长度以及消息有效载荷区的指针。

//tos/interfaces/Send.nc:

#include

#include

interface Send {

command error_t send(message_t* msg, uint8_t len); //设置发送数据包的负载长度

command error_t cancel(message_t* msg); //取消数据的传输

event void sendDone(message_t* msg, error_t error); //发送数据完成

command uint8_t maxPayloadLength(); //返回通讯层允许的最大负载长度

command void* getPayload(message_t* msg, uint8_t len); //获取负载

}

Receive:提供最基本的消息接收接口。这个接口提供了接收消息后的事件。它也提供了些命令,可以方便地获得消息的有效载荷区长度以及消息有效载荷区的指针。

//tos/interfaces/Receive.nc:

#include

#include

interface Receive {

event message_t* receive(message_t* msg, void* payload, uint8_t len);

}

PacketAcknowledgements:提供了一种机制来要求对每个信息包的确认。

//tos/interfaces/PacketAcknowledgements.nc:

interface PacketAcknowledgements {

async command error_t requestAck( message_t* msg ); //告诉协议,当要发送数据包时,使用同步的ACK

async command error_t noAck( message_t* msg ); //告诉协议,当要发送数据包时,不使用同步的ACK

async command bool wasAcked(message_t* msg); //判断传输的数据包是否为ACK

}

 
RadioTimeStamping:为无线电发射和接受提供时间标记信息。

//tos/interfaces/RadioTimeStamping.nc:

interface RadioTimeStamping

{

async event void transmittedSFD( uint16_t time, message_t* p_msg );

async event void receivedSFD( uint16_t time ); //开始接收帧的时间

}

 
 
二.活动消息接口:活动消息(active message, AM)实现多渠道访问无线电。
 
AMPacket:类似Packet,提供对message_t抽象数据类型的基本的AM访问。这个接口提供的命令有:获得节点的AM地址,AM信息包的目标地址以及AM信息包的类型。除此之外还有,设置AM信息包目标地址和类型,检查目标地址是否为本地节点。

//tos/interfaces/AMPacket.nc:

#include

#include

interface AMPacket {

command am_addr_t address();//返回AM栈中节点的AM地址

command am_addr_t destination(message_t* amsg);//返回AM数据包的目的地址的AM地址

command am_addr_t source(message_t* amsg);//返回AM数据包的源地址的AM地址

command void setDestination(message_t* amsg, am_addr_t addr);//设置AM数据包的目的地址的AM地址

command void setSource(message_t* amsg, am_addr_t addr);//设置AM数据包的源地址的AM地址

command bool isForMe(message_t* amsg);

command am_id_t type(message_t* amsg);//返回AM数据包的AM类型,也就是说数据包的类型

command void setType(message_t* amsg, am_id_t t);//设置包的类型

command am_group_t group(message_t* amsg);//获得AM数据包的AM组

command void setGroup(message_t* amsg, am_group_t grp);//设置AM数据包的AM组

command am_group_t localGroup();//返回本节点的AM组

}

 
AMSend:类似Send,提供了基本的活动消息发送接口。AMSend与Send之间的关键区别是,AMSend在其发送命令里带有AM目标地址参数。

//tos/interfaces/AMSend.nc:

#include

#include

#include

interface AMSend {

command error_t send(am_addr_t addr, message_t* msg, uint8_t len);//发送负载长度为len的数据,addr为发送地址

command error_t cancel(message_t* msg);//取消发送数据

event void sendDone(message_t* msg, error_t error);

command uint8_t maxPayloadLength();//返回通信层提供的最大负载长度

command void* getPayload(message_t* msg, uint8_t len);//获取负载

}

 
 
三.支持AM接口的组件:
 

AMReceiverC:提供支持以下的接口:ReceivePacketAMPacket

AMSenderC:提供支持以下的接口:AMSendPacketAMPacketAcks(即PacketAckowledgements)

AMSnooperC:提供支持以下的接口:ReceivePacketAMPacket,进行嗅探的组件功能,和组件AMReceiverC功能相同,用于接收数据。

AMSnoopingReceiverC:提供支持以下的接口:ReceivePacketAMPacket。与AMSnooperC组件比,多了一个ActiveMessageC.Receive[AMId]

ActiveMessageAddressC:本模块提供了一些指令可以用来获取和设置节点的AM地址。这个模块不是为一般用户提供的,它容易破坏网络栈,所以如果不清楚操作的情况下要避免使用它

 
 
所有的接口和组件使用了一个共同的消息缓冲抽象,称为message_t
 
 
 

TinyOS节点间通信相关接口和组件介绍的更多相关文章

  1. RAC 安装完成后 节点间通信不依赖于SSH

    RAC 安装完成后,想修改ssh 的端口.google了一下.原文https://community.oracle.com/thread/2444594?tstart=0 原文说的是11g,10g也好 ...

  2. elasticsearch节点间通信的基础transport

    在前一篇中我们分析了cluster的一些元素.接下来的章节会对cluster的运作机制做详细分析.本节先分析一些transport,它是cluster间通信的基础.它有两种实现,一种是基于netty实 ...

  3. 使用WebSocket帮助应用程序群集节点间通信

    [序列化message传输方式]两种方式都是转成二进制. 1.使用Java序列化器,ObjectXXXputStream 2.使用ByteBuffer.wrap(bytes). 在一个标准群集场景中, ...

  4. Blazor入门笔记(6)-组件间通信

    1.环境 VS2019 16.5.1.NET Core SDK 3.1.200Blazor WebAssembly Templates 3.2.0-preview2.20160.5 2.简介 在使用B ...

  5. react系列(三)组件间通信

    组件间通信 React的基本组件元素是一个个组件,组件之间可能存在关联.组合等关系.不同的组件之间,经常会发生数据传递或者交换,我们称之为组件间通信. 根据传递的复杂程度,可以分为三种情况: 父子间通 ...

  6. Angular : 响应式编程, 组件间通信, 表单

    Angular 响应式编程相关 ------------------------------------------------------------------------------------ ...

  7. vue之父子组件间通信实例讲解(props、$ref、$emit)

       组件间如何通信,也就成为了vue中重点知识了.这篇文章将会通过props.$ref和 $emit 这几个知识点,来讲解如何实现父子组件间通信. 组件是 vue.js 最强大的功能之一,而组件实例 ...

  8. BFT-SMaRt:用Java做节点间的可靠信道

    目录 一.引子 二.名词统一 1. 节点id 2. 节点 3. 本地节点 4. 配置域 5. TTP 6. 陌生域 三.节点服务类 四.节点通信系统概览 五.节点通信层准备 1. 创建socket服务 ...

  9. 集群节点间网络通信TIPC

    1. TIPC背景介绍 TIPC主要是用于集群网络环境之中,它这个协议有一些前提假设包括: 协议发送的大部分message都是直接到达目的地(无路由): message的传输时间都很短; messag ...

随机推荐

  1. 怎么使用 bat 使用日期时间重命名文件名

    d: rename A.txt "A%date:~0,4%-%date:~5,2%-%date:~8,2%_%time:~0,2%-%time:~3,2%-%time:~6,2%_backu ...

  2. log4net 存储到oracle 调试 Could not load type [log4net.Appender.OracleAppender]

    近期在弄webfrom oracle 调用 log4net 開始调试时不出数据,打开了log4net 自己的debug功能后发现: log4net: Logger [root] level set t ...

  3. 鼠标经过显示二级菜单的js特效

    本文章来给大家推荐一个不错的鼠标经过显示二级菜单js特效效果,有需要了解的朋友可以参考一下 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 T ...

  4. Animator根运动清除刚体速率问题测试

    在根运动打开时,施加AddForce,速率在后面几帧被清0了: 没有打开根运动AddForce的情况: unity论坛看了下,似乎有人遇到这个问题,而且无解.只能受力状态下关闭根运动 Q:Im wor ...

  5. win常用

    //base.Invoke((MethodInvoker)delegate() //{ // this.Close(); //});

  6. 基于epoll的简单的httpserver

    该httpserver已经能够处理并发连接,支持多个client并发訪问,每一个连接能够持续读写数据.当然.这仅仅是一个简单的学习样例.还有非常多bug,发表出来仅仅是希望大家能够互相学习.我也在不断 ...

  7. mongodb学习笔记之索引(转)

    一.索引基础:    MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令:    > db.test.ensureIndex({" ...

  8. CEdit 控制键盘操作

    写在前面的话:在工作中要实现这样一个功能,在一个树形控件中选择要发送消息的客户,添加到一个列表控件中,点击确定跳到一个信息发送页面如下图,在发送人编辑框中显示选择的客户,要实现的就是即允许用户删除用户 ...

  9. 請問 localtime() 為什麼不會造成 memory leak?

    http://www.programmer-club.com.tw/ShowSameTitleN/vc/22380.html ************************************* ...

  10. hadoop集群搭建namenode无法启动问题

    一定要确保机器名没有下划线和.等特殊字符 搞了好久,终于找到了是上面这个原因. 搭建好了,下一步就是调优喽!