您的位置:控制工程论坛网论坛 » 工业无线 » Linux 无线网络技术

解脱527

解脱527   |   当前状态:离线

总积分:877  2024年可用积分:0

注册时间: 2007-09-03

最后登录时间: 2009-11-12

空间 发短消息加为好友

Linux 无线网络技术

解脱527  发表于 2007/9/8 12:48:09      1117 查看 0 回复  [上一主题]  [下一主题]

手机阅读

无线技术,例如 WLAN (Wireless Local Area Network)、Bluetooth、GPRS (General Packet Radio Service)、GSM (Global System for Mobile communications) 以及 IrDa (Infrared Data),在不同的环境下提供服务。虽然 WLAN 支持比 Bluetooth 更高的速度和更长的传播距离,但是它也需要更多的费用并且耗电量更大。GPRS 虽然比 Bluetooth 和 WLAN 慢,但是可用于移动技术。尽管它们存在差异,或者是其他原因,但是具有多种无线功能的设备可以综合利用它们。例如,根据 GPS 模块的定位输入,设备可以透明地将网络连接从路上的 GPRS 切换到网吧中更便宜的 WLAN。移动电话可以通过 Bluetooth 与心律监视器通信,当病人心律超出某个极限时,就可以通过 GSM 向医生发送警报。[52RD.com]
目前,无线技术已经以 PCMCIA、Compact Flash (CF) 卡的形式广泛应用,或者用于 USB 设备。大多数计算机系统,包括嵌入式设备,都有 PCMCIA、CF 或者 USB 接口,即使不含对无线技术的内置支持,也能够立刻使用这些技术。这篇文章分析了无线设备的一些示例,并且研究了设备驱动程序的 Linux 实现、总线技术以及各种协议。[52RD.com]
首先,通过跟踪 WLAN 样卡的代码流,您将了解到 WLAN 设备是如何在 Linux 下工作的,然后还可以看到几个 Bluetooth 设备如何与 Linux Bluetooth 栈和其他内核层连接。接下来,您将了解到如何使 GPRS 和 GSM 设备在 Linux 下工作。文章最后分析了 Linux 上的 IrDa 支持并简要介绍了有关无线网络设备的性能问题。[52RD.com]
注意:本文涉及到的内核数据结构和文件名是当前 Linux 版本中所使用的。文件名相对于 Linux 内核源程序树的根。 [52RD.com]
Linux 802.11 WLAN[52RD.com]
WLAN 通信系统作为有线 LAN 以外的另一种选择一般用在同一座建筑内。WLAN 使用 ISM (Industrial、Scientific、Medical) 无线电广播频段通信。WLAN 的 802.11a 标准使用 5 GHz 频段,支持的最大速度为 54 Mbps,而 802.11b 和 802.11g 标准使用 2.4 GHz 频段,分别支持最大 11 Mbps 和 54 Mbps 的速度。[52RD.com]
WLAN 类似于有线以太网,它们都是从同一地址池分配 MAC (Media Access Control) 地址,并且都是作为以太网设备出现在操作系统的网络设备层。例如,ARP(Address Resolution Protocol) 表是用 WLAN MAC 地址和以太网 MAC 地址填充的。[52RD.com]
然而 WLAN 与有线以太网在链路层有很大的区别。例如,802.11 标准使用冲突避免(CSMA/CA)代替有线以太网的冲突检测(CSMA/CD)。而且,与以太网帧不同的是,WLAN 帧是被确认的。[52RD.com]
由于 WLAN 工作站之间的模糊边界,WLAN 链路层拥有在传送前清除一个区域的协议。出于安全性考虑,WLAN 的 Wired Equivalent Privacy (WEP) 加密机制提供与有线网络相同的安全级别。WEP 将 40 比特或 104 比特密钥与随机的 24 比特初始向量组合用以加解密数据。WLAN 支持两种通信模式: Ad Hoc 模式用于小群组工作站之间不必使用访问点的短时间内通信,而 Infrastructure 模式的所有通信必须通过访问点。访问点周期性地广播一个服务集标识符(SSID),SSID 用于将一个 WLAN 网络与其他网络区别开来。 [52RD.com]
大多数可用的 WLAN 卡是基于 Intersil Prism 或 Lucent Hermes 芯片组的。Compaq、Nokia、Linksys 和 D-Link 卡使用 Prism 芯片组,而 Lucent Orinoco 卡和 Apple Airport 使用 Hermes 芯片组。[52RD.com]
Linux WLAN 支持[52RD.com]
Linux WLAN 支持由 WLAN API 实现和 WLAN 设备驱动程序组成。我将依次研究它们。[52RD.com]
有两个 Linux 项目定义一般的 WLAN API,并且提供工具让用户空间应用程序配置参数和存取来自 WLAN 设备驱动程序的信息。Wireless Extensions 项目为不同的无线网卡提供公共的 Linux 用户空间接口。这个项目的工具包括 iwconfig 用以配置参数(比如 WLAN 驱动程序中的 WEP 关键字及 SSID)。linux-wlan 项目作为 Wireless Extensions 项目一部分,也支持一系列用于从用户空间与 WLAN 设备驱动程序交互的工具。与基于 Wireless Extensions 的工具不同,这些工具使用类似于 SNMP (Simple Network Management Protocol) MIB (Management Information Base) 的语法,该语法反映 IEEE 802.11 规范。(请参阅 参考资料,获得项目的更多信息。) [52RD.com]
继续讨论设备驱动程序,支持流行的 WLAN 卡的 Linux 设备驱动程序包括:[52RD.com]
Orinoco WLAN 驱动程序:是 Linux 内核源代码的一部分,支持基于 Hermes 的卡和基于 Intersil Prism 的卡。 orinoco_cs 模块提供了 PCMCIA 和 CF 卡所必需的 PCMCIA 卡服务支持。 [52RD.com]
[52RD.com]
[52RD.com]
linux-wlan 项目的 linux-wlan-ng 驱动程序:支持多种基于 Prism 芯片组的卡。这个驱动程序支持 linux-wlan API 并部分支持 Wireless Extensions。 [52RD.com]
[52RD.com]
[52RD.com]
Host AP 设备驱动程序:支持 Prism 芯片组的 AP 模式,可以使 WLAN 主机起访问点的作用。 [52RD.com]
[52RD.com]
[52RD.com]
Linux Symbol Spectrum 设备驱动程序:支持 Symbol PCMCIA 卡。不同于 PCMCIA 卡,Symbol CF 卡缺乏板载固件,它依靠设备驱动程序来下载固件。该驱动程序的一个单独版本适用于 CF 卡。Intel 将 Symbol PCMCIA 卡重新打包为 Intel PRO/Wireless 卡,而 Socket 通信重新打包了 Symbol CF 卡。 [52RD.com]
[52RD.com]
[52RD.com]
Atmel USB WLAN 驱动程序:利用 Atmel 芯片组支持许多 USB WLAN 设备。 [52RD.com]
[52RD.com]
[52RD.com]
请参阅 参考资料,获得这些设备的驱动程序信息。 [52RD.com]
Intersil Prism2 WLAN CF 卡[52RD.com]
我将讨论 Intersil Prism2 802.11b WLAN CF 卡来展示它如何与 Linux PCMCIA、网络设备及协议层一起工作。[52RD.com]
Linux PCMCIA/CF 层由 PCMCIA 主机控制器的设备驱动程序、不同卡的客户机驱动程序、用户模式程序、有助于热拔的后台进程和与以上各部分交互并为它们提供服务的内核卡服务中枢组成(请参阅 参考资料)。PCMCIA 控制器将卡连接到系统总线,将卡内存映射到主机 I/O 和内存窗口,并将卡产生的中断路由到自由处理器中断线。CF 卡较小,但与 PCMCIA 兼容,并且经常应用于手持设备。PCMCIA/CF 卡拥有两个存储空间: 属性内存(attribute memory)和 公共内存(common memory)。属性内存类似于 Card Information Structure (CIS),用来保存配置注册和描述符信息。Linux 卡服务核心与主机控制器设备驱动程序、卡设备驱动程序及用户模式 cardmgr 后台进程交互。它在一些事件(比如卡插入、卡移出以及低电量)发生时调用卡驱动程序的事件处理程序例程。尽管卡服务从卡的 CIS 向上传送信息到 cardmgr , 但是 cardmgr 将为分配内存窗口和中断级别而在用户空间(/etc/pcmcia/config.opts)中定义的资源分配策略向下传送到卡服务。查看 drivers/pcmcia/ds.c 可以了解与 cardmgr 交互的内核代码,查阅 /etc/pcmcia/config.opts 可以了解用户空间资源分配策略。 [52RD.com]
插入 Intersil WLAN CF 卡时,卡服务调用 orinoco_cs 模块的 PCMCIA 事件处理程序。卡服务解析卡属性内存中的 CIS 元组(tuples)并向上传送信息到 cardmgr ,这将从 /etc/pcmcia/config 文件(参阅清单 1)加载适当的设备驱动程序。由于卡的 CIS 中的 manfid 元组匹配 /etc/pcmcia/config 中的条目,所以 cardmgr 绑定带有 orinoco_cs 驱动程序的卡。清单 1 中的设备条目规定 orinoco_cs 驱动程序由三个内核模块组成: orinoco 、 orinoco_cs 和 hermes 。此外,由于设备属于 无线的(wireless) 一类,所以当启动和停止设备时, cardmgr 执行脚本 /etc/wireless/wireless。这个脚本使用 WLAN 工具和实用程序来配置设备驱动程序参数,例如 WEP 关键字和 SSID。它还可以启动 WLAN 上的网络协议,例如 DHCP(Dynamic Host Configuration Protocol,动态主机配置通讯协议)。清单 1 中的示例使用 Wireless Extensions 工具来执行设备配置。 [52RD.com]
注意: PCMCIA 配置文件的确切位置取决于所用的 Linux 分布。 [52RD.com]
清单 1. Intersil WLAN CF 卡的 PCMCIA 设备条目 [52RD.com]
card "Intersil PRISM2 11 Mbps Wireless Adapter"[52RD.com]
manfid 0x0156, 0x0002[52RD.com]
bind "orinoco_cs"[52RD.com]
        [52RD.com]
