Chinaunix首页 | 论坛 | 博客
  • 博客访问: 261074
  • 博文数量: 65
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 375
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-29 21:49
个人简介

Flowers_World

文章分类

全部博文(65)

文章存档

2017年(7)

2016年(38)

2015年(14)

2014年(6)

我的朋友

分类: 嵌入式

2016-03-04 08:55:33

低功耗无线传感器网络协议栈

 

Contiki系统内部集成了两种类型的无线传感器网络协议栈:uIP和Rime。uIP 是一个小型的符合RFC 规范的 TCP/IP 协议栈,使得 contiki 可以直接和Internet通信。uIP包含了IPv4 和 IPv6 两种协议栈版本,支持 TCP、UDP、ICMP等协议,但是编译时只能二选一,不可以同时使用。Rime 是一个轻量级为低功耗无线传感器网络设计的协议栈,该协议栈提供了大量的通信原语,能够实现从简单的一跳广播通信,到复杂的可靠多跳数据传输等通信功能。

下面这张图有待验证


 

uIP TCP/IP stack

uIP的TCP/IP协议栈是为能够在对内存具有严格要求的智能体和其他网络嵌入式设备运行而设计的。uIP的第一版在2001年9月发布,只有IPv4的通信功能,但在2008年思科系统扩充了uIP的IPv6功能,该uIPv6栈是第一个符合所有IPv6要求的。uIP的代码大小是几千字节,内存占用小于2KB。IPv6比IPv4要求略高。

uIP是一个简单好用的嵌入式网络协议栈,易于移植且消耗的内存空间较少,非常适合学习和使用。可以肯定的说uIP是嵌入式以太网学习的好起点,但不一定是终点。uIP的功能远不如LwIP强大,但两者并没有孰优孰劣之分,uIP和LwIP的作者同为Adam Dunkels,LwIP发布比uIP早一年的时间,uIP经过这几年的发展从IPV4迁移到IPV6,最终可以适用于无线传感网络。总的来说,uIP是一个很好的起点,学好uIP可以迁移到LwIP,也可以迁移到uIPV6。

Contiki 提供完整的 uIP 网络和低功耗无线网络协议栈。对于uIP 协议栈,一个轻量级的TCP/IP协议栈,实现了RFC定义的IPv4,IPv6。uIP很高效,只实现了协议要求的特性。例如整个协议栈只有一个buffer,用于接收和发送数据报。支持 IPv4 和 IPv6 两个版本,其中,IPv6 还包括 6Lowpan 适配层、ROLL RPL无线网络组网路由协议、CoRE/CoAP 应用层协议、还包括一些简化的 Web 工具,包括 Telnet、http 和 web 服务等。Contiki 还实现了无线传感器网络领域知名的MAC和路由层协议,其中 MAC 层包括 X-MAC、CX-MAC、NullMac、ContikiMAC、CSMA/CA、LPP 等,路由层包括 AODV、RPL等。

Application API

这里有两种方法使用uIP协议栈写程序:

·raw API:uIPraw API很适合实现一个简单的应用,例如一个简单的’echo’ server可以监听一些TCP端口并且将它收到的每个数据发送回去。然而当实现一个全功能的程序时编码变得越来越复杂,或者当多个程序需要共同使用时。甚至TCP连接状态机都有些烦人。

·protosocket API:protosocketlibrary利用 protothread library,提供一个更灵活的方式编写TCP/IP程序。这个库提供了一个类似于标准BSD sockets的接口,并允许在一个进程中编写程序。

Lower Layers

拥有一个有效的TCP/IP协议栈并且某些程序可以运行在其上当然很好,但是还不够。uIP协议栈要求一个更低的层(根据OSI模型)为了和peers通讯。我们将讨论两种类型的peers。

·节点(nodes):节点间通信是由无线连接实现的。uIP协议栈需要能够发送和接受数据包。取决于uIP版本,Contiki遵循不同的方法:

·1、当使用IPv6,Contiki将遵循route-over配置(RPL:低功耗有损网络的IPv6路由协议)。因此,uIP6使用一个被称为sicslowmac的简单MAC层。除了头部压缩由6loWPAN模型提供,它仅通过射频转发数据包。

