参考:
http://www.contikistudio.com/forum.php?mod=viewthread&tid=2349&extra=page%3D1
<
The ContikiMAC Radio Duty Cycling Protocol
>
RDC radio duty cycling
MAC
MAC:有两种驱动:CSMA和NULLMAC。默认为CSMA。MAC层接收来自RDC层的数据,并通过RD层来转发数据包。
RDC:默认是ContikiMAC,还包括X-MAC,CX-MAC,LPP以及NULLRDC。ContikiMAC,有很好的功率效率,但是偏向于802.15.4无线设备以及CC2420的无线设备。X-MAC是一个较旧的机制,没有ContikiMAC的高效率,但时序要求较严格。CX-MAC(兼容X-MAC)但是时序要求更宽松,故能在更多的无线设备上运行。LPP(Low-Power Probing)一个随接收器启动的RDC协议。NullRDC如其名没有操作。
根据这个帖子,自己在mbxxx下边搜索了下,
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
#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下sicslowmac.c是一种机制,其他的可以通过设置编译到系统中
MAC:MAC层的管理机制,同样通过配置或得,有csma_driver 可知这里选择的是csma机制。core/net/mac(contiki用的MAC应该符合802.15.4协议才对呀?因为他是基于802.15.4的MAC来开发的网络层,和应用层)。
适配层:6LowPAN适配层,对mac层的数据进行压缩报头等数据分析与重组。core/net/sicslowpan.c,由input函数进入此函数
network:对数据进行处理,由core/net/tcpip.c下的tcpip_input(),packet_input(),uip_input()函数完成最后将数据交给uIP协议栈,最后由UIP_APPCALL()将数据包分发给不同的应用程序。
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
#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语言实现成了类,只是这里边只包含了操作,但是没有包含数据。这样的方法,很是巧妙。而且有效地隐藏了信息,很好地做到了信息隐藏。