CSMA协议原理 Contiki协议栈的设计

网络/协议

43人已加入

描述

Contiki由几个独立的模块组成,是一个开放源码、多任务事件驱动的嵌入式网络专用操作系统,微轻量级的控制器,无线传感网络协议栈Rime。整个应用包括kernel、libraries、user code,对于一些周期性的操作或者网络协议很有帮助。

一.协议栈总体框架

Contiki系统为了支持多种硬件平台和软件协议设计了如图1.1所示的层次框架,通过contiki-conf.h的宏定义用户可以灵活地选择协议类型,如:

#define NETSTACK_CONF_NETWORK rime_driver

#define NETSTACK_CONF_MAC csma _driver

#define NETSTACK_CONF_RDC cxmac_driver

#define NETSTACK_CONF_RADIO sx1278_radio_driver

#define NETSTACK_CONF_FRAMER framer_nullmac

Contiki

图1.1协议栈层次

Contiki V2.7支持的各层次协议类别如图1.2所示,其中NETSTACK_MAC是一个概念层次,真正处理MAC逻辑是由NETSTACK_RDC(Radio Duty Cycling)完成的;而NETSTACK_RADIO层支持的射频驱动,用户可以自由扩展。

Contiki

图1.2 Contiki V2.7支持的协议类型

二.收发Radio Packet的调用与时序

1. 接收Radio Packet

图2.1显示了接收Radio Packet的调用逻辑与时序,当射频硬件接收到数据包时ISR通知rf_process,rf_process自底向顶调用:RDC-》MAC-》NETWORK协议栈的接收函数,最后将数据包提交给应用程序绑定的进程。

Contiki

图2.1接收Radio Packet

2. 发送Radio Packet

如图2.2所举例,process_i需要发送abc(Anonymous best-effort local area Broad Cast)数据包,进程自顶向底调用:MAC-》RDC-》RADIO协议栈的发送函数,最后通过射频硬件以无线电方式传输。

Contiki

图2.2发送Radio Packet

三.CSMA(Carrier Sense Multiple Access)协议原理

CSMA协议提供相对可靠的MAC层传输,每次调用RDC层发送数据包后,它根据反馈信息判断是否需要缓存并重传该数据包。

CSMA的关键数据结构如图3.1所示,struct neighbor_queue根据不同的接收地址缓存数据包;struct rdc_buf_list将同一个接收地址的不同PACKETBUF_ATTR_MAC_SEQNO的数据包进行链接;struct queuebuf保存需要重传的数据包头和数据实体;struct qbuf_metadata存储回调函数指针等信息。

Contiki

图3.1 csma关键数据结构

CSMA根据RDC层发送数据包的反馈信息选择相应逻辑动作:

MAC_TX_OK:发送成功,回收缓存数据结构和善后工作;

MAC_TX_NOACK:启动ctimer,随机延时后重传,直到发送次数超过MAX;

MAC_TX_COLLISION:继续重传,且发送次数不受限。

一个CSMA的典型时序如图3.2所示,当RDC层发送完数据包后,CSMA的回调函数packet_sent()根据发送结果选择动作(见上面逻辑描述),如果需要重传则根据重传次数选择一个随机时间设置ctimer,当ctimer定时器超时后再次发送该缓存的数据包。

Contiki

图3.2 csma逻辑与时序

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分