通过蓝牙和GPRS随时随地在线

作者:Sreekrishnan Venkiteswara

蓝牙和通用分组无线服务 (GPRS) 如今被广泛用于使移动设备可以访问互联网。蓝牙是一种短距离无线技术,由于其低成本和低功耗,几乎可以成为任何设备的一部分,GPRS 提供始终在线的互联网连接。

蓝牙和 GPRS 可以为您的 PDA 或笔记本电脑提供独立的网络连接。蓝牙漫游使您在建筑物楼层之间移动设备时能够保持持续连接,而 GPRS 漫游则在您在路上并从一个服务提供商区域移动到另一个服务提供商区域时保持您的互联网连接。图 1 描述了其中一些场景。

Getting On-line Anywhere with Bluetooth and GPRS

图 1. 通过蓝牙和GPRS随时随地在线

由于 Linux 运行在各种嵌入式设备上,包括支持蓝牙的消费电子设备、GPRS 手机和支持无线的 PDA,因此讨论 Linux 如何与蓝牙和 GPRS 协同工作对于使用和设计此类设备可能有所帮助。

Linux 蓝牙

蓝牙是一种使用射频进行无线通信的协议,最初被设想为电缆的替代品。它支持 723 kbps(非对称)和 432 kbps(对称)的速度,可用于传输数据和语音。蓝牙设备的范围约为 10 米(30 英尺)。

BlueZ 是官方的 Linux 蓝牙协议栈。尽管 Linux 上还有其他流行的蓝牙实现,例如 Affix 栈,但本节的其余部分将专门介绍 BlueZ。

BlueZ 支持核心蓝牙协议,包括主机控制接口 (HCI)、逻辑链路控制和适配协议 (L2CAP)、个人区域网络 (PAN)、服务发现协议 (SDP)、同步连接定向 (SCO) 音频和串行端口仿真 (RFCOMM)。它还捆绑了许多用户空间守护程序和配置工具。

BlueZ 支持蓝牙规范中描述的不同用户配置文件。BlueZ BNEP(蓝牙网络封装协议)实现了以太网仿真,这使得 TCP/IP 可以直接通过蓝牙运行。BNEP 模块与用户模式守护程序 pand 一起实现了蓝牙 PAN。BlueZ RFCOMM 允许串行端口应用程序(如终端仿真器)和协议(如点对点协议 (PPP))在蓝牙上保持不变地运行。RFCOMM 模块与用户模式守护程序 dund 一起实现了蓝牙拨号网络。

蓝牙规范定义了使用 UART 和 USB 传输机制在蓝牙设备和主机系统之间传输 HCI 数据包。对于 UART 接口,可用于封装 HCI 数据包的主要协议是 H4/UART 和蓝牙核心串行协议 (BCSP)。H4 是通过 UART 接口传输蓝牙数据的标准方法,而 BCSP 是 CSR 的专有协议,支持错误检查和重传。BlueZ 同时支持 H4 和 BCSP。如果您的板上使用的蓝牙芯片具有连接到主机处理器的 UART 接口,并且已编程为使用 BCSP 封装 HCI 数据包,则您需要将此信息告知 BlueZ 协议栈。使用 hciattach 执行此操作hciattach ttySx bcsp,其中x是连接到蓝牙芯片的 UART 通道号。BlueZ UART 链路驱动程序 hci_uart 现在使用 BCSP 与芯片通信,并在 BlueZ 协议栈之间来回传递蓝牙数据。

BlueZ 还具有链路驱动程序 hci_usb,它支持 USB 蓝牙设备。该驱动程序使用 Linux 内核 USB 核心提供的服务和数据结构来异步管理主机和蓝牙 USB 设备之间的数据传输。根据蓝牙规范,hci_usb 驱动程序使用相应的 USB 管道——控制、中断、同步或批量——来传输不同类型的蓝牙数据——HCI 命令、HCI 事件、SCO 音频或异步无连接数据)。Belkin 蓝牙 USB 适配器是与 BlueZ 兼容的蓝牙 USB 设备示例。

