基于esmtp的水文數(shù)據(jù)共享方法設(shè)計與實現(xiàn)_第1頁
已閱讀1頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p>  基于ESMTP的水文數(shù)據(jù)共享方法設(shè)計與實現(xiàn)</p><p>  摘 要 針對水利部門數(shù)據(jù)共享的高成本、低效率現(xiàn)狀,提出一種通過email方式進行水文數(shù)據(jù)共享的方法。通過對ESMTP和POP3協(xié)議的應(yīng)用,發(fā)送方將數(shù)據(jù)打包作為郵件的附件發(fā)送,接收方解析郵件,從而實現(xiàn)數(shù)據(jù)共享。該方法靈活方便,運行成本低。本文對協(xié)議進行了簡單說明,同時對數(shù)據(jù)交換流程和實現(xiàn)類圖進行了詳細說明。 </p>

2、<p>  關(guān)鍵詞 水文數(shù)據(jù)共享,ESMTP,POP3</p><p><b>  0 引言</b></p><p>  當前,水利信息化正在水利行業(yè)大力推行,其中水文數(shù)據(jù)的共享是水資源管理以及防洪抗災(zāi)等決策支持的核心。由于水利部門管轄流域分布廣,各水文管理單位地域分散,管理機制多是采用集中-分散方式。管理站采集數(shù)據(jù)后傳送給各個分中心,再由分中心將信息

3、匯總后發(fā)送給管理局(或水利廳),使得管理局(或水利廳)能對管轄范圍的水情信息進行整體把握,做出決策分析;此外,因為河流之間的聯(lián)動關(guān)系,各分中心、管理站之間也需要相互通信,因此水文信息的互傳及共享十分必要。</p><p>  目前水文信息的互傳及共享采用的方式主要有以下三種:1,電話(傳真);2,公用通信信道;3,VPN(或網(wǎng)站)進行數(shù)據(jù)共享。但這三種方式有其明顯的不足之處:電話(傳真)方式需要人工參與,限制了工

4、作人員的工作范圍和處理事情的靈活性,而且需要接收方人工錄入數(shù)據(jù),這樣效率很低且缺乏實時性。公用通信信道方式通常利用PSTN、GSM、GPRS等進行數(shù)據(jù)傳輸,這種方法傳送的數(shù)據(jù)量受限且運行費用較高。通過VPN(或網(wǎng)站)進行數(shù)據(jù)共享,這種方式相對于前兩種而言,真正實現(xiàn)了信息化,但建立VPN或網(wǎng)站都需要較高的投資和后期高昂的維護費用,這阻礙了它的廣泛應(yīng)用及推廣。</p><p>  為了彌補上述方法的不足,本文提出了基

5、于email方式的水文數(shù)據(jù)共享的方法,通過郵件的收發(fā),網(wǎng)絡(luò)協(xié)議身份驗證來實現(xiàn)信息的互傳,實現(xiàn)無人工參與的數(shù)據(jù)共享。該方法簡單、高效,只要能上網(wǎng),不需要額外的系統(tǒng)維護成本,對于大多經(jīng)濟還不發(fā)達的水利單位具有實用性。</p><p>  1 郵件收發(fā)協(xié)議簡介</p><p>  1.1 POP3協(xié)議</p><p>  POP適用于C/S結(jié)構(gòu)的脫機模型的電子郵件協(xié)議

6、,目前已發(fā)展到第三版,稱POP3。</p><p>  在POP3協(xié)議中有三種狀態(tài):認可狀態(tài),處理狀態(tài),和更新狀態(tài)。當客戶機與服務(wù)器建立聯(lián)系時,一旦客戶機提供了自己身份并成功確認,即由認可狀態(tài)轉(zhuǎn)入處理狀態(tài),在完成相應(yīng)的操作后客戶機發(fā)出QUIT命令,則進入更新狀態(tài),更新之后重返認可狀態(tài)。</p><p>  一般情況下,大多數(shù)現(xiàn)有的POP3客戶與服務(wù)器執(zhí)行采用ASCII明文發(fā)送用戶名和口令,

