天天看点

关于Zstack_2.5.1中的重传机制

问题起源于丢包率:丢包率的定义由自己去定义,重传收到数据算不算丢包由你自己去定义。问题起源于丢包率,发100个数据包,结果收到超过100个数据包。Zstack中mac层中默认有CSMA/CA机制,但是最后还是没有搞清楚这个重传机制。

1.mac层的ACK只管点对点的,而且mac层的ack是无法关闭的;多跳的ACK需要应用层的ack,应用层的ack可以关闭。

2.可以尝试自己抓包看看是否重传了什么数据,然后去修改代码,尝试自己能够得出丢包率。

3.协议栈中maxFrameRetries,mac_api.h中的MAC_TXOPTION_ACK等参数可以自己尝试去修改。但是通过这些参数修改是不能够关闭协议栈默认的ack,所以若要测丢包率则需要自己在应用层里面对数据丢包进行匹配测试。官方TI有一个无线质量传输测试丢包率的Demo,但是那个代码延迟性太高了,丢包率一直在变动,因为一直在统计历史数据的丢包情况。打算自己写,但是一直卡出问题了。如果实在不想写的话,可以采用官方的SmartRF Studio软件进行丢包率的测试以及位测试。

4.ZigBee终端与ZigBee协调器之间相互通信过程:

(1)ZigBee终端通过AF函数发送数据;(2)ZigBee Coordinator 回复MAC层的ACK;(3)ZigBee Coordinator的APS层回复ACK帧。

5.关于发送数据的最小周期?

因为丢包率的时候,若一秒发1次,则不会出现丢包;一秒发10个数据包,则出现丢包;这个问题相信也有不少人遇到了。这里仅仅记录自己的搜索到的结果。

若单单从物理层来说,最小周期应该是微秒级的。但是有了协议栈发送数据,很多时间花在OSAL的调度上面,上层到底层的数据帧封装、任务处理等,所以时间间隔较大。所以建议不要一次性发送大量数据,尽量让他一段一段发送,另外波特率要大于传输速率。需要抓包看看具体有多少包发送出去了。

PS:研究精神还是有待加强,遇到了些许困难还是放弃了。记录在此,给有需要的人看吧。

  • 后记:最后还是找到了一个解决方案:通过发送节点发送数据包,然后接收节点直接连接PC机上的串口助手,收到一条数据则打印一条数据(可以标定序号),结果发现在PC机上有些数据包重传打印在串口助手,有些数据则跳过后不显示在串口助手。通过这种方式可以累计统计丢包率。但是还是没有弄明白Zstack协议栈里面的重传机制

继续阅读