BlueZ 还支持将音频数据传输到蓝牙耳机等设备。主机蓝牙设备上的应用程序使用 BlueZ SCO API 将音频数据发送到耳机。通过 SCO API 泵送的音频数据必须是耳机可以理解的格式,例如,A-law 脉冲编码调制 (PCM) 格式用于索尼爱立信 HBH-30 蓝牙耳机。如果您的主机设备上的蓝牙芯片组具有连接到另一个音频源的 PCM 接口,您可能需要配置芯片组以通过其 HCI 接口而不是通过其 PCM 接口接收 SCO 音频。

BlueZ 实用程序可用于设置蓝牙连接。例如,hcitool 实用程序可用于启动查询过程并发现范围内的设备的名称和蓝牙地址。然后,您可以使用 pand 或 dund 设置与已发现的蓝牙设备的 PAN 或拨号连接。sdptool 程序可用于注册或搜索服务,例如打印或联网。下面列出了重要的 BlueZ 用户空间守护程序、实用程序和内核模块,以及每个程序的简要说明

  • hciconfig --a:检查 HCI 接口。

  • hcitool -f hci0 scan --flush:发现范围内的其他蓝牙设备。

  • hciattach ttySx any [baud]:将封装方法(H4、BCSP)、波特率和流控制机制附加到连接到蓝牙设备的串行端口。

  • hcidump:HCI 嗅探器。

  • hcid:HCI 守护程序。

  • /etc/bluetooth/hcid.conf:hcid 使用的 HCI 守护程序配置文件,用于指定链路模式(主或从)、链路策略、查询和扫描模式等。

  • /etc/bluetooth/pinDB:BlueZ PIN 数据库。

  • sdpd:服务发现协议守护程序。

  • pand:通过蓝牙运行 TCP/IP(--listen 用于服务器,--connect<bluetooth_address> 用于客户端)。

  • /etc/bluetooth/pan/dev-up:pand 在启动 TCP/IP 时调用此脚本。此脚本可以包含类似以下的命令ifconfig bnep0<ip_address>up以使用 IP 地址配置蓝牙接口。

  • dund:通过蓝牙 RFCOMM 运行 PPP(--listen 用于服务器,--connect<bluetooth_address> 用于客户端)。

BlueZ 内核模块

  • bluez:BlueZ 核心层。

  • l2cap:L2CAP 实现。

  • hci_uart:UART 传输驱动程序(支持 H4/BCSP)。

  • hci_usb:USB 传输驱动程序。

  • bnep:以太网仿真(与 pand 一起使用)。

  • rfcomm:串行端口仿真。

  • SCO:支持通过蓝牙传输语音。

蓝牙设备示例

夏普蓝牙 CF 卡使用 UART 传输来传输 HCI 数据包。serial_cs 是用于访问 PCMCIA 串行设备的通用卡服务驱动程序,它在夏普 CF 卡上模拟串行端口。第一个未使用的串行设备 (/dev/ttySx) 分配给该卡。当插入夏普蓝牙 CF 卡时,内核 PCMCIA 卡服务模块会解析驻留在卡属性内存中的卡信息结构 (CIS) 元组,并将它们传递给用户模式 cardmgr 守护程序。

由于卡 CIS 中的制造商 ID 元组与 PCMCIA 配置文件 /etc/pcmcia/config 中的条目匹配(如列表 1 所示),cardmgr 将卡绑定到 serial_cs 设备。然后,卡服务调用 serial_cs 模块的 PCMCIA 事件处理程序并发出卡插入事件信号,该事件配置套接字并使卡可供系统使用。此外,由于该设备属于蓝牙类,cardmgr 在启动和停止设备时执行脚本 /etc/pcmcia/bluetooth;所有配置文件的确切位置取决于所使用的 Linux 发行版。此脚本可以执行许多操作,包括加载上面列出的 BlueZ 内核模块并将 BlueZ 协议栈附加到分配给该卡的虚拟串行端口。

列表 1. /etc/pcmcia/config 中夏普蓝牙 CF 卡的条目

