作者: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,Internet 协议控制协议) 是用于运行 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 应用程序例如 Web 浏览器就可以不加更改地在 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 DataInfrared 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 和 Web 浏览器的行为以适应无线网络。
结束语
在本文中,您浏览了是针对包括 WLAN、Bluetooth、GPRS、GSM 和 IrDA 在内的流行的无线技术的 Linux 设备驱动程序和网络协议层。还通过跟踪相应的代码路径和讨论相关的用户空间工具,了解到不同的无线设备如何在 Linux 中工作。
现在,有了对 Linux 上提供的对各种无线技术、网络技术以及总线技术的核心支持的理解,您可以修补多种具有不同形成因素的无线设备,开发启用不被支持的设备所需的 Linux 内核代码。
关于作者
Sreekrishnan Venkateswaran 拥有印度坎普尔市印度科技学院的计算机科学硕士学位。他从 1996 年 2 月开始为 IBM India 工作。 他的兴趣包括设计设备驱动程序和网络协议。可以通过
s_krishna@in.ibm.com 与 Sreekrishnan 联系。
全文出自 :
IBM developerWorks 中国网站