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),這麼幾個資訊。
路由引擎的源碼結構是這樣的:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXYFhGd192UvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jMxEjNzQzMwETOwkDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)