Разделение RPL и временных интервалов приложений по расписанию TSCH (Contiki-NG) - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь построить Расписание TSCH, которое заставляет RPL передавать данные во временном интервале, а мое приложение - в другом временном интервале. Кто-нибудь знает, возможно ли это?

Я пытался использовать следующую функцию для планировать свой слот TSCH, но в настоящее время я не могу понять, как заставить TSCH идентифицировать RPL и сообщения приложения.

void my_tsch_scheduler(int advertising, int rx, int tx) {
  struct tsch_slotframe *sf_min;
  tsch_schedule_remove_all_slotframes();
  sf_min = tsch_schedule_add_slotframe(0, TSCH_SCHEDULE_DEFAULT_LENGTH);

  tsch_schedule_add_link(sf_min, LINK_OPTION_TX | LINK_OPTION_RX,
      LINK_TYPE_ADVERTISING, &tsch_broadcast_address, 0, 0);

  tsch_schedule_add_link(sf_min, LINK_OPTION_TX | LINK_OPTION_RX,
      LINK_TYPE_NORMAL, &tsch_broadcast_address, 3, 0);
}

1 Ответ

0 голосов
/ 04 февраля 2020

Допустим, у вас есть два слота данных, запланированных в ячейках (3, 0) и (4, 0), и вы хотите использовать первый для отправки сообщений RPL и второй для отправки данных:

void my_tsch_scheduler(int advertising, int rx, int tx) {
  struct tsch_slotframe *sf_min;
  tsch_schedule_remove_all_slotframes();
  sf_min = tsch_schedule_add_slotframe(0, TSCH_SCHEDULE_DEFAULT_LENGTH);

  tsch_schedule_add_link(sf_min, LINK_OPTION_TX | LINK_OPTION_RX,
      LINK_TYPE_ADVERTISING, &tsch_broadcast_address, 0, 0);

  tsch_schedule_add_link(sf_min, LINK_OPTION_TX | LINK_OPTION_RX,
      LINK_TYPE_NORMAL, &tsch_broadcast_address, 3, 0); /* RPL */
  tsch_schedule_add_link(sf_min, LINK_OPTION_TX | LINK_OPTION_RX,
      LINK_TYPE_NORMAL, &tsch_broadcast_address, 4, 0); /* data */
}

Идея состоит в том, чтобы использовать селектор пакетов - функцию обратного вызова, которая будет проверять пакет и сообщать TSCH, какую ячейку использовать.

Селектор должен иметь объявление c, например:

int my_callback_packet_ready(void);

В селекторе вы можете посмотреть атрибуты packetbuf, чтобы выяснить, является ли это сообщение RPL, сообщение EB, или обычное сообщение с данными:

int my_callback_packet_ready(void) {
  const uint16_t slotframe = 0;
  const uint16_t channel_offset = 0;
  uint16_t timeslot = 0xffff;

  if(packetbuf_attr(PACKETBUF_ATTR_FRAME_TYPE) == FRAME802154_BEACONFRAME) {
     /* EB packet */
     timeslot = 0;
  } else if (packetbuf_attr(PACKETBUF_ATTR_NETWORK_ID) == UIP_PROTO_ICMP6
     && (packetbuf_attr(PACKETBUF_ATTR_CHANNEL) >> 8) == ICMP6_RPL) {
     /* RPL packet */
     timeslot = 3;
  } else {
     /* data packet */
     timeslot = 4;
  }

#if TSCH_WITH_LINK_SELECTOR
  packetbuf_set_attr(PACKETBUF_ATTR_TSCH_SLOTFRAME, slotframe);
  packetbuf_set_attr(PACKETBUF_ATTR_TSCH_TIMESLOT, timeslot);
  packetbuf_set_attr(PACKETBUF_ATTR_TSCH_CHANNEL_OFFSET, channel_offset);
#endif

  return 1;
}

Вам необходимо включить селектор и определить обратный вызов селектора в конфигурации приложения:

#define TSCH_CONF_WITH_LINK_SELECTOR 1
#define TSCH_CALLBACK_PACKET_READY my_callback_packet_ready
...