周雅芳 范玉娜 張耀寰 相金明
(沈陽理工大學,遼寧 沈陽110159)
在AOS 建議中,CCSDS 包是合路過程的協議數據單元,為了使非CCSDS 結構的數據單元同樣能復用在虛擬信道內, 包裝業務把非CCSDS 格式的包化成了CCSDS 格式的包,也稱為CPPDU。 包信道復用過程就是把這些來自多個用戶的具有相同或者相似服務質量要求的CCSDS 包合成在一個公共的數據結構內,形成一個MPDU,再分別加入幀頭、幀尾,從而生成一幀VCDU,把幾個不同的包信道級連在一個虛擬信道上,實現在一個虛擬信道上多路傳輸用戶間的各自通信[1-2]。 其中,CCSDS 包、多路復用MPDU、虛擬信道傳輸幀VCDU 的數據單元格式詳見參考文獻[1]。

圖1 包信道復用模塊的內部實現過程圖
在本仿真中,根據包信道復用原理,并借助Visual C++[3]中的雙向隊列容器,對包信道復用模塊進行設計。 在包信道復用模塊內部功能的設計中,主要分三個大部分來實現:
第一,從FileDlg.GetPathname()函數中獲得某個其他模塊發送過來的文件賦給容器一(此模塊的容器一名為SOURCE,定義為deque<int>SOURCE),然后進入第二部分的操作。
第二, 在第二部分中, 主要用到四個容器, 分別定義為map<unsigned long、deque<int >>CPPDU_POOL、map<unsigned long,deque<int>>MPDU_POOL、map <unsigned long,deque < int >>VCDU_POOL、map<unsigned long int,deque<int> > DISPATCH_POOL,它們將對信源進行包信道復用操作。實現過程如圖3 所示,基本過程如下:
① 容 器 一SOURCE 中夠20 個字節 則 封 成 一 個CPPDU, 如此循環,然后把封好的CPPDU 都放 到 CPPDU_POOL中, 即對信源進行CPPDU 封 裝 。 當CPPDU_POOL 中夠10個CPPDU 時則封成一個MPDU,如此循環,然后把封好的MPDU 都放到MPDU_POOL 中,即在CPP

圖2 包信道復用仿真結果示意圖
DU_POOL 中進行MPDU 封裝。
②MPDU_POOL 中達到1 個MPDU 時則封成1 個VCDU,如此循環,然后把封好的VCDU 放在VCDU_POOL 中,即在MPDU_POOL 中進行VCDU 封裝。
③然后把VCDU_POOL 中的數據都放到DISPATCH_POOL 中,再把CPPDU_POOL、MPDU_POOL 和VCDU_POOL 中的內容都擦除,準備下一次的封包。
第三, 把上述操作得到的最后封包結果的內容保存到新文件中,操作結束。
基于上述方法,試驗過程中在文本文件中輸入了一串二進制碼元“01010011 00001100 11010000 11101000 11100110 11001101 01100101 11100010 00001111 01001111 00101010 11111001 11011000 00000101 00010001”,經過包信道復用模塊,把輸入的二進制碼中每16 比特的數據信息封為1 個CPPDU,5 個CPPDU 封為1 個MPDU,1 個MPDU 封為1 個VCDU,得到的仿真結果如圖2 所示。
由圖2 可以看出, 輸入的二進制碼元最終被封成了3 個VCDU,圖中前8 行數據為第一個VCDU,在第一個VCDU 中,第③行是1 個完整的CPPDU,其中第③行的后16 比特是原二進制碼,同理,第④行、第⑤行、第⑥行和第⑦行也與第③行的結構相同,這5 行的數據就組成了5 個CPPDU。然后第②行與第③、④、⑤、⑥、⑦這5 行組成了1個MPDU,其中第②行是MPDU 的主導頭。 最后第①行、第⑧行與第②、③、④、⑤、⑥、⑦行組成了1 個VCDU,其中第①行是VCDU 的幀頭、第⑧行是VCDU 的幀尾,即前8 行數據組成了一個完整的VCDU,包信道復用結果正確。 同理,可驗證剩下的兩個VCDU 仿真結果全部正確。
[1]田野,馮永新,馬玉峰,劉桂君.高級在軌系統中的多路復用與差錯控制技術研究[M].北京:科學出版社,2014,4.
[2]Tian ye,Li Qingfan,Feng yongxin,Gao xiaoling.A virtual channels scheduling algorithm with broad applicability based on movable boundary[J].Mathematical Problems in Engineering,2013,9:1-8.
[3] 謝賢芬.21 天學通Visual C++[M].2 版.北京:電子工業出版社,2001,2.