微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > 一个点到点的邮件系统设计

一个点到点的邮件系统设计

时间:05-06 来源:单片机与嵌入式系统应用 点击:

  引 言

  大量嵌入式设备已经进入人们的日常生活和工作中,人们对嵌入式设备的要求越来越高,功能也越来越复杂。笔者与一个嵌入式硬件制造商合作,为其嵌入式电话产品建立了一个软件系统,包括操作系统、驱动程序和一系列应用软件。其中点到点邮件收发系统是一个有明显特色的应用。
  
  本系统是一个基于串口通信的点到点邮件收发软件。运行在嵌入式系统上的邮件收发程序通过Modem以拨号方式连上远端的嵌入式系统,然后进行邮件发送工作。系统结构如图1所示。

图1Tmail系统结构

  从用户角度看,其发送流程与普通的电子邮件差不多。用户在编辑好邮件以后,在收信人一栏中填入对方的电话号码,点击发送,系统就会把邮件发送给对应电话号码的远端用户处,当然远端也必须接有同样的嵌入式系统。
  
  系统运行在基于ARM的S3C2410芯片嵌入式目标板上[1]。操作系统是定制的嵌入式Linux,图形界面使用Qt/Embedded支持。

  1 系统的构架
  
  系统主要由数据传输、邮件编码、邮件管理和用户界面四部分组成。由于要时刻监视串口的状态,所以系统要一直处于运行状态。但由于嵌入式系统的内存资源和计算资源有限,要尽量减少程序运行时带给整个系统的负载,采用了两层的设计结构,分别叫作服务层和用户层。服务层负责数据传输和邮件编码,用C语言编写,生成的可执行文件较小,一直处于运行状态;用户层负责邮件的管理和用户界面,用C++配以Qt/Embedded编写,由于有大量的界面元素,所以其可执行文件较大,只有用户需要查看和发送邮件时才运行。这样就可以大大减少占用的资源,使整个系统具有更快的速度。
  
  用户层与服务层的通信分两个方面:一方面,当用户层运行时通过信号和共享内存实现实时通信;另一方面,当用户层没有运行时,用文件暂存收到的邮件,在用户层运行后,再由它通知用户。
  
  当需要发送邮件时,用户层先把本地邮件拷贝到共享内存中,然后发送信号通知服务层,服务层接收到信号后,把邮件取出、编码和发送。在发送过程中,为了让用户看到发送的进度,服务端把状态信息放在共享内存中,然后发送信号通知用户层更新状态。当接收邮件时,若用户层没有运行,则把收到的邮件解码后暂存到文件中;若用户层运行着,则服务层通过共享内存和信号不断把接收进度传递给用户层,使其显示给用户,但此时并不会把邮件数据传给用户层,因为此时的邮件数据是经过编码的,等所有数据都接收结束后,服务层才会把邮件解码成本地邮件,然后再传送给用户层保存、显示。

  2 服务层的设计与实现

  2.1 串口的初始化
  
  在Linux中,串口的设备文件一般为/dev/ttyS0和/dev/ttyS1,分别表示串口1和串口2。首先要用open命令打开串口,然后根据具体的应用来配置串口,比如设置波特率、校验方法、数据位、停止位和流控制等。

  2.2 连接的建立和拆除
  
  连接的建立过程,就如同一般的拨号上网过程。不同的只是,拨打的电话号码不是ISP的号码,而是收信人的号码,因此需要在收信人方建立一个拨号服务器,使它能够接通外来的连接请求。Linux下的pppd软件可以实现拨号功能,mgetty可以用作拨号服务器。用pppd和mgetty来建立连接太过奢侈,因为只需建立物理上连通的链路,而不需要用PPP协议建立网络层链路[2]。
  
  本系统是用AT指令来编写拨号和拨号服务器代码的。AT指令是一组对Modem的操作指令,其中绝大多数指令都以AT开头,以/r结尾[3]。用到的AT指令有:

  ① 初始化指令--AT;

  ② 拨号指令--ATDT电话号码;

  ③ 应答指令--ATA;

  ④ 挂断指令--+++ATH0。
  
  工作流程为双方打开串口并初始化后,都向Modem发送初始化指令(AT),如果返回"OK",表示成功。成功后,接入方不断读取串口(1次/s)等待"RING"字符串。拨号方,通过拨号指令拨打对方电话号码,并读取串口等待"CONNECT"字符串。此时,接入方会在串口读到"RING",然后向串口发送应答指令(ATA),并读取串口等待"CONNECT"字符串。此后,如果双方都读取到"CONNECT",表示连接已经建立,可以在此链路上传输数据。等数据传输完成后,拨号方用挂断指令(+++ATH0)拆除连接。程序的流程如图2所示。


