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专用协议的分析和实现过程,而且也进一步降低了软件的开发成本,缩短了软件的开发周期,使智能电话终端具有更好的性价比。