何花,王平
(福建師范大學 物理與光電信息科技學院,福州 350008)
目前,嵌入式網絡應用技術是國際熱點應用技術。Philips、Samsung等公司都在研發相應的嵌入式網絡終端,目的是使各類設備直接接入Internet網,實現遠程通信與控制。
基于單片機的嵌入式網絡終端的硬件組成方案有“單片機+硬件協議棧+網卡芯片”模式和“單片機+網卡芯片”模式。因其軟、硬件資源有限,只能實現簡單、低速的通信。本設計采用的“ARM+網卡芯片”模式,其特點是自帶操作系統,芯片中集成了大部分的外圍電路,運行速度快、功能強大[1],為實現互聯網的應用提供了有利的硬件平臺。
電子郵件和聊天軟件是用戶進行非實時交流和實時交流信息的兩種重要方式。但目前運行在PC機上的此類軟件除具備基本通信能力外,還有許多復雜功能,難以運行在嵌入式網絡終端這種資源有限的設備上。另外,許多類庫中的函數(如System.Net.Mail和System.Web.Mail等)在PC機上可以正常運行,但Windows CE嵌入式操作系統卻不支持。因此,不能直接對現有的電子郵件系統和聊天軟件進行簡單的裁減。針對上述問題,本文設計了基于嵌入式網絡終端的聊天軟件和郵件客戶端軟件,具有較高的實用價值。
本設計采用Samsung公司的S3C2440A-40微處理器,結合電源模塊、以太網口模塊、串口模塊、顯示(觸摸屏)模塊、外部數據存儲模塊,以及系統工作狀態指示和接口模塊構成嵌入式網絡終端。
操作系統采用微軟公司研發的Windows CE。它是一款功能強大的32位嵌入式實時操作系統,具有多線程、多任務、完全搶占式的特點,是專為各種受到資源嚴格限制的硬件系統所設計的[2]。Windows CE支持多類硬件外圍設備,內置的標準通信能力使其能夠訪問Internet并收發E-mail或瀏覽Web。除此之外,Windows CE特有的與Windows類似的用戶界面使最終用戶易于使用[3]。聊天軟件和郵件客戶端軟件皆采用C/S開發模式,在VS.C#的智能設備Windows CE開發環境中編輯完成。
TCP/IP協議的Socket提供了原始式、流式、數據報式3種套接字。其中,原始式套接字主要用于檢測新協議的實現,或訪問現有服務中配置的新設備;流式套接字提供面向連接、可靠的數據傳輸服務;而數據報式套接字則提供不可靠、面向無連接的服務。
采用流式套接字編程時,用戶在傳輸、接收數據之前必須先建立連接,然后才能從數據流中讀出數據。其通信過程分為3個步驟:
①服務器監聽。服務器被創建并啟動后,在指定端口進行監聽,等待客戶端的連接,實時監控網絡狀態。
②客戶端請求。用Socket創建一個客戶端流式套接字,并向指定的服務器發送連接請求??蛻舳说奶捉幼直仨毭枋龀鏊B接的服務器的套接字,指出服務器端套接字的地址和端口號,然后向服務器端套接字提出連接請求[4]。
TcPClient tcPClient=new TcPClient()
tcPClient.Connect(IPAddress.Parse(server_ip),Int32.Parse(server_Port))//服務器IP地址server_ip,服務器端口server_Port
③連接確認。當服務器檢測到有連接請求時,listener.Pending()為ture。服務進程被喚醒,生成一個新的字節流套接字Socket socket=listener.AcceptSocket(),與客戶的套接字建立連接。之前的套接字繼續用于監聽網絡上的服務請求。
兩款軟件的編程皆采用流式套接字。聊天軟件的服務器和客戶端處于同一界面。聊天協議常用命令有:JOIN 、GETLIST 、TALK 、SECRET 、EXIT 、OFF 。軟件運行時,先啟動服務器監聽,服務器負責管理客戶端的連接并給客戶端發送信息,同時支持多個客戶端同時連接??蛻舳说卿浐罂稍诤糜蚜斜碇羞x擇好友,進行聊天。
2.3.1 服務器端實現
服務器端程序流程如圖1所示。采用TcpListener類創建一個Socket套接字 TcpListener listener=new Tcp Listener(localaddr_ip,po rt),并啟動服務器listener.Start()。在沒有連接請求時,服務器進程處于休眠狀態。為了能夠實現多用戶同時通信,定義clients為Hashtable對象,同時為每個用戶建立了一個獨立的數據接收線程,對接收到的數據和命令進行處理 Thread clientService=new Thread(new ThreadStart(client.ServiceClient))。
2.3.2 客戶端實現
采用TcPClient類創建一個流式套接字TcPClient作為客戶端,用戶通過點擊好友列表中的好友向 tcPClient類的Connect方法提供所要連接的服務器的IP地址和端口號。若好友沒有在線(即好友的服務器沒有打開),或者沒有檢測到連接請求,則Stream.Read()反饋無法通信。連接成功后,將要發送的命令或數據通過By te[]bytes=System.Text.Encoding.Default.GetBytes();Stream.Write(by tes,0,bytes.Length)寫入網絡數據流。
文件的發送和接收單獨采用一對流式套接字完成,即有獨立的服務器和客戶端套接字。傳送文件時,利用FileGetStream()提取文件流:

