zigbee的无线发送和无法接收ACK

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事件

关于ACK内容

APS ACK 和 MAC ACk都会触发AF_DATA_CONFIRM_CMD,都存在的情况下APS ACK 触发

zigbee的无线发送和无法接收ACK_第1张图片

上图函数进不去

但是查看zigbee的无线发送和无法接收ACK_第2张图片

发现收到ACK,自己写一个case语句,判断hdr.status

终端和协调器收发数据的层面:

(1)ZigBee终端通过AF函数发送数据;

(2)ZigBee Coordinator 回复MAC层的ACK;

(3)ZigBee Coordinator的APS层回复ACK帧

注意:波特率要大于传输速率  单次应用层给物理层数据过多会分包

 

你可能感兴趣的:(zigbee)