謝國(guó)坤, 霍愛(ài)清, 湯 楠
(西安石油大學(xué)陜西省鉆機(jī)控制技術(shù)重點(diǎn)實(shí)驗(yàn)室,陜西西安710065)
Vcard[1]也稱為電子名片,是一種交換個(gè)人信息(如姓名、地址、電話號(hào)碼和電子郵件地址)的簡(jiǎn)單方法。Vcard規(guī)范可作為各種應(yīng)用或系統(tǒng)之間的交換格式,且這種格式與傳遞的方式無(wú)關(guān)。符合Vcard規(guī)范的文件可以在文件系統(tǒng)、點(diǎn)對(duì)點(diǎn)交換的公共電話網(wǎng)絡(luò)、以有線網(wǎng)絡(luò)或無(wú)線傳遞等方式進(jìn)行交換。由于Vcard文件具有如此出眾的優(yōu)點(diǎn),現(xiàn)在越來(lái)越多的應(yīng)用軟件都選擇支持 Vcard功能來(lái)實(shí)現(xiàn)聯(lián)系人或日程表信息的本地存儲(chǔ)。如何將 Vcard文件的數(shù)據(jù)解析出來(lái)存放到不支持Vcard數(shù)據(jù)的單板中就顯得十分重要,是一個(gè)有待解決的問(wèn)題。
某軟件的用戶界面是采用Vcard3.0規(guī)范來(lái)保存聯(lián)系記錄的,而絕大多數(shù)型號(hào)的單板又不支持Vcard格式。為了解決這一問(wèn)題,在分析了直傳單板方式、AT命令寫單板方式基礎(chǔ)上,提出并設(shè)計(jì)了SDK層直接解析轉(zhuǎn)換方式,即在SDK層對(duì)Vcard字符流進(jìn)行解析,并轉(zhuǎn)換成Vcard對(duì)象模型,動(dòng)態(tài)拆分成AT命令并分段下發(fā)給單板,實(shí)現(xiàn)了Vcard字符流的解析存儲(chǔ)。該方案既滿足SDK層作為工具集的設(shè)計(jì)原則,又可以不依賴于單板型號(hào),給第三方的UI用戶界面提供了更強(qiáng)的功能集合。該方案的設(shè)計(jì)原則是首次使單板在不改變其硬件結(jié)構(gòu)的基礎(chǔ)上,具有了存儲(chǔ)Vcard數(shù)據(jù)的能力,通過(guò)SDK層的適配作用,使單板作為底層存儲(chǔ)介質(zhì),可以支持更多樣化的用戶界面,具有非常廣泛的應(yīng)用前景和市場(chǎng)價(jià)值。
對(duì)于每一條聯(lián)系人記錄來(lái)說(shuō),用戶界面通過(guò)接口參數(shù)傳下來(lái)的是標(biāo)準(zhǔn)的Vcard3.0字符流?;谶@個(gè)原因,可以采用在SDK層對(duì)數(shù)據(jù)不做任何解析,直接透?jìng)鞯絾伟迳希瑔伟鍖⒃摋l記錄形成一個(gè)文件進(jìn)行存儲(chǔ)[2-3]。這種做法的優(yōu)點(diǎn)就是SDK層和單板對(duì)Vcard均不做出任何解析,不用增加額外的代碼,以文件的形式保存到單板的Flash中,每個(gè)文件都有一個(gè)唯一的索引進(jìn)行標(biāo)識(shí)。在用戶讀取的時(shí)候可以直接將文件中的Vcard字符流上傳給界面,由界面顯示成聯(lián)系人記錄格式。該方法的缺點(diǎn)也是顯而易見(jiàn)的,以文件的形式直接進(jìn)行存儲(chǔ)犧牲了高通平臺(tái)的電話本的讀寫響應(yīng)速度 (通常對(duì)單板的讀寫性能都有著較高的要求,一般單條記錄的讀寫時(shí)間不能超過(guò)240ms)。
為了解決記錄讀寫效率的問(wèn)題,決定記錄內(nèi)容的存儲(chǔ)還是要交給高通平臺(tái)提供的電話本實(shí)現(xiàn)機(jī)制,可以利用電話本的備注字段進(jìn)行Vcard字符流的存儲(chǔ)[4-5]。這樣對(duì)Vcard字符流也不需要做任何解析,通過(guò)AT命令寫到單板上,并利用單板提供的索引標(biāo)識(shí)每一條記錄,SDK和單板均不需要額外的算法開(kāi)銷,易于實(shí)現(xiàn),并且存儲(chǔ)效率很高。但是有一個(gè)致命的缺陷,那就是AT命令固有的長(zhǎng)度限制。AT命令通過(guò)通信端口傳輸數(shù)據(jù)包,包的大小是有嚴(yán)格限制的,對(duì)于AT的發(fā)送除了AT兩個(gè)字符外最多可以接受260個(gè)字符,終端設(shè)備主動(dòng)上報(bào)的消息或者用戶請(qǐng)求相關(guān)(userrequestcorrelation,URC)最大長(zhǎng)度都限定在668個(gè)字符范圍之內(nèi),而用戶界面?zhèn)飨聛?lái)的字符長(zhǎng)度完全是隨機(jī)的、未知的。
考慮以上兩種方案的不足,提出采用在SDK層對(duì)Vcard字符流進(jìn)行解析,并轉(zhuǎn)換成Vcard對(duì)象模型的方式。根據(jù)單板所能支持的字段數(shù)量和順序動(dòng)態(tài)合成AT命令,同時(shí)為了避免AT超長(zhǎng),對(duì)電話本的讀寫命令進(jìn)行了擴(kuò)展,每次只下發(fā)4個(gè)字段的內(nèi)容,并標(biāo)識(shí)這條記錄一共被拆分成多少條,當(dāng)前AT內(nèi)容屬于第幾條,類似于長(zhǎng)短信的拆分方法。這種方法的優(yōu)點(diǎn)是單板方面改動(dòng)較少,完全保留了高通平臺(tái)的電話本存取機(jī)制,記錄讀寫的效率也是非常高。當(dāng)然也存在一定的缺點(diǎn),那就是 SDK層要增加解析 Vcard文件的算法,并且要建立Vcard字段和單板字段的映射表,動(dòng)態(tài)組成AT命令下發(fā)單板,而且要對(duì)現(xiàn)有的讀寫命令進(jìn)行擴(kuò)展。但是這些算法的開(kāi)銷還是很值得的,這部分可以封裝成一個(gè)動(dòng)態(tài)庫(kù),用于擴(kuò)展SDK的功能。只要單板支持?jǐn)U展的AT命令,那么就可以給任何使用Vcard保存聯(lián)系人的第三方UI軟件提供無(wú)縫集成。下面以增加一條聯(lián)系人記錄為例,給出從界面到單板的處理流程[6-9],如圖1所示。而讀取過(guò)程就是該流程的逆操作,本文將不再贅述。
為了避免AT超長(zhǎng),對(duì)電話本的讀寫命令進(jìn)行了擴(kuò)展,每次只下發(fā)4個(gè)字段的內(nèi)容,并標(biāo)識(shí)這條記錄一共被拆分成多少條,當(dāng)前AT內(nèi)容屬于第幾條[10-13]。
圖1 從界面到單板的處理流程
擴(kuò)展讀取命令A(yù)T^CPBREX,命令格式及響應(yīng)如表1所示。
表1 擴(kuò)展讀取命令A(yù)T^CPBREX
擴(kuò)展寫入命令A(yù)T^CPBWEX,命令格式及響應(yīng)如表2所示。
表2 擴(kuò)展寫入命令A(yù)T^CPBWEX
結(jié)合增加一條聯(lián)系人記錄的實(shí)例,對(duì)所做設(shè)計(jì)進(jìn)行具體闡述。
將一條記錄寫到單板上步驟如下:
步驟1 假如用戶從接口參數(shù)傳下來(lái)Vcard字符流如下[14]:
BEGIN:VCARD
VERSION:3.0
FN:Joe Smith
TEL;TYPE=CELL:+13913131212
TEL;TYPE=HOME:949-362-2399
TEL;TYPE=WORK:029-88886666
X-WMC-MOBILE-2:949-555-1212
TEL;TYPE=FAX:949-362-2300
EMAIL:jsmith@smith.com
X-WMC-EMAIL:joe.smith@smith.com
UID:{4421FEE4-A25D-11D3-9F7C-005004AE6818}
步驟2 使用擴(kuò)展的讀取命令獲取單板所支持的字段列表和字段長(zhǎng)度,該命令的上報(bào)應(yīng)該以O(shè)K結(jié)尾,由于所有的字段名稱都做了縮寫處理,所以單條AT足以上報(bào)所有單板側(cè)所支持的字段類型,命令格式如下所示:
AT^CPBREX=?
^ CPBREX:(1-500),”FN”,32,”CELL”,48,”HOME”,48,”WORK”,48,”EM”,48,”XWEM”,XWGD,5
OK
步驟3 建立單板側(cè)上報(bào)字段與用戶界面支持的 Vcard字段對(duì)應(yīng)的映射表,如表3所示。其中以X-WMC開(kāi)頭的是自定義的字段名稱。將步驟1中傳下來(lái)的Vcard字符流轉(zhuǎn)換成Vcard對(duì)象模型,包括解析用戶自定義的字段。
步驟4 過(guò)濾掉單板側(cè)不支持的字段類型,按照單板上報(bào)的字段順序從對(duì)應(yīng)的Vcard對(duì)象中獲取數(shù)據(jù),構(gòu)造出即將下發(fā)的AT結(jié)構(gòu)[15]。就本例而言需要獲取姓名、手機(jī)號(hào)碼、家庭號(hào)碼、辦公號(hào)碼、電子郵件、擴(kuò)展電子郵件和群組編號(hào)這7個(gè)字段內(nèi)容。然后每4個(gè)一組分段下發(fā),其中字段編碼內(nèi)容是可缺省的,每下發(fā)一條寫命令如果成功,單板側(cè)需要上報(bào)一個(gè)OK響應(yīng),必須拆分的每條命令都返回OK,這條記錄才算保存成功,否則按保存失敗處理。寫命令的執(zhí)行流程如下所示:
AT ^ CPBWEX:3,2,1,”80534E4E3A”,1,”+13913131212”,2,”949-362-2399”,2,”029-88886666”,2
OK
AT ^ CPBWEX:3,2,2,”jsmith@smith.com”,1,”joe.smith@smith.com”,1,”4”,2
OK
至此一條記錄就被寫到單板上了。
表3 單板側(cè)上報(bào)字段與Vcard字段對(duì)應(yīng)的映射
在不改變單板存儲(chǔ)結(jié)構(gòu)以及存儲(chǔ)方式的基礎(chǔ)上,無(wú)需實(shí)現(xiàn)Obex協(xié)議或Diag協(xié)議的前提下,通過(guò)建立Vcard對(duì)象模型以及AT命令的擴(kuò)展,實(shí)現(xiàn)了Vcard數(shù)據(jù)的動(dòng)態(tài)字段解析和存儲(chǔ)。整個(gè)過(guò)程大部分工作都是放在SDK層來(lái)完成的,單板側(cè)只需要支持?jǐn)U展的AT命令即可,而用戶界面無(wú)需做任何額外的改動(dòng)。這種方案符合了SDK層作為工具集的設(shè)計(jì)原則,在不依賴于單板型號(hào)的同時(shí),給第三方的UI界面提供了更強(qiáng)的功能集合。
[1]Cronin.From victorian visiting card to vcard:the evolution of a communicative genre[J].Journal of Information Science,2003,29(1):65-68.
[2]孫鶴飛.基于IMS的雙模智能手機(jī)的設(shè)計(jì)與實(shí)現(xiàn)[D].西安:西北大學(xué),2008.
[3]Deitel H M,Deitel P J.C++編程金典[M].周靖,黃都培,譯.北京:清華大學(xué)出版社,2002.
[4]CN101237610,基于點(diǎn)還本分組的短信息發(fā)送方法和移動(dòng)終端[P].中興通訊股份有限公司,2008-08-06.
[5]蔡?hào)|.基于BREW平臺(tái)的CEMA移動(dòng)終端電話本的研究和實(shí)現(xiàn)[D].西安:西安電子科技大學(xué),2008.
[6]Gary JBronson.C++程序開(kāi)發(fā)與設(shè)計(jì)[M].劉勇,譯.北京:人民郵電出版社,2002.
[7]劉天印,李福亮.C++程序設(shè)計(jì)[M].北京:北京大學(xué)出版社,2006.
[8]Andrew Koenig,Barbara Moo.C++沉思錄[M].黃曉春,譯.北京:人民郵電出版社,2008:133-150.
[9]趙清杰.C++程序設(shè)計(jì) [M].北京:清華大學(xué)出版社,2008:183-193.
[10]深圳市森森科技發(fā)展有限公司.AT指令集[Z].4-5.
[11]華為技術(shù)有限公司.GTM 900 AT命令手冊(cè)Version 1.12[Z].2007:40-56.
[12]李志偉.基于AT指令的串行通信程序的設(shè)計(jì)[J].微計(jì)算機(jī)信息,2007,23(3):272-274.
[13]李佳.一種數(shù)據(jù)卡PC側(cè)收發(fā)AT命令模塊的實(shí)現(xiàn)方法[J].計(jì)算機(jī)測(cè)量與控制,2010,18(6):1370-1372.
[14]杜青.Symbian OS C++編程訣竅[M].北京:清華大學(xué)出版社,2009:103-106.
[15]CN101140517,在PC軟件中實(shí)現(xiàn)名片夾Vcard格式方法及裝置[P].中興通訊股份有限公司,2008-03-12.