部件号: CC1354P10
我的客户需要了解 Wi-SUN 栈中重新加入逻辑的详细信息、以实现一些应用代码。 请就以下问题提供帮助:
- 如果路由器已经加入边界路由器并执行 OTA、它会在 OTA 或新加入后执行重新加入过程吗?
- BR 上是否有路由器节点重新加入网络的回调函数? 客户需要进行此回调、以在路由器完成 OTA 或因连接断开而重新加入后处理一些用户数据。
此致、
Shuyang
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
部件号: CC1354P10
我的客户需要了解 Wi-SUN 栈中重新加入逻辑的详细信息、以实现一些应用代码。 请就以下问题提供帮助:
此致、
Shuyang
尊敬的 Shuyang:
抱歉、每个默认情况下、我看到这不是示例的一部分。 以下是有关如何在路由表中添加轮询机制的一些指导原则。
1.概述
ns_br 边界路由器项目本身包含极少的应用逻辑。 核心边界路由器实现
驻留在:
source/ti/ti_wisunfan/apps/border_router_nanostack_tirf/
borderrouter_ws.c—主任务和 Wi-SUN 接口管理
application.c—主线程、NCP tasklet
路由由由由 nanostack RPL (RFC 6550) 实现在内部进行管理。 没有推送式回调
路由表更改。 应用程序必须通过 BBR API 轮询。
2、相关 API
标题:source/third_party/mbed/nanostack/Sal-stack-nanostack/nanostack/nanostack/ws_bbr_api.h
//第 36-53 行:边界路由器信息(包括设备数和前缀)
typedef 结构 BBR_INFORMATION{
uint64_t timestamp;//设备时间戳/版本
uint8_t gateway[16];//默认路由本地链路地址
uint8_t dodag_id[16];//边界路由器 DODAG ID
uint8_t prefix[8];//网络的全局前缀
uint8_t IID[8];//边界路由器 IID
uint16_t devices_in_network;//已注册节点数
uint8_t instance_id;
uint8_t 版本;
} bbr_information_t;
//行 58-63:路由表中的一个条目
typedef 结构 bdr_route_info{
uint8_t target[8];//子节点的 8 字节 IID
uint8_t parament[8];//其父级的 8 字节 IID
} bbr_route_info_t;
//行~149:检索完整路由表
int ws_BBR_ROUTING_TABLE_GET (int8_t interface_id、
bbr_route_info_t *table_ptr、
uint16_t table_len);
//获取 BR 信息、包括当前设备计数
int ws_BBR_INFO_GET (int8_t interface_id、bb_information_t *info);
任何节点的完整 IPv6 地址= bb_information_tprefix(8 字节)+ bb_route_info_t.ttarget(8 字节)。
3.路由表何时更改?
加入网络的节点(重新)向边界路由器发送 RPL DAO(目标通告对象)。 。
纳米堆叠通过以下方式在内部进行处理:
文件:source/.../RPL/rpl_control.c
函数: RPL_CONTROL_DOO_HANDLER ()
发生的情况:接收和派送 DAO
────────────────────────────────────────μ s
文件:source/.../RPL/rpl_downward.c
函数:RPL_INSTANCE_DO_RECEIVED ()
发生的情况:处理 DAO 目标
────────────────────────────────────────μ s
文件:source/.../RPL/rpl_downward.c
函数:RPL_DRODING_PROCESS_TARGETESS_FOR_TRANSITY()
发生的情况:创建/更新路由表条目;在内部设置 new_info = true
此事件没有应用程序可访问的回调。 观察它的唯一方法是轮询
WS_BBR_ROUTING_TABLE_GET () 和比较结果。
4.在项目中添加路由表轮询的位置
4.1 现有的定期计时器挂钩
文件:borderrouter_ws.c、第 543–561 行
任务组已经有一个 20 秒的重复计时器 (event_id =9)。 这是添加路由的自然位置
表快照和差异:
// borderrouter_ws.c、第 543 行
充电盒 ARM_LIB_SYSTEM_TIMER_EVENT:
eventos_event_timer_cancel (event->event_id、event->receiver);
如果 (event->event_id ==9){
#if mbed_CONF_APP_DEBUG_TRACE
#ifndef WISUN_DEMO
arm_print_routing_table();//第 549 行—已打印内部路由表
arm_print_neigh_cache();
print_memory_stats();
print_interface_addresses();
#endif
#endif
//>>在此处插入路由表查询(参见第 5 节)<<<
eventos_event_timer_request (9、ARM_LIB_SYSTEM_TIMER_EVENT、
br_tasklet_id、20000);//行 559
}
休息;
计时器首先在 ARM_LIB_TASKLET_INIT_EVENT 内的第 540 线路上布防。
4.2 引导模式就绪(一次性触发)
文件:borderrouter_ws.c、第 659–683 行 (wisun_interface_event_handler)
当 Wi-SUN 接口完成 bootstrap 时、arm_Nwk_bootload_ready 将触发。 这样可确认边界路由器为
就绪、节点可以开始加入:
// borderrouter_ws.c、第 663 行
case (arm_Nwk_bootload_ready):{
TR_INFO(“Wisun bootstrap ready“);
if (arm_net_interface_set_metric (ws_br_handler.ws_interface_id、mesh_metric)!= 0){
TR_WARN(“未能为网格 0 设置度量。“);
}
TR_INFO(“RF 接口地址:“);
print_interface_addr (ws_br_handler.ws_interface_id);
//>>从此处开始安全地开始轮询<<<<
休息;
}
5、建议插入的代码
应在计时器启用之前、在第 559 行的 ARM_LIB_SYSTEM_TIMER_EVENT 块内添加以下代码
重新布防。 它通过将当前路由表与之前的快照进行比较来检测节点联接和重新联接。
要在 borderrouter_ws.c 顶部添加的声明(在现有全局变量之后,在第 118 行周围):
#include “ws_bbr_api.h"//“//已包含在第 18 行中
#define MAX_ROUTE_ENTRIES 50 //匹配 router.opts 中的 NANOSTACK_DEVICE_TABLE_ENTRY_BR
静态 BBR_route_info_t prev_route_table[MAX_route_entry];
静态 uint16_t prev_route_COUNT = 0;
在第 559 行插入的代码(在 event->event_id == 9 块内):
/*--路由表更改检测--*/
bb_information_t br_info;
if (ws_BBR_INFO_GET (ws_br_handler.ws_interface_id、&br_info)== 0){
uint16_t n = br_info.devices_in_network;
if (n >0 && n <= MAX_route_entries){
bbr_route_info_t cur_table[MAX_route_entry];
int count = ws_bbr_routing_table_get (
ws_br_handler.ws_interface_id、cur_table、n);
if (count >= 0){
/*检测新节点或重新连接节点*/
for (int i = 0;i < count;i++){
bool found = false;
对于 (int j = 0;j <(int) prev_route_COUNT;j++){
if (memcmp (cur_table[i].target、
Prev_route_table[j].target、8)== 0){
已找到= true;
休息;
}
}
如果(!found){
/*节点为新节点或已重新连接*/
TR_INFO(“已加入/重新加入的节点:IID %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x“
“父级%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x“、
CUR_TABLE[i]。TARGET[0]、cur_TABLE[i]。TARGET[1]、
CUR_TABLE[i]。target[2]、cur_TABLE[i]。target[3]、
CUR_TABLE[i]。target[4]、cur_TABLE[i]。target[5]、
CUR_TABLE[i]。target[6]、cur_TABLE[i]。target[7]、
CUR_TABLE[i]。parent[0]、cur_table[i]。parent[1]、
CUR_TABLE[i]。parent[2]、cur_table[i]。parent[3]、
CUR_TABLE[i]。parent[4]、cur_TABLE[i]。parent[5]、
CUR_TABLE[i]。parent[6]、cur_table[i]。parent[7]);
}
}
/*保存下一次轮询的快照*/
memcpy (prev_route_table、cur_table、
计数* sizeof (BBR_route_info_t);
Prev_route_COUNT =(uint16_t) count;
}
}
}
/*--端路由表更改检测--*/
谢谢、
Marie H