card "SHARP Bluetooth Card"
     manfid 0x00b0, 0x0001
     bind "serial_cs"
 
device "serial_cs"
    class "Bluetooth" module "serial_cs"

板载的旧式 UART 设备驱动程序以及蓝牙 N_HCI 线路规程用于驱动在卡上模拟的串行端口。线路规程是位于串行驱动程序之上的内核层,它控制串行驱动程序的行为方式。同一个串行驱动程序可以用于不同的目的——终端仿真、PPP、SLIP、蓝牙——分别在串行驱动程序之上粘合不同的线路规程——N_TTY、N_PPP、N_SLIP、N_HCI。当夏普卡收到数据时,旧式 UART 驱动程序的接收中断服务例程会调用 N_HCI 线路规程注册的接收入口点,后者又调用相应 HCI 传输协议的接收函数。在这种情况下,它是 h4_receive,因为 H4 协议用于封装。此例程分配并填充 skbuff(Linux 网络协议栈使用的关键数据结构),并将其传递给 BlueZ。如果数据属于 IP 数据报,BlueZ BNEP 代码随后通过调用 netif_rx 将其传递给 TCP/IP 层。

某些 PCMCIA/CF 蓝牙卡(例如 Socket 蓝牙 CF 卡)具有特定的 BlueZ 卡服务设备驱动程序,可直接控制卡中的 UART 并将数据传输到 HCI 层。例如,Socket 蓝牙卡围绕 Nokia 蓝牙芯片组构建,使用 dtl1_cs 卡服务驱动程序。在这种情况下,数据流不会通过旧式串行驱动程序或 N_HCI 线路规程。相反,作为 dtl1_cs 一部分的 PCMCIA 中断处理程序分配 skbuff 并用接收到的蓝牙数据填充它们。通过 BlueZ 协议栈的其余代码流与针对夏普卡描述的代码流类似。具有特定 BlueZ 卡服务驱动程序的设备的另一个示例是 Pretec CompactBT 蓝牙卡,它具有一个名为 bt950_cs 的驱动程序。

蓝牙漫游

当蓝牙与 GPRS 结合使用以使哑设备支持网络时,支持蓝牙的 GPRS 手机通常充当网络的网关。但是,当蓝牙用作独立互联网连接的手段时,网络流量将通过蓝牙接入点路由。

接入点是蓝牙网关,通常支持额外的网络接口,例如以太网或 DSL。通常,接入点也可以充当 DHCP 服务器并在蓝牙侧分配 IP 地址。

当您携带蓝牙设备在建筑物内走动时,您可能会移出某个接入点的范围并进入另一个接入点的范围。根据链路质量(可以使用 HCI 命令查询),您的移动设备可以通过切换到新的接入点来保持与固定网络上的计算机的持续连接。为了为不同的更高层网络协议保持无缝漫游,您可能需要在设备上实现额外的软件层。但是,当您的设备切换到新的接入点时,通过发送新的 DHCP 请求可以保持持续的 Web 浏览功能。

Linux GPRS

GPRS 是一种分组服务,用于通过 GSM(主要的数字蜂窝标准)传输数据。GPRS 数据是一种始终连接的、分组交换的数据流,用户根据使用量付费。GPRS 的运行速度为 56 kbps 到 170 kbps。GPRS 网络通过 GGSN(网关 GPRS 支持节点)连接到互联网,如图 1 所示。

GPRS 设备通常具有连接到主机系统的 UART 接口。例如,某些手机具有连接到板载 UART 通道的西门子 MC-45 芯片组。然后,可以使用旧式串行设备驱动程序与 GPRS 设备通信。对于具有 PCMCIA/CF 外形尺寸的 GPRS 卡(例如 Options GPRS 卡),可以使用前面讨论的通用串行卡服务驱动程序,使内核将该卡视为串行设备。对于 USB GPRS 调制解调器,USB 到串行转换器通常将 USB 端口转换为虚拟串行端口,因此系统的其余部分将其视为串行设备。