7、在認可狀態(tài)等待客戶連接的情況下,客戶發(fā)出連接,并由命令USER/PASS對在網(wǎng)絡(luò)上發(fā)送明文用戶名和口令給服務(wù)器進行身份確認。一旦確認成功,便轉(zhuǎn)入處理狀態(tài)。</p><p>  1.2 ESMTP協(xié)議</p><p>  ESMTP英文全稱是“Extended SMTP”,是對SMTP協(xié)議的擴展,為了防止垃圾郵件的泛濫,采用了身份驗證機制。在登陸服務(wù)器后需經(jīng)過身份驗證才能發(fā)信。其他部分同S

8、MTP協(xié)議基本一樣。命令A(yù)UTH LOGIN表示開始身份驗證,然后是用戶名和密碼的驗證。用戶名和密碼都是使用Base64編碼。</p><p>  1.2.1 SMTP協(xié)議:</p><p>  SMTP稱為簡單郵件傳輸協(xié)議(Simple Mail Transfer Protocol),目標是向用戶提供高效、可靠的郵件傳輸。SMTP的一個重要特點是它能夠在傳送中接力傳送郵件,即郵件可以通

9、過不同網(wǎng)絡(luò)上的主機接力式傳送。工作在兩種情況下:一是電子郵件從客戶機傳輸?shù)椒?wù)器;二是從某一個服務(wù)器傳輸?shù)搅硪粋€服務(wù)器。SMTP是個請求/響應(yīng)協(xié)議,它監(jiān)聽25號端口,用于接收用戶的Mail請求,并與遠端Mail服務(wù)器建立SMTP連接??蛻舳讼蚍?wù)器發(fā)送請求命令,服務(wù)器向客戶端返回一些響應(yīng)信息。命令和響應(yīng)都是基于ASCII文本,并以CR和LF符結(jié)束。響應(yīng)包括一個表示返回狀態(tài)的三位數(shù)字代碼。</p><p>  1.

10、2.2 Base64編碼:</p><p>  由于歷史原因,Email只被允許傳送ASCII字符,即一個8位字節(jié)的低7位。因此,如果您發(fā)送了一封帶有非ASCII字符(即字節(jié)的最高位是1)的Email通過有“歷史問題”的網(wǎng)關(guān)時就可能會出現(xiàn)問題。網(wǎng)關(guān)可能會把最高位置為0而產(chǎn)生錯誤?;谝陨系囊恍┲饕虍a(chǎn)生了Base64編碼。</p><p>  Base64編碼的思想是采用64個基本的A

11、SCII碼字符對數(shù)據(jù)進行重新編碼。它將需要編碼的數(shù)據(jù)拆分成字節(jié)數(shù)組。以3個字節(jié)為一組。按順序排列24位數(shù)據(jù),再把這24位數(shù)據(jù)分成4組,即每組6位。再在每組的最高位前補兩個0湊足一個字節(jié)。這樣就把一個3字節(jié)為一組的數(shù)據(jù)重新編碼成了4個字節(jié)。當所要編碼的數(shù)據(jù)的字節(jié)數(shù)不是3的整倍數(shù),也就是說在分組時最后一組不夠3個字節(jié)。這時在最后一組填充1到2個0字節(jié)。并在最后編碼完成后在結(jié)尾添加1到2個“=”。</p><p>  

12、2 水文信息共享系統(tǒng)實現(xiàn)</p><p>  該系統(tǒng)通過網(wǎng)絡(luò)郵件收發(fā)協(xié)議進行水文信息的傳送。從信息保密的角度出發(fā),發(fā)送協(xié)議我們采用具有身份驗證機制的ESMTP協(xié)議;從信息可讀性角度出發(fā),即信息編碼方式的限制,我們通過Base64編碼進行解決;接收采用通用的POP3協(xié)議完成。</p><p>  2.1 數(shù)據(jù)交換流程</p><p>  當分中心需要將信息上報給管理處

