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