问题描述:建立一个mesh网络,网络中只存在协调器和路由器节点,并不存在Endevice终端节点。整个网络大概存在20多个路由节点,一个协调器。
路由器节点和协调器都加入和NV存储,所以路由节点掉电后在上电shortaddr地址不发生变化。
路由节点初始上电的时候会告诉协调器节点自己的网络地址,协调器建立一个地址表存储各个节点的短地址信息,以便单播方式通信。
协调器节点收到串口数据进行解析,通过解析数据包中的路由节点地址信息然后在本身存储的地址表中查找到该路由节点的短地址,采用单播的方式 Addr16bit发送数据包给对应的路由节点。
1,出现的情况:协调器节点收到多个数据包进行解析,然后发送数据给对应的路由节点。比如现在需要控制1,2,3,4号路由节点,协调器收到控制这四个节点的数据包,然后顺序解析,发送1号节点的控制包,紧接着接发送2号节点,然后是3号和4号,并没有等到节点应答后再去发送数据包(采用的是AF_DISCV_ROUTE方式,而不是AF_ACK_REQUEST 方式。),
2,但是发送四个数据包,4个路由节点只有3号节点收到了数据包。好像单播传输的时候出现了数据拥堵的情况。
3,单播方式连续发送多个数据包的时候后面的会不会把前面的覆盖掉呢,每个数据包基本上是50-60个字节长度。
4,如果协调器通过串口不是一下子拿到1,2,3,4号节点的控制包,而是先拿到1号,然后是2号,再者是3号,最后是4号,就没有任何问题,不会出现数据拥堵。
5,请问该怎么解决这个问题呢?(修改一些宏配置,可以解决吗?)
6,好像感觉协调器连续发送数据会出现拥堵的情况。
7,我在协调器发送每个数据包之后增加延时函数,还是没有任何效果,路由节点还是只有部分受到,出现丢包的问题。
请TI的技术工程师和技术大牛们指点下,谢谢!考虑了好久一直没有找到根本的原因。
谢谢!
jessy sun:
我也遇到你这个问题,单播连续发命令(节点比较多的状态下)丢包比较严重
Aries Lord:
发送的时候,需要在AF_DATA_CONFIRM_CMD的时候才能继续发。
延时函数没有用,AF_DataRequest不是真正的发数据,而是把要发的数据缓存起来,最终在mac_event_loop发送
sinan chen:
1.AF_DISCV_ROUTE在最新协议栈里已经不使用了,见Z-Stack API.pdf第53页
2.加入简单的延时函数会阻断系统运行的,也就是上一个数据包会发不出去。建议采用楼上的方法。
3.“所以路由节点掉电后在上电shortaddr地址不发生变化”,在我的使用中发现节点短地址会发生变化,比如节点因为信号不好退网再重新加入网络时,父节点不是原来的父节点的话短地址会再次随机分配。