Я совершенно новичок в contiki и cooja, поэтому ваши усилия высоко ценятся. Я думаю, что мне нужно подробно описать мою проблему. Итак, я знаю, что часть набора соседей является родительским набором, и один из них выбирается в качестве предпочтительного родителя на основе спецификации RPL, так как же я могу выбрать худший из этого частичного набора в contiki? Я попытался изменить код в файле src rpl-dag.c и rpl-mrhof.c и ожидал, что каждый раз, когда узел добавляет родителя в набор соседей, он сравнивает новый с текущим предпочтительным родителем и выбирает плохой один, но это не сработало, как должно было быть!! узел выбирает родителя 0, т.е. он отсоединяется от DODAG. узел 1 является приемником - UDP-сервером, а остальные - UDP-клиентами. Изменены коды узлов 8 rpl-dag.c и rpl-mrhof.c. Я думал, что узел 8 изменит своего предпочтительного родителя с узла 7 на узел 6.
rpl-mrhof.c
static rpl_parent_t *
best_parent(rpl_parent_t *p1, rpl_parent_t *p2)
{
rpl_dag_t *dag;
rpl_path_metric_t min_diff;
rpl_path_metric_t p1_metric;
rpl_path_metric_t p2_metric;
dag = p1->dag; /* Both parents are in the same DAG. */
min_diff = RPL_DAG_MC_ETX_DIVISOR /
PARENT_SWITCH_THRESHOLD_DIV;
p1_metric = calculate_path_metric(p1);
p2_metric = calculate_path_metric(p2);
/* Maintain stability of the preferred parent in case of similar ranks. */
if(p1 == dag->preferred_parent || p2 == dag->preferred_parent) {
if(p1_metric < p2_metric + min_diff &&
p1_metric > p2_metric - min_diff) {
PRINTF("RPL: MRHOF hysteresis: %u <= %u <= %u\n",
p2_metric - min_diff,
p1_metric,
p2_metric + min_diff);
return dag->preferred_parent;
}
}
return p1_metric > p2_metric ? p1 : p2;
}
rpl-dag.c
rpl_parent_t *
rpl_select_parent(rpl_dag_t *dag)
{
rpl_parent_t *p, *worse;
best = NULL;
//p = nbr_table_head(rpl_parents);
p= nbr_table_head(ds6_neighbors);
while(p != NULL) {
if(p->rank == INFINITE_RANK) {
/* ignore this neighbor */
} else if(worse == NULL) {
worse = p;
} else {
worse = dag->instance->of->best_parent(worse, p);
}
//p = nbr_table_next(rpl_parents, p);
p = nbr_table_next(ds6_neighbors, p);
}
if(worse != NULL) {
rpl_set_preferred_parent(dag, worse);
}
return worse;
}