图2建立和拆除连接流程

  2.3 数据传输协议
  
  现在著名的串口协议主要有XModem和ZMODEM。XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个认可字节。然而,这种对每个块都进行认可的策略将导致低性能,特别是具有很长传播延迟的卫星连接的情况时,问题更加严重[4]。ZMODEM协议是XMODEM文件传输协议的一种增强形式,它不需要对每个块都进行认可。事实上,它只是简单地要求对损坏的块进行重发。它不仅能传输更大的数据,而且错误率更小。包含一种名为检查点重启的特性,如果通信链接在数据传输过程中中断,能从断点处而不是从开始处恢复传输[5]。
  
  结合XMODEM和ZMODEM优点,根据点到点邮件的特性,设计了一个称之为TMP(Telephone Mail Protocol)的协议。

  ① 邮件发送方先发送一个邮件信息包(其中包括发送方的电话号码和邮件长度),然后等待接收方应答。

  ② 接收方接收到邮件信息包后,发送应答包,等待邮件内容包。

  ③ 发送方接收到应答包后,开始发送邮件内容,直到邮件发送完毕或收到重发包。

  ④ 接收方接收邮件内容包,并检查其检验和,如有误则发送重发包,否则一直接收。

  ⑤ 发送方若收到重发包,则根据重发包内容重发部分邮件;若邮件发送完毕,还未收到重发包,则发送邮件结束确认包,要求接收方确认已正确接收到邮件。

  ⑥ 接收方接收到邮件结束确认包后,发送应答包,表示自己已正确接收到邮件。

  ⑦ 发送方接收到应答包后断开连接。

  ⑧ 在此过程中,等待都有超时计时,一旦超时就会断开连接;接收方接收到错误的包都会要求重发,而如果发送方接收到错误的包则会马上停止发送,断开连接。

  ⑨ 包采用变长包,最大长度为128字节,结构为
   
  其中:

  ◇ S为包起始符,取值为0x02,占1字节;

  ◇ E为包结束符,取值为0x03,占1字节;

  ◇ 包号本为占4字节的整型,但在传输过程中为了防止与包起始和结束符混淆,把它编成了BCD码,占8字节;

  ◇ 包类型也编成了BCD码,占2字节;

  ◇ 检验和是以字节为单位,把包号、包类型和数据累加起来,然后再编成BCD码,占2字节;

  ◇ 数据根据包的类型不同而不同,最多可以有114字节。

  由于包的判断只是依靠包起始符和结束符,包中的其他字段绝对不能与这两个字符相同,所以对有些可能产生混淆字符的字段进行了编码。

  一共有五种类型的数据包:

  ① 邮件内容包。包类型为0x00,数据是编码的邮件片断。

  ② 邮件信息包。包类型为0x81,数据是编成BCD码的发送方电话号码和邮件长度。

  ③ 邮件结束确认包。包类型为0x82,无数据。

  ④ 应答包。包类型为0x83,无数据。

  ⑤ 重发包。包类型为0x84,数据是编成BCD码的新包号和重发起始位置。

  2.4 包的发送和接收
  
  包的发送和接收就是按照包的格式定义读写串口。邮件的收发过程就是依照TMP协议收发包的过程。

  2.5邮件的编码和解码
  
  本系统要求发送的邮件是可以带附件的。在初始化串口时使用的是7位数据,而附件内容可能是二进制数据,这和普通电子邮件碰到的问题一样,要涉及到对邮件的编码问题。在设计该系统前,已经实现了普通电子邮件的客户端软件,所以就把普通电子邮件的编码方法应用到这里,也就是点到点邮件也用MIME格式来编码[6]。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top