原英文文章:https://github.com/contiki-os/contiki/wiki/Change-mac-or-radio-duty-cycling-protocols

在Contiki中,MAC层源码位于core\net\mac目录下。
       在低功耗网络中,无线收发设备必须时常休眠以节省电量。在Contiki中,负责这个工作的是RDC(Radio Duty Cycling)层,也即信道接入技术。Contiki提供了一系列RDC机制。默认的就是ContikiMAC。
       有人将rdc层归类到mac层,但在contiki中,倾向于将rdc层作为mac之下的独立一层。
       1、关于MAC驱动
MAC(Medium Access Control)层处于RDC的上层。MAC层负责避免数据在传输过程中的冲突以及重传数据包。Contiki提供了两种MAC层,一种是CSMA(Carrier Sense Multiple Access 载波侦听多路访问)机制以及NullMAC机制(只负责对数据的转接而不对数据进行任何的操作)。默认为CSMA。MAC层接收来自RDC层的数据并通过RDC层来转发数据包。假如RDC层或者是radio层检测到数据碰撞,MAC层就要重发这个数据包。如有数据碰撞只有CSMA支持重发。
       2、关于RDC驱动
       Contiki有多种RDC驱动。默认提供ContikiMAC,Contiki X-MAC,Contiki LPP以及NullRDC。默认的是ContikiMAC,它具有很好的功率效率,但有些更偏向于802.15.4无线设备以及CC2420无线收发设备。X-MAC是一个较旧的机制,采用strobe机制和确认机制,当发送方收到接收方对strobe的ack后,开始发送数据包,它不像ContikiMAC那样有高功率效率,但是有较严格的时序要求。Contiki的X-MAC基于原始的X-MAC协议,但前者降低了功耗,有更宽松的时序要求,因此能在更多的无线设备上工作。Contiki的LPP基于LPP(Low-Power Probing)协议,在功耗方面有所改善,同时提供发送广播数据的机制,是一个随接收器启动的RDC协议。NullRDC是一个空的RDC层,它从来不会关闭无线设备,因此可以用来测试或者与其它的RDC驱动比较使用。

