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