IM軟件在智能電話終端上的設(shè)計(jì)與實(shí)現(xiàn)
從底層開(kāi)始實(shí)現(xiàn)一個(gè)完整的MSN客戶端軟件需要一定的時(shí)間。為了縮短開(kāi)發(fā)周期、節(jié)省開(kāi)發(fā)成本,本文采用開(kāi)源項(xiàng)目的方式,即在第三方MSN客戶端軟件的基礎(chǔ)上進(jìn)行修改,使之滿足要求。這樣做的另外原因是可以從這些開(kāi)放源碼的軟件中進(jìn)一步剖析出MSN的協(xié)議格式,即使MSN協(xié)議有了新的版本,只要這個(gè)軟件仍然可用,它所使用的新的協(xié)議格式級(jí)仍對(duì)開(kāi)發(fā)調(diào)整有重要的參考價(jià)值,可以據(jù)此重新調(diào)整軟件而無(wú)須去通過(guò)逆向工程的方法對(duì)MSN協(xié)議進(jìn)行分析。
支持MSN協(xié)議的IM客戶端軟件很多,必須選擇適合于剪裁并且是基于Linux的開(kāi)放源碼系統(tǒng),Gaim和Kmess都是不錯(cuò)的選擇。其中Gaim是為L(zhǎng)inux操作系統(tǒng)而設(shè)計(jì)的一種即時(shí)消息傳遞軟件,它可以同時(shí)支持MSN、ICQ、AIM和Yohoo等多種客戶端通信,但是它的軟件結(jié)構(gòu)比較復(fù)雜。Kmess也是基于Linux的開(kāi)放源碼系統(tǒng),它只能支持MSN客戶端,從開(kāi)發(fā)者的角度而言,Kmess因其結(jié)構(gòu)相對(duì)簡(jiǎn)單則更易于分析和改進(jìn)。所以這里選擇了Kmess作為MSN客戶端軟件的開(kāi)發(fā)藍(lán)本。
2.3 IM開(kāi)放源碼的修改
盡管Kmess是基于Linux平臺(tái)的支持MSN客戶端的即時(shí)消息傳遞軟件,但并不是直接搬過(guò)來(lái)就能用,必須進(jìn)行大量的修改工作。首先Kmess是基于KDE環(huán)境而開(kāi)發(fā)的應(yīng)用程序,在源代碼中大量使用KDE庫(kù)函數(shù),而KDE庫(kù)本身就有數(shù)百兆,受到原型機(jī)存儲(chǔ)容量的限制,不可能在原型機(jī)上實(shí)現(xiàn)KDE環(huán)境;其次Kmess是一個(gè)功能完善的MSN客戶端,其中包括許多增強(qiáng)功能如文件傳送、多方聊天、語(yǔ)音聊天和視頻聊天等,由于在目前的智能電話終端上暫不考慮實(shí)現(xiàn)這些功能,因此對(duì)源碼的修改和剪裁是必不可少的。
針對(duì)上面的二個(gè)問(wèn)題,對(duì)Kmess軟件進(jìn)行了較大的調(diào)整,主要保留了與MSN協(xié)議處理的相關(guān)的內(nèi)容。具體調(diào)整如下:
(1)重新設(shè)計(jì)界面部分
由于Kmess中的用戶界面是基于KDE環(huán)境,而原型機(jī)上采用的是Qt-Embeded,因此界面部分基本不能用,本文用Qt designer重新設(shè)計(jì)了登錄窗口、主菜單、聯(lián)系人窗口、會(huì)話窗口等,在這些界面中再調(diào)用Kmess的函數(shù)。
(2)KDE庫(kù)函數(shù)的替換
將源代碼中的基于KDE的庫(kù)函數(shù)用Qt-Embeded提供的類函數(shù)來(lái)實(shí)現(xiàn)。由于Qt-Embeded對(duì)一些基本功能的實(shí)現(xiàn)都有很好的支持,所以找到它們的對(duì)應(yīng)實(shí)現(xiàn)方法并不困難,惟一的例外是SSL的實(shí)現(xiàn)。
(3)剪裁部分源代碼
分析Kmess的源碼結(jié)構(gòu),刪除不需要實(shí)現(xiàn)的功能部分,構(gòu)建自己需要的體系結(jié)構(gòu)。由于Kmess的模塊之間有著緊密聯(lián)系,因此并不是簡(jiǎn)單剔除實(shí)現(xiàn)這些增強(qiáng)功能的類函數(shù)就可以完成的。首先必須理清Kmess的層次結(jié)構(gòu)及模塊與模塊之間的相互關(guān)系,只有在對(duì)整體結(jié)構(gòu)有了清晰的了解之后才能夠著手剪裁工作。
2.4 IM網(wǎng)絡(luò)安全的實(shí)現(xiàn)
在登錄過(guò)程中,用戶要向NS服務(wù)器發(fā)送賬號(hào)和密碼來(lái)通過(guò)驗(yàn)證,只有合法的注冊(cè)用戶才能使用即時(shí)消息收發(fā)功能,因此對(duì)用戶賬號(hào)和密碼必須進(jìn)行加密。MSN客戶端采用SSL(Secure Socket Layer)技術(shù)來(lái)保證賬號(hào)信息的安全性。SSL即安全套接層,是介于應(yīng)用層和TCP層之間的一個(gè)薄層。使用SSL協(xié)議的雙方可以在一個(gè)不安全的公共信道上協(xié)商加密算法和加密密鑰,并使用協(xié)商好的算法和密鑰將應(yīng)用層的數(shù)據(jù)加密成密文,然后在網(wǎng)絡(luò)上傳輸。這樣即使第三方截獲了該密文,由于沒(méi)有解密算法和密鑰,也無(wú)法解密出明文數(shù)據(jù),從而確保網(wǎng)絡(luò)數(shù)據(jù)的安全性。
2.5 應(yīng)用程序的移植
由于在原型機(jī)上開(kāi)發(fā)和調(diào)試應(yīng)用程序有相當(dāng)大的困難,因此需要在PC上先進(jìn)行仿真開(kāi)發(fā),然后再下載到原型機(jī)上。
(1)PC機(jī)與原型機(jī)的通信
PC機(jī)通過(guò)串口與原型機(jī)交換數(shù)據(jù)。在Linux中,串口的設(shè)備文件一般為/dev/ttyS0和/dev/ttyS1,分別表示串口1和串口2。首先用open命令打開(kāi)串口,然后根據(jù)具體的應(yīng)用來(lái)配置串口,設(shè)置波特率、校驗(yàn)方法、數(shù)據(jù)位、停止位和流控制等參數(shù)。設(shè)置完成后,就可以通過(guò)MINICOM串口通信程序,完成PC與原型機(jī)之間應(yīng)用程序的下載和調(diào)試結(jié)果的上傳等操作。
(2)應(yīng)用程序的交叉編譯
整個(gè)開(kāi)發(fā)過(guò)程分為二個(gè)階段:第一階段,開(kāi)發(fā)者在PC環(huán)境下使用Qt-Embeded進(jìn)行應(yīng)用程序開(kāi)發(fā),通過(guò)gcc編譯器生成在PC上可以執(zhí)行的目標(biāo)代碼,然后使用QVFB模擬原型機(jī)的運(yùn)行效果,經(jīng)過(guò)不斷的調(diào)整直到滿足用戶的要求;第二階段,根據(jù)CPU體系結(jié)構(gòu)的不同,對(duì)PC上實(shí)現(xiàn)的應(yīng)用程序作相應(yīng)的調(diào)整后,再使用arm-Linux-gcc將程序重新交叉編譯為在原型機(jī)上可執(zhí)行的代碼,最后將該代碼下載到原型機(jī)的Flash中,從而完成原型機(jī)上的即時(shí)消息軟件的開(kāi)發(fā)。由于在PC機(jī)上已經(jīng)用QVFB模擬過(guò)軟件的運(yùn)行情況,因此下載到原型機(jī)上后能基本上確保軟件的正確性,從而大大提高了開(kāi)發(fā)效率。
(3)OpenSSL庫(kù)的交叉編譯
OpenSSL庫(kù)是作為目標(biāo)代碼被調(diào)用的,因此還需要進(jìn)行OpenSSL庫(kù)的移植工作。首先需在PC上對(duì)OpenSSL庫(kù)進(jìn)行交叉編譯,生成目標(biāo)平臺(tái)上使用的二進(jìn)制文件,然后將其載入目標(biāo)平臺(tái)。為了使OpenSSL庫(kù)能夠在ARM嵌入式平臺(tái)上運(yùn)行,首先要為OpenSSL的Makefile文件加入一個(gè)名為“opensslForARM.Makefile.patch”的補(bǔ)丁,再用arm-Linux-gcc編譯生成可執(zhí)行代碼。
(4)OpenSSL庫(kù)的注冊(cè)
交叉編譯OpenSSL成功后,使用MINICOM將其下載到原型機(jī)上,但此時(shí)仍然無(wú)法正常使用OpenSSL庫(kù)函數(shù)。這是因?yàn)樵贚inux中只有經(jīng)過(guò)注冊(cè)的庫(kù),才能成為共享動(dòng)態(tài)鏈接庫(kù)。Linux下的共享庫(kù)采用了類似于高速緩存的機(jī)制,將共享庫(kù)所在的目錄信息首先保存在/etc/ld.so.cache中。應(yīng)用程序需要連接時(shí)先在這個(gè)文件里查找,若找不到再去ld.so.conf的路徑里查找。動(dòng)態(tài)鏈接庫(kù)的管理命令ldconfig會(huì)在默認(rèn)目錄(/lib和/usr/lib)和動(dòng)態(tài)庫(kù)配置文件/etc/ld.so.conf內(nèi)所列的目錄下,搜索出可共享的動(dòng)態(tài)鏈接庫(kù),進(jìn)而創(chuàng)建出動(dòng)態(tài)裝入程序(ld.so)所需的連接和緩存文件,并將已排序的動(dòng)態(tài)鏈接庫(kù)名稱列表存放在默認(rèn)文件/etc/ld.so.cache中。用戶首先將ldconfig下載到原型機(jī)上,然后在ld.so.conf文件中指定OpenSSL的路徑,運(yùn)行l(wèi)dconfig命令即可自動(dòng)完成整個(gè)注冊(cè)過(guò)程。
3 結(jié)束語(yǔ)
在智能電話終端上構(gòu)造MSN客戶端軟件,首先要考慮目標(biāo)平臺(tái)的特點(diǎn)及資源的有限性,選擇實(shí)現(xiàn)其中最基本和最常用的功能;然后借助于已有的開(kāi)放源碼成果,選擇一個(gè)合適的開(kāi)源項(xiàng)目,并對(duì)其界面部分和相關(guān)庫(kù)函數(shù)進(jìn)行調(diào)整和調(diào)試,使之滿足目標(biāo)平臺(tái)的運(yùn)行要求;最后通過(guò)交叉編譯的方法生成目標(biāo)平臺(tái)上的可執(zhí)行代碼并下載到智能電話終端上。充分利用現(xiàn)有的開(kāi)源成果不僅可以大大簡(jiǎn)化對(duì)MSN專用協(xié)議的分析和實(shí)現(xiàn)過(guò)程,而且也進(jìn)一步降低了軟件的開(kāi)發(fā)成本,縮短了軟件的開(kāi)發(fā)周期,使智能電話終端具有更好的性價(jià)比。本文引用地址:http://butianyuan.cn/article/166799.htm
評(píng)論