1

我对 contiki 和 cooja 完全陌生,因此非常感谢您的努力。我想我必须详细说明我的问题。所以,我知道邻居集的一部分是父集,其中一个被选为基于 RPL 规范的首选父集,那么我如何从 contiki 中的部分集中选择最差的一个?我尝试更改 src 文件 rpl-dag.c 和 rpl-mrhof.c 中的代码,并且我希望每次节点将父节点添加到邻居集时,它将新的父节点与当前首选父节点进行比较并选择坏的一,但这并没有按预期工作!节点选择父节点 0,即它与 DODAG 分离。节点 1 是接收器 -UDP 服务器,其余的是 UDP 客户端。节点 8 rpl-dag.c 和 rpl-mrhof.c 代码已更改。我认为节点 8 会将其首选父节点从节点 7 更改为节点 6。

rpl-mrhof.c

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;
}

rpl-dag.c

rpl_parent_t *
rpl_select_parent(rpl_dag_t *dag)
{
  rpl_parent_t *p, *worse;

  best = NULL;

  //p = nbr_table_head(rpl_parents);
    p= nbr_table_head(ds6_neighbors);
  while(p != NULL) {
    if(p->rank == INFINITE_RANK) {
      /* ignore this neighbor */
    } else if(worse == NULL) {
      worse = p;
    } else {
      worse = dag->instance->of->best_parent(worse, p);
    }
    //p = nbr_table_next(rpl_parents, p);
    p = nbr_table_next(ds6_neighbors, p);
  }

  if(worse != NULL) {
    rpl_set_preferred_parent(dag, worse);
  }

  return worse;
}

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

0

我完全忘记了,如果一个节点有 2 个父节点提供相同的等级/路由指标,那么它必须选择 2 个中的任何一个,我相应地修复了代码!!

于 2017-12-01T18:16:21.240 回答