关键词:嵌入式系统;增值服务;短信息
1. 引言
近年来,随着手机技术的迅猛发展,功能的不断增多,人们对手机的使用已经不再局限于传统的语音通话上了,而是越来越多地用到了非语音的功能,比如SMS(Short Message Service短信息),彩信等等,也就是手机增值服务[1]。而能够把手机增值服务应用到嵌入式系统中,使得手机能够与嵌入式系统进行短信息的交互,那么这样的一种增值服务技术的发展前景将会是非常有前途的。本文就是给出了这种增值服务系统的一个完整的解决方案。
开发中,嵌入式系统的程序部分使用的开发环境是Keil C,而其余所有的程序均使用Java来编写,且已经成功地移植到Linux平台上。此外,下面所提到的SP使用的数据库为SQL Server 2000。下面将对整个增值服务系统的设计与实现进行论述。
2. 增值服务系统的整体架构
各大移动运营商提供给自己的SP的增值服务体系架构和接口都是相似的[2],如中国移动的体系架构,如图1所示,整个基于嵌入式系统的增值服务系统是由嵌入式系统、增值服务系统网关和SP及其内嵌的接入模块组成的。SP负责向用户提供丰富多彩的增值服务,但如果由于资金不足等原因不能申请成为SP时,可以在现有的SP中嵌入一个接入模块,同样可以达到提供增值服务的目的,本文介绍的就是这种解决方案。
当MS(Mobile Subscriber手机用户)想要发送一条短信息到嵌入式系统时,短信息首先被发送到基站,基站再把它发到SMSC(Short Message Service Center短信中心),SMSC通过SMPP协议(Short Message Peer to Peer短消息点对点协议)再把短信息转发到ISMG(Internet Short Message Gateway互联网短信网关)[3]。
ISMG是中国移动与其SP进行通信的门户,ISMG与SP的通信的底层是TCP/IP协议,而应用层是CMPP(China Mobile Peer to Peer中国移动点对点协议)协议。
图1 基于嵌入式系统的增值服务系统的整体架构原理
然后,SP按照CMPP协议从ISMG接收到关于此短信息的所有必要信息(如MS的手机号码,MS点播的服务代码等等)后把该条短信息的相关数据传给SP内嵌的接入模块,然后接入模块通过TCP/IP发送到增值服务系统网关,由网关解析这些信息并重新编码,再发送到PSTN(Public Switched Telephone Network公共开关电话网络),最后由嵌入式系统从PSTN接收到该条短信息的所有信息,并显示在它的LCD上。至此完成了由MS到嵌入式系统的短信息通信,而由嵌入式系统到MS的短信息通信过程也是类似的[4]。
下面,将针对系统各部分的每个功能模块逐一地进行介绍,并详细地叙述它们如何实现的。
3. 嵌入式系统部分
3.1 嵌入式系统的特点和开发背景
许多嵌入式系统都有串口和LCD,这样就能够通过编程与外界通信并显示信息,但由于嵌入式系统的存储器容量比较小,在上面开发程序必须要注意节约存储器的使用。此次所用的嵌入式系统是由台湾研发的网络信息电话,使用的是8051系列的芯片,拥有两个串口,其中一个与内置的Modem相连,可以与外界通信,此外还有一个128*64的LCD可以用来显示接收到的短信息,一个键盘用来输入要发送的短信息内容。整个嵌入式系统部分的开发是建立在底层的串口,LCD以及键盘的API都已经由这家台湾公司提供了的基础上。
3.2 Modem的AT指令简介
AT指令为所有调制解调器制造商所使用的一个调制解调器命令语言。只要用连接线把串口和Modem连接起来,使得可以通过串口向Modem进行输入,就可以让Modem与Modem之间通过使用AT指令经PSTN进行通信的。这是由于Modem有两种工作模式:指令模式与数据传输模式。
3.3 Modem通讯模块
表1 Modem通讯模块的自定义帧
字段 |
所占字节 |
字段 |
所占字节 |
DLE |
1 |
发送时间 |
20 |
STX |
1 |
保留字段 |
20 |
类型 |
1 |
内 容 |
160 |
帧序号 |
2 |
DLE |
1 |
源号码 |
20 |
ETX |
1 |
目的号码 |
20 |
|
|
Modem通讯模块是嵌入式系统部分的主体,它负责与外界(其它的Modem)进行通讯。由于Modem之间的传输是连续的字节流,因此必须要定义一些建立在数据链路层上的帧,才能够把实际要传输的每个数据包从连续的字节流中区分出来。如表1所示,DLE STX和DLE ETX都是自定义的常量,数值是十六进制数的10 02和10 03,分别代表着一个帧的开始与结束。如果一个帧的内容中有这两个常量,那么可以在发送此帧时插入一个DLE,如10 02插入DLE后变为10 10 02,接收此帧时,遇到连续的10 10就检查是否紧跟着02,如果是就删除中间的10,这样就既可以接收到正确的数据,又避免了从字节流中不能正确地截取帧。类型字段有两种可能值:一种是DATA,即数据帧,代表此帧传输的是数据;一种是ACK,即确认帧,代表此帧是对已收到某一数据帧的确认。帧序号是标志该帧的唯一标志,发送过程中不断递增,达到最大值后可以循环使用。由于手机短信息的英文长度可以长达160个字节(中文为140个字节),所以内容字段规定为160个字节。对于数据帧,内容字段存放短信息的内容;对于确认帧,内容字段存放它所指明的已收到数据帧的帧序号。
当Modem通讯模块接收到从MS发来的短信息时,只是简单地发送确认帧。当Modem通讯模块发送短信息到MS时,它把一个数据帧发送到目的端Modem,然后等待对此数据帧的确认帧的返回,如果超过一定的时间还没有收到返回,Modem通讯模块将会重发此数据帧,重发超过一定的次数就放弃发送此数据帧。如果在等待确认帧的返回时,有新的数据帧需要发送,那么将会允许发送一定数量的数据帧,超过这个数量以后就不再发送,直到有对之前发送帧的确认帧返回。
4. 增值服务系统网关部分
4.1 功能简述
图2 增值服务系统网关
增值服务网关的主要作用是在PSTN和Internet(数据通过TCP/IP传送)之间进行数据的转发。因此定义了两种类:Frame与ShortMessage。在内部,Modem通讯模块与协议转换模块之间传送的对象是Frame,TCP/IP通讯模块与协议转换模块之间传送的对象是ShortMessage,Frame与ShortMessage之间通过协议转换模块来互相转换。所以网关的功能就是解析从PSTN收到的包含短信息内容的Frame后重新编码为ShortMessage再发送到TCP/IP,或者解析从TCP/IP收到的包含短信息内容的ShortMessage后重新编码为Frame再发送到PSTN。网关中所有模块的活动都通过调用日志模块提供的接口来进行日志的记录。由于协议转换模块的实现比较简单,而网关的Modem 通讯模块跟嵌入式系统的Modem通讯模块的设计思想是相似的,不同的只是网关的Modem 通讯模块调用的是Sun提供的Java的串口API,屏蔽了很多底层的实现细节,在开发中更加容易使用。因此下面只对TCP/IP通讯模块和日志模块进行说明。
4.2 TCP/IP通讯模块
本模块中数据包的确认/重发机制与Modem通讯模块的策略类似。为了提高工作效率,可以在该模块内建立两个队列缓冲区:发送队列和接收队列,用来存放暂时还没有被发送出去或刚刚接收到的ShortMessage类对象。
发送时有两种策略:长连接和短连接[5]。长连接即在与远程主机第一次建立连接后,就一直保持连接,这样有数据要发送时可以随时发送;短连接即有数据发送时才建立连接,发送完毕后马上断开连接,直到下次有数据来到再重新建立连接。长连接的不足之处在于当网络发生故障时,之前建立的连接会被破坏导致无法发送数据,还有就是长期占用网络资源。短连接的最大缺点是当要发送的数据量较多时,建立连接过于频繁,在建立连接上的开销太大,但是每次使用新的连接对比起长连接来说较为可靠。本文所提到增值服务系统中的所有TCP/IP通讯模块的发送均采用短连接的策略。
接收时的策略是生成一个主线程不断监听端口上的数据,如果有新的数据来到,则产生一个新的子线程来处理此次数据,处理完后该子线程自动终止,而主线程则继续监听。具体实现框架如下:
while(true)//主线程run方法体内
{
Socket sock = serverSocket.accept();//监听数据
Thread childThread = new Thread(sock);
childThread.start();//启动子线程处理此次数据
}
4.3 日志模块
日志对于任何一个系统来说都是非常重要的,通过日志文件,我们可以查看系统中每一个细小的活动,而且往往可以通过日志来达到调试查错的目的。通常需要输出到日志的信息有三种:1)正常活动的信息,比如通讯模块接收到一个数据包,协议的一次转换等等;2)发生错误的信息,比如由于网络故障,接收的数据包格式不正确而解析失败等等;3)调试的信息:系统处于开发阶段时,开发人员用来定位错误的信息,这种信息在开发完成后则不应再输出到日志中,但是仍然应该在程序中保留相关的语句,因为系统很有可能在未来被发现有问题,而不得不改进程序和再次调试。
可以建立一个类LogManager来实现日志模块的功能。该类需要提供三个静态方法的接口,它们分别对应着上述需要输出到日志的信息的三种情况,分别是:1)LogManager.log(String info)对应正常活动的输出;2)LogManager.error(String info)对应发生错误时的输出;3)LogManager.debug(String info)对应调试的输出。三种接口输出到日志文件时应该带有各自的标记和输出的时间,具体输出效果如下:
[ LOG ][2003-08-11 11:41:56]正常活动的输出
[ERROR][2003-08-11 11:41:56]错误信息的输出。
[DEBUG][2003-08-11 11:41:56]调试信息的输出。
此外可以使用XML文件来管理日志模块以及整个增值服务系统的配置,比如控制调试信息是否被输出只需在XML配置文件中增加一个数据项,并在LogManager.debug(String info)方法的开头读取此数据项的值并进行判断,如果不需要输出调试信息则直接退出该方法。
5. SP接入模块部分
5.1 功能简述
由于申请成为中国移动的SP需要一笔为数不少的资金,所以在资金不充裕的情况下,在现有的SP的增值服务系统上嵌入一个接入模块来提供增值服务是建立一个增值服务系统的理想的廉价的解决方案。
接入模块与宿主SP共同完成短信息收发的整个过程是这样的:1)当TCP/IP通讯模块接收到一个ShortMessage对象后,它就转发给数据库存取访问模块,数据库存取访问模块再把该对象转为一条记录并插入到SQL Server数据库中,然后由宿主SP读取该条记录,并与ISMG交互把短信息发给MS;2)当ISMG把一条来自MS的短信息发给宿主SP后,宿主SP就把该条短信息转为一条记录插入到数据库中,再由数据库存取访问模块读取出来,并转为一个ShortMessage对象,传给TCP/IP通讯模块发送到增值服务系统网关。
图3 SP接入模块部分
SP接入模块的存在使得我们可以不需要理会SP与ISMG之间的任何交互,使得复杂的CMPP协议对我们不可见。从而大大降低了开发的难度,并把该模块内的短信息的收发变为简单的对数据库的访问的过程[6]。
图3中TCP/IP通讯模块,日志模块与增值服务系统网关的同名模块的设计与实现类似,故不再重复说明。
5.2 数据库存取访问模块
此模块的功能就是使用JDBC来访问SQL Server 2000数据库,从而完成短信息的收发。JDBC有多种驱动,一般来说使用数据库厂家提供的专用驱动效率更高,这里使用的是通用的sun.jdbc.odbc.JdbcOdbcDriver[7]。主要的操作是对两个表进行访问:存放已接收的短信息的表ReceiveSMS和存放要发送的短信息的表SendSMS。这两个表包括了源号码,目的号码,信息内容,接收或发送的时间等等重要的字段,其中表ReceiveSMS还有一个字段IsRead表示该条记录是否已经被读取过,0表示没有被读取,1表示已被读取过。该模块的具体运作流程过下:1)接收短信息时读取表ReceiveSMS中IsRead字段为0的记录,然后把此次所有被读取的记录的IsRead字段置为1,表示该记录已被读过,并把读出的记录的各个字段取出,做为新构造的ShortMessage对象的属性值,最后把它传给TCP/IP通讯模块;2)发送短信息时首先从TCP/IP通讯模块接收到一个ShortMessage类对象,并用ShortMessage对象的属性值作为新构造的纪录的字段值,最后往SendSMS表中插入该条新纪录。
6. 总结
本文通过对各个功能模块设计中的难点与重点进行了论述,是一种实用而有前景的增值服务应用。
本文作者创新点:提出了一种基于嵌入式系统的增值服务技术的应用的解决方案,把手机增值服务应用到嵌入式系统中,使得手机能够与嵌入式系统进行短信息的交互,这样的一种增值服务技术的发展前景将会是非常有前途的。在开发中,嵌入式系统的程序部分使用的开发环境是Keil C,并且已经成功地移植到Linux平台上。