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

相关文章

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

Java对接MQTT协议的完整实现示例代码

《Java对接MQTT协议的完整实现示例代码》MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,:本文主要介绍Ja... 目录前言前置依赖1. MQTT配置类代码解析1.1 MQTT客户端工厂1.2 MQTT消息订阅适配器1.

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Java根据IP地址实现归属地获取

《Java根据IP地址实现归属地获取》Ip2region是一个离线IP地址定位库和IP定位数据管理框架,这篇文章主要为大家详细介绍了Java如何使用Ip2region实现根据IP地址获取归属地,感兴趣... 目录一、使用Ip2region离线获取1、Ip2region简介2、导包3、下编程载xdb文件4、J

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展