摘 要: 提出了在智能電話終端上實(shí)現(xiàn)IM軟件的方案,對(duì)實(shí)現(xiàn)步驟及所涉及的關(guān)鍵技術(shù)進(jìn)行了詳細(xì)介紹,。
關(guān)鍵詞: 即時(shí)消息傳遞 智能電話終端 嵌入式系統(tǒng)
電話在經(jīng)過(guò)數(shù)百年的發(fā)展之后,已從最早的簡(jiǎn)單接聽(tīng)和撥打設(shè)備,,成為集錄音留言,、自動(dòng)應(yīng)答、個(gè)人信息管理和撥號(hào)上網(wǎng)等諸多功能于一身的智能電話終端,。智能電話終端使人們能夠更加高效,、及時(shí)地處理周邊的各種信息,滿足不斷發(fā)展的信息化要求,。
IM(Instant Messaging)軟件即即時(shí)消息傳遞軟件,,它是目前網(wǎng)絡(luò)上比較流行的殺手級(jí)應(yīng)用程序(Killer Application),如騰訊的QQ,、Microsoft的MSN,、AOL的AIM和ICQ等。無(wú)論在什么地方,,使用何種設(shè)備(如PC,、手機(jī)、PDA和Web TV等),,只要接入Internet,,就能夠同其他用戶進(jìn)行實(shí)時(shí)的消息和文件傳遞,甚至進(jìn)行語(yǔ)音和視頻交流,。通過(guò)撥號(hào)接入Internet,,就能在智能電話終端的原型機(jī)上實(shí)現(xiàn)基本的網(wǎng)絡(luò)功能,如瀏覽器,、電子郵件等,。如果能在智能電話終端上實(shí)現(xiàn)IM的客戶端軟件,用戶通過(guò)電話就可以進(jìn)行實(shí)時(shí)交談,,進(jìn)而進(jìn)一步完善了其網(wǎng)絡(luò)功能,,從而增強(qiáng)了該產(chǎn)品在市場(chǎng)上的競(jìng)爭(zhēng)力。
1 IM軟件的設(shè)計(jì)方案
1.1 硬件平臺(tái)
智能電話終端的原型機(jī)運(yùn)行在基于ARM920T內(nèi)核處理器S3C2410的嵌入式開(kāi)發(fā)板上,,該開(kāi)發(fā)板由于性能優(yōu)異,、性價(jià)比高,因此適合于開(kāi)發(fā)各類(lèi)高端的手持,、小型終端以及各種網(wǎng)絡(luò)應(yīng)用產(chǎn)品,。它的標(biāo)準(zhǔn)工作頻率為203MHz,核心板上的FlashROM和SDRAM均為64MB,,并支持1024*768的液晶顯示器,,附帶USB鍵盤(pán)和鼠標(biāo),,可運(yùn)行嵌入式Linux操作系統(tǒng)。為了降低整個(gè)系統(tǒng)的成本,,設(shè)計(jì)過(guò)程中將該開(kāi)發(fā)板改造成具有32MB的FlashROM和32MB的SDRAM的產(chǎn)品,,并為其配置了支持16階灰度的320*240液晶顯示器。
1.2 IM軟件的功能設(shè)計(jì)
近年來(lái)較為流行的即時(shí)消息傳遞軟件很多,,它們所提供的功能大同小異,。這些客戶端軟件的根本區(qū)別在于客戶機(jī)和服務(wù)器之間的通信過(guò)程分別基于不同的即時(shí)消息傳遞協(xié)議。通常,,每一種即時(shí)消息傳遞軟件都具有賬號(hào)管理,、聯(lián)系人管理、即時(shí)消息收發(fā)等基本功能,,在此基礎(chǔ)上又有各自不同的特色功能,,如語(yǔ)音聊天、視頻聊天和表情管理等,。
在眾多的即時(shí)消息傳遞軟件中,MSN是最受歡迎的軟件之一,,其通用性和齊全的功能特性得到了用戶的廣泛肯定,。在許多平臺(tái)上都有由第三方開(kāi)發(fā)的MSN客戶端軟件,人們對(duì)其協(xié)議內(nèi)容早已作了深入的研究和詳細(xì)的分析,,這對(duì)開(kāi)發(fā)人員具有極大的參考價(jià)值,,能夠使開(kāi)發(fā)周期大大縮短。本文介紹實(shí)現(xiàn)MSN客戶端的一些基本功能的方法,,包括用戶登錄,、聯(lián)系人管理和即時(shí)消息收發(fā)和顯示等。
1.3 MSN協(xié)議及其模型
MSN協(xié)議是采用C/S模型的應(yīng)用層協(xié)議,,其命令采用字符形式,。客戶端應(yīng)用程序必須以協(xié)議規(guī)定的順序在規(guī)定的時(shí)間內(nèi)向服務(wù)器發(fā)送請(qǐng)求,,接收應(yīng)答信息,,通過(guò)這種機(jī)制實(shí)現(xiàn)服務(wù)器與客戶端的通信。由于客戶端軟件并非始終與單一服務(wù)器進(jìn)行交互,,MSN協(xié)議要求其客戶端在不同的階段與不同的服務(wù)器建立連接,,傳輸相應(yīng)的賬號(hào)或數(shù)據(jù)信息,因此首先必須了解MSN服務(wù)器的類(lèi)型和作用,。
MSN服務(wù)器分為通知服務(wù)器(Notification Server,,NS)和接線服務(wù)器(SwitchBoard Server,SBS)兩種,。前者負(fù)責(zé)用戶的登錄及身份驗(yàn)證工作,,包括聯(lián)系人列表的增加,、刪除、修改和狀態(tài)等信息都通過(guò)NS傳輸,;后者則用于提供即時(shí)通信服務(wù),,即用戶聊天消息的收發(fā)和文件的傳輸?shù)榷际怯蒘BS實(shí)現(xiàn)的。MSN的通信模型如圖1所示,,客戶端在登錄時(shí)首先與NS建立連接,,將用戶賬號(hào)和密碼信息加密后發(fā)送給NS,再由NS進(jìn)行身份驗(yàn)證,。若驗(yàn)證通過(guò),,則NS把用戶登錄到SBS的Cookie令牌以及該用戶的聯(lián)系人列表和相應(yīng)的狀態(tài)信息發(fā)送到客戶端,由客戶端軟件進(jìn)行顯示,。當(dāng)用戶開(kāi)始同聯(lián)系人進(jìn)行聊天會(huì)話時(shí),,客戶端同SBS建立連接,將從NS得到的Cookie令牌交給SBS,,SBS驗(yàn)證Cookie令牌的有效性,,驗(yàn)證通過(guò)后,客戶端就可以發(fā)送和接收即時(shí)消息及文件,。最后在用戶退出會(huì)話后,,關(guān)閉同SBS的連接,此時(shí)只存在與NS的連接,。圖中的虛線表示NS和SBS的通信過(guò)程,。由于對(duì)客戶端來(lái)說(shuō)這個(gè)過(guò)程是透明的,因此可以認(rèn)為它是一個(gè)黑盒子而不必關(guān)注,。
1.4 IM軟件的系統(tǒng)結(jié)構(gòu)
本系統(tǒng)主要由顯示界面,、登錄模塊、聯(lián)系人管理和即時(shí)消息收發(fā)四個(gè)部分組成,。
(1)顯示界面
界面設(shè)計(jì)可以分為登錄界面及主界面兩個(gè)部分,。登錄界面提供用戶賬號(hào)和密碼的輸入。主界面由一個(gè)菜單欄和三個(gè)窗口構(gòu)成,。在用戶狀態(tài)菜單中,,用戶可以選擇聯(lián)機(jī)、離開(kāi),、忙碌等六種狀態(tài),;聯(lián)系人菜單實(shí)現(xiàn)了對(duì)聯(lián)系人的增加、刪除,、修改等工作,。三個(gè)窗口分別為聯(lián)系人列表窗口、消息發(fā)送窗口和會(huì)話窗口。聯(lián)系人列表窗口列出所有聯(lián)系人的昵稱及其狀態(tài)信息,;消息發(fā)送窗口用于輸入需要發(fā)送的內(nèi)容,;會(huì)話窗口中按順序依次顯示用戶所發(fā)送的消息和對(duì)方的應(yīng)答消息。
(2)登錄模塊
與NS服務(wù)器建立連接,,傳輸加密的用戶賬號(hào)和密碼信息,,接收NS返回的應(yīng)答信息,并從應(yīng)答信息中抽取出SBS服務(wù)器的地址和用于登錄到該服務(wù)器上的Cookie令牌,。
(3)聯(lián)系人管理
提供對(duì)聯(lián)系人的增加,、刪除和修改等功能。在MSN中為了便于管理,,聯(lián)系人可以分成不同的隊(duì)列,,如好友、家庭成員和商務(wù)伙伴等,。在新增加聯(lián)系人時(shí),,應(yīng)提示用戶選擇要加入的隊(duì)列,而對(duì)于曾經(jīng)添加過(guò)后又刪除的聯(lián)系人則直接將其恢復(fù)到原先所在的隊(duì)列,。聯(lián)系人的刪除又分為阻止聯(lián)系人和徹底刪除兩種情況,。阻止聯(lián)系人就是將其放入阻止隊(duì)列,使該聯(lián)系人無(wú)法看到用戶的狀態(tài)并且不能給用戶發(fā)送即時(shí)消息,;而徹底刪除聯(lián)系人,,則會(huì)刪除與該聯(lián)系人有關(guān)的所有信息。
(4)即時(shí)消息的收發(fā)模塊
負(fù)責(zé)發(fā)送和接收即時(shí)消息的工作,。當(dāng)用戶想同一個(gè)聯(lián)系人發(fā)起會(huì)話時(shí),首先同SBS服務(wù)器創(chuàng)建連接,,將Cookie令牌交給它進(jìn)行驗(yàn)證,。驗(yàn)證通過(guò)后就可以調(diào)用Socket接口向SBS服務(wù)器發(fā)送信息,而從服務(wù)器收到的消息則在會(huì)話窗口中顯示,。
2 IM軟件的實(shí)現(xiàn)步驟及關(guān)鍵技術(shù)
2.1 開(kāi)發(fā)平臺(tái)的選擇
Linux操作系統(tǒng)因其開(kāi)放源碼,、容易定制和擴(kuò)展、多硬件平臺(tái)支持和內(nèi)置網(wǎng)絡(luò)功能等優(yōu)良特性,,早已成為嵌入式應(yīng)用開(kāi)發(fā)的首選平臺(tái),,因此本文使用定制的嵌入式Linux系統(tǒng)[1]。
另外本文選擇了Qt-Embeded開(kāi)發(fā)工具,,它是由著名的Qt庫(kù)開(kāi)發(fā)商Trolltech針對(duì)嵌入式Linux系統(tǒng)推出的構(gòu)建GUI和應(yīng)用的C++開(kāi)發(fā)包,。Qt-Embeded的移植性較好,支持ARM,、PowerPC,、MIPS和Dragonball等多種CPU體系結(jié)構(gòu)。同時(shí)又有QMake,、QVFB,、Qt Designer等眾多強(qiáng)大開(kāi)發(fā)支撐工具的支持,大大提高了Qt-Embeded系統(tǒng)的開(kāi)發(fā)效率,。Qt設(shè)計(jì)器(Qt Designer)是用來(lái)設(shè)計(jì)和實(shí)現(xiàn)用戶界面并能夠在多平臺(tái)下運(yùn)行的一種開(kāi)發(fā)支撐工具,用以簡(jiǎn)化用戶界面的設(shè)計(jì),。QVFB即虛擬幀緩沖技術(shù),,是用于在PC機(jī)上運(yùn)行和測(cè)試嵌入式應(yīng)用程序的工具。
2.2 IM開(kāi)放源碼的選擇
從底層開(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提供的類(lèi)函數(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)功能的類(lèi)函數(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ù)采用了類(lèi)似于高速緩存的機(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專(zhuān)用協(xié)議的分析和實(shí)現(xiàn)過(guò)程,,而且也進(jìn)一步降低了軟件的開(kāi)發(fā)成本,縮短了軟件的開(kāi)發(fā)周期,,使智能電話終端具有更好的性價(jià)比,。
參考文獻(xiàn)
1 郭勝超,呂強(qiáng).一個(gè)嵌入式Linux應(yīng)用系統(tǒng)在Lubbock開(kāi)發(fā)板上的實(shí)現(xiàn).計(jì)算機(jī)應(yīng)用,,2003,;23(12)