在 TSCH Schedule (Contiki-NG) 上分离 RPL 和应用时隙
Separating RPL and application timeslots on TSCH Schedule (Contiki-NG)
我正在尝试构建一个 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);
}
假设您在单元格 (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 使用哪个小区。
选择器需要有特定的声明,如:
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
我正在尝试构建一个 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);
}
假设您在单元格 (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 使用哪个小区。
选择器需要有特定的声明,如:
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