發(fā)布日期:2022-07-15 點(diǎn)擊率:22
隨著網(wǎng)絡(luò)嵌入式系統(tǒng)應(yīng)用的普及,嵌入式系統(tǒng)之間的通信成為工程師關(guān)注的焦點(diǎn)之一。除了API或HTTP協(xié)議等傳統(tǒng)方式外,電子郵件也可以用來進(jìn)行數(shù)據(jù)通信,本文描述了一個用于接收信息的小型SMTP服務(wù)器以及發(fā)送回函的客戶程序來說明電子郵件通信方式的應(yīng)用。
通過電子郵件來與網(wǎng)絡(luò)嵌入式系統(tǒng)通信有如下優(yōu)點(diǎn):(1) 用戶接口是日常使用的標(biāo)準(zhǔn)電子郵件客戶程序,對技術(shù)要求較低;(2) 有現(xiàn)成的協(xié)議用于從各種設(shè)備(桌面電腦、手持設(shè)備及網(wǎng)絡(luò)電話)發(fā)送電子郵件并在因特網(wǎng)上傳輸;(3) 只需稍加處理,便可對嵌入式設(shè)備上回復(fù)的電子郵件以HTML格式進(jìn)行編碼,使數(shù)據(jù)的表現(xiàn)形式更為豐富和易讀;(4) 電子郵件客戶程序有自己的存檔日志,便于進(jìn)行數(shù)據(jù)歸檔備份。
郵件系統(tǒng)的組成
在用因特網(wǎng)發(fā)送郵件時,我們使用郵件用戶代理(MUA)與本地的郵件傳輸代理(MTA)進(jìn)行通信,后者則將電子郵件傳送給目標(biāo)MTA。目標(biāo)MTA通過一個本地投遞服務(wù)器(如POP3)將電子郵件傳送給接收MUA,如圖1所示。
客戶與MTA間傳送電子郵件的協(xié)議稱為簡單郵件傳輸協(xié)議(SMTP),它的具體條款可在RFC-821中找到。目的MTA接收到郵件,該郵件暫存在接收系統(tǒng)上,郵件接收者可通過POP3將之收集下來(郵局協(xié)議)。通過郵局協(xié)議可避免在每個需要接收郵件的節(jié)點(diǎn)上建立一個SMTP服務(wù)器。
協(xié)議會話示例
SMTP是一種其于ASCII的簡單協(xié)議,可通過標(biāo)準(zhǔn)的遠(yuǎn)程登錄客戶程序執(zhí)行。MTA寄存在端口25上,程序1是一段與稱為Sendmail(紅色顯示部分為用戶輸入)標(biāo)準(zhǔn)MTA的互動會話示例。
通過遠(yuǎn)程登錄打開一個Socket會話后,先通過HELO指令表明身份,然后再通過MMAIL FROM指令告知MTA郵件從何而來,并通過RCPT TO指令表明郵件去向何處。最后,發(fā)出DATA指令指示MTA以下文本內(nèi)容是電子郵件的正文。在正文中輸入內(nèi)容后,通過一個簡單的“.”來結(jié)束郵件,這個符號獨(dú)占一行。這時MTA便準(zhǔn)備將電子郵件發(fā)送給指定姓名的接收者。
這個示例所用功能極少,但作為例子已經(jīng)足夠了。它表明MTA只是一個特殊的命令解釋器。當(dāng)所有的命令都向MTA發(fā)出后,會返回一個數(shù)字響應(yīng)代碼,以便知道是否執(zhí)行成功。此外還有多種協(xié)議了采用這種模式,包括POP3和網(wǎng)絡(luò)新聞傳輸協(xié)議(NNTP)。
簡單SMTP服務(wù)器和客戶實現(xiàn)
以下是一個適用于嵌入式系統(tǒng)的簡單實現(xiàn)。這個實現(xiàn)的目的是在SMTP傳輸系統(tǒng)中開發(fā)一個命令-響應(yīng)協(xié)議。服務(wù)器接收一個電子郵件,然后對它進(jìn)行語法分析,找出其中的指令(這種情況下,這個指令位于電子郵件的標(biāo)題欄中)。如果指令合法,就調(diào)用一個處理程序產(chǎn)生電子郵件的響應(yīng),該響應(yīng)傳送到客戶實現(xiàn)上,然后傳輸回去給用戶。整個系統(tǒng)如圖2所示。
嵌入式SMTP服務(wù)器的組件和客戶與圖1所示的傳統(tǒng)圖形有所不同。客戶MUA配置了一個SMTP網(wǎng)關(guān)(發(fā)出郵件服務(wù)器)作為嵌入式器件的地址(由于服務(wù)器既充當(dāng)MTU又充當(dāng)自動MUA)。嵌入式客戶采用SMTP GATEWAY #define(程序1)來定義從何處發(fā)送響應(yīng)電子郵件。
實現(xiàn)過程
主要功能(可從獲得完整的源代碼)提供了基本的服務(wù)器插座設(shè)置以便郵件連接。將插座綁定到端口25,即SMTP服務(wù)的標(biāo)準(zhǔn)端口。然后執(zhí)行一個循環(huán)等待連接,當(dāng)有客戶連接時調(diào)用MailReceive函數(shù)。為了簡化實現(xiàn),一次只處理一個連接。
MailReceive函數(shù)實現(xiàn)SMTP協(xié)議的服務(wù)器端功能,如實例程序2所示。MailReceive函數(shù)中的第一步是將初始化標(biāo)志發(fā)送給客戶程序,然后等待其響應(yīng)。接著順序等待接收“MAIL
FROM”、“RCPT TO”及“DATA”命令,并存儲結(jié)果及發(fā)送相應(yīng)的返回碼。
接收郵件正文的操作十分簡單,只需將收到的字符緩存起來,直到接收到一個特殊的字符序列為止。客戶程序發(fā)送“
這時存放郵件內(nèi)容的字符串?dāng)?shù)組中已接收到整個郵件原文。然后調(diào)用mailParse函數(shù)分析該數(shù)組,找出相關(guān)指令。
程序2中給出了mailParse函數(shù)的實現(xiàn)。該函數(shù)首先檢索“Subject:”字符串,如果找到則存儲相應(yīng)的標(biāo)題內(nèi)容。然后將標(biāo)題串與目標(biāo)所支持的命令(PING、SENSOR和RESET)相比較,并調(diào)用相應(yīng)的處理函數(shù)。
實例代碼中每個處理函數(shù)都包含了相同的基本處理過程。首先分配一個郵件標(biāo)題結(jié)構(gòu),根據(jù)希望提供的響應(yīng)填入該結(jié)構(gòu)的相關(guān)字段,然后調(diào)用mailSend函數(shù)發(fā)送郵件(參見示例程序3)。sendResponse 和processCommand函數(shù)的功能十分顯而易見。
函數(shù)sendSensorData略有不同,它發(fā)送的是HTML格式的文本。除了郵件正文不同外,其內(nèi)容類型標(biāo)志也不同:普通正文的內(nèi)容標(biāo)志為“text/plain”,而HTML格式的內(nèi)容標(biāo)志為“text/html”,表示郵件中可能包含HTML標(biāo)記。這些處理程序十分簡單,但可以進(jìn)行擴(kuò)展以支持任何電子郵件客戶程序所允許的嵌入標(biāo)記(包括圖象、聲音等數(shù)據(jù)的傳輸)。
MailSend函數(shù)實現(xiàn)SMTP客戶端的協(xié)議處理。這基本上是服務(wù)器端代碼的反向處理。
另外值得注意的是客戶報頭文件,它定義了mailHeader結(jié)構(gòu)(見實例程序1)。該結(jié)構(gòu)中多數(shù)的字段都一目了然,其中一個特殊的字段是specialHeaders。如果電子郵件客戶程序把郵件中所有的標(biāo)題域都顯示出來,將發(fā)現(xiàn)許多不常見的內(nèi)容,多數(shù)都可在IETF的“通用互連網(wǎng)消息標(biāo)題”(RFC-2076)文檔中找到。通過specialHeaders字段可調(diào)整電子郵件的處理。例如可采用“Priority: Urgent”標(biāo)題注明郵件的重要性,或采用“Content-MD5:”標(biāo)題(以及相應(yīng)的校驗碼)來保證在傳遞過程中郵件的內(nèi)容未發(fā)生改變。
測試設(shè)置
實例代碼可在Linux上直接編譯并運(yùn)行。編譯前必須先配置兩個參數(shù)程序才能正常運(yùn)行(在client.h文件中)。
第一個參數(shù)是SMTP GATEWAY宏定義,它設(shè)定嵌入式SMTP客戶程序發(fā)送電子郵件的目標(biāo),一般是用戶有發(fā)送或接收帳號的SMTP網(wǎng)關(guān),或者是提供電子郵件中轉(zhuǎn)服務(wù)的網(wǎng)關(guān)。該參數(shù)可設(shè)為一個IP地址或一個域名(mailSend函數(shù)中的代碼具備域名解析功能)。
第二個可配置的參數(shù)是SOURCE_E-MAIL_ADDRESS,該參數(shù)并不十分關(guān)鍵,它表示回復(fù)郵件中“From:”字段的內(nèi)容(即發(fā)送方的標(biāo)志)。這些參數(shù)設(shè)置好以后,只需簡單地“Make”就可生成“Tinyms”可執(zhí)行程序鏡像。
發(fā)出郵件的電子郵件桌面程序必須將其SMTP網(wǎng)關(guān)(或發(fā)送服務(wù)器)配置為嵌入式設(shè)備的IP地址。當(dāng)用軟件發(fā)送電子郵件時,無論接收方在哪里,郵件都要首先經(jīng)過預(yù)先設(shè)好的SMTP網(wǎng)關(guān)(即嵌入式設(shè)備)。嵌入式設(shè)備并不關(guān)心地址,它只是處理所有收到的郵件,并把回復(fù)內(nèi)容傳給發(fā)送方。注意標(biāo)題域(Subject:)的內(nèi)容是要執(zhí)行的命令(如SENSOR或者PING)。在列舉的實現(xiàn)中忽略了郵件的正文,但只需稍加修改舊可對正文進(jìn)行處理,因為整個郵件的原文都存放在字符數(shù)組中。
本文小結(jié)
現(xiàn)在可以向嵌入式設(shè)備發(fā)送電子郵件并獲得響應(yīng)了,但這只是一個最基本的配置,它給傳統(tǒng)的通信模式提供了一種有趣的替代。我們可對這一實現(xiàn)進(jìn)行多種擴(kuò)展,例如支持在電子郵件正文中嵌入XML消息(通過某種XML分析器);還可通過在接收或發(fā)送的郵件中附加Base64或“Quoted-Printable MIME”編碼/解碼處理功能來支持二進(jìn)制附件。利用后者可提供向嵌入式設(shè)備發(fā)送軟件更新或接收采集的二進(jìn)制數(shù)據(jù)的功能(在傳統(tǒng)的圖像等多媒體數(shù)據(jù)之外)。最后,不用任何額外的改變,就可由嵌入式設(shè)備在異常情況下發(fā)送電子郵件報警。
作者簡介:
M. Tim Jones是Emulex公司的軟件工程師。他從1986年到現(xiàn)在一直從事嵌入式軟件開發(fā),其范圍十分廣泛,從航空設(shè)備的操作系統(tǒng)內(nèi)核到地面嵌入式網(wǎng)絡(luò),無所不及。Tim獲得了計算機(jī)科學(xué)的學(xué)士和碩士學(xué)位。可通過mtj@與他聯(lián)系。
作者:M. Tim Jones
Emulex公司