13、時,需要先設(shè)置郵件發(fā)送端口號以及郵件服務(wù)器,接著驗證用戶身份,然后是發(fā)送信息的添加和發(fā)送;接收方利用POP3協(xié)議到郵件服務(wù)器上進行下載,其中關(guān)鍵是附件的處理,當信息從郵件服務(wù)器中下載到接收方,則完成了一次信息交換。</p><p>  圖1 數(shù)據(jù)交換示意圖</p><p>  從上圖中可以把整個數(shù)據(jù)交換流程劃分為三個部分:郵件發(fā)送,郵件接收和郵件處理。</p><p&g

14、t;  1)郵件發(fā)送:把郵件從本地發(fā)送到郵件服務(wù)器。</p><p>  首先,設(shè)置郵件發(fā)送的端口號和郵件服務(wù)器;進行服務(wù)器連接;</p><p>  其次,將用戶名和密碼經(jīng)過Base64編碼,并且發(fā)送進行驗證;</p><p><b>  最后,郵件發(fā)送。</b></p><p>  2)郵件接收:把郵件從服務(wù)器下載到

15、本地并處理附件。</p><p>  主要應(yīng)用POP3協(xié)議將郵件從服務(wù)器進行郵件下載。其主要流程如圖3所示:</p><p><b>  圖2 發(fā)郵件流程圖</b></p><p>  首先,設(shè)置郵件接收端口號和下載郵件服務(wù)器;然后進行服務(wù)器連接;</p><p>  其次,用戶名和密碼檢驗;</p>&l

16、t;p>  最后,郵件接收和附件處理。</p><p><b>  圖3 收郵件流程圖</b></p><p>  3)郵件處理:構(gòu)建和分析郵件的各個部件(郵件頭,郵件體,附件等)。</p><p>  該部分為整個系統(tǒng)實現(xiàn)的重點也是關(guān)鍵。它主要完成郵件體的生成、附件添加、以及接收郵件后郵件的解析和附件的處理等。</p>&

17、lt;p>  郵件的生成主要通過CMimeMessage、CMimeBody、CMimeHeader類。首先創(chuàng)建CMimeField類創(chuàng)建郵件項列表,然后CMimeHeader進行郵件的頭部的生成,并存放到郵件項列表中;郵件體通過CMimeBody進行創(chuàng)建,加載附件,最后再調(diào)用CMimeMessage類構(gòu)成郵件;實現(xiàn)代碼如下:</p><p>  CMimeMessage mail;</p>

18、<p>  //設(shè)置郵件各項的值</p><p>  mail.SetFrom(MailAddress);</p><p>  mail.SetTo(DestinationAddress);</p><p>  mail.SetSubject("郵件主題");</p><p>  mail.SetDate();&

19、lt;/p><p>  mail.SetVersion();</p><p>  mail.SetContentType("multipart/mixed");</p><p>  mail.SetBoundary();</p><p><b>  //創(chuàng)建郵件體</b></p><p

20、>  CMimeBody* pBp;</p><p>  pBp = mail.CreatePart();</p><p>  pBp-&gt;SetText("數(shù)據(jù)見附件");</p><p>  pBp = mail.CreatePart();</p><p><b>  //添加附件</

21、b></p><p>  pBp-&gt;SetDescription("attachment"); </p><p>  pBp-&gt;SetTransferEncoding("base64");</p><p>  pBp-&gt;ReadFromFile("附件");&

22、lt;/p><p><b>  圖4 郵件收發(fā)類圖</b></p><p>  郵件解析主要實現(xiàn)郵件附件的處理,它通過定義中間文檔將附件拷貝到內(nèi)存當中,然后再從內(nèi)存中將數(shù)據(jù)讀出,然后以與郵件名同名的文件將附件存放到用戶設(shè)定的目錄下;實現(xiàn)代碼如下:</p><p>  CStdioFile File;</p><p>  Fi

