一種基于嵌入式系統(tǒng)的增值服務技術(shù)的設計與實現(xiàn)
關(guān)鍵詞:嵌入式系統(tǒng);增值服務;短信息
1. 引言
近年來,隨著手機技術(shù)的迅猛發(fā)展,功能的不斷增多,人們對手機的使用已經(jīng)不再局限于傳統(tǒng)的語音通話上了,而是越來越多地用到了非語音的功能,比如SMS(Short Message Service短信息),彩信等等,也就是手機增值服務[1]。而能夠把手機增值服務應用到嵌入式系統(tǒng)中,使得手機能夠與嵌入式系統(tǒng)進行短信息的交互,那么這樣的一種增值服務技術(shù)的發(fā)展前景將會是非常有前途的。本文就是給出了這種增值服務系統(tǒng)的一個完整的解決方案。
開發(fā)中,嵌入式系統(tǒng)的程序部分使用的開發(fā)環(huán)境是Keil C,而其余所有的程序均使用Java來編寫,且已經(jīng)成功地移植到Linux平臺上。此外,下面所提到的SP使用的數(shù)據(jù)庫為SQL Server 2000。下面將對整個增值服務系統(tǒng)的設計與實現(xiàn)進行論述。
2. 增值服務系統(tǒng)的整體架構(gòu)
各大移動運營商提供給自己的SP的增值服務體系架構(gòu)和接口都是相似的[2],如中國移動的體系架構(gòu),如圖1所示,整個基于嵌入式系統(tǒng)的增值服務系統(tǒng)是由嵌入式系統(tǒng)、增值服務系統(tǒng)網(wǎng)關(guān)和SP及其內(nèi)嵌的接入模塊組成的。SP負責向用戶提供豐富多彩的增值服務,但如果由于資金不足等原因不能申請成為SP時,可以在現(xiàn)有的SP中嵌入一個接入模塊,同樣可以達到提供增值服務的目的,本文介紹的就是這種解決方案。
當MS(Mobile Subscriber手機用戶)想要發(fā)送一條短信息到嵌入式系統(tǒng)時,短信息首先被發(fā)送到基站,基站再把它發(fā)到SMSC(Short Message Service Center短信中心),SMSC通過SMPP協(xié)議(Short Message Peer to Peer短消息點對點協(xié)議)再把短信息轉(zhuǎn)發(fā)到ISMG(Internet Short Message Gateway互聯(lián)網(wǎng)短信網(wǎng)關(guān))[3]。
ISMG是中國移動與其SP進行通信的門戶,ISMG與SP的通信的底層是TCP/IP協(xié)議,而應用層是CMPP(China Mobile Peer to Peer中國移動點對點協(xié)議)協(xié)議。
圖1 基于嵌入式系統(tǒng)的增值服務系統(tǒng)的整體架構(gòu)原理
然后,SP按照CMPP協(xié)議從ISMG接收到關(guān)于此短信息的所有必要信息(如MS的手機號碼,MS點播的服務代碼等等)后把該條短信息的相關(guān)數(shù)據(jù)傳給SP內(nèi)嵌的接入模塊,然后接入模塊通過TCP/IP發(fā)送到增值服務系統(tǒng)網(wǎng)關(guān),由網(wǎng)關(guān)解析這些信息并重新編碼,再發(fā)送到PSTN(Public Switched Telephone Network公共開關(guān)電話網(wǎng)絡),最后由嵌入式系統(tǒng)從PSTN接收到該條短信息的所有信息,并顯示在它的LCD上。至此完成了由MS到嵌入式系統(tǒng)的短信息通信,而由嵌入式系統(tǒng)到MS的短信息通信過程也是類似的[4]。
下面,將針對系統(tǒng)各部分的每個功能模塊逐一地進行介紹,并詳細地敘述它們?nèi)绾?a class="contentlabel" href="http://www.ex-cimer.com/news/listbylabel/label/實現(xiàn)">實現(xiàn)的。
3. 嵌入式系統(tǒng)部分
3.1 嵌入式系統(tǒng)的特點和開發(fā)背景
許多嵌入式系統(tǒng)都有串口和LCD,這樣就能夠通過編程與外界通信并顯示信息,但由于嵌入式系統(tǒng)的存儲器容量比較小,在上面開發(fā)程序必須要注意節(jié)約存儲器的使用。此次所用的嵌入式系統(tǒng)是由臺灣研發(fā)的網(wǎng)絡信息電話,使用的是8051系列的芯片,擁有兩個串口,其中一個與內(nèi)置的Modem相連,可以與外界通信,此外還有一個128*64的LCD可以用來顯示接收到的短信息,一個鍵盤用來輸入要發(fā)送的短信息內(nèi)容。整個嵌入式系統(tǒng)部分的開發(fā)是建立在底層的串口,LCD以及鍵盤的API都已經(jīng)由這家臺灣公司提供了的基礎上。
3.2 Modem的AT指令簡介
AT指令為所有調(diào)制解調(diào)器制造商所使用的一個調(diào)制解調(diào)器命令語言。只要用連接線把串口和Modem連接起來,使得可以通過串口向Modem進行輸入,就可以讓Modem與Modem之間通過使用AT指令經(jīng)PSTN進行通信的。這是由于Modem有兩種工作模式:指令模式與數(shù)據(jù)傳輸模式。
3.3 Modem通訊模塊
表1 Modem通訊模塊的自定義幀
字段 | 所占字節(jié) | 字段 | 所占字節(jié) |
DLE | 1 | 發(fā)送時間 | 20 |
STX | 1 | 保留字段 | 20 |
類型 | 1 | 內(nèi) 容 | 160 |
幀序號 | 2 | DLE | 1 |
源號碼 | 20 | ETX | 1 |
目的號碼 | 20 |
Modem通訊模塊是嵌入式系統(tǒng)部分的主體,它負責與外界(其它的Modem)進行通訊。由于Modem之間的傳輸是連續(xù)的字節(jié)流,因此必須要定義一些建立在數(shù)據(jù)鏈路層上的幀,才能夠把實際要傳輸?shù)拿總€數(shù)據(jù)包從連續(xù)的字節(jié)流中區(qū)分出來。如表1所示,DLE STX和DLE ETX都是自定義的常量,數(shù)值是十六進制數(shù)的10 02和10 03,分別代表著一個幀的開始與結(jié)束。如果一個幀的內(nèi)容中有這兩個常量,那么可以在發(fā)送此幀時插入一個DLE,如10 02插入DLE后變?yōu)?0 10 02,接收此幀時,遇到連續(xù)的10 10就檢查是否緊跟著02,如果是就刪除中間的10,這樣就既可以接收到正確的數(shù)據(jù),又避免了從字節(jié)流中不能正確地截取幀。類型字段有兩種可能值:一種是DATA,即數(shù)據(jù)幀,代表此幀傳輸?shù)氖菙?shù)據(jù);一種是ACK,即確認幀,代表此幀是對已收到某一數(shù)據(jù)幀的確認。幀序號是標志該幀的唯一標志,發(fā)送過程中不斷遞增,達到最大值后可以循環(huán)使用。由于手機短信息的英文長度可以長達160個字節(jié)(中文為140個字節(jié)),所以內(nèi)容字段規(guī)定為160個字節(jié)。對于數(shù)據(jù)幀,內(nèi)容字段存放短信息的內(nèi)容;對于確認幀,內(nèi)容字段存放它所指明的已收到數(shù)據(jù)幀的幀序號。
當Modem通訊模塊接收到從MS發(fā)來的短信息時,只是簡單地發(fā)送確認幀。當Modem通訊模塊發(fā)送短信息到MS時,它把一個數(shù)據(jù)幀發(fā)送到目的端Modem,然后等待對此數(shù)據(jù)幀的確認幀的返回,如果超過一定的時間還沒有收到返回,Modem通訊模塊將會重發(fā)此數(shù)據(jù)幀,重發(fā)超過一定的次數(shù)就放棄發(fā)送此數(shù)據(jù)幀。如果在等待確認幀的返回時,有新的數(shù)據(jù)幀需要發(fā)送,那么將會允許發(fā)送一定數(shù)量的數(shù)據(jù)幀,超過這個數(shù)量以后就不再發(fā)送,直到有對之前發(fā)送幀的確認幀返回。
4. 增值服務系統(tǒng)網(wǎng)關(guān)部分
4.1 功能簡述
圖2 增值服務系統(tǒng)網(wǎng)關(guān)
增值服務網(wǎng)關(guān)的主要作用是在PSTN和Internet(數(shù)據(jù)通過TCP/IP傳送)之間進行數(shù)據(jù)的轉(zhuǎn)發(fā)。因此定義了兩種類:Frame與ShortMessage。在內(nèi)部,Modem通訊模塊與協(xié)議轉(zhuǎn)換模塊之間傳送的對象是Frame,TCP/IP通訊模塊與協(xié)議轉(zhuǎn)換模塊之間傳送的對象是ShortMessage,F(xiàn)rame與ShortMessage之間通過協(xié)議轉(zhuǎn)換模塊來互相轉(zhuǎn)換。所以網(wǎng)關(guān)的功能就是解析從PSTN收到的包含短信息內(nèi)容的Frame后重新編碼為ShortMessage再發(fā)送到TCP/IP,或者解析從TCP/IP收到的包含短信息內(nèi)容的ShortMessage后重新編碼為Frame再發(fā)送到PSTN。網(wǎng)關(guān)中所有模塊的活動都通過調(diào)用日志模塊提供的接口來進行日志的記錄。由于協(xié)議轉(zhuǎn)換模塊的實現(xiàn)比較簡單,而網(wǎng)關(guān)的Modem 通訊模塊跟嵌入式系統(tǒng)的Modem通訊模塊的設計思想是相似的,不同的只是網(wǎng)關(guān)的Modem 通訊模塊調(diào)用的是Sun提供的Java的串口API,屏蔽了很多底層的實現(xiàn)細節(jié),在開發(fā)中更加容易使用。因此下面只對TCP/IP通訊模塊和日志模塊進行說明。
4.2 TCP/IP通訊模塊
本模塊中數(shù)據(jù)包的確認/重發(fā)機制與Modem通訊模塊的策略類似。為了提高工作效率,可以在該模塊內(nèi)建立兩個隊列緩沖區(qū):發(fā)送隊列和接收隊列,用來存放暫時還沒有被發(fā)送出去或剛剛接收到的ShortMessage類對象。
發(fā)送時有兩種策略:長連接和短連接[5]。長連接即在與遠程主機第一次建立連接后,就一直保持連接,這樣有數(shù)據(jù)要發(fā)送時可以隨時發(fā)送;短連接即有數(shù)據(jù)發(fā)送時才建立連接,發(fā)送完畢后馬上斷開連接,直到下次有數(shù)據(jù)來到再重新建立連接。長連接的不足之處在于當網(wǎng)絡發(fā)生故障時,之前建立的連接會被破壞導致無法發(fā)送數(shù)據(jù),還有就是長期占用網(wǎng)絡資源。短連接的最大缺點是當要發(fā)送的數(shù)據(jù)量較多時,建立連接過于頻繁,在建立連接上的開銷太大,但是每次使用新的連接對比起長連接來說較為可靠。本文所提到增值服務系統(tǒng)中的所有TCP/IP通訊模塊的發(fā)送均采用短連接的策略。
接收時的策略是生成一個主線程不斷監(jiān)聽端口上的數(shù)據(jù),如果有新的數(shù)據(jù)來到,則產(chǎn)生一個新的子線程來處理此次數(shù)據(jù),處理完后該子線程自動終止,而主線程則繼續(xù)監(jiān)聽。具體實現(xiàn)框架如下:
while(true)//主線程run方法體內(nèi)
{
Socket sock = serverSocket.accept();//監(jiān)聽數(shù)據(jù)
Thread childThread = new Thread(sock);
childThread.start();//啟動子線程處理此次數(shù)據(jù)
}
4.3 日志模塊
日志對于任何一個系統(tǒng)來說都是非常重要的,通過日志文件,我們可以查看系統(tǒng)中每一個細小的活動,而且往往可以通過日志來達到調(diào)試查錯的目的。通常需要輸出到日志的信息有三種:1)正?;顒拥男畔?,比如通訊模塊接收到一個數(shù)據(jù)包,協(xié)議的一次轉(zhuǎn)換等等;2)發(fā)生錯誤的信息,比如由于網(wǎng)絡故障,接收的數(shù)據(jù)包格式不正確而解析失敗等等;3)調(diào)試的信息:系統(tǒng)處于開發(fā)階段時,開發(fā)人員用來定位錯誤的信息,這種信息在開發(fā)完成后則不應再輸出到日志中,但是仍然應該在程序中保留相關(guān)的語句,因為系統(tǒng)很有可能在未來被發(fā)現(xiàn)有問題,而不得不改進程序和再次調(diào)試。
可以建立一個類LogManager來實現(xiàn)日志模塊的功能。該類需要提供三個靜態(tài)方法的接口,它們分別對應著上述需要輸出到日志的信息的三種情況,分別是:1)LogManager.log(String info)對應正?;顒拥妮敵?;2)LogManager.error(String info)對應發(fā)生錯誤時的輸出;3)LogManager.debug(String info)對應調(diào)試的輸出。三種接口輸出到日志文件時應該帶有各自的標記和輸出的時間,具體輸出效果如下:
[ LOG ][2003-08-11 11:41:56]正?;顒拥妮敵?/P>
[ERROR][2003-08-11 11:41:56]錯誤信息的輸出。
[DEBUG][2003-08-11 11:41:56]調(diào)試信息的輸出。
此外可以使用XML文件來管理日志模塊以及整個增值服務系統(tǒng)的配置,比如控制調(diào)試信息是否被輸出只需在XML配置文件中增加一個數(shù)據(jù)項,并在LogManager.debug(String info)方法的開頭讀取此數(shù)據(jù)項的值并進行判斷,如果不需要輸出調(diào)試信息則直接退出該方法。
5. SP接入模塊部分
5.1 功能簡述
由于申請成為中國移動的SP需要一筆為數(shù)不少的資金,所以在資金不充裕的情況下,在現(xiàn)有的SP的增值服務系統(tǒng)上嵌入一個接入模塊來提供增值服務是建立一個增值服務系統(tǒng)的理想的廉價的解決方案。
接入模塊與宿主SP共同完成短信息收發(fā)的整個過程是這樣的:1)當TCP/IP通訊模塊接收到一個ShortMessage對象后,它就轉(zhuǎn)發(fā)給數(shù)據(jù)庫存取訪問模塊,數(shù)據(jù)庫存取訪問模塊再把該對象轉(zhuǎn)為一條記錄并插入到SQL Server數(shù)據(jù)庫中,然后由宿主SP讀取該條記錄,并與ISMG交互把短信息發(fā)給MS;2)當ISMG把一條來自MS的短信息發(fā)給宿主SP后,宿主SP就把該條短信息轉(zhuǎn)為一條記錄插入到數(shù)據(jù)庫中,再由數(shù)據(jù)庫存取訪問模塊讀取出來,并轉(zhuǎn)為一個ShortMessage對象,傳給TCP/IP通訊模塊發(fā)送到增值服務系統(tǒng)網(wǎng)關(guān)。
圖3 SP接入模塊部分
SP接入模塊的存在使得我們可以不需要理會SP與ISMG之間的任何交互,使得復雜的CMPP協(xié)議對我們不可見。從而大大降低了開發(fā)的難度,并把該模塊內(nèi)的短信息的收發(fā)變?yōu)楹唵蔚膶?shù)據(jù)庫的訪問的過程[6]。
圖3中TCP/IP通訊模塊,日志模塊與增值服務系統(tǒng)網(wǎng)關(guān)的同名模塊的設計與實現(xiàn)類似,故不再重復說明。
5.2 數(shù)據(jù)庫存取訪問模塊
此模塊的功能就是使用JDBC來訪問SQL Server 2000數(shù)據(jù)庫,從而完成短信息的收發(fā)。JDBC有多種驅(qū)動,一般來說使用數(shù)據(jù)庫廠家提供的專用驅(qū)動效率更高,這里使用的是通用的sun.jdbc.odbc.JdbcOdbcDriver[7]。主要的操作是對兩個表進行訪問:存放已接收的短信息的表ReceiveSMS和存放要發(fā)送的短信息的表SendSMS。這兩個表包括了源號碼,目的號碼,信息內(nèi)容,接收或發(fā)送的時間等等重要的字段,其中表ReceiveSMS還有一個字段IsRead表示該條記錄是否已經(jīng)被讀取過,0表示沒有被讀取,1表示已被讀取過。該模塊的具體運作流程過下:1)接收短信息時讀取表ReceiveSMS中IsRead字段為0的記錄,然后把此次所有被讀取的記錄的IsRead字段置為1,表示該記錄已被讀過,并把讀出的記錄的各個字段取出,做為新構(gòu)造的ShortMessage對象的屬性值,最后把它傳給TCP/IP通訊模塊;2)發(fā)送短信息時首先從TCP/IP通訊模塊接收到一個ShortMessage類對象,并用ShortMessage對象的屬性值作為新構(gòu)造的紀錄的字段值,最后往SendSMS表中插入該條新紀錄。
6. 總結(jié)
本文通過對各個功能模塊設計中的難點與重點進行了論述,是一種實用而有前景的增值服務應用。
本文作者創(chuàng)新點:提出了一種基于嵌入式系統(tǒng)的增值服務技術(shù)的應用的解決方案,把手機增值服務應用到嵌入式系統(tǒng)中,使得手機能夠與嵌入式系統(tǒng)進行短信息的交互,這樣的一種增值服務技術(shù)的發(fā)展前景將會是非常有前途的。在開發(fā)中,嵌入式系統(tǒng)的程序部分使用的開發(fā)環(huán)境是Keil C,并且已經(jīng)成功地移植到Linux平臺上。
參考文獻
[1] 徐愛鈞,彭秀華.單片機高級語言C51 Windows環(huán)境編程與應用[M] .北京:電子工業(yè)出版社,2001,11-13.
[2] 胡大可,李培弘,方路平.嵌入式開發(fā)專家――基于單片機8051的嵌入式開發(fā)指南[M] . 北京:電子工業(yè)出版社,2003.25-26.
[3] 賴麒文.8051單片機嵌入式系統(tǒng)應用[M]. 北京:科學出版社,2002.55-56.
[4] 徐迎曉.Java語法及網(wǎng)絡應用設計[M],北京:清華大學出版社,2002.30-32.
[5] [美]多納休.美國計算機“寶典”叢書――Java數(shù)據(jù)庫編程寶典[M].北京:電子工業(yè)出版社,2003.88-89.
[6] [美]Timothy Budd.面向?qū)ο驤AVA編程思想(修訂版)[M].北京:清華大學出版社,2002.10-11.
[7] 冉春玉,翟向梅,谷川,面向多ISMG網(wǎng)關(guān)協(xié)議的SMS管理平臺的研究與設計[J]. 微計算機信息,2006 Vol.22 No.27:P.143-145
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論