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 觸發

上圖函數進不去

但是查看

發現收到ACK,自己寫一個case語句,判斷hdr.status

終端和協調器收發數據的層面:

(1)ZigBee終端通過AF函數發送數據;

(2)ZigBee Coordinator 回覆MAC層的ACK;

(3)ZigBee Coordinator的APS層回覆ACK幀

注意:波特率要大於傳輸速率  單次應用層給物理層數據過多會分包

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章