DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1250|回复: 0
打印 上一主题 下一主题

[待整理] 嵌入式系统中SMTP协议的通讯实现

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-12 15:40:40 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
摘要:本文介绍了在网络时代的嵌入式系统发展状况,结合网络协议中SMTP协议自身的特点及其应用,提出了在嵌入式系统中提供SMTP支持的具体流程和方法,然后给出了SMTP代理在嵌入式系统下的一个具体实现.
关键字:嵌入式系统 SMTP

引言

       随着因特网技术的成熟,在以信息家电为代表的互联网时代嵌入式产品中SMTP协议得到广泛的应用。 SMTP 协议作为嵌入式领域中的客户机协议十分有用的原因就是可以被大量的现有的基础设施所支持。在嵌入式系统的角度上说,通过简单的SMTP协议工作可以异步的传输数据,数据以email的形式通过MTA进行传输,主要的工作交给SMTP基础设施去接管,减少在嵌入式系统中进行同步数据传输时带来的运行开销。并且通过使用MIME还可以扩展单一的文本数据的传输方式,传输各种包括音频,视频或静止图象等丰富的多媒体数据。同时,在SMTP客户和服务器中通过email的方式进行通讯还可以作为工具来对远程设备更新命令传输和响应。

1.SMTP协议的通讯模型和会话流程:

       SMTP协议通讯模型
       SMTP协议是TCP/IP协议族中的一员,其通信模型并不复杂,适合于工作在嵌入式系统的环境下。它的主要工作集中在发送SMTP和接收SMTP上:首先针对用户发出的邮件请求,由发送SMTP建立一条连接到接收SMTP的双工通讯链路,这里的接收SMTP是相对于发送SMTP而言的,实际上它既可以是最终的接收者也可以是中间传送者。发送SMTP负责向接收SMTP发送SMTP命令,而接收SMTP则负责接收并反馈应答。可大致用下面的通讯模型示意图来表示:

SMTP协议的命令和应答
       从通讯模型可以看出SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP的 SMTP命令和接收SMTP反馈的应答来完成的。在通讯链路建立后,SMTP客户端发送MAIL命令指令邮件发送者,若SMTP服务器此时可以接收邮件则作出OK的应答,然后SMTP客户端继续发出RCPT命令以确认邮件是否收到,如果接收到SMTP服务器端就作出OK的应答,否则就发出拒绝接收应答,但这并不会对整个邮件操作造成影响。双方如此反复多次,直至邮件处理完毕。SMTP协议共包含10个SMTP命令,主要命令有 HELO,MAIL FROM, RCPT TO,DATA,QUIT等,它们用来完成服务器端和客户端在进行数据传输正式开始前需要进行的同步。

2.SMTP服务器和SMTP客户之间的对话实例:

       首先建立TCP连接,然后客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令,服务器端正希望以OK作为响应,表明准备接收。接下来客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行,服务器端则表示是否愿意为收件人接受邮件 。在协商结束后发送邮件,用命令DATA发送,将输入内容一起发送出去。最后结束此次发送,用QUIT命令退出。

C: HELO emailserver.com

S: 250 emailserver.com hello ident::root@[192.168.2.121]

C: MAIL FROM:<tom@emailserver.com>

S: 250 <tom@emailserver.com> sender ok

C: RCPT TO:<peter@emailserver.com>

S: 250 <peter@emailserver.com> recipient ok

C: DATA

S: 354 Enter mail,end with "." on a line by itself

C:

C: Content-type: text/plain

C:

C: This is a test email

C:

C: .

S: 250 Message accepted for delivery

C: QUIT

S: 221 emailserver.com closing connection

3.SMTP客户端的实现:

       在这里,本文只着重提供具体实现中的关键部分,其余部分可以很方便的实现,故不再多述。首先,定义通讯过程中使用的简化数据结构:

// Embedded SMTP Client header

Struct mailheader {

char subject[MAX_SUBJECT+1];

char sender[MAX_SEND+1];

char recipient[MAX_RCPT+1];

char contentType[MAX_CONTENT+1];

char *contents;

}

       在这里可以看出来,结构 mailheader 的各个字段对应着运用 SMTP

        然后,定义在客户端使用SMTP协议通讯的主函数 sendmail, 函数原型为:int sendmail(struct mailheader* mail) 下面是该函数的代码的主要部分:

int sendmail(struct mailheader) {

// local variables definition

int connfd, result, ret, goodMsg = 0;

struct sockaddr_in servaddr;



// set up socket connection routine

connfd = socket(AF_INET,SOCK_STREAM,0);

.....

result = connect(connfd,(struct sockaddr*)&servaddr,sizeof(servaddr);

do {

// Be sure to check each request and response for correct communication

// Look for initial salution

// Send HELO and await response

// Send MAIL FROM and await response

// Send RCPT TO and await response

// Send DATA and await response

// Send out mail contents

// Send QUIT and await response

} while(0);

close(connfd);

return (goodMsg);

}

4.SMTP服务器端的实现:

       服务器端主要的功能是通过TCP流的套接字服务,在启动后创建“监听”套接字,并将其绑定在为SMTP保留的端口上,接收连接处理。

int main(int artc, char **argv) {

// 初始化链接套接字

bind (listenfd, (struct sockadd*)&servaddr, sizeof(servaddr));

// 进入循环

for (; ;) {

connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen);

if (connfd >0) {

// 在该函数中进行SMTP协议相关的处理工作

handleConnection(connfd);

close(connfd);

}

}

close(listenfd);

}

       在函数 handleConnection 中按照SMTP协议元素分析由客户端发送过来的HELO, MAIL FROM, RCPT TO, DATA, 和QUIT 等命令并作出相应的数据处理,然后对客户端作出相应的应答。客户端和服务器端对于命令应答的方式都是固定的,应答内容则随应用的不同而存在差别,这里就不必要进行讨论了。

SMTP服务器端需要考虑的问题:

       除了通常的文本信息的传输外,在email中还有额外的附件传输的支持,这可以通过content-type区分是包含了普通的文本信息还是包含了多媒体信息。由于email传输只能支持7位二进制数编码的文本信息,所以对多媒体和其他非文本信息就必需通过其他的编码转换来解决,这里在嵌入式系统中考虑和使用的一般为Base64编码方案,这个编码方案是使用3个8位字节变成4个6位字节来解决多媒体信息变换为文本信息的问题,不过这样有一个不可避免的问题,就是编码转换后的信息流比原始编码流大33%。不过SMTP是个弹性的协议,可以使用任何的带宽,并且Base64这种编码机制为Email中传输二进制数据提供了手段。

5.小结:

       对嵌入式设备发送Email的能力以及通过SMTP协议对数据进行传输在许多的领域中都用途广泛,尤其是软件更新方面。在科技快速发展的今天,嵌入式产品将会越来越多地被广泛应用。越来越多的嵌入式产品必将更加深入的走进人们的生活之中。

参考文献:

1.Abraham Operating System Concepts, 6th Edition, Wiley publisher

2.Michael Barr Programming embedded system in C and C++ , O’reilly publisher

3.W Richard Stevens TCP/IP illustrated Volume one:Protocol, 机械工业出版社

4.王超,胡晨 嵌入式系统中HTTP协议的实现, 电子器件 2002。3

5.张晶,曾宪云 嵌入式系统概述,电测与仪表 2002。4
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-8-5 23:54 , 耗时 0.107332 秒, 21 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表