作者:Sreekrishnan Venkateswaran
GSM 上的 Linux GPRS 和資料
GPRS 是一個用於通過 GSM 傳輸資料的資料分組服務,是一種卓越的數字蜂窩標準。儘管 GSM 上的資料是線路交換的並且不管怎樣都佔用一個通道,但是 GPRS 上的資料是一直串連的(always-on)、封包交換(packet-switched)的資料流,使用者根據使用付費。GSM 的傳輸速度一般是 9.6 kbps,而 GPRS 能夠啟動並執行速度為 56 kbps 到 170 kbps。
GPRS 和 GSM 晶片通常有一個到系統的 UART 介面。對於內建 GSM/GPRS 支援的母板(例如,一個帶有串連到 UART 通道的 Siemen MC-45 模組的母板),傳統的串列驅動程式就能驅動這個連結。考慮 PCMCIA/CF 的形成因素(例如一張可選 GPRS 卡),serial_cs(是用於訪問 PCMCIA 串列裝置的普通卡服務驅動程式)能夠允許其他動作系統把此卡當作一個串列裝置。第一個未使用的串列裝置(/dev/ttySx)被分配給此卡,然後此卡就可以被當成串列裝置訪問。serial_cs 也可以通過全球定位系統 (GPS) PCMCIA 和 CF 卡類比序列埠。針對 USB GPRS 數據機而言,USB-to-serial 轉換器一般 USB 連接埠轉換為虛擬序列埠,因此系統其他部分就會將它看作串列裝置。
GPRS 網路使用 GGSN(GPRS 網關支援節點) 串連到一個外部網路(例如 Internet)。GPRS 裝置類似於擁有擴充 AT 命令集的數據機,在進入資料模式之前必須使用 AT 命令定義一個上下文。上下文字串看起來類似於清單 3 中給出的樣本。
清單 3. 上下文字串
'AT+CGDCONT=1,"IP","internet.voicestream.com","0.0.0.0",0,0' |
在這個樣本中,1 代表上下文編號,IP 是資料分組類型,internet.voicestream.com 是存取點名稱(APN) 字串,0.0.0.0 意味著服務提供者選擇 IP 位址,其他參數與資料和前序壓縮有關。APN 字串取決於服務提供者。一般不需要使用者名稱和口令。
PPP 允許網路通訊協定(比如 TCP/IP)在串列鏈路上運行。在無線網路的上下文中,PPP 可以使 TCP/IP 運行於 GPRS 上,資料通過 GSM、Bluetooth RFCOMM 以及 IrDa COMM 進行傳輸。清單 4 給出了一種調用 PPP 後台進程 pppd 的公用文法。
清單 4. 調用 PPP 後台進程 pppd 的公用文法
pppd ttySx call connection-script |
在這個樣本中,ttySx 是物理或虛擬串列裝置(PPP 運行其上),connection-script 是 /etc/ppp/peers/ 目錄中的一個檔案,這個目錄包含在 pppd 和服務提供者之間交換的用於建立連結的 AT 命令序列。建立連結並完成身分識別驗證以後,PPP 將啟動網路控制協議(Network Control Protocol,NCP)。IPCP (Internet Protocol Control Protocol,網際網路通訊協定 (IP)控制協議) 是用於運行 IP 的 NCP。一旦 IPCP 成功通過 IP 位址,PPP 就開始與 TCP/IP 棧互動。
清單 5 給出了用於串連到 GPRS 服務提供者的 PPP 連結指令碼樣本,而清單 6 給出的是用於到 GSM 服務提供者的資料連線的串連指令碼樣本。
清單 5. 針對 GPRS 的 pppd 連結指令碼樣本(/etc/ppp/peer/gprs-script)
115200 connect "/usr/sbin/chat -s -v "" AT+CGDCONT=1,"IP", "internet2.voicestream.com","0.0.0.0",0,0 OK AT+CGDATA="PPP",1" crtscts noipdefault modem usepeerdns defaultroute connect-delay 5000 |
從作業系統的角度出發,GSM 上的資料類似於通過撥號調試解調器串連收發的資料。互連網服務提供者(ISP)的電話號碼是使用 GSM 撥入的,並且會建立一個撥號連線。利用使用者名稱和口令進行身分識別驗證。
一旦 PPP 建立了與服務提供者的 IP 串連,TCP 應用程式例如 網頁瀏覽器就可以不加更改地在 GSM/GPRS 裝置上運行。
gsmlib 項目為通過 GSM 發送語音和 SMS(Short Messaging Service,簡訊服務)提供了公用程式(請參閱 參考資料 瞭解更多關於 gsmlib 的資訊)。它包括用於存取 Subscriber Identity Module (SIM)卡中的電話簿、收發 SMS 訊息等功能的公用程式。
清單 6. 用於通過 GSM 傳輸資料的 pppd 串連指令碼樣本(/etc/ppp/peer/gsm-script)
115200 connect '/usr/sbin/chat -s -v ABORT "NO CARRIER" ABORT "NO DIALTONE" ABORT "BUSY" "" AT OK ATDT<phone_number> CONNECT' crtscts noipdefault modem user "linux" usepeerdns defaultroute connect-delay 5000 |
Linux Infrared Data
Infrared Data (IrDa) 是一種用紅外線無線傳輸資料的規範。主要用於串連膝上電腦或者將錄影機或照相機這樣的裝置串連到電腦系統。
IrDa 的速度從 Serial Infrared (SIR) 的 115 kbps 到 Very Fast Infrared (VFIR) 的 16 Mbps。大多數處於 SIR 模式的 IrDa 晶片是 UART 16650 相容的(16650 是一種公用 PC UART),因此傳統 Linux 串口驅動程式可以充當鏈路層級的驅動程式。IrDa 行的規範實現 —— IrTTY (drivers/net/irda/irtty.c),使串列驅動程式驅動 SIR。IrPORT 驅動程式(drivers/net/irda/irport.c)代替了 IrTTY 和串列驅動程式,並提供更好的裝置控制。與串列磁碟機不相容的 IrDa 晶片有自己的裝置驅動程式。例如,NSC PC87108 晶片集就使用自己的驅動程式(nsc-ircc.c)。與上面討論到的用於 USB Bluetooth 裝置的 hci-usb 驅動程式類似,irda-usb.c 裝置驅動程式支援 USB IrDa FIR 軟體狗。
IrLAP 是負責 IrDa 裝置發現、重傳以及流量控制的鏈路存取協議層。IrLMP 鏈路管理層和 Tiny 傳輸協議層(TinyTP)駐留於 IrLAP 之上。而它們之上是 IrCOMM 和 IrLAN 層。IrCOMM(在 net/irda/ircomm/ 中實現)提供串列類比,使運行於序列埠(比如終端模擬器)上的應用程式不加更改地在 IrDa 棧上運行。IrLAN(在 net/irda/irlan/ 中實現)提供使 TCP/IP 直接運行於 IrDa 棧之上的虛擬網路介面。IrLAN 代碼使用 register_netdev 將太網裝置註冊到 Linux 網路層,使用 netif_rx 向 Linux IP 棧發送資料(與對 WLAN 驅動程式和 Bluetooth BNEP的解釋類似)。IrCOMM 與 Bluetooth RFCOMM 相似,而 IrLAN 則類似於 Bluetooth BNEP。
IrOBEX 是建立在 TinyTP 之上的一個簡單協議,它允許傳輸位元據。IrOBEX 的擴充定義了不同資料對象的傳輸。
為了在 Linux 上應用 IrDa 協議,必須安裝 IrDa 公用程式(如 irattach),它是作為 Linux IrDa 項目的一部分開發的。
效能問題
網路效能取決於特定載體網路的特徵。例如,GPRS 的頻寬取決於使用的代碼模式,而 Bluetooth 的效能受 L2CAP 層的網段的影響。對於 WLAN 工作站與存取點之間的通訊,幀確認會降低頻寬, 使用同一存取點的其他工作站的數量也會帶來同樣影響。
無線網路的特徵(比如低且波動的頻寬和高延遲)會歪曲 TCP 度量和傳輸策略。儘管無線網路中的大多數損耗來自訊號衰退、幹擾以及串連中斷等因素,但是 TCP 假定這些損耗與擁塞有關, 因此它摒棄了降低網路流量的演算法。有多種項目用來調整 TCP 和 網頁瀏覽器的行為以適應無線網路。
結束語
在本文中,您瀏覽了是針對包括 WLAN、Bluetooth、GPRS、GSM 和 IrDA 在內的流行的無線技術的 Linux 裝置驅動程式和網路通訊協定層。還通過跟蹤相應的代碼路徑和討論相關的使用者空間工具,瞭解到不同的無線裝置如何在 Linux 中工作。
現在,有了對 Linux 上提供的對各種無線技術、網路技術以及匯流排技術的核心支援的理解,您可以修補多種具有不同形成因素的無線裝置,開發啟用不被支援的裝置所需的 Linux 核心代碼。
關於作者
Sreekrishnan Venkateswaran 擁有印度坎普爾市印度科技學院的電腦科學碩士學位。他從 1996 年 2 月開始為 IBM India 工作。 他的興趣包括設計裝置驅動程式和網路通訊協定。可以通過 s_krishna@in.ibm.com 與 Sreekrishnan 聯絡。
全文出自 : IBM developerWorks 中國網站