Как получить доступ к данным пакета данных в целевой функции rpl MRHOF в contikiRPL? - PullRequest
0 голосов
/ 23 января 2020

Я хочу реализовать DAG Metri c Типы объектов контейнера, такие как энергия, пропускная способность, задержка, количество переходов в целевой функции mrhrof в contikirpl. Я пытаюсь получить пакет данных пакета данных, такой как отметка времени отправки / получения пакета, пакеты, полученные непосредственным родительским участником и т. Д. c.

Экспериментальная установка: один приемник (mote1) (udp-сервер. c), три источника (mote2,3 и 4) (udp-slient. c) (.... / contiki-3.0 / examples / ipv6 / rpl-udp).

mote1 <----> mote2 <----> mote3 <- -> mote4

(1) Для подсчета полученных пакетов я попробовал очень простой код в neighbour_link_callback () , потому что эта функция получает информацию о соседях канального уровня. (..contiki-3.0 / core / net / rpl / rpl-mrhof. c)

#include "sys/node-id.h" (включено в файл для доступа к идентификатору узла)


 static uint16_t pkt1=0,pkt2=0,pkt3=0;   /* pkt1,2 and 3 store incoming packets for mote2,3 and 4 respectively */  

if(status == MAC_TX_OK)      // pkts transmission successfully 
    {
      switch (node_id) {
      case 2:
         pkt1++;
        break;
      case 3:
        pkt2++;
        break;
      case 4:
        pkt3++;
        break;
      default:
         PRINTF("Other::error outside of three mote  \n"); 
        break;
      }
     }

Проблема с этим кодом заключается в том, что я получаю больше пакетов в этой переменной. Я думаю, из-за этого хранятся все типы пакетов (контроль и пакеты данных). Как получить только пакеты данных в этих переменных (pkt1, pkt2, pkt3).

(2) Для вычисления задержки я хочу получить метку времени отправки / получения пакета в mrhrof. c Мудро, но я могу получать время только на udp-сервере. c и udp-клиенте. c
(.... / contiki-3.0 / examples / ipv6 / rpl- udp)

Для этого я написал следующий код: udp-клиент. c

stati c uint16_t pkt1_s = 0, pkt2_s = 0, pkt3_s = 0;

Внутри "stati c void send_packet (void * ptr)"

 pkt_send_time = clock_seconds(); 

switch (node_id) {
      case 2:
        PRINTF("::No of pkt_send::  %u by \t mote %d at \t pkt_send_time:: %u  \n",++pkt1_s,node_id,pkt_send_time); 
        break;
      case 3:
        PRINTF("::#pkt_send::  %u  \t  by mote %d at \t pkt_send_time:: %u  \n",++pkt2_s,node_id,pkt_send_time); 
        break;
      case 4:
        PRINTF("::#pkt_send::  %u  \t by mote %d at \t pkt_send_time:: %u  \n",++pkt3_s,node_id,pkt_send_time); 
        break;
      default:
         PRINTF("::error send pkt outside range  \n"); 
        break;
      }

Я написал такой же код для udp-сервера. c .

Здесь я сталкиваюсь со следующими проблемами:

  1. Функция clock_seconds () предоставляет время в секундах, но мне нужно время в милисекундах.
  2. Как получить точную метку времени отправки / получения пакетов данных в rpl-mhrof. c

1 Ответ

1 голос
/ 25 января 2020
  1. Вы можете использовать RTIMER_NOW () для лучшей детализации времени, но будьте осторожны: для большинства типов узлов часы не синхронизированы! Единственное надежное решение - отправить значение time_send узлу и попросить узел ответить этим. Когда вы его получите, вы можете взять current_time и вычесть их. Еще один обходной путь - использовать время cooja для вывода (Записать все выходные данные и работать с этими автономными данными).
  2. Для подробных пакетов (data / icmp, send / receive) используйте следующее: uip_stat.udp.sent, uip_stat.udp.recv, uip_stat.icmp.sent, uip_stat.icmp.recv

с использованием

#include "net/ipv6/uip-ds6.h"
#include "net/ip/uip-udp-packet.h"
...