CTP路由引擎主要由定时器驱动,发动路由帧来建立通信拓扑,广播主要的内容就是广播自己相对于根节点的ETX以及自己的地址,当然还有自己阻塞的一些状态信息,这些信息会被邻居节点捕获,然后更新邻居节点的路由表,每个节点都可以根据自己的路由表,根据情况选出ETX比较小的节点来作为自己的父节点。这样子每个节点和根节点的最小代价通信路径就可以得出来了。拓扑也可以得以建立。
在CTP.h中规定了路由帧的格式:
typedef nx_struct {
nx_ctp_options_t options;
nx_am_addr_t parent;
nx_uint16_t etx;
nx_uint8_t data[0];
} ctp_routing_header_t;
第一个变量是状态位,比如如果节点阻塞了或者节点还没有自己的父节点,那么就要在这个状态为中填充对应的值。
路由表的格式在TreeRoute.h中也有了定义:
typedef struct {
am_addr_t parent;
uint16_t etx;
bool haveHeard;
bool congested;
} route_info_t;
typedef struct {
am_addr_t neighbor;
route_info_t info;
} routing_table_entry;
inline void routeInfoInit(route_info_t *ri) {
ri->parent = INVALID_ADDR;
ri->etx = 0;
ri->haveHeard = 0;
ri->congested = FALSE;
}
首先就是一个索引值一个信息部分,在路由表中要记录当前节点的地址,ETX,有没有监听到父节点(当一个节点没有确定父节点之前haveHeart这个值都是0),这么几个信息。
路由引擎的源码结构是这样的: