羅如為,陳威孝
(貴州大學(xué)計(jì)算機(jī)科學(xué)與信息學(xué)院,貴州貴陽(yáng) 550025)
串口通信的一種通用模式
羅如為,陳威孝
(貴州大學(xué)計(jì)算機(jī)科學(xué)與信息學(xué)院,貴州貴陽(yáng) 550025)
為了通過(guò)通信線路實(shí)現(xiàn)異地遠(yuǎn)程數(shù)據(jù)的實(shí)時(shí)傳輸,提出一種基于串口通信的通用模式:首先應(yīng)用 zlibEx對(duì)數(shù)據(jù)進(jìn)行最大化壓縮,減少線路傳輸數(shù)據(jù)量及傳輸時(shí)間;在進(jìn)行文件流壓縮時(shí),加入 md5算法生成的加密口令,提高數(shù)據(jù)的安全性;最后根據(jù)自定義通信協(xié)議將壓縮后的文件通過(guò)串口進(jìn)行遠(yuǎn)程傳輸。
串口通信;通用模式;zlibEx壓縮;實(shí)時(shí)傳輸
zlib壓縮算法廣泛應(yīng)用于各種數(shù)據(jù)的壓縮。例如壓縮數(shù)據(jù)庫(kù)或數(shù)據(jù)庫(kù)字段值[1],網(wǎng)絡(luò)中壓縮網(wǎng)頁(yè)數(shù)據(jù)或?qū)嶒?yàn)數(shù)據(jù)[2],壓縮圖書(shū)館數(shù)字文獻(xiàn)[3],壓縮監(jiān)測(cè)數(shù)據(jù)[4]等,使用最廣泛的是網(wǎng)絡(luò)視頻或遠(yuǎn)程屏幕拷貝圖像的壓縮傳輸[5]。還有不少軟件的遠(yuǎn)程更新也使用了 zlib壓縮。
zlib是用于數(shù)據(jù)壓縮的函數(shù)庫(kù),zlib壓縮算法是一種基于字典的無(wú)損壓縮算法,當(dāng)緩沖區(qū)中有與滑動(dòng)窗口 (字符字典)的字符串相匹配的最長(zhǎng)的字符串,將該字符串按照LZ77編碼,當(dāng)兩個(gè)緩沖區(qū)中沒(méi)有相匹配的字符時(shí),便根據(jù)字符出現(xiàn)的概率采用自適應(yīng)的 Huffman編碼法進(jìn)行編碼,以編碼代替字符串以達(dá)到壓縮目的,并且在編碼的過(guò)程中將已編好的壓縮碼實(shí)時(shí)地寫入壓縮文件中。zlib壓縮算法有機(jī)地結(jié)合了 Huffman樹(shù)編碼法和 LZ77編碼法的優(yōu)點(diǎn),去掉了壓縮文件時(shí)包含的一些冗余信息,提高了對(duì)緩沖區(qū)數(shù)據(jù)的壓縮速度,壓縮效果更好。
zlib經(jīng)過(guò)不斷地修改和添加新的函數(shù),已經(jīng)改名并更新到現(xiàn)在的 ZlibEx 1.2.3和 ZlibExGZ 1.2.3。
md5是對(duì)一段信息產(chǎn)生信息摘要,以防止被篡改。通過(guò) md5不可逆的字符串變換算法,把一個(gè)任意長(zhǎng)度的字符串變換成一個(gè)定長(zhǎng)的整數(shù),所以采用 md5加密解壓縮所需要的口令,就算得到了壓縮文件也不能獲得原始口令,不能解壓縮文件[6]。
MSComm控件是微軟的 Visual Basic中提供的一個(gè)串口通信OCX控件。MSComm提供了各種與串口通信密切相關(guān)的屬性及事件,編程者只需改變MSComm控件的屬性設(shè)置和編寫相應(yīng)的初始化程序。在 Delphi環(huán)境下進(jìn)行串行通信編程,利用MSComm控件可以靈活地調(diào)用功能函數(shù),使程序設(shè)計(jì)簡(jiǎn)單、直觀,既保證了數(shù)據(jù)傳輸?shù)膶?shí)時(shí)性,又方便快捷[7]。
本文在 Delphi環(huán)境下首先采用最新的 zlibEx壓縮庫(kù)進(jìn)行多文件或文件夾的最大化壓縮;利用MSComm控件和自定義通信協(xié)議將壓縮文件通過(guò)串口Modem實(shí)現(xiàn)遠(yuǎn)程傳輸。這種傳輸模式 (數(shù)據(jù)采集——壓縮——串口發(fā)送——串口接收——解壓縮)可以推廣到其它需要通過(guò)串口傳輸?shù)膽?yīng)用場(chǎng)合,從而作為一種通用模式得以廣泛應(yīng)用。
圖1 文件壓縮和遠(yuǎn)程傳輸流程圖
圖1為文件壓縮和遠(yuǎn)程傳輸流程圖[8-9]。在 Delphi下,首先將選中的文件變換為文件流,對(duì)文件流進(jìn)行 zlibEx流壓縮,并在壓縮流中加入加密信息和文件、文件夾信息形成完整的壓縮文件;將壓縮文件按照自定義通信協(xié)議分組打包,通過(guò)MSComm控件讀寫串口、并用 AT指令控制Modem,將壓縮文件完整快速地發(fā)送到遠(yuǎn)程接收方。接收方對(duì)收到的數(shù)據(jù)幀組合成完整的文件,轉(zhuǎn)換為文件流,并提取加密信息和文件、文件夾信息,并根據(jù)加密口令判斷是否正確解壓。如果有口令,并且口令正確則將文件流進(jìn)行zlibEx流解壓縮,得到壓縮前的文件、文件夾。
要在Delphi下完成多文件的壓縮,首先將選擇的文件、文件夾生成一個(gè)列表。針對(duì)列表中的文件、文件夾分別由以下四種方式處理:如果是非 0字節(jié)文件,則記錄文件名和文件大小,并將文件進(jìn)行 zlibEx流壓縮;如果是 0字節(jié)文件,則只記錄文件名和文件大小,不做壓縮處理;如果是空文件夾,則只記錄文件夾名,不做進(jìn)一步處理;如果是非空文件夾,則用遞歸方法搜索下一級(jí)目錄,對(duì)于搜索結(jié)果仍按上述四種方式處理,直至完全遍歷所有子目錄。
根據(jù)以上四種情況的處理,得到所有文件、文件夾信息和所有文件的壓縮流。
為了保證正常解壓縮,需要約定壓縮文件的結(jié)構(gòu)。圖2定義的是加密壓縮的文件流結(jié)構(gòu)圖[8]。加密信息部分包括壓縮庫(kù)標(biāo)識(shí)、是否加密標(biāo)識(shí)、md5加密后的口令;文件夾信息只記錄空文件夾的名稱;文件信息包括文件名和文件流大小;最后一部分是所有文件的壓縮流。
圖2 加密壓縮的文件流結(jié)構(gòu)圖
在解壓縮的時(shí)候,從文件流中讀入壓縮庫(kù)標(biāo)識(shí),如果不是本程序產(chǎn)生的文件不可解壓;如果壓縮庫(kù)標(biāo)識(shí)正確,則判斷讀入的加密標(biāo)識(shí),如果已經(jīng)加密,并且提供的密碼不正確,則不允許解壓縮。如果沒(méi)有加密或者已經(jīng)加密而且解壓縮密碼也正確,則根據(jù)文件夾、文件信息判斷,如果是空目錄或空文件,則直接創(chuàng)建文件夾、0字節(jié)文件,否則根據(jù)文件大小解壓縮文件流,創(chuàng)建出壓縮前的文件。
zlibEx壓縮代碼如下:
instream:=TFileStream.Create(mFileName,fmOpen-Read or fmShareExclusive);
ZCompressStream(instream,mStream,zcMax);
instream是由 mFileName指定的文件創(chuàng)建的文件流,函數(shù) ZCompressStream是進(jìn)行 zlibEx流壓縮,壓縮后的流保存在內(nèi)存流 mStream中,為了充分減少傳輸時(shí)間,所以壓縮級(jí)別選擇最大 zcMax。
zlibEx解壓縮代碼如下:
outStream:=TFileStream.Create(mFileName,fmCreate);
ZDeCompressStream(mstream,outStream);
outStream是要?jiǎng)?chuàng)建mFileName指定名字的新文件的文件流,通過(guò)函數(shù) ZDeCompressStream將 mstream中的壓縮流釋放到 outStream中。
通過(guò)以上的方法,實(shí)現(xiàn)多文件 (夾)的加密壓縮和解壓縮。當(dāng)然也可以壓縮單一的文件。
利用MSComm控件讀寫串口、向Modem發(fā)送 AT指令來(lái)實(shí)現(xiàn)遠(yuǎn)程傳輸,則必須首先熟知MSComm控件的屬性和事件。
在MSComm的 PortOpen設(shè)置為 True,也就是打開(kāi)串行端口之前,先初始化MSComm,將一些參數(shù)設(shè)置完成,如:
1)CommPort:設(shè)置串行端口號(hào),可以設(shè)置為 1到 16之間的任何值,缺省值為 1。但是如果用 PortOpen打開(kāi)一個(gè)并不存在的端口時(shí),MSComm控件會(huì)產(chǎn)生錯(cuò)誤 68(設(shè)備無(wú)效)。
2)Setting:設(shè)置串口通信參數(shù)——波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止位參數(shù)。
3)Inpu tMode:設(shè)置 0,從接收緩沖區(qū)讀取文本形式的數(shù)據(jù)。
4)RThreshold:設(shè)置 1,當(dāng)接收緩沖區(qū)內(nèi)字節(jié)個(gè)數(shù)達(dá)到或超過(guò) 1就會(huì)產(chǎn)生OnComm事件。
5)SThreshold:設(shè)置 0,MSComm控件在發(fā)送數(shù)據(jù)時(shí)不會(huì)產(chǎn)生OnComm事件。
6)InBufferSize:設(shè)置接收緩沖區(qū)的大小,缺省值為1024字節(jié)。
7)InBufferCount:返回接收緩沖區(qū)內(nèi)等待讀取的字節(jié)數(shù),可設(shè)置為 0清空接收緩沖區(qū)。
8)Ou tBufferSize:設(shè)置發(fā)送緩沖區(qū)的大小,缺省值為512字節(jié)。
9)Ou tBufferCount:返回發(fā)送緩沖區(qū)內(nèi)等待發(fā)送的字節(jié)數(shù),可設(shè)置為 0來(lái)清空發(fā)送緩沖區(qū)。
10)InputLen:設(shè)置為 0,Input讀取接收緩沖區(qū)中全部的內(nèi)容。
本文采用MSComm控件的事件驅(qū)動(dòng)通信方式:當(dāng)串口發(fā)送或接收到數(shù)據(jù)時(shí),利用MSComm控件 OnComm事件捕獲并處理這些通信事件。如果在通信過(guò)程中發(fā)生錯(cuò)誤或異常,也會(huì)觸發(fā) OnComm事件,通過(guò) CommEvent屬性反映錯(cuò)誤類型,在通信程序的設(shè)計(jì)中可根據(jù)該屬性值來(lái)執(zhí)行不同的操作。
發(fā)送文件之前,必須建立通信連接。所以利用MSComm控件向串口Modem發(fā)出控制命令,例如:
1)撥號(hào):’ATDT’+電話號(hào)碼 +#13
2)掛機(jī):’+++’+#13+’ATH0’+#13
3)自動(dòng)應(yīng)答:’ATS0=1’+#13
當(dāng)撥號(hào)后成功建立連接,則開(kāi)始發(fā)送文件。為了順利地發(fā)送文件,需定義好通信協(xié)議并將待發(fā)送數(shù)據(jù)按協(xié)議組包。
如圖 3、圖 4定義通信數(shù)據(jù)幀 (信息幀)的一般格式。
信息幀格式的說(shuō)明:
命令字:區(qū)分不同的操作,如:準(zhǔn)備發(fā)送文件、發(fā)送數(shù)據(jù)、發(fā)送數(shù)據(jù)完畢、準(zhǔn)備接收文件、已接收數(shù)據(jù)、已保存文件。
驗(yàn)證碼:檢驗(yàn)信息幀是否屬于同一個(gè)文件的發(fā)送。
校驗(yàn)碼:判斷信息幀是否完整。
圖5 串口發(fā)送文件信息流程圖
接收方接收到發(fā)送方的信息幀后,首先核對(duì)幀的大小是否符合協(xié)議約定的幀大小,如果不一致,則拋棄該信息幀。如果幀大小正確,則校驗(yàn)該信息幀是否正確,如果信息幀校驗(yàn)失敗,則接收方拋棄該信息幀。發(fā)送方等待接收方的反饋信息,如果在指定的時(shí)間未接收到反饋信息,發(fā)送方重發(fā)信息幀。如果信息幀校驗(yàn)正確,則接收方將正確接收信息幀的消息發(fā)給發(fā)送方作為反饋信息,并對(duì)信息幀進(jìn)行相應(yīng)的處理。發(fā)送方接收到反饋信息,進(jìn)行校驗(yàn),如果校驗(yàn)成功則表示信息幀發(fā)送成功,繼續(xù)發(fā)送下一個(gè)信息幀,否則需要重發(fā)信息幀。
圖5為串口發(fā)送文件流程圖。通過(guò)初始化MSComm,分別對(duì)串口和Modem進(jìn)行初始化,如果發(fā)現(xiàn)串口或者M(jìn)odem出錯(cuò),向用戶提示出錯(cuò)信息。如果初始化成功,則進(jìn)行撥號(hào)嘗試建立通信鏈路,如果連接不成功,則自動(dòng)重?fù)?如果超出重?fù)艽螖?shù)則向用戶提示出錯(cuò)。當(dāng)建立連接后,將待發(fā)送的壓縮文件讀入文件流,計(jì)算出流的總長(zhǎng)度,并按照通信協(xié)議劃分文件流組成系列信息幀,向接收方發(fā)送,如果發(fā)送成功,則繼續(xù)發(fā)送下一個(gè)幀;如果超時(shí),則重發(fā)。直到整個(gè)壓縮文件發(fā)送完畢。
最后結(jié)論是:將增加了加密口令的壓縮文件用在串口傳輸上,在一定程度上增加了傳輸?shù)陌踩?。而文件的最大化壓縮減少了傳輸?shù)臄?shù)據(jù)字節(jié)數(shù),減少了傳輸?shù)臅r(shí)間消耗,實(shí)現(xiàn)傳輸實(shí)時(shí)性。另一方面實(shí)現(xiàn)靈活選擇用于壓縮傳輸?shù)奈募?可以是單文件,也可以是多文件、多文件夾的混合。這種壓縮后進(jìn)行傳輸?shù)哪J?可廣泛應(yīng)用于遠(yuǎn)程監(jiān)測(cè)設(shè)備的數(shù)據(jù)采集、連鎖門店的數(shù)據(jù)匯總等方面。所以可以作為串口通信的一種通用模式進(jìn)行推廣。
[1]魏崢,萬(wàn)珊.用 Delphi實(shí)現(xiàn)對(duì)庫(kù)文件的壓縮解壓[J].濟(jì)南大學(xué)學(xué)報(bào) :自然科學(xué)版,2002,16(3):313-314.
[2]左繼紅,霍劍青,吳葛銘,等.虛擬物理實(shí)驗(yàn)的遠(yuǎn)程教學(xué)交互和管理系統(tǒng) [J].中國(guó)科學(xué)技術(shù)大學(xué)學(xué)報(bào),2000,30(3):307-311.
[3]汪勇,楊濤,高偉,等.汽輪機(jī)組振動(dòng)波形數(shù)據(jù)高效實(shí)時(shí)無(wú)損壓縮算法[J].華中科技大學(xué):自然科學(xué)版,2008,36(9):86-89.
[4]彭偉.局域網(wǎng)圖像廣播及相關(guān)遠(yuǎn)程控制的設(shè)計(jì)與實(shí)現(xiàn)[D].武漢:華中師范大學(xué)計(jì)算機(jī)科學(xué)系,2006.
[5]孫萍.基于 ZLib的數(shù)字文獻(xiàn)壓縮技術(shù)的設(shè)計(jì)與實(shí)現(xiàn)[J].農(nóng)業(yè)圖書(shū)情報(bào)學(xué)刊,2007,19(11):5-8.
[6]蘭順碧,彭晶晶.醫(yī)學(xué)多媒體在線考試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2006(4):60-62.
[7]黃軍,熊勇,劉燕,等.Delphi串口通信編程 [M].北京:人民郵電出版社,2002.
[8]wnhoo.用DELPHI實(shí)現(xiàn)文件加密壓縮[EB/OL].http://dev.csdn. net/author/Jason009/0e90c8556a414b2790df1e2de9a723e5.html,2007-07-13.
[9]王保印,康健,姜傳國(guó).用 VC++6.0中 MSComm控件實(shí)現(xiàn)多類型文件傳送[J].吉林大學(xué)學(xué)報(bào):信息科學(xué)版,2004,22(2):164-168.
(責(zé)任編校:光明)
A CurrentMode of Serial Communication
LUO Ru-wei,CHEN W ei-xiao
(College of Computer Science and Information,Guizhou University,Guiyang,550025,China)
To implement real-time transmit long-distance data by communication line,a currentmode of serial communication is presented.Firstly,the data are maximally compressed with the latest zlibEx,and in the process of compression,the encrypted pass word usingmd5 is added,so the security of data can be enhanced.Finally,a series of communication protocols are designed to realize the remote trans missing via serial port.
serial communication;currentmode;compressingwith zlibEx;real-time trans missing
TP311
A
1673-0712(2010)02-0014-03
2010-02-08.
羅如為 (1974-),男,湖南邵東人,貴州大學(xué)計(jì)算機(jī)科學(xué)與信息學(xué)院在讀博士,研究方向:數(shù)字圖像處理、虛擬現(xiàn)實(shí);陳孝威(1945-),男,貴州貴陽(yáng)人,貴州大學(xué)計(jì)算機(jī)科學(xué)與信息學(xué)院教授,博士生導(dǎo)師,CCF會(huì)員 (E20-0005528S),研究方向:虛擬現(xiàn)實(shí)、數(shù)字圖像處理及網(wǎng)絡(luò)通信技術(shù)。