AF_DataRequest的作用不是发送数据,而是把要发送的数据放到发送队列,由MAC来发送。MAC收到要发的数据就务必尽全力把数据发出去,而且不管有没有发出去,要通过消息AF_DATA_CONFIRM_CMD返回给应用层
AF_DataRequest返回Success表示发送数据成功进入发送队列
AF_DataRequest是一个比较高级的函数接口了,只要返回了success,就说明输入的发送数据格式有效,而数据并不会发送出去,而是进入一个等待队列。其实串口通信也很类似,比如典型的UartWrite函数,返回值代表当前串口发送队列的状态。串口发送和无线发送最大的区别是,串口是一个字节一个字节的发送,而且发送完成时间是固定的,发送目标是固定的,发送结果也是固定的(100%能发出去)。无线就不一样,CSMA机制介入,导致每次函数调用填入发送数据,到发送的数据到空中,这段时间是随机的。同样CSMA机制还会导致填入的数据根本无法发出去。在zigbee网络里面还有一种情况就是你发送数据的时候目标正在休眠,数据要先缓存在MCU中等待目标唤醒后再发出去
zigbee ACk有两种,即 APS ACK 和 MAC ACk 抓包工具看到的是看到的是MAC ACK
APS ACK属于应用层的ACk,实际上目标设备收到数据包后,如果源设备需要APS ACk( AF_DataRequest 函数中的option设置 ),那么目标设备会回一个数据包给源设备,源设备收到该确认用的数据包后会触发AF_DATA_CONFIRM_CMD事件
APS ACK 和 MAC ACk都会触发AF_DATA_CONFIRM_CMD,都存在的情况下APS ACK 触发
上图函数进不去
但是查看
发现收到ACK,自己写一个case语句,判断hdr.status
终端和协调器收发数据的层面:
(1)ZigBee终端通过AF函数发送数据;
(2)ZigBee Coordinator 回复MAC层的ACK;
(3)ZigBee Coordinator的APS层回复ACK帧
注意:波特率要大于传输速率 单次应用层给物理层数据过多会分包