摘 要:提出一種改進(jìn)的報文編碼方式,實現(xiàn)了對不同大小要求和多種報文元素動態(tài)組合成的報文進(jìn)行編碼,經(jīng)過實例比較體現(xiàn)出該方式的優(yōu)越性并很好地實現(xiàn)了數(shù)據(jù)鏈仿真信息傳遞的功能。
關(guān)鍵詞:報文; 消息結(jié)構(gòu); 編碼
中圖法分類號:TP309 文獻(xiàn)標(biāo)識碼:A 文章編號:1001-3695(2006)10-0101-02
Improved Effective Message Encoding Technique
WANG Jiangfeng,BAO Weidong,HUANG Jincai
(College of Information System Management, National University of Defense Technology, Changsha Hunan 410073, China)
Abstract:This paper offers an improved effective message encoding technique, which can be used to encode message that has different length or composed of various message elements dynamically. This technique shows its superiority and well satisfies the simulation demand.
Key words:Message; Message Structure; Encoding
戰(zhàn)術(shù)數(shù)據(jù)鏈,在美國稱為TADIL(Tactical Data Information Link),在北約稱為Link,采用無線電通信裝備和數(shù)據(jù)通信規(guī)程,是直接為作戰(zhàn)指揮和武器控制系統(tǒng)提供支持、服務(wù)的數(shù)據(jù)通信與計算機(jī)控制密切結(jié)合的系統(tǒng)。它不僅能實現(xiàn)機(jī)載、陸基和艦載戰(zhàn)術(shù)數(shù)據(jù)系統(tǒng)之間的數(shù)據(jù)信息交換,而且可以構(gòu)成點對點、一點對多點的數(shù)據(jù)鏈路和網(wǎng)狀數(shù)據(jù)鏈路,使作戰(zhàn)平臺的計算機(jī)系統(tǒng)形成戰(zhàn)術(shù)數(shù)據(jù)傳輸、交換和信息處理網(wǎng)絡(luò),為指揮員和戰(zhàn)斗人員同時提供有關(guān)的數(shù)據(jù)和完整的戰(zhàn)場態(tài)勢信息。
數(shù)據(jù)鏈?zhǔn)乾F(xiàn)代高技術(shù)條件下作戰(zhàn)對通信及信息共享提出更高要求的必然產(chǎn)物。數(shù)據(jù)鏈一詞應(yīng)用于現(xiàn)代作戰(zhàn)概念之中,從作戰(zhàn)的角度應(yīng)該對它這樣理解:數(shù)據(jù)鏈?zhǔn)遣捎脽o線網(wǎng)絡(luò)通信技術(shù)和應(yīng)用協(xié)議實現(xiàn)陸、海、空,乃至天、電諸軍、兵種的戰(zhàn)術(shù)數(shù)據(jù)系統(tǒng)間的實時傳輸,使戰(zhàn)區(qū)內(nèi)各種指揮控制系統(tǒng)和各種作戰(zhàn)平臺(主戰(zhàn)兵器的載體)之間實現(xiàn)無縫連接,融為一體,最大限度地提高作戰(zhàn)效能,實現(xiàn)真正意義上的聯(lián)合作戰(zhàn)。
數(shù)據(jù)鏈與一般通信系統(tǒng)最大的不同點是不僅提供各種通信信道,而且提供標(biāo)準(zhǔn)格式的數(shù)據(jù)和控制報文,也可直接連向特定的指揮控制系統(tǒng)和武器控制系統(tǒng)。報文是數(shù)據(jù)鏈發(fā)揮作用的核心技術(shù)之一,本文針對其具體的應(yīng)用背景,提出了一個改進(jìn)的報文編碼方案,包括新的報文消息結(jié)構(gòu)定義,經(jīng)過檢驗,提高了報文編碼的效率、增加了編碼函數(shù)的通用性。
1 問題描述
現(xiàn)代高技術(shù)條件下的戰(zhàn)場態(tài)勢信息復(fù)雜多變,同時也就需要更及時、更精確的指揮控制命令,這就對報文傳送信息內(nèi)容提出了很高的要求。由于受到傳輸帶寬的限制,報文消息結(jié)構(gòu)應(yīng)當(dāng)盡可能精簡,這就引出了報文編碼的主要問題,即如何用盡可能小的數(shù)據(jù)結(jié)構(gòu)有效地傳遞盡可能多的信息。為了節(jié)省空間,在定義報文消息結(jié)構(gòu)時,在不影響信息傳遞的基礎(chǔ)上元素大小應(yīng)盡可能小。例如有些元素傳遞的信息比較簡單,只傳遞一個布爾類型的信息,在最終的數(shù)據(jù)幀里只占2bits。但為了便于在編碼前對其進(jìn)行有效賦值,同樣也為了在解碼后能夠解析出有價值的信息,我們定義的消息結(jié)構(gòu)最小數(shù)據(jù)類型為Byte,應(yīng)大于元素實際占用空間。如何有效地將這些元素壓縮到用于傳輸?shù)臄?shù)據(jù)幀里,就是我們這里提到的編碼問題。
假設(shè)一條數(shù)據(jù)鏈對傳輸報文的要求是每個消息72bits長,報文由有具體含義的報文元素組成。例如一個傳遞空中目標(biāo)位置的消息可能包含的元素即幀結(jié)構(gòu)如表1所示。
表1 目標(biāo)位置消息報文元素表
元素名稱長度(bit)意 義備 注報文頭10包括接收方編號等固定信息每個消息固定部分目標(biāo)屬性2表示敵我屬性目標(biāo)類型8屬于哪種機(jī)型目標(biāo)編號6目標(biāo)的編號航向12目標(biāo)航向速度10目標(biāo)速度高度13目標(biāo)高度備用11報文中元素可以分為兩類:①目標(biāo)屬性、目標(biāo)類型等。這類元素根據(jù)不同取值表示不同意義,通過預(yù)先的宏定義在編碼解碼時獲取有意義的取值。例如目標(biāo)屬性取0時表示不明,1表示我方飛機(jī),2表示敵方飛機(jī)。目標(biāo)類型取不同值時,根據(jù)相應(yīng)定義表示不同類型的目標(biāo),我們稱這類元素為枚舉型。②接收方編號、目標(biāo)編號、速度、高度、航向等。編碼解碼時只需進(jìn)行相應(yīng)的單位轉(zhuǎn)換,其取值不用再作其他解釋。我們稱這類元素為數(shù)值型。
每個消息根據(jù)類型的不同,由不同長度、類型的元素組成。每個報文根據(jù)傳遞內(nèi)容的要求,由不同類型和個數(shù)的消息組合而成,這樣每次發(fā)送的報文根據(jù)內(nèi)容要求與報文組合的規(guī)則可能發(fā)送個數(shù)不等的消息。
2 改進(jìn)的報文編碼方式
在實際應(yīng)用中,報文編碼主要存在兩個問題:①如何定義消息的結(jié)構(gòu)。為了能夠傳輸多種信息,報文往往是由多個不同內(nèi)容的消息字組成。如何合理地定義消息的結(jié)構(gòu)是提高編碼效率的基礎(chǔ)。②用哪種編碼方式既合理又簡單。選擇合適的編碼方式能大大地提高效率、簡化代碼。下面將從這兩方面對比原有的編碼方法與改進(jìn)的編碼方法。
對于bit小于Byte的問題即移位操作的復(fù)雜性問題,解決方法是bit到Byte的轉(zhuǎn)換。對于消息結(jié)構(gòu)的定義方法問題,每個消息單獨編碼,解決方法是定義統(tǒng)一結(jié)構(gòu),添加Bool標(biāo)識符進(jìn)行編碼。
2.1 原有的編碼方法存在的缺陷
在原方法中對于消息的結(jié)構(gòu)沒有重新定義,完全是按照報文消息的原有結(jié)構(gòu)進(jìn)行定義的,如下所示:
struct msgTargetPosition//目標(biāo)位置消息
{
short msgHead;//報文頭10
byte TargetAttr;//目標(biāo)屬性2
byte TargetType;//目標(biāo)類型8
byte TargetNo;//目標(biāo)編號6
short Course;//航向12
short Velocity;//速度10
short Altitude;//高度13
short Standby;//備用11
}
可以看出這個定義是專門針對空中目標(biāo)消息的,而報文一般包含多個消息字,所以如果采用這種方式定義消息結(jié)構(gòu),針對每個報文方案需要對每個消息字均定義單獨的結(jié)構(gòu)。
原方法采用的編碼方式是針對每個元素進(jìn)行移位操作,將所有元素按照真實占位大小移到相互連續(xù)的位置,最后組成一個連續(xù)的72位字符串。空中目標(biāo)消息編碼函數(shù)如下:
void EncodeTargetPosition(msgTargetPosition amsg, unsigned char MsgStr[])
{
MsgStr[0]=0; //初始化
unsigned char tempbyte;//報文頭 10
tempbyte=amsg.msgHead 0x03FC;//取出前八位
tempbyte >>= 2; //右移兩位
MsgStr[0]=MsgStr[0]| tempbyte;
tempbyte=amsg.msgHead 0x0003;//取出后兩位
tempbyte <<=6; //左移六位
MsgStr[1]=0; //初始化
MsgStr[1]=MsgStr[1]| tempbyte;//目標(biāo)類型樹型 2
tempbyte=amsg.TargetAttr 0x03;//取出后兩位
tempbyte <<=4; //左移四位
MsgStr[1]=MsgStr[1]| tempbyte;
…
}
解碼函數(shù)是編碼函數(shù)的逆過程,空中目標(biāo)消息解碼函數(shù)如下:
void DecodeTargetPosition(unsigned char MsgStr[],msgTargetPosition amsg)
{
unsigned char tempbyte;//報文頭 10
short tempHead=0; //初始化
tempHead=MsgStr[0] 0xFF;//取出八位
tempHead<<=2; //左移兩位
amsg.msgHead=tempHead;
tempHead=MsgStr[1] 0xC0;//取出前兩位
tempHead>>=6; //右移六位
amsg.msgHead=amsg.msgHead|tempHead;//目標(biāo)屬性 2
tempbyte=MsgStr[1] 0x30;
tempbyte>>=4;
amsg.TargetAttr=tempbyte;
…
}
這個方法的缺點在于,針對每個消息都要有單獨的結(jié)構(gòu)定義、單獨的編碼與解碼函數(shù),而且移位操作非常煩瑣,也沒有通用性與動態(tài)可編輯性。因此,我們提出了改進(jìn)的編碼方式。
2.2 改進(jìn)的編碼方法
針對原有方法存在的兩個問題,改進(jìn)的編碼方法主要從消息結(jié)構(gòu)定義與編碼方式兩個方面對原有方法進(jìn)行了改進(jìn)。對于消息結(jié)構(gòu)的定義,我們改為通用的結(jié)構(gòu)定義,如下所示:
struct msgBody
{
short msgHead;
int pData[MAX_MSG_ELEMENT];
bool pDataOK[MAX_MSG_ELEMENT];
struct msgBody*pNext;
}
其中,消息頭為每個消息的共有部分,pData[i]為元素值變量,MAX_MSG_ELEMENT是總的元素個數(shù),i為元素的索引號,每個元素均有唯一的索引號,如可規(guī)定pData[6]表示目標(biāo)屬性。pDataOK[i]是表示該索引號的元素是否有賦值,在編碼(或解碼)時用來判斷是否要對該元素進(jìn)行編碼(或解碼)操作。例如,若pDataOK[i]為True,則說明pData[i]有賦值,應(yīng)對其進(jìn)行編碼與解碼。在給元素賦值時,若pData[i]有賦值則pDataOK[i]變?yōu)門rue否則為False。結(jié)構(gòu)最后為一個指向下一個消息機(jī)構(gòu)體(如果有的話)的指針,這樣就實現(xiàn)了多個消息的組合,滿足報文要求。
因為報文是由多個消息組合而成的,包含的元素更多。我們定義的結(jié)構(gòu)更能適合復(fù)雜的消息結(jié)構(gòu),只需一個通用的編碼函數(shù)減輕編碼的負(fù)擔(dān)。新編碼函數(shù)的結(jié)構(gòu)定義如下:
void EncodemsgBody(msgBody amsg, unsigned char frame[])
{
for(int i=0;i { if(pDataOK[i]=true) { Encode(pData[i]) } } } 新的編碼函數(shù)放棄了較為麻煩且通用性差的移位操作,而是采用定義一個臨時的由72Bytes組成的字符串tepmbyte[71]作轉(zhuǎn)換。其原理是:①將元素的真實取值轉(zhuǎn)換成由0和1組成的二進(jìn)制串,對于72bits長的消息字,不管其內(nèi)部取值為多少,最終均可以轉(zhuǎn)換成由72個0和1組成的字符串;②按每個0或1賦給一個Byte,將所有01按位賦給臨時Byte串;③將這個72位Bytes串按每八位截取一次,轉(zhuǎn)換成十進(jìn)制數(shù),賦給用于傳輸?shù)臄?shù)據(jù)幀中的一個Byte,逐次完成數(shù)據(jù)幀中的填充。這樣就實現(xiàn)了將消息元素取值壓縮到數(shù)據(jù)幀中去,卻比移位操作更方便、通用性更強(qiáng)。這個過程可逆,即為解碼時的過程:先將數(shù)據(jù)幀解壓縮到臨時Byte串,然后按照元素取值有效位數(shù)截取相應(yīng)段,再解析取值即可。例如對于實例中的消息元素目標(biāo)屬性,其實際取值為2,表示敵方目標(biāo)。首先將其轉(zhuǎn)換為二進(jìn)制串10,按照目標(biāo)屬性元素對應(yīng)位(1011)將10分別賦給Byte[10]與Byte[11];然后將它們同Byte[8]到Byte[15]這個段內(nèi)的八個Byte一起轉(zhuǎn)換成一個十進(jìn)制數(shù)賦給數(shù)據(jù)幀中的第二個Byte用于傳輸。在解碼時首先將數(shù)據(jù)幀解壓成72個Byte的01串,截取Byte[10]和Byte[11]將其轉(zhuǎn)換為有效值即目標(biāo)屬性的取值。 本方法在消息結(jié)構(gòu)的通用性與編碼函數(shù)的通用性方面都有很大提高,可用于動態(tài)、長度可變的報文消息,并且編碼函數(shù)操作更為簡單方便。改進(jìn)方法與原方法的性能比較如表2所示。 表2 改進(jìn)編碼方法與原方法的性能對比 性 能原方法改進(jìn)的方法消息結(jié)構(gòu)通用性不通用能通用編碼函數(shù)通用性不通用能通用編碼函數(shù)簡單性比較復(fù)雜比較簡單對于動態(tài)可變報文實用性不適用適用內(nèi)存占用無冗余有冗余3 結(jié)論 本文提出了一種改進(jìn)的報文編碼方式,有效地解決了編碼過程中的兩個問題,即移位操作的復(fù)雜性問題和報文多消息字的統(tǒng)一結(jié)構(gòu)問題。由于現(xiàn)在內(nèi)存價格的降低,本方法雖然在數(shù)據(jù)結(jié)構(gòu)上有冗余,但與提高的通用性、操作的方便性相比,這樣的改進(jìn)是有意義的。經(jīng)過實例檢驗,完全滿足數(shù)據(jù)鏈仿真過程中報文信息傳遞的要求。 本方法還有可改進(jìn)的地方,如編碼時可以按照事先約定的規(guī)則隨機(jī)組合元素內(nèi)容,這樣在解碼時按照相應(yīng)的規(guī)則截取信息可以更好地起到加密效果。 參考文獻(xiàn): [1]廖長清,龔誠,等.航空戰(zhàn)術(shù)數(shù)據(jù)鏈系統(tǒng)及關(guān)鍵技術(shù)的探討[J]. 航空電子技術(shù),2005,36(1):1115. [2]吳德偉,高曉光,等.戰(zhàn)術(shù)數(shù)據(jù)鏈的建設(shè)與發(fā)展[J]. 火力與指揮控制,2004,29(1):1013. [3]李建軍,張軍,等.空地數(shù)據(jù)鏈機(jī)載仿真系統(tǒng)設(shè)計研究[J]. 航空電子技術(shù),2003,34(3):24-28. [4]薛均義,虞鶴松,等.微型計算機(jī)原理及應(yīng)用[M]. 西安:西安交通大學(xué)出版社,2000.35-75. 作者簡介: 王江峰(1980-),男,陜西咸陽人,碩士研究生,研究方向為管理科學(xué)與工程、指揮自動化;包衛(wèi)東(1971-),男(蒙古族),內(nèi)蒙古呼和浩特人,副教授,博士后,研究方向為管理科學(xué)與工程、指揮自動化;黃金才 (1945-),男,安徽人,副教授,研究方向為指揮自動化、輔助決策技術(shù)。 注:本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文