device "orinoco_cs"[52RD.com]
class "wireless" module "orinoco","orinoco_cs","hermes"[52RD.com]
      [52RD.com]
[52RD.com]
[52RD.com]
[52RD.com]
用 /etc/pcmcia/wireless 和 /etc/pcmcia/wireless.opts 脚本来配置 WEP 关键字和 SSID 这样的参数。[52RD.com]
清单 2. 配置 WLAN 特定参数 [52RD.com]
iwconfig ethX essid [52RD.com]
key AAAA-AAAA-AA [1] key BBBB-BBBB-BB [2] key CCCC-CCCC-CC [3] key DDDD-DDDD-DD [4][52RD.com]
                   : Set 64-bit WEP Keys and ESSID in the driver[52RD.com]
iwconfig ethX      : Display WLAN parameters[52RD.com]
iwpriv             : Get nongeneric, driver-specific parameters[52RD.com]
iwlist             : List Information and statistics from an interface[52RD.com]
iwspy              : Read quality of link for a set of addresses[52RD.com]
/proc/net/wireless : Wireless Statistics from the device driver[52RD.com]
[52RD.com]
[52RD.com]
[52RD.com]
[52RD.com]
在插入卡时, orinoco_cs 像传统的网络设备驱动程序一样,调用 register_netdev 来获得分配给 WLAN 接口的 ethX 网络接口名。它还会注册一个中断服务例程的地址以服务收发无线数据时产生的中断。中断处理程序是 orinoco 模块的一部分,并与 Linux 网络栈交互。Linux 网络栈使用主要的数据结构是 sk_buff 结构(定义在 include/linux/skbuff.h 中,请参阅 参考资料,该文件包括关于附加在它上的一个内存块的控制信息)。 sk_buffs 为所有网络层提供有效的缓冲器处理和流控制机制。网络设备驱动程序执行一个 dev_alloc_skb 和一个 skb_put ,以用 IP 数据填充一个 sk_buff ,然后通过调用 netif_rx 将这个 sk_buff 传送到 TCP/IP 栈。orinoco 中断服务例程用从 WLAN 接收的数据填充 sk_buffs ,并经由 netif_rx 将它传送到 IP 栈。 [52RD.com]
Linux TCP/IP 应用程序可以在前面谈到的内核模块为 Intersil WLAN CF 卡提供的网络接口上不加更改地运行。[52RD.com]
[52RD.com]
[52RD.com]
[52RD.com]
[52RD.com]
[52RD.com]
回页首[52RD.com]
[52RD.com]
[52RD.com]
[52RD.com]
[52RD.com]
Linux Bluetooth[52RD.com]
Bluetooth 是用于替换电缆的短程无线技术,支持 723 kbps(不对称)和 432 kbps(对称)的速度,可以传输数据和语音。Bluetooth 设备的传输范围大约 10 米(30 英尺)。(关于 Bluetooth 规范,请参阅 参考资料。) [52RD.com]
BlueZ 是官方 Linux Bluetooth 栈,由主机控制接口(Host Control Interface ,HCI)层、Bluetooth 协议核心、逻辑链路控制和适配协议(Logical Link Control and Adaptation Protocol,L2CAP)、SCO 音频层、其他 Bluetooth 服务、用户空间后台进程以及配置工具组成(请参阅 参考资料)。 [52RD.com]
Bluetooth 规范支持针对 Bluetooth HCI 数据分组的 UART(通用异步接收器/传送器)和 USB 传输机制。BlueZ 栈对这两个传输机制(drivers/Bluetooth/)都支持。BlueZ BNEP(Bluetooth 网络封装协议)实现了 Bluetooth 上的以太网仿真,这使 TCP/IP 可以直接运行于 Bluetooth 之上。BNEP 模块(net/bluetooth/bnep/)和用户模式 pand 后台进程实现了 Bluetooth 个人区域网(PAN)。BNEP 使用 register_netdev 将自己作为以太网设备注册到 Linux 网络层,并使用上面为 WLAN 驱动程序描述的 netif_rx 来填充 sk_buffs 并将其发送到协议栈。BlueZ RFCOMM(net/bluetooth/rfcomm/) 提供 Bluetooth 上的串行仿真,这使得串行端口应用程序(如 minicom)和协议(如点对点协议(PPP))不加更改地在 Bluetooth 上运行。RFCOMM 模块和用户模式 dund 后台进程实现了 Bluetooth 拨号网络。下面的列表给出了配置 Bluetooth 上的各种协议服务所必需的 BlueZ 模块、实用程序、后台进程以及配置文件。 [52RD.com]
下一步,考虑 Bluetooth CF 卡、Bluetooth USB 适配器、具有内置 CSR Bluetooth 芯片组的设备以及 Sony Bluetooth 耳机的示例,了解它们在 Linux 下是如何工作的。 [52RD.com]
Sharp Bluetooth CF 卡[52RD.com]
Sharp Bluetooth CF 卡使用 UART 传输器来传送 HCI 数据分组。除了 serial_cs 是与 Linux PCMCIA 核心交互的卡服务驱动程序之外,Linux PCMCIA/CF 层与 Sharp 卡的其他操作系统的交互类似于针对 Intersil WLAN CF 卡所解释的交互。 serial_cs 驱动程序(将在下面的 “GSM 上的 Linux GPRS 和数据”一节中做进一步解释)模拟了 Sharp CF 卡上的串行端口。BlueZ hci_uart 链接驱动程序与 Bluetooth UART 通道交互并将模拟的串行端口连接到 BlueZ 栈。 [52RD.com]
下面的列表给出了当卡插入时必须加载的模块。其他的 Bluetooth CF 卡,例如 Pretec CompactBT 卡和 Socket Bluetooth 卡,具有 UART 接口,但是又有各自的卡服务驱动程序(分别是 drivers/bluetooth/dtl1_cs.c 和 drivers/bluetooth/btuart_cs.c)。在本文后面,您将发现更多关于 Bluetooth UART 传输器的信息。[52RD.com]
/etc/pcmcia/config 中针对 Sharp Bluetooth CF 卡的条目: [52RD.com]
card "SHARP Bluetooth Card" [52RD.com]
version "SHARP", "Bluetooth Card" [52RD.com]
bind "serial_cs" [52RD.com]
将要加载的必需的内核模块: [52RD.com]
insmod serial_cs [52RD.com]
insmod bluez [52RD.com]
insmod l2cap [52RD.com]
insmod hci_uart [52RD.com]
insmod bnep (for pand) [52RD.com]
insmod rfcomm (for dund) [52RD.com]
BlueZ 用户空间后台进程、实用程序以及配置文件: [52RD.com]
hciattach ttySx any [baud_rate] [flow] [52RD.com]
hciconfig -a:检查 HCI 接口。 [52RD.com]
hcitool -a hci0 scan 'flush:发现其他设备。 [52RD.com]
hcidump:HCI 嗅探器。 [52RD.com]
hcid:HCI 后台进程。 [52RD.com]
/etc/bluetooth/hcid.conf:hcid 所用的 HCI 后台进程配置文件,它指定了链接模式(主或从)、链接策略、询问和扫描模式,等等。 [52RD.com]
/etc/bluetooth/pinDB:BlueZ PIN 数据库。 [52RD.com]
hcidump:Service Discovery Protocol 后台进程。 [52RD.com]
pand:在 Bluetooth 上运行 TCP/IP(--listen 用于服务器,--connect 用于客户机)。 [52RD.com]
/etc/bluetooth/pan/dev-up:pand 在激活 TCP/IP 时调用此脚本。此脚本能够包含一个类似于 ifconfig bnep0 的命令,用以为 Bluetooth 接口配置 IP 地址。 [52RD.com]
hcidump:在 Bluetooth RFCOMM 上运行 PPP(--listen 用于服务器,--connect 用于客户机)。 [52RD.com]
Belkin Bluetooth USB 适配器[52RD.com]
Belkin Bluetooth USB 适配器拥有一个 Bluetooth CSR 芯片组,并使用 USB 传输器来传输 HCI 数据分组。因此,Linux USB 层、BlueZ USB 传输器驱动程序以及 BlueZ 协议栈是使设备工作的主要内核层。现在,您将了解到三层之间如何交互以使 Linux 网络应用程序在这个设备上运行。[52RD.com]
Linux USB 子系统(请参阅 参考资料)类似于 PCMCIA 子系统,它们都有与移动设备交互的主机控制器设备驱动程序,并且都包含一个向主机控制器和单个设备的设备驱动程序提供服务的核心层。USB 主机控制器遵循两个标准之一:UHCI(通用主机控制器接口)或 OHCI(开放式主机控制器接口)。由于具有 PCMCIA,单个 USB 设备的 Linux 设备驱动程序不依赖于主机控制器。经由 USB 设备传输的数据分为四种类型(或管道): [52RD.com]
Control [52RD.com]
Interrupt [52RD.com]
Bulk [52RD.com]
Isochronous [52RD.com]
前两个通常用于小型消息而后两个则用于较大型的消息。[52RD.com]
USB 设备插入时,主机控制器使用控制管道来枚举它并给它分配设备地址(1 到 127)。主机控制器设备驱动程序读取的设备描述符包含关于设备的信息,例如 class、 subclass 和 protocol。Linux 的 usbcore 内核模块支持 USB 主机控制器和 USB 设备。并包含 USB 设备驱动程序可以使用的函数和数据结构。USB 驱动程序利用 usbcore 及自己的 class/subclass/protocol 信息(请参阅 include/linux/usb.h 中的 struct usb_driver )注册了两个入口点:probe 和 disconnect。当相应的 USB 设备被附加时, usbcore 用枚举期间从设备配置描述符中读取的 class 信息来匹配已注册的 class 信息,并将设备与相应的驱动程序绑定。这个核心使用一种叫做 USB Request Block 或 URB(在 include/linux/usb.h 中定义)的数据结构,来异步地管理主机和设备之间的数据传输。设备驱动程序使用这些例程来请求各种类型的数据传输(control、interrupt、bulk 或 isochronous)。传送请求完成后,核心会使用以前注册的回调函数来通知驱动程序。 [52RD.com]
针对 Bluetooth USB 设备而言,HCI 命令使用 Control 管道传输,HCI 事件使用 Interrupt 管道,Asynchronous (ACL) 数据使用 Bulk 管道,而 Synchronous (SCO) 音频数据使用 Isochronous 管道。Bluetooth 规范为 Bluetooth USB 设备定义了 class/subclass/protocol 代码 0xE/0x01/0x01 。BlueZ USB 传输驱动程序(drivers/bluetooth/hci_usb.c)将该 class/subclass/protocol 信息注册到 Linux USB 核心。Belkin USB 适配器插入时,主机控制器设备驱动程序会枚举它。因为在枚举期间从适配器读取的设备描述符与 hci_usb 驱动程序注册到 USB 核心的信息相匹配,所以这个驱动程序可附加到 Belkin USB 设备。由 hci_usb 驱动程序从以上描述的各个端点读取的 HCI、ACL 和 SCO 数据被透明传送到 BlueZ 协议栈。一旦做完这些,通过使用以上描述的 BlueZ 服务和工具,Linux TCP/IP 应用程序就可以运行在 BlueZ BNEP 上,而串行应用程序则可以运行在 BlueZ RFCOMM 上。 [52RD.com]
具有内置 CSR Bluetooth 芯片组的母板[52RD.com]
现在,关注一下具有内置 Bluetooth 芯片组的设备上的 Bluetooth 网络数据流。考虑一种拥有内置 CSR Bluetooth 芯片组的手持设备与使用 UART 接口的系统的连接。针对 UART 接口而言,在 Bluetooth 设备和系统之间传输 HCI 数据分组的可用协议有 BlueCore Serial Protocol (BCSP)、H4/UART 和 H3/RS232。而 H4 充当通过 UART 传输 Bluetooth 数据的标准方法。UART 是在规范中定义的来自 CSR 的专有 BCSP 协议,支持错误校验和重传。BCSP 用在基于 CSR BlueCore 芯片的非 USB 设备上,包括 PCMCIA 和 CF 卡。BlueZ 支持 BCSP 和 H4。[52RD.com]
这个母板的 UART 通道使用的传统串行驱动程序可以从 BlueZ UART 传输驱动程序上收发数据。如果使用 BSCP 协议将 CSR 芯片设计为封装 HCI 数据分组,您必须使用 hciattach ( hciattach ttySx bcsp ) 通知 BlueZ 链接驱动程序,在这里 x 是连接到 CSR 芯片组的 UART 通道号。现在 hci_uart 与 CSR 芯片交互并且传送 Bluetooth 数据往返于 BlueZ 栈。 [52RD.com]
Sony HBH-30 Bluetooth 耳机[52RD.com]
前面的 Bluetooth 设备示例展示了网络数据流。现在,通过查看 Sony Ericsson Bluetooth 耳机来考虑 Bluetooth 音频 (SCO) 数据的传输。在耳机可以开始与 Linux 设备通信以前,它必须被 Linux 设备上的 Bluetooth 链路层检测出来。因此,您必须将耳机置于发现模式(通过按下耳机上的一个按钮)。另外,您需要通过 Linux 设备上的 BlueZ 配置耳机的 PIN。Linux Bluetooth 设备上使用 BlueZ SCO API 的应用程序现在可以发送音频数据到耳机上。音频数据应当是耳机 可以理解的格式(例如,Sony 耳机的 A-law PCM [Pulse Code Modulation] 格式)。有些公共主域实用程序可以将音频(甚至文本文件)转换为各种 PCM 格式。 [52RD.com]
Bluetooth 芯片组除拥有 HCI 传输接口以外还有 PCM 接口 PIN。例如,如果设备同时支持 GSM 和 Bluetooth,GSM 芯片组的 PCM 线路可以直接与 Bluetooth 芯片的 PCM 音频线路连接。然后,您可能不得不在 Linux 设备上配置 Bluetooth 芯片组,以通过 HCI 传输接口而不是 PCM 接口收发 SCO 音频数据分组。[52RD
1楼 0 0 回复