TI中文支持网
TI专业的中文技术问题搜集分享网站

求助路由路径问题(工程应用-急!)

现有一协调器C,两个路由R1和R2,若干终端E1,E2,E3

三个终端设备E1,E2,E3选择了R1为父设备,通过R1为其中转数据

R2离协调器C比较近,R1距离协调器C较远。

理想的数据传输本应该是 终端->R1->R2->协调器C,实际通讯过程中数据有时是按照此流程通讯的

但是由于协调器C与R1也在通信距离内(信号强度很差),导致有时数据会直接从R1发到协调器C,但由于其信号强度较差,会导致丢包情况严重

默认状态下,数据会通过R1->R2的路线走,时不时就会出现R1直接传向协调器

通信环境下,R2到R1的信号强度是一定要强于协调器到R1的

我用的是z-stack2.5.1的znp版本

我想问哪些配置可以改善这种情况?

我了解路由转发数据的流程,如下:

当路由器从他自身的应用程序或者别的设备那里收到一个单点发送的数据
包 , 则网络层 (NWK Layer) 根据一下程序将它继续传递下去 。 如果目标节点是它相
邻路由器中的一个 , 则数据包直接被传送给目标设备 。 否则 , 路由器将要检索它
的路由表中与所要传送的数据包的目标地址相符合的记录 。 如果存在与目标地址
相符合的活动路由记录,则数据包将被发送到存储在记录中的下一级地址中去 。
如果没有发现任何相关的路由记录 , 则路由器发起路径寻找 , 数据包存储在缓冲
区中知道路径寻找结束。

其中,LINK_DOWN_TRIGGER 此选项,应该是在链路成本在什么样的范围内,将设备纳入到邻居表中,对吗?

之前我将此值设为 “7”,默认为“3”,我认为此值肯定是调到一般水平,才会解决我叙述的问题,我想咨询一下,还有什么参数能对我遇到的此问题进行有效的处理或改善吗??

抓包文件没有保存,但现象就是如此。麻烦各位专家了!

谢谢!

VV:

LINK_DOWN_TRIGGER值代表的意思是,当发送失败次数累计到LINK_DOWN_TRIGGER值的时候,认为link已经down了。

当发送的cost也就是txcost和事先设定的link down cost相同的时候也认为link down。

协议栈里面关于Link cost的值,是根据LQI和RSSI决定的,通过长期实验,有一定的经验公式在里面,所以不建议你自己去修改这些值。

按照正常的话如果长时间丢包,节点会重新选择父节点的。

sylar zhang:

回复 VV:

首先感谢您的解答

但是我的上述问题该如何解决呢?

该怎么设置尽量去避免R1总是直接将数据传向协调器呢?因为明明R1到R2的信号是好于R1直接到主控的

并且我看到关于它的解释是这样

 #define LINK_DOWN_TRIGGER         7    // 3   // Link is down if txCounter exceeds this

而它的设置是影响到邻居表的

// Table of neighboring nodes (not including child nodes)neighborEntry_t neighborTable[MAX_NEIGHBOR_ENTRIES];

CONST uint8 gMAX_SOURCE_ROUTE = MAX_SOURCE_ROUTE;

CONST uint8 gMAX_BROADCAST_QUEUED = MAX_BROADCAST_QUEUED;

CONST uint8 gLINK_DOWN_TRIGGER = LINK_DOWN_TRIGGER;

CONST uint8 gMAX_PASSIVE_ACK_CNT = MAX_PASSIVE_ACK_CNT;

我猜想,会不会由于我将LINK_DOWN_TRIGGER 调大,导致即使在信号强度极差的情况下,R1依然把协调器放到了其邻居表内

并且由于R1要转发数据的目标地址正是协调器,所以R1经常会首先选择将数据直接发向其邻居表内的协调器,而不是信号更好的R2

但关键是,这个现象不是一直持续的,大多数时候,是R1通过R2再传给了协调器,间歇性的会出现R1直接传向协调器。

该怎样设置避免此问题呢?

跟下面的这些设置有何关系吗?

// Link cost constants #define DEF_LINK_COST 1                                      // Default link cost#define MAX_LINK_COST 7                                       // max link cost#define LINK_DOWN_COST 0                                  // link is down if txCost is equal to LINK_DOWN_COST#define LINK_AGEOUT_COST 0                              // Set link cost to zero if the neighbor age out

// Link counter constants#define DEF_LINK_COUNTER ((gLINK_DOWN_TRIGGER+1) / 2)                                    // Starting tx counter#define LINK_ACTIVE_TRIGGER 2                                                                                             // link is up if txCounter goes below this

VV:

回复 sylar zhang:

对于zigbee的路由实现方式,你没有完整理解。路由节点发送数据的路由实现方式如下。

当一个路由节点想要把数据发给另外的节点的时候,需要依次判断以下几步

1)目的地址是否是自己的子节点或者是父节点,如果是就直接发出去了。

