为了使用contiki中的仿真软件cooja进行rpl组网实验,这里对以下网页进行翻译,以获取修改RPL objective function 的相关信息@RPL objective function modification and simulation in cooja

1、介绍

低功耗有损网络(RPL)的路由协议使用目标函数(OF)构建面向目标的有向无环图(DODAG)。目标函数根据某些算法或计算公式使用路由度量来形成DODAG。基本上,目标函数可以优化或约束用于形成路线的路线度量,从而帮助选择最佳路线。在同一节点和网格网络上运行的目标功能可能很多,这是因为部署因目标不同而有很大差异,并且单个网格网络可能需要承载对路径质量有非常不同要求的流量。RPL的Contiki实现有2个目标函数,但默认情况下它使用使ETX值最小的函数。但是,在所有路由方案中,它不一定是最好的策略。因此,需要相应地修改目标函数以适应任何附加约束或实现不同目标。

2、学习目标

本教程的学习前提是您知道低功耗有损网络(RPL)的路由协议的工作原理。这里使用并解释了RPL的Contiki OS 2.7v实现。本教程对以下内容进行了说明:

  1. 不同的RPL相关功能及其工作
  2. RPL目标功能的示例场景和修改
  3. 使用DGRM模型在Cooja中进行仿真

3、源码与目录

这里给出仓库地址:contiki-os-3.0

~/contiki-2.7/core/net/rpl/rpl-conf.h
~/contiki-2.7/core/net/rpl/rpl-of0.c
~/contiki-2.7/core/net/rpl/rpl-mrhof.c
~/contiki-2.7/tools/cooja

4、相关文件和函数

具有RPL要点的一些重要文件是rpl-config.h、rpl-of0.c、rpl-mhrof.c。但是,这里仅提及这些文件中的一些重要功能。

rpl-config.h

RPL-CONF-STATS

/* RPL_CONF_STATS */
#ifndef RPL_CONF_STATS
#define RPL_CONF_STATS 0
#endif

这里contiki配置统计是禁能的,若要启用,需要将RPL_CONF_STATS 设置为1.

RPL-DAG-MC

/* RPL_CONF_DAG_MC */
#ifdef RPL_CONF_DAG_MC
#define RPL_DAG_MC RPL_CONF_DAG_MC
#else
#define RPL_DAG_MC RPL_DAG_MC_NONE
#endif

这里支持使用ETX和ENERGY两种类型的RPL度量标准容器(metric container)。当然,如果您开发目标函数和一个关联的度量标准容器这也是受允许的。
RPL-OF

/* RPL_CONF_OF */
#ifdef RPL_CONF_OF
#define RPL_OF RPL_CONF_OF
#else
#define RPL_OF rpl_mrhof
#endif

RPL_CONF_OF参数配置RPL’s of。ETX是此处的默认目标函数。应将其定义为链接到系统映像的rpl_of对象的名称,例如rpl_of0。在这里,您还可以将其定义为您自己开发的目标函数。
RPL-LEAF-ONLY

#ifdef RPL_CONF_LEAF_ONLY
#define RPL_LEAF_ONLY RPL_CONF_LEAF_ONLY
#else
#define RPL_LEAF_ONLY 0
#endif

