c - 使用 Contiki OS 在 rpl 协议(protocol)中实现多首选父节点

标签 c contiki

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

rpl-dag.c 文件中有static rpl_parent_t * best_parent(rpl_dag_t *dag)函数,它将两个邻居发送到mrhof.c文件中的static rpl_parent_t *best_parent(rpl_parent_t *p1, rpl_parent_t *p2)函数这个函数返回最好的邻居作为首选。

我想做的是获取另一个邻居(不是最好的)并将其与所有其他邻居进行比较,这样我就得到了最好的两个邻居,但是当在 mrhof.c 中运行时返回一个首选 parent 我不知道哪个是这个邻居,正如您在 rpl-dag.c 文件的这一行中看到的那样:

best = dag->instance->of->best_parent(best, p);

我的意思是在这一行中,函数发送 bestp 并获得其中一个 best 但是我不知道哪个是最好的,所以我可以拿另一个和其他邻居比较。

如果我尝试发送三个邻居在 mrhof.c 中运行,我应该像这样返回两个最好的 return best1, best2 但这当然行不通。

最佳答案

一种选择是在父代选择算法中引入一个新参数:要忽略的父代。然后你可以做两次父选择。第一次将“忽略参数”设置为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;
}

关于c - 使用 Contiki OS 在 rpl 协议(protocol)中实现多首选父节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50326191/

相关文章:

contiki空中编程

Contiki OS 循环太快无法打印结果?

c - 复制“Gallery of processor cache effects”

arrays - 快速初始化C数组(写入)

c - 既然 'fread'是buffred的,有没有必要把数据fread到内存中再使用呢?

Contiki os MQTT

c - 在 econotag (contiki 2.7) 中加载程序

openssl - 在 Contiki 中使用 OpenSSL

c - 如何在 C 中交换 num1 的第一个字节与 num2 的最后一个字节?

mysql - C程序中的"unable to include mysql.h"