文件接收主要流程如下:

SMTP(Simple Mail Transfer Protoco1,簡單郵件傳輸協議)規定由源地址到目的地址傳送郵件的規則[5]。其命令由ASCII字母表組成,提供8位的字節傳送通道,最高位被填充為0,剩下的7位正確傳送,且以<CRLF>作為結束符。

圖1 服務器程序流程
郵局協議POP3通信過程包括3個階段:驗證狀態、事務狀態和更新狀態[6]。常用的命令有 DELE(刪除郵件)、RETR+郵件號(閱讀郵件)、TOP(讀取指定郵件的信頭和指定的信頭行數)等。
客戶端軟件主要采用多用途互聯網郵件擴展編碼(MIME)標準,解決了RFC822標準只能發送基本的ASCII碼文本信息,難以實現語音、圖像等多媒體數據以及其他二進制數據文件發送的問題。MIME常用的編碼有Base64、Quoted-printable、7bit、8bit、Binary 等幾種,其中 7bit是缺省的編碼方式[7]。客戶端軟件功能模塊如圖2所示。

圖2 客戶端軟件功能模塊
郵件的發送主要包括以下函數:將字符串編碼為Base64字符串的編碼函數Base64Encode(),發送單個命令函數SendCommand(),接收SMTP服務器響應碼函數 ReceiveData(),讀取附件文件流函數Get-Stream(),以及綜合上述函數的郵件發送函數SendEmai()。
若發送的郵件不包含附件,則直接發送郵件體。若包含附件,則需要將郵件體分成若干個段:首先定義標志郵件頭域中說明郵件內容類型的域Content-Type為multipart/mixed;然后定義其boundary的屬性值,后面每段的分段標志就是boundary的屬性值,附件可以是語音、圖像等。
郵件發送程序流程如圖3所示。每條命令發送后都有判斷響應碼是否正確,如果不正確,則放棄發送郵件內容,并提示用戶釋放資源。
結合POP3協議的命令、Socket套接字和Network-Stream網絡數據流,可以很快地獲取郵件源代碼。如何從源代碼中提取有用的信息并轉換成人們能夠理解的文字,是郵件接收程序的難點。本郵件接收系統主要依靠郵件接收類(WincePOPClient.CS)、解碼類(QUOTEDPRINTABLE)、解碼類(BASE64)和附件保存類(SaveFileAttachment)實現。
郵件接收類(WincePOPClient.CS)包含POP3協議的各種命令、郵件源代碼的分段、有用代碼的提取,結合QUOTED-PRINTABLE解碼類、Base64解碼類等進行解碼。當正在查看的郵件含附件時,則調用SaveFileAttachment類提取附件。SaveFileAttachment類主要通過正切表達式提取附件的內容,經解碼后由SaveFileDialog保存。
接收郵件程序流程如圖4所示。

圖3 郵件發送程序流程

圖4 接收郵件程序流程
嵌入式網絡終端聊天軟件功能測試如圖5所示。嵌入式網絡終端郵件收發過程測試如圖6所示。當所讀取的郵件內包含附件時,讀完郵件并按“確定”鍵后,會彈出“保存文件”對話框,可選擇是否保存附件。

圖5 聊天軟件測試

圖6 聊天軟件測試
本文在“ARM+網卡芯片”模式的硬件平臺實現了與網絡資源的對接,開發出基于Windows CE嵌入式操作系統的聊天軟件和電子郵件客戶端系統。這兩款軟件完全可以滿足嵌入式系統對硬件的要求,同時也較好地滿足了現實社會對交互性、分布性和異地辦公的需求,使人們可以在此網絡終端上進行實時和非實時通信。在此基礎上,還可繼續開發VoIP語音通信和 Telnet數據通信,具有良好的市場前景。
[1]王平,等.基于PSTN與Interent的嵌入式終端遠程控制方案[J].微計算機應用,2009(1):64-51.
[2]吳弋旻,葛海江,張能貴.基于WinCE的模擬鍵盤驅動程序的實現[J].機電工程,2008,25(9):103-105.
[3]林建民.嵌入式操作系統技術發展趨勢[J].計算機工程,2001,27(10):1-4.
[4]李巧玲.基于C#-Socket的網絡通信程序設計[J].福建電腦,2009(4):135-136.
[5]周彩蘭,虞珊.基于SM TP協議解析的垃圾郵件防止技術[J].計算機技術與發展,2008,18(1):188-191.
[6]葉樹華,高志紅.網絡編程實用教程[M].北京:人民郵電出版社,2006:328-330.
[7]孫濤.MIME郵件格式分析及信息提取[J].計算機與信息技術,2007,(6):24-30.