RDC驱动尽量保持无线设备休眠并且定期检查无线传输介质。当进行检测时,无线设备接收数据包。信道检查频率以HZ为单位,指定每秒信道检查的次数,默认为8HZ。典型的信道检查频率为2、4、8、16HZ。在仿真实验时,可以在配置文件中设置。(以sky平台为例,在该平台下的contiki-conf.h文件中通过#define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8宏进行定义,默认果然是8Hz,0.125秒一次)
       通常传输的数据包必须重复发送直到接收器打开检测。这就增加了耗电量以及无线通信流量(traffic)进而影响与其它节点的通信。一些RDC驱动允许锁相优化(phase optimization)以此来推迟选通(strobe)发送的数据包直到接收器将要唤醒。这需要两个节点之间良好的时间同步,如果以1%的时钟差那么唤醒时间将贯穿整个发送阶段窗口每100个周期,比如在信道检查频率为8HZ的时候是12秒。当传送包的时间间隔为几秒的时候这将让阶段优化失去作用,因为发送者必须在接收器唤醒之前提前准备好发送的数据。时钟漂移校正(clock drift correction)可能解决这个问题。
       这些Contiki RDC驱动被称作:
       contikimac_driver
       xmac_driver
       cxmac_driver
       lpp_driver
       nullrdc_driver
另:SICSLoWMAC专门作为6LowPAN的mac层而设计的。有关SICSLowMAC层参见:http://www.sics.se/~adam/contiki/docs-uipv6/a01103.html

关于如何更改contki的mac层和rdc层协议,参见英文原文:https://github.com/contiki-os/contiki/wiki/Change-mac-or-radio-duty-cycling-protocols

配置文件contiki_conf.h中:
#define NETSTACK_CONF_MAC                       csma_driver
#define NETSTACK_CONF_RDC                       contikimac_driver
#define NETSTACK_CONF_FRAMER                    framer_802154
#define NETSTACK_CONF_RADIO                     stm32w_radio_drive
……
#if WITH_UIP6
#define NETSTACK_CONF_NETWORK             sicslowpan_driver
#else
#define NETSTACK_CONF_NETWORK             rime_driver
#endif

大概如下:
radio:即是STM32W支持的射频部分的驱动,在cpu/stm32w108/dev/stm32w_radio.c,相应的平台有相应的radio驱动

Framer:帧结构采用802.15.4协议

RDC:Radio的管理机制在core/net/mac下contikiMAC.c中

MAC:MAC层的管理机制,同样通过配置获得,有csma_driver 可知这里选择的是csma机制。core/net/mac。

适配层:6LowPAN适配层,对mac层的数据进行压缩报头等数据分析与重组。core/net/sicslowpan.c,由input函数进入此函数

network:对数据进行处理,由core/net/tcpip.c下的tcpip_input(),packet_input(),uip_input()函数完成最后将数据交给uIP协议栈,最后由UIP_APPCALL()将数据包分发给不同的应用程序。

rime协议:对于带宽有限或者不能运行完整IPv6网络栈的环境,Contiki定制了名为Rime的无线网络栈。Rime栈既支持简单操作,例如向所有邻居或指定邻居节点发送消息,也支持一些复杂机制,例如网络洪泛、多跳数据采集等。Rime可以运行在休眠路由上以降低功耗。

App:应用程序

从这个过程看,第一个radio中的驱动是紧密与硬件平台有关系的,只能对于相应的硬件平台选择适当的driver,而其他各层却不是与硬件层紧密相连的。但是一些实现需要硬件的支持,所以有些虽然不与硬件直接相关,但是由于硬件本身不支持,所以无法实现一些可用的算法。尤其是在RDC层,因为这个设计可以降低无线射频的功耗,也是Contiki之所以作为网络系统优秀的原因。

从RDC和MAC的文件在同一个文件夹下可知,他们之间应该是有紧密的联系。适配层和Network在同一个文件夹下可知,他们应该是有紧密的联系。

#define NETSTACK_CONF_MAC                       csma_driver
#define NETSTACK_CONF_RDC                       contikimac_driver
#define NETSTACK_CONF_FRAMER                    framer_802154
#define NETSTACK_CONF_RADIO                     stm32w_radio_drive
#if WITH_UIP6
#define NETSTACK_CONF_NETWORK         sicslowpan_driver
#else
#define NETSTACK_CONF_NETWORK          rime_driver
#endif
这里使用这样的宏定义,其实是已经在各个模块中都初始化好的一组函数指针的集合的结构体的全局变量,这种方式相当于用C语言实现了类的功能,只是结构体中只包含了操作,没有包含数据。这样的方法很是巧妙,在linux内核中经常被使用。有效地隐藏了信息,很好地做到了信息隐藏。

Contiki中MAC层与RDC层相关推荐

  1. 网桥、vlan、源目MAC地址的链路层处理

    一,链路层 在报文接收方向上,网卡驱动把接收到的数据按照其对应的链路层协议(如以太网)组装成报文,然后把它上交给链路层,接口是netif_receive_skb,至此网卡驱动的任务就结束了,报文交给链 ...

  2. java action dao_java中Action层、Service层和Dao层的功能区分

    一.Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DA ...

  3. [转]JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分

    首先这是现在最基本的分层方式,结合了SSH架构.modle层就是对应的数据库表的实体类.Dao层是使用了Hibernate连接数据库.操作数据库(增删改查).Service层:引用对应的Dao数据库操 ...

  4. oracle数据库有哪些文件构成,Oracle数据库架构中包括几层?每层都有什么元素?...

    Oracle数据库架构中包括几层?每层都有 什么元素? 1 PL/SQL代表 A PROCEDURAL LANGUAGE/SQL B PROGRAM LANGUAGE SQL C POWER LANG ...

  5. 在 Java Web 项目中,Service 层和 Dao 层真的有必要每个类都加上接口吗

    作者 l 会点代码的大叔(CodeDaShu) 很多程序员在刚开始工作的时候,接触到的项目都是这样做的:项目的代码被分成 Controller.Service.Dao 层,一个接口对应一个实现类,然后 ...

  6. java domain层_java框架中的controller层、dao层、domain层、service层、view层

    1.Controller层:接口层,用户访问请求时对接. Controller层负责具体的业务模块流程的控制,在此层里面要调用Serice层的接口来控制业务流程,控制的配置也同样是在Spring的配置 ...

  7. 独家 | 初学者的问题:在神经网络中应使用多少隐藏层/神经元?(附实例)

    作者:Ahmed Gad 翻译:蒋雨畅 校对:李海明 本文约2400字,建议阅读8分钟. 本文将通过两个简单的例子,讲解确定所需隐藏层和神经元数量的方法,帮助初学者构建神经网络. 人工神经网络(ANN ...

  8. Spring中Controller层、Filter层、Interceptor层全局统一异常处理

    Controller层.Filter层.Interceptor层全局统一异常处理 SpringBoot为异常处理提供了很多优秀的方法,但是像我这种新手在处理异常时还是会觉得一头包,终于我痛定思痛,总结 ...

  9. python中digits什么意思_在Caffe中使用 DIGITS自定义Python层

    Caffe 使得我们有了使用Python自定义层的能力,而不是通常的C++/CUDA.这是一个非常有用的特性,但它的文档记录不足,难以正确实现本演练将向您展示如何使用DIGHT来学习实现Python层 ...

最新文章

  1. P4512 【模板】多项式除法
  2. ajax 与route的区别,浅析vue-router jquery和params传参(接收参数)$router $route的区别
  3. 剑指Offer - 面试题40. 最小的k个数(排序/大顶堆)
  4. 比开源快30倍的自研SQL Parser设计与实践
  5. Linux开机启动过程(15):start_kernel()->rcu_init()初始化
  6. 蓝桥杯 ADV-80 算法提高 选最大数
  7. aixcoder 智能代码补全工具
  8. Hibernate查询 内连接和外连接区别
  9. 最新!2022 LaTeX安装教程(Windows)
  10. 国内博客搬家工具大全
  11. 【numpy学习】numpy教程--基于莫烦python的教程
  12. 酒店宾馆wifi无线上网认证,手机认证方式详解
  13. mac读取ntfs移动硬盘
  14. k8s初级班day2
  15. python getcwd_Python os.getcwd() 方法
  16. centos7扫描新硬盘_跟大家讲讲硬盘基础知识
  17. 1838公共政策概论 (2)
  18. 数字驱动,智能发展 | 的卢深视三维全栈技术亮相宁波智博会
  19. Windows10下利用Visual Studio Code搭建C语言开发环境
  20. 如何用计算机打520,520,各专业是如何表白的?

热门文章

  1. Excel:将图片制作成九宫格形式
  2. 7-2 实验9_2_身份证号码最后一位
  3. SpringCloudAlibaba - Nacos (1) 服务治理
  4. python控制浏览器模块_Pamie模块详解 python操作ie浏览器
  5. ESP32 Arduino (六)TFT屏幕连接无线局域网投屏
  6. 介绍给大家400种生活小窍门(很有用的)
  7. Zotero如何修改文献命名格式
  8. HaaS轻应用(JavaScript)快速开始 @HaaS100
  9. pythonif语句如何循环_pythonif语句如何循环
  10. 软件工程师与硬件工程师谁更有发展优势