该值决定该节点是否应保留为叶节点。(如draft-ietf-roll-rpl-19#section-8.5中所述)
RPL_INIT_LINK_METRIC

#ifndef RPL_CONF_INIT_LINK_METRIC
#define RPL_INIT_LINK_METRIC        5
#else
#define RPL_INIT_LINK_METRIC        RPL_CONF_INIT_LINK_METRIC
#endif

This is the initial metric attributed to the link when ETX is unknown. It can be changed to any desirable value. Further as we will see we will set this value to 1.
当未知ETX时,这是归因于链接的初始指标。可以将其更改为任何所需的值。更进一步,我们将看到将该值设置为1。

rpl-of0.c

此文件中含有一个RPL目标函数0的实现

calculate_rank(rpl_parent_t *p, rpl_rank_t base_rank)

static rpl_rank_tcalculate_rank(rpl_parent_t *p, rpl_rank_t base_rank){rpl_rank_t increment;if(base_rank == 0) {if(p == NULL) {return INFINITE_RANK;}base_rank = p->rank;}increment = p != NULL ?p->dag->instance->min_hoprankinc :DEFAULT_RANK_INCREMENT;if((rpl_rank_t)(base_rank + increment) < base_rank) {PRINTF("RPL: OF0 rank %d incremented to infinite rank due to wrapping\n",base_rank);return INFINITE_RANK;}return base_rank + increment;}


在这里节点的rank值被计算出来。节点的rank值基于其父节点的rank值和base_rank值。如果base_rank为零,并且没有父节点,则节点的rank值为无限(infinite)。如果base_rank值为零且存在父级,则base_rank值等于父级。如果base_rank值不为零,则取决于父级是否存在,增量increrement将被赋予DAG实例中父节点的min_hoprankinc或DEFAULT_RANK_INCREMENT。简而言之,如果父节点为NULL,则base_rank会默认增加一个增量increrement,否则它将使用有关parent的信息来增加base_rank。在最后一部分中,如果计算出的新等级小于基本等级,则新等级由于环绕而变为无穷大。新计算出的等级等于基础等级加上增量。

**best_dag(rpl_dag_t d1, rpl_dag_t d2)

static rpl_dag_t *
best_dag(rpl_dag_t *d1, rpl_dag_t *d2)
{if(d1->grounded) {if (!d2->grounded) {return d1;}} else if(d2->grounded) {return d2;}if(d1->preference < d2->preference) {return d2;} else {if(d1->preference > d2->preference) {return d1;}}if(d2->rank < d1->rank) {return d2;} else {return d1;}
}

此函数将比较两个DAG,并根据目标函数返回两个DAG(作为输入d1和d2进行传递)中的最佳值。有3个标准可以在此处找到最佳DAG。第一个是查找2个DAG 的grounded值(值为一的选中)。第二个是每个DAG的偏好指标(比较两个dag的preference值,选中值更大的一个)。第三个是每个DAG的rank值(rank值小的,则选中)。

**best_parent(rpl_parent_t p1, rpl_parent_t p2)

static rpl_parent_t *
best_parent(rpl_parent_t *p1, rpl_parent_t *p2)
{rpl_rank_t r1, r2;rpl_dag_t *dag;PRINTF("RPL: Comparing parent ");PRINT6ADDR(rpl_get_parent_ipaddr(p1));PRINTF(" (confidence %d, rank %d) with parent ",p1->link_metric, p1->rank);PRINT6ADDR(rpl_get_parent_ipaddr(p2));PRINTF(" (confidence %d, rank %d)\n",p2->link_metric, p2->rank);r1 = DAG_RANK(p1->rank, p1->dag->instance) * RPL_MIN_HOPRANKINC  +p1->link_metric;r2 = DAG_RANK(p2->rank, p1->dag->instance) * RPL_MIN_HOPRANKINC  +p2->link_metric;dag = (rpl_dag_t *)p1->dag; /* Both parents must be in the same DAG. */if(r1 < r2 + MIN_DIFFERENCE &&r1 > r2 - MIN_DIFFERENCE) {return dag->preferred_parent;} else if(r1 < r2) {return p1;} else {return p2;}
}

此函数比较两个父对象,并根据目标函数返回最佳父对象。在此,根据父节点的rank值和该父节点的ETX值进行比较。这是重要的函数之一,因为在选择最佳DAG之后,路由就是基于此的。

rpl-mhrof.c

在该文件中实现了MRHOF(The Minimum Rank with Hysteresis Objective Function)。目标函数使用ETX作为路由度量标准,并且还具有用于能量度量标准的存根。
*calculate_path_metric(rpl_parent_t p)

static rpl_path_metric_t
calculate_path_metric(rpl_parent_t *p)
{if(p == NULL) {return MAX_PATH_COST * RPL_DAG_MC_ETX_DIVISOR;}#if RPL_DAG_MC == RPL_DAG_MC_NONEreturn p->rank + (uint16_t)p->link_metric;
#elif RPL_DAG_MC == RPL_DAG_MC_ETXreturn p->mc.obj.etx + (uint16_t)p->link_metric;
#elif RPL_DAG_MC == RPL_DAG_MC_ENERGYreturn p->mc.obj.energy.energy_est + (uint16_t)p->link_metric;
#else
#error "Unsupported RPL_DAG_MC configured. See rpl.h."
#endif /* RPL_DAG_MC */
}

这里,路径度量是根据OF计算的。如果没有父级,则使用基于最大路径成本计算的默认指标。如果没有提到OF,则路径度量是rank值之和(和链接度量之和。对于基于ETX的OF,它是测得的ETX(p-> mc.obj.etx)和链接度量的总和。类似地,如果OF基于能量,则将能量值(p-> mc.obj.energy.energy_est)添加到链接量度。此函数由best_parent()调用以比较两个父级的路径量度。

*neighbor_link_callback(rpl_parent_t p, int status, int numtx)

static void
neighbor_link_callback(rpl_parent_t *p, int status, int numtx)
{uint16_t recorded_etx = p->link_metric;uint16_t packet_etx = numtx * RPL_DAG_MC_ETX_DIVISOR;uint16_t new_etx;/* Do not penalize the ETX when collisions or transmission errors occur. */if(status == MAC_TX_OK || status == MAC_TX_NOACK) {if(status == MAC_TX_NOACK) {packet_etx = MAX_LINK_METRIC * RPL_DAG_MC_ETX_DIVISOR;}new_etx = ((uint32_t)recorded_etx * ETX_ALPHA +(uint32_t)packet_etx * (ETX_SCALE - ETX_ALPHA)) / ETX_SCALE;PRINTF("RPL: ETX changed from %u to %u (packet ETX = %u)\n",(unsigned)(recorded_etx / RPL_DAG_MC_ETX_DIVISOR),(unsigned)(new_etx  / RPL_DAG_MC_ETX_DIVISOR),(unsigned)(packet_etx / RPL_DAG_MC_ETX_DIVISOR));p->link_metric = new_etx;}
}

该函数接收链路层邻居信息。参数状态设置为0或1。numetx参数指定邻居的当前ETX(估计传输)。记录的ETX是link_metric,数据包ETX是传递给该函数的numetx参数。new_etx是基于公式使用记录的ETX值和数据包ETX值计算的。用新的ETX值更新link_metric。

*calculate_rank(rpl_parent_t p, rpl_rank_t base_rank)

static rpl_rank_t
calculate_rank(rpl_parent_t *p, rpl_rank_t base_rank)
{rpl_rank_t new_rank;rpl_rank_t rank_increase;if(p == NULL) {if(base_rank == 0) {return INFINITE_RANK;}rank_increase = RPL_INIT_LINK_METRIC * RPL_DAG_MC_ETX_DIVISOR;} else {rank_increase = p->link_metric;if(base_rank == 0) {base_rank = p->rank;}}if(INFINITE_RANK - base_rank < rank_increase) {/* Reached the maximum rank. */new_rank = INFINITE_RANK;} else {/* Calculate the rank based on the new rank information from DIO orstored otherwise. */new_rank = base_rank + rank_increase;}return new_rank;
}

这类似于前面解释的calculate_rank()函数,但有一点区别。在该OF中,rank_increase是如果parent = NULL则等于RPL_INIT_LINK_METRIC的增量。否则,它等于link_metric。新的rank值是base_rank + increment。

**best_parent(rpl_parent_t p1, rpl_parent_t p2)

static rpl_parent_t *
best_parent(rpl_parent_t *p1, rpl_parent_t *p2)
{rpl_dag_t *dag;rpl_path_metric_t min_diff;rpl_path_metric_t p1_metric;rpl_path_metric_t p2_metric;dag = p1->dag; /* Both parents are in the same DAG. */min_diff = RPL_DAG_MC_ETX_DIVISOR /PARENT_SWITCH_THRESHOLD_DIV;p1_metric = calculate_path_metric(p1);p2_metric = calculate_path_metric(p2);/* Maintain stability of the preferred parent in case of similar ranks. */if(p1 == dag->preferred_parent || p2 == dag->preferred_parent) {if(p1_metric < p2_metric + min_diff &&p1_metric > p2_metric - min_diff) {PRINTF("RPL: MRHOF hysteresis: %u <= %u <= %u\n",p2_metric - min_diff,p1_metric,p2_metric + min_diff);return dag->preferred_parent;}}return p1_metric < p2_metric ? p1 : p2;
}

这与之前的best_parent()函数相似,比较两个父对象并返回最佳父对象。这里,为每个父节点计算的路径度量是比较的基础。首先检查是否在形成的DAG中将任何父级设置为偏好父节点,如果是,则将其选为最佳父级(基于MRHOF滞后 RFC 6719)。否则,将比较两个计算的度量(metric),并且具有较低度量(metric)的父级是最佳父级。
在此OF中,仅当最小Rank路径​​(就路径成本而言)比当前路径短至少给定阈值时,才切换到该最小Rank路径​​。这种第二机制称为“滞后”(RFC 6719)。此处将PARENT_SWITCH_THRESHOLD_DIV定义为2。
在以下情况下会发生此父选择
1 .在网络最初形成期间
2 .相邻节点的路径成本发生变化时
3 .或者一个新节点出现在该节点的附近

目标函数修改的示例方案



上图显示了可以使用的示例网络拓扑
要定义一个全新的目标函数文件(不修改现有文件),必须在其中定义以下功能。同样,应该相应地修改makefile,并应注意新文件不应遇到编译和链接错误。一些RPL API函数包括:
1 .reset(dag):重置特定DAG的目标函数状态。在DAG上进行全局修复时,将调用此函数。
2 .neighbor_link_callback(parent, status, etx):接收链路层邻居信息。
3 .best_parent(parent1, parent2): 根据OF,比较两个父母并返回最佳父母。
4 .best_dag(dag1,dag2):根据OF比较两个DAG并返回最佳DAG。
5 .calculate_rank(parent,base_rank):使用父节点和基本rank值计算rank值。
6 .update_metric_container(dag):更新某个DAG中传出DIO的度量标准容器。如果DAG的目标函数不使用度量​​标准容器,则该函数应将对象类型设置为RPL_DAG_MC_NONE。

cooja具体操作未涉及代码问题,仅涉及操作,这里不再提及!

                                                  Edited by - Ashwini Telang

基于cooja的RPL OF的修改与仿真相关推荐

  1. 基于NS2的AODV协议的修改与仿真的实现

    最近在用ns2帮别人做移动自组网aodv协议的改进仿真实验,学习了路由仿真方面的不少知识,顺手记录下来. ns2的安装 查阅网上资料发现ns2可以在cygwin上安装,为了省事就用cygwin安装了n ...

  2. linux 修改bios信息,一种基于Linux系统通过IPMI工具修改BIOS选项的测试方法及系统_2017103901253_权利要求书_专利查询_专利网_钻瓜专利网...

    1.一种基于Linux系统通过IPMI工具修改BIOS选项的测试方法,其特征在于: 步骤101,启用IPMI服务: 步骤102,BIOS Setup选项使能设置: 步骤103,修改BIOS选项当前值与 ...

  3. mysql修改工资字段_基于Linux的MySQL操作实例(修改表结构,MySQL索引,MySQL数据引擎)...

    基于Linux的MySQL操作实例(修改表结构,MySQL索引,MySQL数据引擎) 前言 本篇是基于Linux下针对MySQL表结构的修改,MySQL索引的操作以及MySQL数据引擎的配置和说明. ...

  4. Linux 模拟基于进程的隐蔽通道(修改文件名)

    Linux 模拟基于进程的隐蔽通道(修改文件名) 目录 Linux 模拟基于进程的隐蔽通道(修改文件名) 实验要求 实验步骤 流程图 具体代码 文件监听程序(process_p2.c) 文件修改程序( ...

  5. 【扫地机器人】基于stm32f103ze扫地机器人程序,基于整点原子精英版例程修改

    32程序-[扫地机器人]基于stm32f103ze扫地机器人程序,基于整点原子精英版例程修改. 本产品主要实现的是机器人自动弓字形前进,遇到障碍物避障并继续,WiFi控制整个过程,同时可一键回到初始位 ...

  6. 基于echart青海省地图资源的修改体验

    基于echart青海省地图资源的修改体验 最近老用echart做首页展示地图,本来都还很正常,却遇到了奇怪的甲方需求. 在青海省下8个同级行政区内,把唐古拉山镇部分独立划分出来和这8个平级. 什么也不 ...

  7. matlab同步发电机外特性仿真,基于Matlab-Simulink的虚拟同步发电机控制方法的仿真研究...

    分 类 号: TM341 单位代码:10183 研究生学号: 201255E025 密 级:公开 吉 林 大 学硕士学位论文 (专业学位) 基于 Matlab-Simulink 的虚拟同步发电机控制方 ...

  8. java数字图像处理开题报告,基于MATLAB的数字图像处理算法研究与仿真开题报告...

    基于MATLAB的数字图像处理算法研究与仿真开题报告 毕 业 设 计 (2013 届) 题 目基于 MATLAB 的数字图像 处理算法研究与仿真 学 院 物理电气信息学院 专 业 通信工程 年 级 0 ...

  9. 炮弹仿真系统matlab软件下载,基于Matlab/Simulink的导弹六自由度弹道仿真系统设计...

    第 11 卷 第 1 期 2011 年 1 月 1671-1815( 2011) 1-0029-06 科 学 技 术 与 工 程 Science Technology and Engineering ...

  10. 基于gazebo实现多无人车的编队仿真(一)

    基于gazebo实现多无人车的编队仿真(一)--多机器人的显示 研究背景 宏定义部分 gazebo的gui启动以及world启动 多机器人模型显示部分 致谢 研究背景 网上已经有许多的多机器人显示的资 ...

最新文章

  1. 数据库——修改表信息(转)
  2. linux 下oracle 的kernel.shmmax,Linux 下kernel.shmmax 的设置问题
  3. 皮一皮:35岁后你做什么?
  4. 谈吉日嘎拉的《白话反射技术》及其他(吵架篇)
  5. C++的简单文本IO
  6. ABAP中的Table Control编程
  7. 你有必要知道的一些JavaScript 面试题(中)
  8. 初步探讨WPF的ListView控件(涉及模板、查找子控件)
  9. Django从理论到实战(part49)--ModelForm
  10. 计算机网络 --- 数据链路层CSMA/CA协议
  11. Python单元测试框架之unittest+requests+ddt+excel接口自动化测试
  12. 项目后台运行关闭_iOS到底有没有必要上滑强制关闭APP?
  13. 14.为主题配置图片性能
  14. 计算机房设计规范2008,电子信息系统机房设计规范(GB50174-2008)(下)
  15. 国际音标 英式音标 美式音标
  16. mysql中floor的用法_Mysql报错注入之floor报错详解
  17. 软件和资源收集(四):图库、作图、音乐、视频
  18. 在爱情里不会委曲求全,活的非常自我,态度十分坚决的三个生肖
  19. 吕思清老师口中的小艺是何许人也
  20. 英语文章关于计算机的,关于计算机的英语作文(通用8篇)

热门文章

  1. 关于显示屏分辨率的问题
  2. Android 快速集成文档校正能力 超简单
  3. QS最新大学排名惹争议:深大南科大再获认可,上海大学超华科,人大校友心里最苦...
  4. php 调用reboot,Linux命令:reboot命令
  5. TCP套接口丢失与重传报文线索
  6. Paper reading (三十一):Personalized Nutrition by Prediction of Glycemic Responses(overview)
  7. Unity-Chan Toon Shader 2 介绍
  8. ps快捷键 拿走不谢*小Lemon送你们的
  9. PeopleSoft介绍
  10. C++ RQNOJ 星门龙跃