2、对于IPv4(并不是IPv4),Contiki选用mesh-under配置。这由Rime通讯协议栈完成。Rime提供mesh routing和路由发现,因此uIP使用它来转发网络上的数据包。从IP point的角度来看,所有的传感器网络节点组成了一个本地子网,虽然multiple radio hops可能被要求。(这里的说法有待验证

 

Rime stack

Rime协议栈提供一种递阶型无线网络协议,从简单的匿名广播到mesh网络路由。一个复杂的协议(比如multihop mesh routing)实现会被分解成若干部分,复杂的模块利用相对简单的模块来组成。

以下是对Rime不同模块的简述:

·abc:匿名广播,它仅通过射频驱动发送数据包和接收所有的数据包,并将他们送至上层;

·broadcast:标识广播,它为发出的数据包添加了发送者地址,然后传递给abc模块;

·unicast:这个模块添加给数据包添加一个目标地址,再传递给broadcast模块。在接收端,如果数据包的目标地址和当前节点地址不符,该数据包将为丢弃。

·stunicast:当要求发送数据包至某个节点,它将在给定的时间周期内反复发送,直到要求停止。

·runicast:可信单播,它使用stunicast模块发送数据包,并等待确认报文,收到后停止持续重发数据包。为了防止无限次发送,必须指定一个最大重发次数。

·politeipolite:这两个模块几乎相同,当一个数据包必须在给定的时间帧内被发送,模块在到达时间的一半时,检查是否收到的数据包与它准备发送的相同。如果收到了,这个数据包将不被发送,否则发送。这是一个有效的泛洪技术,可以避免没必要的重发。

·multihop:这个模块要求一个路由表功能,当将要发送数据时它会请求路由表提供下一跳,并且使用unicast发送。当它收到一个数据包,如果本身即为目标节点就将数据包传至上层,否则再次请求路由表提供下一跳并转发。

原文:http://blog.csdn.net/frank_jb/article/details/46381907

一、abc层

abc为anonymous best-effort single-hop broadcast primitive的简写,中文翻译为:匿名最优单跳广播原型模块,主要实现匿名广播。

对于abc原型模块而言,其结构为:

struct abc_conn {

  struct channel channel;  //rime中定义的通道

  const struct abc_callbacks *u;

};

其中abc_callbacks为回调函数结构,需要包含接收回调与发送回调函数:

struct abc_callbacks {

 

  void (* recv)(struct abc_conn *ptr);

  void (* sent)(struct abc_conn *ptr, int status, int num_tx);

};

而struct channel定义在core/net/rime/abc.h中,如下:

struct channel {

  struct channel *next;

  uint16_t channelno;

  const struct packetbuf_attrlist *attrlist;

  uint8_t hdrsize;

};

调用abc层发送广播时,只需要将待发送数据拷贝到待发送buf中,调用abc_send即可。

示例程序:

PROCESS_THREAD(example_abc_process, ev, data)

{

  static struct etimer et;

  PROCESS_EXITHANDLER(abc_close(&abc);)  //PROCESS_BEGIN前添加

  PROCESS_BEGIN();

  abc_open(&abc, 128, &abc_call); //打开abc_conn连接,通道为128

  while(1) {

   

    etimer_set(&et, CLOCK_SECOND * 2 + random_rand() % (CLOCK_SECOND * 2)); //设定事件定时器间隔

    PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));  //等待etimer超时

    packetbuf_copyfrom("Hello", 6);  //拷贝到packetbuf

    abc_send(&abc); //调用abc_send函数发送

    printf("abc message sent\n");

  }

  PROCESS_END();

}

虽然调用abc_send之后,数据就通过无线链路广播出去了,但是具体都通过了怎么样的一个处理流程之后发送出去的,理清楚这一层关系就可以很清晰的了解Contiki中整个无线链路中的一个层次结构是如何组建的。

?图2  Contiki无线传输链路结构

如图2所示,描述了Contiki中整个无线传输链路基本结构,主要包含了:网络层(NETSTACK_NETWORK)、链路层安全驱动(link layer security driver, NETSTACK_LLSEC)、MAC层(Media Access Control, NETSTACK_MAC),RDC层(Radio Duty Cycling,NETSTACK_RDC)以及物理层(NETSTACK_RADIO)。

在图2的左边一列为对应不同层次,对应需要实现的驱动接口结构,右边为各个层次之间相互的调用情况(只提取了最重要的部分,相关处理没有细化)。

其中网络层主要完成相关无线网络的连接、组网等情况,链路层安全驱动用于保证整个传输链路的数据安全,MAC层完成物理媒介的访问控制,RDC层用于控制无线电电路的开断,可以有效的控制无线电部分的耗电情况,RADIO层实现了不同无线媒介底层访问驱动,完成整个无线链路的访问与操作。

在实际应用中,根据需求来配置是否需要对应的层,即使对应层不需要实现也需要提供相应的接口函数,即使仅仅只是直接返回参数。

以abc_send为例,分析在JN516x平台上整个数据传输的工作流程。

在应用中调用abc_send函数实现匿名广播,调用时首先其调用网络层的rime_driver,调用rime_driver的output函数,该函数用于向下一层发送数据,调用NETSTACK_LLSEC.send函数,在JN516x平台的实现中,我们并没有添加安全相关任务,因此使用了nullsec_driver,在NETSTACK_LLSEC.send函数中调用NETSTACK_MAC.send函数继续向下一层传递数据,中间需要完成相关的数据包打包,添加相关的标签信息。在MAC层的send函数中继续调用下一层NETSTACK_RDC的send_list函数发送数据列表,默认采用contikimac_driver。而最终通过调用NETSTACK_RADIO层的send函数来完成数据的发送(prepare+transmit函数)。

而关于数据的接收则正好是反向的一条链路,首先通过无线链路接收到有效数据包开始逆向传输,通过RDC层,再到MAC层、LLSEC层、网络层,最后通过NETSTACK_NETWORK.input函数调用在创建abc_conn连接时指定的接收回调函数,将接收到的数据信息传递到用户应用程序,完成数据接收。

总结:对于一个新的平台而言,首先需要根据平台硬件的特点完成NETSTACK_RADIO层的实现,实现一个可对RDC层调用的radio_driver,而RDC层、MAC层可以根据需求来进行适当的修改,可以较方便的实现在Contiki上进行无线数据传输。

阅读(1899) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~