Вопросы об энергетической целевой функции для RPL в contiki cooja
Я пытаюсь реализовать кластерный протокол rpl, но прежде всего я пытаюсь понять, как он работает, и реализовать существующее усовершенствование rpl.
Я пытаюсь сделать так, чтобы у каждого ребенка было более одного родителя в списке, и он выбрал родителя с минимальной стоимостью, а стоимость зависит от ETX и остаточной энергии узла.
Я использую Contiki 3.0 и из того, что я понимаю, когда я меняю
#define RPL_DAG_MC RPL_DAG_MC_NONE to #define RPL_DAG_MC RPL_DAG_MC_ENERGY в файле rpl-conf.h, целевая функция (MRHOF) работает в зависимости от энергии, но когда я использую оператор печати в Calculate_path_metric(rpl_parent_t-rp), pp_parent_t #elif RPL_DAG_MC == RPL_DAG_MC_ENERGY вот так:
#elif RPL_DAG_MC == RPL_DAG_MC_ENERGY
printf ("энергия ночи% d =% d +% d \ n", p->mc.obj.energy.energy_est + (uint16_t) nbr-> link_metric, p->mc.obj.energy.energy_est, nbr- > link_metric);
return p->mc.obj.energy.energy_est + (uint16_t) nbr-> link_metric;
значение p->mc.obj.energy.energy_est всегда равно 0
Я ищу аккумуляторный модуль и, насколько я понимаю, я должен использовать самую мощную модель, поэтому я нашел некоторую формулу и изменил ее в соответствии с тем, что мне нужно, чтобы рассчитать оставшуюся энергию и установить 2000mj в качестве начальной энергии, это код:
uint32_t consum_energy; uint32_t init_energy = 32400000
consum_energy = (длинный без знака) ((0,6 * energest_type_time(ENERGEST_TYPE_CPU) +0,003 * energest_type_time(ENERGEST_TYPE_LPM) + 21,0 * energest_type_time(ENERGEST_TYPE_TRANSMIT) + 23,0 * energest_type_TY_TY_TY_TY_TY_TY_TY_TENETT) ENERG printf ("consum_energy =:% lu mJ \ n", consum_energy);
p->mc.obj.energy.energy_est = (init_energy - consum_energy);
я добавляю его в статическую функцию rpl_path_metric_t вычисления_path_metric(rpl_parent_t *p) в файле rpl-mrhof.c после #elif RPL_DAG_MC == RPL_DAG_MC_ENERGY, но это вычислит оставшуюся энергию того же узла и поместит его в родительский узел (p>.obj.energy.energy_est = (init_energy - consum_energy);) что неверно, поскольку значение оставшейся энергии родительского муша будет получено от родителя dio_input, не установленным тем же узлом, я думаю, что я должен поместить этот код в соседний_связь (rpl_parent_t *) p, int status, int numtx), но эта функция выполняется, когда что-то меняется в ссылке, поэтому я думаю, что это тоже неправильно. я не знаю, должен ли я написать новую функцию, но я боюсь, что она не работает, потому что я не знаю, какой другой файл я должен изменить, и если я должен добавить новое поле в пакет rpl dio?
Также в статической функции rpl_parent_t *best_parent(rpl_parent_t *p1, rpl_parent_t *p2) в файле rpl-mrhof.c он возвращает лучшего родителя для ребенка, но я не могу найти, когда этот родительский файл сохранен (в каком файле я могу его увидеть, потому что я хочу вернуть обоих родителей, но я думаю, что в этом случае все соседние будут сохранены не только два лучших родителя, поэтому мне нужно отсортировать список и сохранить два лучших
Извините за то, что долго, но мне действительно нужна помощь с этими вопросами Спасибо