兩年前寫的封包資料驗證文章主要應用在網路封包或RS232資料,後來從事嵌入式與單晶片程式工作,發現TI德州儀器的ZigBee通訊資料結構也差不多如此,只不過為了快速辨別封包類型,把Data欄位的前兩個bytes拉出來作為CMD0, CMD1兩個欄位.
欄位 | SOF | LEN0長度 | LEN1長度 | CMD0 | CMD1 | DATA資料 | FCS檢查碼 |
長度 | 1 | 1 | 1 | 1 | 1 | N | 1 |
SOF (Start of Frame)就是每個封包Packet的起始辨別字元,TI的資料長度只有1個byte,我將其擴充為2bytes。
FCS (Frame Check Sequence)即是針對LEN0至DATA這部分的陣列作xor運算之值。
網路Socket傳輸,這樣的格式也是一個很不錯的bytes陣列包裝方式,透過PacketFrame這樣的Helper Class,可以快速得到這樣的資料結構。
我們可以快速建立一個符合結構的pkt[] array, 而其封包有效的資料長度即為pktLen值.
為什麼這函式不直接傳回新陣列呢? 因為重複使用buffer位址來存寫資料,可大大增加效能。
建立該結構的陣列,並沒有什麼困難,比較有門檻的是如何在陸續進來的封包緩衝區(Buffer)裏,解析(Parsing)出一個個完整的Packet結構。
為單一封包準備一個足夠大的Packet Buffer及SOF辨識字元,透過Parse(queue, startIndex, length)函式即可觸發事件。
事件參數為:
以上的Event Arguments資訊,就足夠判斷進來的封包資料所為何事了!
No comments:
Post a Comment