Реализовать несколько предпочтительных родителей в протоколе rpl, используя ОС Contiki.

Я пытаюсь реализовать протокол multi-parent rpl, я использую Contiki 3.0.

В файле rpl-dag.c есть функция static rpl_parent_t * best_parent(rpl_dag_t *dag), она отправляет двух соседей в static rpl_parent_t *best_parent(rpl_parent_t * p1, rpl_parent_t *p2) в файле mrhof.c, и эта функция возвращает лучшего соседа в качестве предпочтительного.

Что я пытаюсь сделать, так это получить другого соседа (не самого лучшего) и сравнить его со всеми другими соседями, поэтому я получаю двух лучших соседей, но когда функция в mrhof.c возвращает одного предпочтительного родителя я не могу знать, что это за сосед, как вы можете видеть в этой строке в файле rpl-dag.c:

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

Я имею в виду, что в этой строке функция отправляет best и p и получает best один из них, но я не знаю какой из них выбран как лучший, поэтому я могу взять другой и сравнить его с другими соседями.

И если я попытаюсь отправить трех соседей для работы в mrhof.c, я должен вернуть два лучших, например return best1, best2, но это, конечно, не работает.


person Sara    schedule 14.05.2018    source источник


Ответы (1)


Один из вариантов заключается в том, что вы вводите новый параметр в алгоритм выбора родителя: родитель для игнорирования. Затем вы можете сделать родительский выбор два раза. В первый раз с параметром «игнорировать», установленным на 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;
}
person kfx    schedule 14.05.2018
comment
Большое спасибо за ваш ответ, но я не понимаю значение to_ignore, которое изначально установлено равным NULL, а затем сравнивается с лучшим следующим образом: best1 = dag-›instance-›of-›best_parent(to_ignore, NULL ); best2=dag-›экземпляр-›best_parent(best1, to_ignore); но значение to_ignore по-прежнему равно NULL, поэтому best2 также будет сравнивать best1 с NULL, почему? И все изменения выполняются в файле best_parent файла rpl-dag.c, а не в файле mrhof.c, я прав? - person Sara; 15.05.2018
comment
Да, в rpl-dag.c. Я не понимаю первую часть вашего комментария. - person kfx; 16.05.2018
comment
Я имею в виду, каково значение to_ignore? , код для основной идеи никогда не присваивает значение to_ignore, так каково значение to_ignore? - person Sara; 18.05.2018
comment
Он присваивает значение to_ignore. Прочтите код еще раз. - person kfx; 18.05.2018