Contiki协议栈Rime: 节点链接地址linkaddr

2024-04-08 04:32

本文主要是介绍Contiki协议栈Rime: 节点链接地址linkaddr,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

更多的Contiki协议栈知识,请参考索引目录:
《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 == 2uint16_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协议栈Rime: 节点链接地址linkaddr的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/884570

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

webapp地址

F:\LSP\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A