Contiki协议栈Rime: 节点链接地址linkaddr
2016-05-23 12:51
387 查看
更多的Contiki协议栈知识,请参考索引目录:
《Contiki协议栈:索引目录》
在早期的Contiki代码中,节点地址是以rimeaddr表示的,所以网上很多教程都是rimeaddr的。在2014年1月30日后,adam对Contiki中的所有节点地址相关定义由rimeaddr_xxx修改为linkaddr_xxx。这样做的理由是linkaddr模块不仅仅在Rime协议栈中使用,还被其它很多模块使用。请参考adam的pull request。
linkaddr相关源码位于
表明在Rime协议中,使用LINKADDR_SIZE个字节的unsigned char类型表示节点地址。
其中,LINKADDR_SIZE的定义如下:
可以看出,默认情况下,节点地址为两个字节,因此用16位表示一个节点地址。
IPv4地址的表示方法:
IPv6地址的表示方法:
不知道如何表示IPv6地址?请参考《Contiki协议栈学习计划》中提到的书籍《IoT in five days》
还记得我们在博客《Contiki协议栈Rime:引子》中做的cooja仿真吗,我们再看看仿真结果:
注意上图中用黑色方框框处的部分:Rime started with address 2.0。这错,
由于Rime中节点地址有两种定义,分别应该有不同的表示方法:
16bit短地址的表示方法:
64bit扩展地址的表示方法:
linkaddr_node_addr表示本节点的Rime地址。需要注意的是,不要直接对该地址进行修改,而要通过函数linkaddr_set_node_addr() 修改。
linkaddr_null表示一个空地址。空地址主要用于路由表,以确定表的入口是否被占用。如果一个节点没有配置地址,那么它的地址就是空地址。如果节点的地址为空,那么它就无法与其它节点通信。默认情况下,每个运行Contiki的设备都会被Contiki自动设置一个节点地址。
使用memcpy将scr所指向的linkaddr拷贝给dest。
比较两个Rime地址是否相等。如果相等,返回非0(真);否则,返回0(假)
设置本节点的地址。
《Contiki协议栈:索引目录》
1 概述
linkaddr模块是对Rime中地址的抽象表示,用来标识节点在无线传感器网络中的地址。在早期的Contiki代码中,节点地址是以rimeaddr表示的,所以网上很多教程都是rimeaddr的。在2014年1月30日后,adam对Contiki中的所有节点地址相关定义由rimeaddr_xxx修改为linkaddr_xxx。这样做的理由是linkaddr模块不仅仅在Rime协议栈中使用,还被其它很多模块使用。请参考adam的pull request。
linkaddr相关源码位于
contiki/core/net/linkaddr.[ch]
2 地址的定义
在Rime协议中,节点地址有两种定义:linkaddr_t、linkaddr_extended_t。之所以有两种地址定义,估计是为了兼容更多的MAC层协议,比如在IEEE 802.15.4协议中,就规定了16bit短地址模式和64bit扩展地址模式。linkaddr_t
16bit短地址linkaddr_t的定义如下:typedef union { unsigned char u8[LINKADDR_SIZE]; #if LINKADDR_SIZE == 2 uint16_t u16; #endif /* LINKADDR_SIZE == 2 */ } linkaddr_t;
表明在Rime协议中,使用LINKADDR_SIZE个字节的unsigned char类型表示节点地址。
其中,LINKADDR_SIZE的定义如下:
#ifdef LINKADDR_CONF_SIZE #define LINKADDR_SIZE LINKADDR_CONF_SIZE #else /* LINKADDR_SIZE */ #define LINKADDR_SIZE 2 // 默认值为2 #endif /* LINKADDR_SIZE */
可以看出,默认情况下,节点地址为两个字节,因此用16位表示一个节点地址。
linkaddr_extended_t
64bit扩展地址linkaddr_extended_t的定义如下:typedef union { uint8_t u8[8]; uint16_t u16[4]; } linkaddr_extended_t;
3 地址的表示方式
我们先来回忆我们是如何表示IP地址的。现在的IP协议又两种:IPv4和IPv6,因此IP地址的表示方法也有两种。IPv4地址的表示方法:
192.168.1.23
IPv6地址的表示方法:
2001:0db8:4004:0010:0000:0000:6543:0ffd
不知道如何表示IPv6地址?请参考《Contiki协议栈学习计划》中提到的书籍《IoT in five days》
还记得我们在博客《Contiki协议栈Rime:引子》中做的cooja仿真吗,我们再看看仿真结果:
注意上图中用黑色方框框处的部分:Rime started with address 2.0。这错,
2.0就表示该节点的Rime地址。
由于Rime中节点地址有两种定义,分别应该有不同的表示方法:
16bit短地址的表示方法:
[%d].[%d], 例如
1.0,
2.0
64bit扩展地址的表示方法:
[%d].[%d].[%d].[%d].[%d].[%d].[%d].[%d](这里有待验证)
4 相关变量
linkaddr_node_addr
linkaddr_t linkaddr_node_addr;
linkaddr_node_addr表示本节点的Rime地址。需要注意的是,不要直接对该地址进行修改,而要通过函数linkaddr_set_node_addr() 修改。
linkaddr_null
#if LINKADDR_SIZE == 2 const linkaddr_t linkaddr_null = { { 0, 0 } }; #else /*LINKADDR_SIZE == 2*/ #if LINKADDR_SIZE == 8 const linkaddr_t linkaddr_null = { { 0, 0, 0, 0, 0, 0, 0, 0 } }; #endif /*LINKADDR_SIZE == 8*/ #endif /*LINKADDR_SIZE == 2*/
linkaddr_null表示一个空地址。空地址主要用于路由表,以确定表的入口是否被占用。如果一个节点没有配置地址,那么它的地址就是空地址。如果节点的地址为空,那么它就无法与其它节点通信。默认情况下,每个运行Contiki的设备都会被Contiki自动设置一个节点地址。
5 相关函数
linkaddr_copy
void linkaddr_copy(linkaddr_t *dest, const linkaddr_t *src) { memcpy(dest, src, LINKADDR_SIZE); }
使用memcpy将scr所指向的linkaddr拷贝给dest。
linkaddr_cmp
int linkaddr_cmp(const linkaddr_t *addr1, const linkaddr_t *addr2) { return (memcmp(addr1, addr2, LINKADDR_SIZE) == 0); }
比较两个Rime地址是否相等。如果相等,返回非0(真);否则,返回0(假)
linkaddr_set_node_addr
void linkaddr_set_node_addr(linkaddr_t *t) { linkaddr_copy(&linkaddr_node_addr, t); }
设置本节点的地址。
6 小结
linkaddr是一个很简单的东西,我们在今后会经常碰到。相关文章推荐
- contiki udp 使用
- windows cc2530 6lowpan(contiki)报文监控
- Packetbuffer Basics (包缓冲区基础知识)
- Contiki 实例hello_world详细剖析
- 用Doxygen和Graphviz给Contiki文档添加类图和调用图
- linux 中的rime 输入法 自定义 新世纪五笔输入法
- cc2650鼓捣教程-2.一切的开始 Hello world程序!
- cc2650鼓捣教程-1.硬件选型与contiki 6lowpan环境配置
- 基于keil的contiki系统的stm32移植
- Install ibus-rime in Kubuntu(qt)
- 对contiki原理的一些理解
- Contiki 配置参数“技巧”说明
- Contiki高级程序设计
- 怎样把LoRa终端功耗降到极致
- 无线通信设计秘密四:唤醒下发算法
- fedora 20 , 64位系統下,rime 輸入法 ,五筆86, 簡繁轉換 之實現
- contiki MAC
- TinyOS视频第二集内容介绍
- contiki for CC2530的IAR移植
- contiki学习笔记之leds