GPRS 设备类似于具有扩展 AT 命令集的调制解调器。GPRS 设备必须在使用 AT 命令进入数据模式之前定义上下文。上下文字符串示例如下

AT+CGDCONT=1,"IP","internet2.voicestream.com","0.0.0.0",0,0

其中 1 代表上下文编号,IP 是数据包类型,internet2.voicestream.com 是 GPRS 服务提供商特定的接入点名称 (APN) 字符串,0.0.0.0 表示服务提供商分配您的 IP 地址。其余参数与标头和数据压缩有关。通常不需要用户名和密码。APN 字符串取决于所需的服务类型。您需要使用一个 APN 用于基于 GPRS 的互联网,但使用另一个 APN 用于浏览专用的无线应用协议 (WAP) 内容。

PPP 使 TCP/IP 等网络协议可以通过串行链路运行。调用 Linux PPP 守护程序 pppd 的常用语法是

pppd ttySx call connection-script

其中 ttySx 是 PPP 运行的物理或虚拟串行设备,connection-script 是 /etc/ppp/peers/ 目录中的文件,其中包含 pppd 和服务提供商之间交换的 AT 命令序列,以便建立链路。建立链路连接并完成身份验证后,PPP 启动网络控制协议 (NCP)。互联网协议控制协议 (IPCP) 是用于运行 IP 的 NCP。一旦 IPCP 成功协商 IP 地址,PPP 就开始与 TCP/IP 协议栈通信。您的设备现在已准备好通过 GPRS 链路运行 TCP/IP 应用程序。列表 2 是用于将您的设备连接到 GPRS 服务提供商的示例 PPP 连接脚本。

列表 2. 用于 GPRS 的示例 Linux 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

运行 PPP 需要加载的 Linux 内核模块如下

  • ppp_generic:通用 PPP 层。

  • ppp_async:PPP 异步串行通道线路规程 (N_PPP)。

  • slhc:TCP 数据包的压缩/解压缩。

  • ppp_deflate:deflate PPP 压缩。

要获取您当前位置的服务提供商列表,您可以发出AT+COPS=?命令到 GPRS 模块。为了保持持续连接,Linux 应用程序可以监控当前区域中可用的服务提供商,并在认为有必要切换时使用新服务提供商的 connection-script 重新启动 PPP 会话。

桥接蓝牙和 GPRS

具有集成蓝牙和 GPRS 功能的手机或 PDA 可以通过不同的方式为蓝牙设备提供互联网访问

  • 手机通过蓝牙拨号 (RFCOMM) 连接与蓝牙设备通信,并在 RFCOMM 连接和其 GPRS 接口之间管道传输数据。蓝牙设备通过 RFCOMM 链路发送 GPRS 命令,直接建立与 GPRS 服务提供商的 PPP 连接。

  • 手机通过 GPRS 服务提供商使用 PPP 建立互联网连接。它通过 PAN 连接与蓝牙设备通信,并在蓝牙和 GPRS 接口之间路由 TCP/IP 数据包。

  • 手机支持一些蓝牙通用对象交换配置文件,蓝牙设备可以使用这些配置文件来传输对象,例如文件或图像。

由于蓝牙支持设备查询和服务发现,蓝牙设备可以自动使用附近的手机进行互联网连接,而无需繁琐地配置物理地址等详细信息。

结论

集成到 GPRS 手机中的蓝牙技术将互联网扩展到支持蓝牙的消费电子设备。此外,由于 CF 和 USB 外形尺寸的 GPRS 和蓝牙设备的广泛可用性,手持计算机和笔记本电脑可以利用这些技术在移动中实现独立的网络连接。随着 Linux 为这两种技术提供稳定的支持,以及许多嵌入式设备运行 Linux,一个广阔的可能世界正在打开。

Sreekrishnan Venkateswaran 自 1996 年以来一直在 IBM 印度公司工作。他拥有印度坎普尔印度理工学院计算机科学硕士学位。他的兴趣包括设计设备驱动程序和网络协议。

加载 Disqus 评论