我尝试实现多父 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);
我的意思是在这一行中,函数发送 best 和 p 并获得其中一个 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/