一.基本通信接口:
 
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. unity 获得父子节点

    与常识不同,unity中获得父子节点需要通过transform.即先获得父/子节点的transform,然后再通过父/子节点的transform获得父/子节点. 获得父节点gameObject: Ga ...

  2. angularJS核心原理

    一.angularJS优点和缺点 优点 1.1免去重复劳动-获取元素.给元素加事件.创建元素 1.2接管UI:angularJS根据数据创建UI元素,免去手工创建UI元素. 1.3自动同步:根据数据个 ...

  3. Memory Analyzer tool(MAT)分析内存泄漏---理解Retained Heap、Shallow Heap、GC Root

    Shallow Heap Size 指对象自身所占用的内存大小,不包含其引用的对象所占的内存大小. 1.数组类型 数组元素对象所占内存的大小总和. 2.非数组类型 对象与它所有的成员变量大小的总和.当 ...

  4. 第九章 搭建Hadoop 2.2.0版本HDFS的HA配置

    Hadoop中的NameNode好比是人的心脏,非常重要,绝对不可以停止工作.在hadoop1时代,只有一个NameNode.如果该NameNode数据丢失或者不能工作,那么整个集群就不能恢复了.这是 ...

  5. Java – Convert IP address to Decimal Number

    In this tutorial, we show you how to convert an IP address to its decimal equivalent in Java, and vi ...

  6. git 命令删除远程分支

    删除 服务器上的分支: git push origin :sxz 分支名 注意 origin 后面的空格:

  7. 基于js仿汽车之家2015新版焦点图代码

    今天给大家分享一款仿汽车之家2015新版焦点图代码.这是一款基于jQuery实现的适合电子商务网站或者企业产品展示功能特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: < ...

  8. 7款基于jquery的动画搜索框

    无论是电商网站,还是媒体网,还是个人博客,每个网站都有属于自己个性化的搜索框.今天小编给大家带来7款基于jquery的动画搜索框.每个搜索框都采用了动画效果,一起看下效果图吧. 在线预览   源码下载 ...

  9. DataTable 字段值为空的时候报错的解决

    在使用Datatable的时候,后台返回给前台的值会有空的时候,而这个时候,前台会报错,这里讲防治方法: $('#datatable1').DataTable( { ajax: { "url ...

  10. Android——FileOutputStream与openFileOutput()的区别分析【第一个用于文件存储,第二个用于SD卡存储】【转】

    本文实例分析了Android编程中FileOutputStream与openFileOutput()的区别.分享给大家供大家参考,具体如下: openFileOutput() 首先给大家介绍使用文件如 ...