Реализовать несколько предпочтительных родителей в протоколе rpl с использованием ОС Contiki - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь реализовать многопользовательский протокол rpl, я использую Contiki 3.0.

Из файла rpl-dag.c есть статический 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 );

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

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

1 Ответ

0 голосов
/ 14 мая 2018

Один вариант заключается в том, что вы вводите новый параметр в алгоритм выбора родительского элемента: родительский параметр, который следует игнорировать. Затем вы можете сделать родительский выбор два раза. Первый раз с параметром ignore, установленным в NULL, второй раз с параметром ignore, установленным для родительского поиска, в первый раз 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;
}
...