首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TSCH计划中RPL和应用时隙的分离(Contiki-NG)

TSCH计划中RPL和应用时隙的分离(Contiki-NG)
EN

Stack Overflow用户
提问于 2020-02-02 00:23:27
回答 1查看 444关注 0票数 0

我正在尝试构建一个TSCH计划,使RPL传输成为时隙,而我的应用程序在另一个时隙中传输,有人知道这是否可能吗?

我尝试使用下面的函数来调度我的the,但是目前我不知道如何使TSCH识别RPL和应用程序消息。

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-04 13:25:47

假设您在单元格(3,0)和(4,0)处有两个数据插槽,您希望使用第一个用于发送RPL消息,第二个用于发送数据:

代码语言:javascript
复制
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使用哪个单元格。

选择器需要有特定的声明,例如:

代码语言:javascript
复制
int my_callback_packet_ready(void);

在选择器中,您可以查看packetbuf属性,以确定这是RPL消息、EB消息还是常规数据消息:

代码语言:javascript
复制
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;
}

您需要启用选择器,并在应用程序的配置中定义选择器回调:

代码语言:javascript
复制
#define TSCH_CONF_WITH_LINK_SELECTOR 1
#define TSCH_CALLBACK_PACKET_READY my_callback_packet_ready
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60022282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档