關鍵詞:TS27.010 串行鏈路復用 GPRS移動終端 嵌入式Linux
隨著移動通信技術的迅速發(fā)展,具備無線通信功能的移動終端也迅速發(fā)展起來。這些移動終端支持普通的話音、短消息等業(yè)務,隨著GPRS網(wǎng)絡覆蓋的迅速擴大,越來越多的手持/車載移動終端也開始支持GPRS上網(wǎng)業(yè)務。如何在一個終端設備上整合這些業(yè)務,這是許多移動終端設備開發(fā)者面對的問題。筆者在開發(fā)一款車載移動終端過程中,采用了3GPP的TS 27.010協(xié)議,成功地整合了這些業(yè)務。
圖1 TS27.010協(xié)議棧組成與示意圖
1 TS27.010協(xié)議介紹
在常用的GSM/GPRS通信模塊中(如Siemens的MC35、WaveCom的Q2400等),只能通過一個普通9針的異步串口與終端設備TE(Terminal Equipment)進行通信。TE和MS?穴Mobile Station?雪需要通過這個串口交換各種類型的數(shù)據(jù),例如:語音、傳真、數(shù)據(jù)、SMS、CBS、電話號碼本的維護、電池狀態(tài)、GPRS、USSD等。如何在一個串口上同時支持這么多的業(yè)務?例如,在數(shù)據(jù)通信過程中,怎樣發(fā)送或接收SMS?為了解決這些問題,3GPP提出了一個協(xié)議——TS27.010協(xié)議(Terminal Equipment to Mobile Station Multiplexer Protocol)。有了Multiplexer,即使在數(shù)據(jù)連接過程中,也可以發(fā)送SMS。其它業(yè)務組合也可以同時進行。例如,數(shù)字語音和SMS同時發(fā)送。Multiplexer的存在使得一個完整的系統(tǒng)能夠根據(jù)需要進行劃分。
3GPP 的Multiplexer設計非常靈活,并且獨立于MS/TE平臺,已有的應用程序不需要改動即可工作。在設計Multiplexer時,特別考慮到采用電池供電的設備的需求,所以包含了省電模式控制等很重要的功能,并且Multiplexer本身在運行時也盡量使用最小的功耗和內(nèi)存。
Multiplexer基于ISO的HDLC標準設計,工作于有多種選項的單模式下。但是Basic Option并不遵從HDLC。在基本選項模式下,Multiplexer沒有透明機制,也沒有錯誤恢復功能。但是在高級選項(Advanced Option)模式下,使用HDLC的透明機制,且Multiplexer有一個方便的再同步機制,能夠在DC1/DC3(XON/XOFF)流控打開的鏈路上工作,且包含了錯誤恢復功能。
3GPP的Multiplexer依賴于一個控制信道。在這個控制信道上,TE和MS交換控制信息,例如參數(shù)協(xié)商、節(jié)電控制信息、流控信息等。Multiplexer是一個可選項,如果支持這個功能,就應使用AT+CMUX命令激活它。
Multiplexer為TE和MS在一個起始/停止模式的、具有分幀功能的串行鏈路上傳輸數(shù)據(jù)流提供了一套機制。圖1給出了不同的協(xié)議層及其功能示意。Multiplexer?qū)迂撠煂?shù)據(jù)按字節(jié)流的方式傳輸,不再進行進一步的組幀;如果數(shù)據(jù)需要按一定結構傳輸,就需要增加一個會聚層來完成這些功能。
Multiplexer為TE上的進程和MS上相對應的進程提供了一條虛連接,這樣TE和MS上的進程就可以通過這條虛連接通信。例如,TE上的SMS應用程序可以通過一條Multiplexer通道與MS上的SMS處理程序連接起來。
TS27.010規(guī)范使用8bit字符的start-stop傳輸模式,兩個Mulitplexer?qū)嶓w間的通信使用了規(guī)定的幀格式。TE和MS之間的每個信道稱為一條數(shù)據(jù)鏈路連接DLC(Data Link Connection),這些DLC被依次獨立地建立起來。每個DLC都可以有自己的流控機制。
Multiplexer有三種工作模式:Basic、Advanced without error recovery和Advanced with error recovery。這三種模式特點如下:
·Basic:長度標識代替HDLC的透明機制;使用與HDLC不同的標志字;不能用于具有XON/XOFF流控的鏈路;從同步丟失狀態(tài)中恢復需要更長的時間。
·Advanced without error recovery:遵從ISO/IEC13239的異步HDLC過程;可以用于具備XON/XOFF流控的鏈路上;可以更快地從失同步狀態(tài)恢復。
·Advanced with error recovery:使用了HDLC的錯誤恢復過程。
2 Wavecom GSM/GPRS模塊Multiplexing協(xié)議介紹
筆者選用了Wavecom的Q2403A,這是一款E-GSM/GPRS 900/1800的雙頻模塊。這個模塊支持大部分常用的AT命令,但不支持標準的TS27.010協(xié)議。為了能夠數(shù)據(jù)/命令復用,Wavecom定義了自己的multiplex協(xié)議。
Wavecom的復用協(xié)議允許一條串行鏈路上同時進行兩個會話(即虛連接):一個AT命令的會話和一個數(shù)據(jù)通信的會話。AT+WMUX=1將激活模塊的復用模式。在這種模式下,AT命令和數(shù)據(jù)都被封裝成數(shù)據(jù)包。通過包頭,可以區(qū)分是數(shù)據(jù)包還是AT命令包。
2.1 AT命令包格式
AT命令包幀格式如圖2所示。第一個字節(jié)(0xAA)用于標識這是一個命令包,第二個字節(jié)是AT命令長度的低八位。第三個字節(jié)由兩部分組成:低3位是AT命令長度的高3位;高3位用于標識一個AT命令。AT命令的最大長度可以為2047字節(jié)。校驗和?穴checksum?雪是包中所有字節(jié)(包括頭和AT命令)之和對256取模。
圖4 Linux下串行通信數(shù)據(jù)流和函數(shù)調(diào)用示意圖
2.2 數(shù)據(jù)包格式
數(shù)據(jù)包各個字段(除packet type外)意義與AT命令包相同,其幀格式如圖3所示。數(shù)據(jù)包有以下幾種類型:
·Type=0——DATA 包:這個包是發(fā)送到無線鏈路上或者從無線鏈路上接收到的數(shù)據(jù)
·Type=1——STATUS包:這個包給出了SA、SB、X和中斷條件編碼的信息。
狀態(tài)包的長度總為1字節(jié)。任何一個狀態(tài)(除了break)改變時,所有的狀態(tài)位都要發(fā)送出去。缺省情況下,所有的狀態(tài)位都是關閉的(因此DTR、RTS都是關閉的),所以在打開復用開關準備傳送數(shù)據(jù)之前,一定要發(fā)送一個狀態(tài)包。
·Type=2——READY包:這個包表示發(fā)送READY包的一方可以接收數(shù)據(jù)了。包中沒有數(shù)據(jù),所以長度字段為0。
·Type=3——BUSY 包:這個包表示發(fā)送READY包的一方忙,無法接收數(shù)據(jù)。包中沒有數(shù)據(jù)。
3 Linux下串口通信系統(tǒng)的組成
要在Linux系統(tǒng)上實現(xiàn)TS27.010協(xié)議,就必須了解Linux下串口驅(qū)動軟件模塊的結構。
圖4不但給出了Linux kernel中串口通信模塊的組成結構,還形象地表示出了數(shù)據(jù)是如何在用戶和硬件接口之間流動的(筆者使用Linux 2.4.19的內(nèi)核)。從圖4可以看到串口通信模塊可在邏輯上分為三層:TTY層、line discipline層和底層驅(qū)動層。TTY層是用戶空間和內(nèi)核空間的橋梁,用戶程序和內(nèi)核需要通過tty層交換數(shù)據(jù);Low-level driver則負責硬件的交互,它對硬件進行控制和讀寫操作;line discipline層是整個串行通信模塊中最靈活、設計最巧妙的一層,它要為一個串行口的使用定下數(shù)據(jù)交互的“規(guī)程”,在Linux內(nèi)核中已經(jīng)存在了許多line discipline,例如PPP、SLIP、TTY等。缺省使用TTY line discipline??梢愿鶕?jù)需要將line discipline替換成Linux已經(jīng)定義的line discipline結構,甚至替換為自己的line discipline結構。
在圖4中,向硬件接口寫數(shù)據(jù)的過程是顯而易見的。但是,用戶程序從硬件讀取數(shù)據(jù)的過程卻要復雜一些,這是因為硬件與用戶空間之間沒有直接的聯(lián)系。解決的辦法就是使用緩沖技術,硬件接收數(shù)據(jù)存儲于kernel buffer中,等待用戶程序請求這些數(shù)據(jù);如果用戶程序請求數(shù)據(jù)時,這個buffer是空的,那么用戶程序就會被掛起,直到buffer中有數(shù)據(jù)時,它才被喚醒。實際上,TTY相關的緩沖是由兩級構成的:一個“常規(guī)”buffer(數(shù)據(jù)等待著line discpline取走,缺省情況下傳到用戶空間)和一個“flip”buffer(硬件驅(qū)動函數(shù)將底層進來的數(shù)據(jù)盡可能快地存入這個緩沖,而不必考慮并發(fā)存取問題,因為這個buffer是每個硬件驅(qū)動專有的)。flip buffer由兩個物理的緩沖實現(xiàn),并被交替地寫入,這樣中斷處理函數(shù)就會總有一個緩沖可用。
Linux下串口軟件的這種分層結構雖然增加了復雜性,但是它帶來的好處是多方面的。第一,串口模塊更加靈活,在為新的串口硬件編寫驅(qū)動程序時,只需修改和增加最底層的軟件即可;第二,上層應用程序可以根據(jù)需要改變line discipline的處理軟件,在使用PPP、SLIP等協(xié)議進行撥號連接時,都需要將原有的line discipline替換為PPP或者SLIP協(xié)議本身的line discipline?鴉第三,可以根據(jù)需要,在層與層之間加入一層自己的處理軟件。事實上,筆者在實現(xiàn)Multiplex協(xié)議時正是這樣做的。
圖5 MUX系統(tǒng)組成
4 Multiplexing協(xié)議的實現(xiàn)
4.1 協(xié)議實現(xiàn)時的考慮
在實現(xiàn)TS27.010協(xié)議時,基于以下考慮:第一,使用串口的上層應用程序不需要改動。這一點很重要,因為系統(tǒng)中有許多用戶程序使用串口進行通信。如果需要對它們進行改動,那么由此付出的代價顯然是不值得的。在這一點上,尤其需要特別考慮PPP軟件,因為在Linux下通過GPRS上網(wǎng)必須使用PPP協(xié)議進行撥號。PPP存在于用戶空間和內(nèi)核空間兩個地方,用戶空間的pppd應用程序完成撥號連接的管理功能;內(nèi)核空間的ppp協(xié)議軟件實現(xiàn)PPP包的組幀/分幀等核心功能。PPP定義了自己的line discipline模塊,且到此為止,往下就不再有PPP相關的軟件模塊(參看圖4的分層結構)。第二,盡可能多地實現(xiàn)TS27.010協(xié)議。雖然這個協(xié)議的內(nèi)容很豐富,但是由于Wavecom通信模塊只支持有限的幾種格式,并且?guī)^部分還略有不同。這樣實現(xiàn)起來就存在許多困難,只能在保證實現(xiàn)Wavecom復用協(xié)議并可靠工作的前提下,盡量實現(xiàn)TS27.010協(xié)議,以便于以后硬件和軟件的升級。
4.2 mux driver的實現(xiàn)方案
正是基于以上兩點考慮,決定將這個協(xié)議的實現(xiàn)放在Line discipline和Low-level driver兩層之間,參看圖5。這樣,不需要對Linux的TCP/IP協(xié)議棧軟件和PPP軟件作任何修改,就可以在復用模式下實現(xiàn)原有的無線上網(wǎng)功能。
圖5給出了MUX模塊的函數(shù)調(diào)用和數(shù)據(jù)流程。TTY Layer、line discipline和serial driver是Linux tty設備文件系統(tǒng)在內(nèi)核中已有的三層,在前一節(jié)已經(jīng)介紹。
正如筆者在實現(xiàn)TS27.010協(xié)議時所考慮的,為了不影響上層應用程序,MUX必須支持標準的Linux系統(tǒng)調(diào)用,如write()、read()、ioctl()等。write()如果成功,則返回發(fā)送的字節(jié)數(shù);如果失敗則返回-1,并將errno(Linux系統(tǒng)下一個全局變量,用戶接口可以根據(jù)這個值判斷錯誤類型)置為合適的值。正如圖5所示,write?穴?雪并不是將數(shù)據(jù)直接發(fā)送出去,要發(fā)送的數(shù)據(jù)首先按照TS27.010協(xié)議的要求(筆者使用Wavecom模塊,它有自己的協(xié)議要求)組成MUX幀?熏然后根據(jù)數(shù)據(jù)的優(yōu)先級排隊,優(yōu)先級高的數(shù)據(jù)首先被發(fā)送。
同樣,對設備/dev/muxN(0<N<M)的標準的Linux調(diào)用read()也不是由MUX直接支持的。MUX不會知道一個用戶應用程序何時讀設備/dev/muxN(0<N<M)。read()功能由MUX的上層(主要是TTY層)支持。MUX根據(jù)TS27.010協(xié)議(或者Wavecom協(xié)議)將物理鏈路上接收到的MUX包解封裝,然后將純數(shù)據(jù)發(fā)送到設備/dev/muxN(0<N<M)的讀緩沖區(qū)中。如果設備/dev/muxN(0<N<M)沒有足夠的讀緩沖空間,MUX就會將數(shù)據(jù)放到自己的接收緩沖區(qū)中。
4.3 Wavecom復用協(xié)議特殊情況的處理
在實現(xiàn)TS27.010協(xié)議時,考慮到Wavecom協(xié)議的特殊情況,在完全實現(xiàn)Wavecom復用功能的同時,盡可能多地實現(xiàn)TS27.010協(xié)議。由于Wavecom只能同時支持兩個虛連接,所以這里的M=2。其中,/dev/mux0用于AT命令,作為控制信息通道;/dev/mux1用于PPP連接,作為數(shù)據(jù)通道。作為Wavecom復用協(xié)議的一個嚴重缺陷,從圖2、圖3的幀結構可以看到,從串行鏈路提交來的數(shù)據(jù)只能區(qū)分出是AT command數(shù)據(jù)還是DATA數(shù)據(jù),而無法確定鏈路的信息,即無法確定數(shù)據(jù)是mux0接收,還是mux1接收。為了解決這個問題,筆者在實現(xiàn)時,將底層提交的數(shù)據(jù)同時送給mux0和mux1(如果這兩個設備都已經(jīng)打開)。但是考慮到軟件的效率和數(shù)據(jù)的可靠性,在向上層提交數(shù)據(jù)時,有以下兩點例外:第一,mux1是PPP專用的,在PPP沒起來之前,mux1可以作為AT命令通道,但是PPP連接成功后(PPP的line discipline已經(jīng)替換掉了缺省的TTY line discipline),它將不再接收AT命令,所以此時底層提交的AT命令幀不會送給mux1?鴉第二,mux0作為AT命令通道,將不接收PPP數(shù)據(jù),所以在PPP連接成功后,不會把0x7E開始和0x7E結束(PPP的幀同步標志字節(jié))的DATA幀發(fā)送到mux1。
GPRS網(wǎng)絡作為一種過渡性質(zhì)的2.5G網(wǎng)絡,覆蓋日益廣泛。由于它的速率高、實時性好、費用低廉等諸多優(yōu)勢,日益被手持/車載等移動終端設備采用。在使用GPRS網(wǎng)絡傳輸數(shù)據(jù)的同時,這些設備也必須能支持普通的無線業(yè)務,如語音、短消息等。TS 27.010協(xié)議很好地解決了這些業(yè)務的復用問題。筆者開發(fā)的這套Linux上的multiplexing軟件實現(xiàn)了這些功能,使得移動終端能夠在PPP連接不斷開的情況下,可以打出/接聽電話、發(fā)送/接收短消息。
- 數(shù)據(jù)終端(9708)
相關推薦
評論
查看更多