使用Contiki OS在rpl协议中实现多首选父级

时间:2018-05-14 08:40:50

标签: c contiki

我尝试实现多父rpl协议,我使用Contiki 3.0。

rpl-dag.c 文件中有 static rpl_parent_t * best_parent(rpl_dag_t * dag)函数,它在 mrhof.c 文件中向静态rpl_parent_t * best_parent(rpl_parent_t * p1,rpl_parent_t * p2)函数发送两个邻居并且此函数返回最喜欢的邻居。

我想要做的是获得另一个邻居(不是最好的)并将其与所有其他邻居进行比较,以便我得到最好的两个邻居,但是当 mrhof.c 中的功能返回时我不知道哪个是这个邻居,你可以在 rpl-dag.c 文件的这一行看到:

  

最佳 = dag-> instance-> of-> best_parent(最佳 p );

我的意思是在这一行中,函数发送最佳 p 并获得最佳其中一个但是我不知道哪一个被选为最佳,所以我可以拿另一个并与其他邻居进行比较。

如果我尝试在 mrhof.c 中发送三个邻居,我应该返回两个最好的返回best1,best2 ,但这当然不起作用。

1 个答案:

答案 0 :(得分:0)

一个选项是在父选择算法中引入一个新参数:要忽略的父项。然后你可以做两次父选择。第一次使用" ignore参数"设置为NULL,第二次用"忽略参数"在第一次设置为父查找时为NULL。

主要想法的代码:

rpl_parent_t *best1 = NULL;
rpl_parent_t *best2 = NULL;
best1 = best_parent(NULL);
if(best1 != NULL) {
  best2 = best_parent(best1);
}

选择如下:

rpl_parent_t *best_parent(rpl_parent_t *to_ignore)
{
  rpl_parent_t *best = NULL;
  rpl_parent_t *p;
  for(p = nbr_table_head(rpl_parents); p != NULL; p = nbr_table_next(rpl_parents, p)) {
    if(p != to_ignore) {
      best = of->best_parent(best, p);
    }
  }
  return best;
}