#路由
路由对于应用层是完全透明的。应用层只是简单地将数据发送到堆栈,然后负责查找路由。这样应用程序是不在乎这是在一个多跳网络中运行。
支持网络“自愈”。如果一条特定的无线路径被破坏,路由功能会找到一条新的路径。
多对一路由。当所有数据发送到网关时,协助优化最小化流量。
##路由协议
基于AODV自组网络
用于传感器中简化了支持移动节点、链路故障、丢包
邻居路由:同个无线电范围内的路由。每个路由在“邻居表中”跟踪他们的邻居路由,路由从邻居路由收到数据后邻居表就会更新
路由收到单播包的过程:如果目标是邻居路由(包扩它的子设备),数据直接发给目标设备。否则,检测路由表条目中是否有对应的数据包目的地址,如果发现有对应的条目,则包被转发过去存储在下一跳地址中。如果单次失败,NWK层重新发包等待响应,直到达到最大次数NWK_MAX_DATA_RETRIES。如果数据超时,路由发现将启动,数据保存在缓存中。
终端设备不执行任何路由功能。消息包由它的父节点处理。
树状寻址使得根据地址派生到任何目的地路由成为可能
通过将特定父节点的终端设备的所有条目和此父节点的条目组合在一起,可以优化存储且不丢失功能。
##路由功能
###路由发现和选择
任何路由都可以发起路由发现
路由选择花费最小的路线。每个节点都在不断地跟踪邻居的连接成本(接收信号强度)。路由算法选择最佳路由路线。
路由过程:更新RREQ的成本字段,并在路由表中生成一个条目—源设备广播RREQ包获取目标地址-----节点收到后,重新广播RREQ包----遍历所有连接成本-----直到RREQ包发到目标设备-----目标设备收到很多RREQ包----目标设备选择最优的RREQ包后发送应答信号到源地址(反向路由单播)-----中间节点更新路由发现表(为了确定下一跳源)
发送数据中失去下一跳的连接时,这个中间节点向所有可能收到它的RREQ包的节点发送一个RREP来失效它的路由,并在邻居表中标记这个连接为坏。
###路由的维护
中间节点跟踪链路上的传输故障,如果确定故障,上游节点将发起路由修复,如果路由重新发现无法启动,路由错误RERR发送回数据包的源,负责重新启动路由发现。
###路由到期
如果一段时间内路由条目没有发出数据,则被标记为路由超时。直到需要空间的时候会被删除。时间配置ROUTE_EXPIRY_TIME = 30 (秒)
##表
###路由表
路由表条目内容:目标地址、下一跳节点和连接状态。
表中的条目会过期
路由表大小可以配置MAX_RTG_ENTRIES 条目的数量,默认40
###路由发现表
路由发现表条目仅在路由发现操作期间有效。在网络中可同时执行的路由分配最大数目MAX_RREQ_ENTRIES 默认8
##多对一路由协议
所有的路由都在网络层处理
多对一路由最大限度节省流量。最小化路由表和路由发现表大小。最小化发现广播风暴。
网络中的所有节点都应该保存至少一条到中心节点的有效路由。
源路由是多对一路由的一部分,为集中器确认将响应发送回目的地提供了一种有效方式。
###多对一路由发现
集中器发送一个多对一的广播请求。每个设备为集中器增加一套路由表条目,并存储一个单条邻居。
目标地址:0xFFFC
多对一路由发现请求API接口:
ZStatus_t NLME_RouteDiscoveryRequest(uint16 DstAddress, byte options,uint8 radius)
options值:
0x00 单播路由发现
0x01 多对一路由发现(集中器不占用缓存)
0x03 多对一路由发现(集中器占用缓存)
###路由记录命令RREC
反向路由是通过源路由方案的路由记录命令执行的。
数据包记录路由路径,并提供给集中器ACK的返回路径。
最后一个到集中器的数据包包含了整个路由路径,最后一个到R1的ACK网络层头报文中包含了源路由。
###路由的维护
如果连接故障,路由表标记的条目中目的地址是集中器。
当集中器收到路由失败时,应用程序将决定是否重发多对一请求。将指示传递给ZDO层,调用回调函数:
void ZDO_ManytoOneFailureIndicationCB()
默认情况下函数将重新做一个多对一路由发现请求
##路由设置函数
设置路由表大小--------MAX_RTG_ENTRIES 值必须大于4(f8wConfig.cfg)默认40
设置路由有效期--------ROUTE_EXPIRY_TIME (秒)设置为0关闭路由到期(f8wConfig.cfg)默认30
设置路由发现表大小—MAX_RREQ_ENTRIES (f8wConfig.cfg)默认8
集中器使能---------------CONCENTRATOR_ENABLE(ZGlobals.h)
设置集中器特性使用路由缓存-----CONCENTRATOR_ROUTE_CACHE(ZGlobals.h)
设置源路由表大小------MAX_RTG_SRC_ENTRIES(ZGlobals.h)
设置默认集中器广播跳数信号--------CONCENTRATOR_RADIUS(ZGlobals.h)
##路由离网关联处理
如果路由长时间脱离网络,子节点将试图加入其他父节点。当路由重新联上时,子节点仍然存在于路由表中,这样就会妨碍了正确的路线。为了避免这个状况,将那些容易掉线的路由器zgRouterOffAssocCleanup 设置为 TRUE:
uint8 CleanupChildTable = TRUE;
zgSetItem(ZCD_NV_ROUTER_OFF_ASSOC_CLEANUP,sizeof(cleanupChildTable),&cleanupChildTable);
启用后,如果收到另一个父进程,废弃的终端条目将从路由表中删除。