2)如果不是1) 那么判断目的地址是否在邻居表中,如果是,那么也直接发

3)如果不是2)那么判断目的地址有没有在路由表中,如果有就按照路由表来发

4)如果路由表也没有,那就开始route request的过程

所以你的理解漏掉了第1)步,首先考虑的是父子节点,如果是就直接发了,不管link cost怎么样。而并不是你理解的邻居表。

sylar zhang:

回复 VV:

非常感谢您的解答

那么父子节点这个概念,在路由之间或是路由与协调器之间也是存在的吗?

它是体现在关联表这个概念上吗?

那么像之前上述的那种情况应该如何避免呢?有没有办法让此路由能根据信号强度的强弱选择父节点呢?

这个跟以下选项有关系吗?

// Minimum lqi value that is required for associationuint8 gMIN_TREE_LINK_COST = MIN_LQI_COST_3;

// LQI to Cost mapping#define MIN_LQI_COST_1 12 //24#define MIN_LQI_COST_2 9 //20#define MIN_LQI_COST_3 6 //16#define MIN_LQI_COST_4 4 //12#define MIN_LQI_COST_5 2 //8#define MIN_LQI_COST_6 1 //4#define MIN_LQI_COST_7 0 //0

感谢您帮助我进一步理解了这个概念,但希望您能为我在设置上指条明路好吗

谢谢!

VV:

回复 sylar zhang:

父子的关系,是在加入网络的时候,谁接受它的 谁就是父设备,加入的设备就是子设备。

如果一个路由器加入网络的时候是另外路由器接受它的,那么这两个路由就是父子关系。

对的关联表Association table

LQI cost指的是链路的cost,是根据RSSI LQI换算来的,跟Association table没什么关系

sylar zhang:

回复 VV:

听了您的解答,我似乎有点恍然大悟的感觉,实在感谢!

但是我还是有几点疑问希望您能继续帮助我

第一点

对于终端设备来说,这个父子节点的概念我很清晰,就是它data request的对象

但是对于路由设备来说,这个父节点仅仅是在于初始发送beacon request的时候由谁接收而决定的吗?

之后不会更换?除非是重新发送beacon request加入网络?

如果是开启了nv_restore选项,再次加入网络由别的设备接收,父设备会改变吗?

第二点

如果路由在转发数据时是按照您之前说的1,、2、3、4步的话

1)目的地址是否是自己的子节点或者是父节点,如果是就直接发出去了。

2)如果不是1) 那么判断目的地址是否在邻居表中,如果是,那么也直接发

3)如果不是2)那么判断目的地址有没有在路由表中,如果有就按照路由表来发

4)如果路由表也没有,那就开始route request的过程

假如R1的父设备是协调器C,即使R1->R2的信号优于R1->协调器C的信号,它的首选一定是发送给父设备吗?

那应该怎么解释R1准备发给目的地址为C的数据,一开始是通过R1->R2->C的路径,当R1有一组数据没有收到R2的ACK时,R1转为直接向C发送数据

并且接下来连续多个包均是如此,直到R1多次出现收不到C的ACK时,又由R1-R2-C的路径发送,这里R2应该是R1的父设备。每次发送不都应该是优先发送给父设备的吗?

这里有什么参数可以规避或尽量避免这个问题的吗?

同时附上抓包数据

此抓包数据文件中,地址0x1DAC即为我所叙述的R1,协调器C为0x0000,R2的地址为0XD5E1

在第538行的时候, 地址0x1DAC(R1) 发送给0XD5E1(R2)的数据没有得到应答,转为直接发向0x0000

但是多次发送给0x0000的数据包没有成功,最后又转回发送给0XD5E1(R2)

怎样才能尽量的让R1去发送给R2,再由R2转发给C,而不是出现上述那种状况呢

因为总是一旦一次R1到R2的数据得不到ACK,随即转向直接发送给0x0000,并且要多次失败后才会重新转向R2。这个过程中,会有好多数据包丢失。

希望您能帮我分析一下,不胜感激!!!

 

zimu cheng:

回复 VV:

你好,我想请问下,这个问题,发送数据的优先级是否是关联表>邻居表>路由表>源路由表,如果邻居表有这个设备是否一定通过邻居表,直接发,如果邻居表这个设备的信号很差,但是还是存在这个设备,是否会出现数据没有发送出来。

VV:

回复 zimu cheng:

如果邻居表里面的链路质量不等于0,就可以发出来。

JINNIAN LIN1:

回复 sylar zhang:

您好  sylar zhang:

       我这边测试发现的问题跟您描述的基本一样,二级路由发送数据到协调器,有时候会经过父节点,有时候跳过父节点直接发送到协调器,信号不稳定导致切换父节点过程中会丢失很多的数据,请问您现在有更好的解决方案吗?

赞(0)
未经允许不得转载:TI中文支持网 » 求助路由路径问题(工程应用-急!)
分享到: 更多 (0)