IM软件在智能电话终端上的设计与实现
扫描二维码
随时随地手机看文章
IM(Instant Messaging)软件即即时消息传递软件,它是目前网络上比较流行的杀手级应用程序(Killer Application),如腾讯的QQ、Microsoft的MSN、AOL的AIM和ICQ等。无论在什么地方,使用何种设备(如PC、手机、PDA和Web TV等),只要接入Internet,就能够同其他用户进行实时的消息和文件传递,甚至进行语音和视频交流。通过拨号接入Internet,就能在智能电话终端的原型机上实现基本的网络功能,如浏览器、电子邮件等。如果能在智能电话终端上实现IM的客户端软件,用户通过电话就可以进行实时交谈,进而进一步完善了其网络功能,从而增强了该产品在市场上的竞争力。
1 IM软件的设计方案
1.1 硬件平台
智能电话终端的原型机运行在基于ARM920T内核处理器S3C2410的嵌入式开发板上,该开发板由于性能优异、性价比高,因此适合于开发各类高端的手持、小型终端以及各种网络应用产品。它的标准工作频率为203MHz,核心板上的FlashROM和SDRAM均为64MB,并支持1024*768的液晶显示器,附带USB键盘和鼠标,可运行嵌入式Linux操作系统。为了降低整个系统的成本,设计过程中将该开发板改造成具有32MB的FlashROM和32MB的SDRAM的产品,并为其配置了支持16阶灰度的320*240液晶显示器。
1.2 IM软件的功能设计
近年来较为流行的即时消息传递软件很多,它们所提供的功能大同小异。这些客户端软件的根本区别在于客户机和服务器之间的通信过程分别基于不同的即时消息传递协议。通常,每一种即时消息传递软件都具有账号管理、联系人管理、即时消息收发等基本功能,在此基础上又有各自不同的特色功能,如语音聊天、视频聊天和表情管理等。
在众多的即时消息传递软件中,MSN是最受欢迎的软件之一,其通用性和齐全的功能特性得到了用户的广泛肯定。在许多平台上都有由第三方开发的MSN客户端软件,人们对其协议内容早已作了深入的研究和详细的分析,这对开发人员具有极大的参考价值,能够使开发周期大大缩短。本文介绍实现MSN客户端的一些基本功能的方法,包括用户登录、联系人管理和即时消息收发和显示等。
1.3 MSN协议及其模型
MSN协议是采用C/S模型的应用层协议,其命令采用字符形式。客户端应用程序必须以协议规定的顺序在规定的时间内向服务器发送请求,接收应答信息,通过这种机制实现服务器与客户端的通信。由于客户端软件并非始终与单一服务器进行交互,MSN协议要求其客户端在不同的阶段与不同的服务器建立连接,传输相应的账号或数据信息,因此首先必须了解MSN服务器的类型和作用。
MSN服务器分为通知服务器(Notification Server,NS)和接线服务器(SwitchBoard Server,SBS)两种。前者负责用户的登录及身份验证工作,包括联系人列表的增加、删除、修改和状态等信息都通过NS传输;后者则用于提供即时通信服务,即用户聊天消息的收发和文件的传输等都是由SBS实现的。MSN的通信模型如图1所示,客户端在登录时首先与NS建立连接,将用户账号和密码信息加密后发送给NS,再由NS进行身份验证。若验证通过,则NS把用户登录到SBS的Cookie令牌以及该用户的联系人列表和相应的状态信息发送到客户端,由客户端软件进行显示。当用户开始同联系人进行聊天会话时,客户端同SBS建立连接,将从NS得到的Cookie令牌交给SBS,SBS验证Cookie令牌的有效性,验证通过后,客户端就可以发送和接收即时消息及文件。最后在用户退出会话后,关闭同SBS的连接,此时只存在与NS的连接。图中的虚线表示NS和SBS的通信过程。由于对客户端来说这个过程是透明的,因此可以认为它是一个黑盒子而不必关注。
1.4 IM软件的系统结构
本系统主要由显示界面、登录模块、联系人管理和即时消息收发四个部分组成。
(1)显示界面
界面设计可以分为登录界面及主界面两个部分。登录界面提供用户账号和密码的输入。主界面由一个菜单栏和三个窗口构成。在用户状态菜单中,用户可以选择联机、离开、忙碌等六种状态;联系人菜单实现了对联系人的增加、删除、修改等工作。三个窗口分别为联系人列表窗口、消息发送窗口和会话窗口。联系人列表窗口列出所有联系人的昵称及其状态信息;消息发送窗口用于输入需要发送的内容;会话窗口中按顺序依次显示用户所发送的消息和对方的应答消息。
(2)登录模块
与NS服务器建立连接,传输加密的用户账号和密码信息,接收NS返回的应答信息,并从应答信息中抽取出SBS服务器的地址和用于登录到该服务器上的Cookie令牌。
(3)联系人管理
提供对联系人的增加、删除和修改等功能。在MSN中为了便于管理,联系人可以分成不同的队列,如好友、家庭成员和商务伙伴等。在新增加联系人时,应提示用户选择要加入的队列,而对于曾经添加过后又删除的联系人则直接将其恢复到原先所在的队列。联系人的删除又分为阻止联系人和彻底删除两种情况。阻止联系人就是将其放入阻止队列,使该联系人无法看到用户的状态并且不能给用户发送即时消息;而彻底删除联系人,则会删除与该联系人有关的所有信息。
(4)即时消息的收发模块
负责发送和接收即时消息的工作。当用户想同一个联系人发起会话时,首先同SBS服务器创建连接,将Cookie令牌交给它进行验证。验证通过后就可以调用Socket接口向SBS服务器发送信息,而从服务器收到的消息则在会话窗口中显示。
2 IM软件的实现步骤及关键技术
2.1 开发平台的选择
Linux操作系统因其开放源码、容易定制和扩展、多硬件平台支持和内置网络功能等优良特性,早已成为嵌入式应用开发的首选平台,因此本文使用定制的嵌入式Linux系统[1]。
另外本文选择了Qt-Embeded开发工具,它是由著名的Qt库开发商Trolltech针对嵌入式Linux系统推出的构建GUI和应用的C++开发包。Qt-Embeded的移植性较好,支持ARM、PowerPC、MIPS和Dragonball等多种CPU体系结构。同时又有QMake、QVFB、Qt Designer等众多强大开发支撑工具的支持,大大提高了Qt-Embeded系统的开发效率。Qt设计器(Qt Designer)是用来设计和实现用户界面并能够在多平台下运行的一种开发支撑工具,用以简化用户界面的设计。QVFB即虚拟帧缓冲技术,是用于在PC机上运行和测试嵌入式应用程序的工具。
[!--empirenews.page--]2.2 IM开放源码的选择
从底层开始实现一个完整的MSN客户端软件需要一定的时间。为了缩短开发周期、节省开发成本,本文采用开源项目的方式,即在第三方MSN客户端软件的基础上进行修改,使之满足要求。这样做的另外原因是可以从这些开放源码的软件中进一步剖析出MSN的协议格式,即使MSN协议有了新的版本,只要这个软件仍然可用,它所使用的新的协议格式级仍对开发调整有重要的参考价值,可以据此重新调整软件而无须去通过逆向工程的方法对MSN协议进行分析。
支持MSN协议的IM客户端软件很多,必须选择适合于剪裁并且是基于Linux的开放源码系统,Gaim和Kmess都是不错的选择。其中Gaim是为Linux操作系统而设计的一种即时消息传递软件,它可以同时支持MSN、ICQ、AIM和Yohoo等多种客户端通信,但是它的软件结构比较复杂。Kmess也是基于Linux的开放源码系统,它只能支持MSN客户端,从开发者的角度而言,Kmess因其结构相对简单则更易于分析和改进。所以这里选择了Kmess作为MSN客户端软件的开发蓝本。
2.3 IM开放源码的修改
尽管Kmess是基于Linux平台的支持MSN客户端的即时消息传递软件,但并不是直接搬过来就能用,必须进行大量的修改工作。首先Kmess是基于KDE环境而开发的应用程序,在源代码中大量使用KDE库函数,而KDE库本身就有数百兆,受到原型机存储容量的限制,不可能在原型机上实现KDE环境;其次Kmess是一个功能完善的MSN客户端,其中包括许多增强功能如文件传送、多方聊天、语音聊天和视频聊天等,由于在目前的智能电话终端上暂不考虑实现这些功能,因此对源码的修改和剪裁是必不可少的。
针对上面的二个问题,对Kmess软件进行了较大的调整,主要保留了与MSN协议处理的相关的内容。具体调整如下:
(1)重新设计界面部分
由于Kmess中的用户界面是基于KDE环境,而原型机上采用的是Qt-Embeded,因此界面部分基本不能用,本文用Qt designer重新设计了登录窗口、主菜单、联系人窗口、会话窗口等,在这些界面中再调用Kmess的函数。
(2)KDE库函数的替换
将源代码中的基于KDE的库函数用Qt-Embeded提供的类函数来实现。由于Qt-Embeded对一些基本功能的实现都有很好的支持,所以找到它们的对应实现方法并不困难,惟一的例外是SSL的实现。
(3)剪裁部分源代码
分析Kmess的源码结构,删除不需要实现的功能部分,构建自己需要的体系结构。由于Kmess的模块之间有着紧密联系,因此并不是简单剔除实现这些增强功能的类函数就可以完成的。首先必须理清Kmess的层次结构及模块与模块之间的相互关系,只有在对整体结构有了清晰的了解之后才能够着手剪裁工作。
2.4 IM网络安全的实现
在登录过程中,用户要向NS服务器发送账号和密码来通过验证,只有合法的注册用户才能使用即时消息收发功能,因此对用户账号和密码必须进行加密。MSN客户端采用SSL(Secure Socket Layer)技术来保证账号信息的安全性。SSL即安全套接层,是介于应用层和TCP层之间的一个薄层。使用SSL协议的双方可以在一个不安全的公共信道上协商加密算法和加密密钥,并使用协商好的算法和密钥将应用层的数据加密成密文,然后在网络上传输。这样即使第三方截获了该密文,由于没有解密算法和密钥,也无法解密出明文数据,从而确保网络数据的安全性。
2.5 应用程序的移植
由于在原型机上开发和调试应用程序有相当大的困难,因此需要在PC上先进行仿真开发,然后再下载到原型机上。
(1)PC机与原型机的通信
PC机通过串口与原型机交换数据。在Linux中,串口的设备文件一般为/dev/ttyS0和/dev/ttyS1,分别表示串口1和串口2。首先用open命令打开串口,然后根据具体的应用来配置串口,设置波特率、校验方法、数据位、停止位和流控制等参数。设置完成后,就可以通过MINICOM串口通信程序,完成PC与原型机之间应用程序的下载和调试结果的上传等操作。
(2)应用程序的交叉编译
整个开发过程分为二个阶段:第一阶段,开发者在PC环境下使用Qt-Embeded进行应用程序开发,通过gcc编译器生成在PC上可以执行的目标代码,然后使用QVFB模拟原型机的运行效果,经过不断的调整直到满足用户的要求;第二阶段,根据CPU体系结构的不同,对PC上实现的应用程序作相应的调整后,再使用arm-Linux-gcc将程序重新交叉编译为在原型机上可执行的代码,最后将该代码下载到原型机的Flash中,从而完成原型机上的即时消息软件的开发。由于在PC机上已经用QVFB模拟过软件的运行情况,因此下载到原型机上后能基本上确保软件的正确性,从而大大提高了开发效率。
(3)OpenSSL库的交叉编译
OpenSSL库是作为目标代码被调用的,因此还需要进行OpenSSL库的移植工作。首先需在PC上对OpenSSL库进行交叉编译,生成目标平台上使用的二进制文件,然后将其载入目标平台。为了使OpenSSL库能够在ARM嵌入式平台上运行,首先要为OpenSSL的Makefile文件加入一个名为“opensslForARM.Makefile.patch”的补丁,再用arm-Linux-gcc编译生成可执行代码。
(4)OpenSSL库的注册
交叉编译OpenSSL成功后,使用MINICOM将其下载到原型机上,但此时仍然无法正常使用OpenSSL库函数。这是因为在Linux中只有经过注册的库,才能成为共享动态链接库。Linux下的共享库采用了类似于高速缓存的机制,将共享库所在的目录信息首先保存在/etc/ld.so.cache中。应用程序需要连接时先在这个文件里查找,若找不到再去ld.so.conf的路径里查找。动态链接库的管理命令ldconfig会在默认目录(/lib和/usr/lib)和动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库,进而创建出动态装入程序(ld.so)所需的连接和缓存文件,并将已排序的动态链接库名称列表存放在默认文件/etc/ld.so.cache中。用户首先将ldconfig下载到原型机上,然后在ld.so.conf文件中指定OpenSSL的路径,运行ldconfig命令即可自动完成整个注册过程。
3 结束语
在智能电话终端上构造MSN客户端软件,首先要考虑目标平台的特点及资源的有限性,选择实现其中最基本和最常用的功能;然后借助于已有的开放源码成果,选择一个合适的开源项目,并对其界面部分和相关库函数进行调整和调试,使之满足目标平台的运行要求;最后通过交叉编译的方法生成目标平台上的可执行代码并下载到智能电话终端上。充分利用现有的开源成果不仅可以大大简化对MSN专用协议的分析和实现过程,而且也进一步降低了软件的开发成本,缩短了软件的开发周期,使智能电话终端具有更好的性价比。