23、le.Open("a.txt",CFile::modeCreate|CFile::modeWrite); </p><p>  LONG size = 0,nsize =0;</p><p><b>  //接受郵件到文件</b></p><p>  while(size &lt;= lSize ) </p&g

24、t;<p><b>  {</b></p><p><b>  //接受郵件</b></p><p>  nsize=m_wsSocket.Receive(buf,10240); </p><p>  size =size + nsize;</p><p>  File.Write(b

25、uf,nsize);</p><p><b>  }</b></p><p>  File.Flush();</p><p>  File.Close();</p><p>  //打開接收到的文件</p><p>  File.Open("a.txt",CFile::mode

26、Read); </p><p><b>  //得到文件的大小</b></p><p>  LONG FileSize=File.GetLength();</p><p>  //建立緩沖區(qū)來存放讀取文件的內(nèi)容</p><p>  char* pBuff = new char[FileSize];</p>

27、<p>  File.Read(pBuff,size); //讀取文件到緩沖區(qū)</p><p>  File.Close(); //關(guān)閉文件</p><p>  File.Remove("a.txt");</p><p>  CMimeMessage mail; </p><p>  mail.Load(pBuf

28、f,size); </p><p>  CMimeBody::CBodyList bodies; // 定義變量</p><p>  Int nCount=mail.GetBodyPartList(bodies); </p><p>  CMimeBody::CBodyList::const_iterator it; </p><p><

29、;b>  //獲得附件</b></p><p>  for (it=bodies.begin(); it!=bodies.end(); it++)</p><p><b>  {</b></p><p>  CMimeBody* pBP = *it;</p><p>  if (pBP-&gt;

30、IsAttachment())</p><p><b>  {</b></p><p><b>  //獲得附件名</b></p><p>  string strName = pBP-&gt;GetName();</p><p>  //存儲附件到當前目錄</p><p

31、>  pBP-&gt;WriteToFile(FilePath+strName.c_str());</p><p><b>  }</b></p><p><b>  }</b></p><p>  delete pBuff; //刪除緩沖區(qū)</p><p>  3 數(shù)據(jù)交換類圖及其

32、實現(xiàn)</p><p>  該系統(tǒng)采用Visual C++6.0進行開發(fā),將數(shù)據(jù)交換流程中三個主要部分封裝為標準動態(tài)鏈接庫。該模塊具有通用性,可應(yīng)用于需要進行數(shù)據(jù)交換和共享的系統(tǒng)。</p><p>  從圖4中可以看出通過CMimeHeader,CMimeBody和CMimeMessage主要用于郵件體的生成和解析;CSmtp類用于郵件發(fā)送;CPop3用于郵件接收。</p>&

33、lt;p><b>  4 結(jié)語</b></p><p>  基于Email方式的水文數(shù)據(jù)共享系統(tǒng)的設(shè)計和開發(fā)為目前水文數(shù)據(jù)的互傳和共享提供了一種新的方式,該方法高效、簡單易行,只要開通了Internet網(wǎng)絡(luò)即可應(yīng)用,無運行維護費用。目前該系統(tǒng)在都江堰灌區(qū)東風(fēng)渠管理處應(yīng)用良好。</p><p><b>  參考文獻</b></p>

34、;<p>  [1] 潘愛民譯. Visual C++技術(shù)內(nèi)幕(第4版)[M]. 北京:清華大學(xué)出版社,2004</p><p>  [2] 汪曉平,鐘軍. Visual C++網(wǎng)絡(luò)通信協(xié)議分析與應(yīng)用實現(xiàn)[M]. 北京:人民郵電出版社,2003</p><p>  [3] 張建云,姚永熙,唐鎮(zhèn)松. 我國水文自動測報系統(tǒng)的發(fā)展與探討[J]. 水文,2006,26(3):53-5

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論