分类: 嵌入式
2013-01-22 17:31:31
摘要 :
本文讲述了Contiki之Rime协议栈的Rime地址rimeaddr_t相关细节,包括地址格式、地址相关操作rimeaddr_copy和rimeaddr_cmp、两个全局变量rimeaddr_node_addr和rimeaddr_null。
一、概述
无论哪个协议栈,都得解决一个根本问题,如何标识不同的设备,即编址。如计算机网络中,用端口号标识同一台主机不同的进程,用IP地址标识不同的主机,用MAC唯一标识网卡。同样,Rime协议栈也需对不同节点进行标识,其用联合体rimeaddr_t进行描述。rimeaddr_t定义如下(在rimeaddr.h文件):
Rime协议栈的节点地址格式为%d.%d.%d...,默认长度为2,即%d.%d 。可以通过配置RIMEADDR_CONF_SIZE大小来配置节点地址长度,如contiki-2.5\platform\cc2530dk\contiki-conf.h中将RIMEADDR_CONF_SIZE 设为8。源代码如下:
二、相关操作
对Rime地址rimeaddr_t操作很简单,拷贝eaddr_copy(也可以直接理解成赋值),判断两地址是否相等rimeaddr_cmp,重设当前节点Rime地址rimeaddr_node_addr的rimeaddr_set_node_addr。
2.1 rimeaddr_copy
rimeaddr_copy拷贝将Rime地址从src拷贝到dest,源码如下:
2.2 rimeaddr_cmp
rimeaddr_cmp用于判断两个Rime地址是不是相同,相同返回非0,不相同则返回0。源码如下:
2.3 rimeaddr_set_node_addr
rimeaddr_set_node_addr用于设置当前节点Rime地址rimeaddr_node_addr,源码如下:
三、几个全局变量
3.1 rimeaddr_node_addr
节点的Rime地址,可以通过rimeaddr_set_node_addr()函数改变当前节点的Rime地址,即rimeaddr_node_addr。源代码如下:
3.2 rimeaddr_null
先来看下咱们熟悉的TCP/IP协议栈0.0.0.0地址,其表示整个网络,用于帮助路由表中无法查询的包(即路由表没有指明特定到达条目的主机和目的网络),路由表中无法查询的包都送到全零网络的路由中去[2]。在一些老的软件中,0.0.0.0作为广播地址使用[3]。
Rime的零地址貌似跟TCP/IP协议栈不同,路由表使用零地址表明该项未使用,没有配置地址的节点默认为零地址。但配置地址的节点如果设成零地址,在与其他节点通信时将会有问题。这点我也没看懂,待后续源码分析求证。另,建立连接时(如rucb_open),发送方sender的地址被设成rimeaddr_null了。rimeaddr_null注释及定义如下:
如果Rime地址长度为2,则rimeaddr_null为0.0;若Rime地址长度为8,则rimeaddr_null为0.0.0.0.0.0.0.0。源码如下:
这显然有个问题,如果在配置Rime地址长度RIMEADDR_CONF_SIZE时,既不是2也不是8(当然,如果不配置则默认为2),那么rimeaddr_null则没有初始化,即rimeaddr_null是一个弱符号,对该符号的处理依赖于编译连接器。
参考资料:
[1] Adam Dunkels论文《Poster Abstract: Rime - A Lightweight Layered Communication Stack for Sensor Networks》
[2] 博文《》
[3] 博文《0.0.0.0的IP是什么地址》