Linux Bluetooth Bluetooth 是用於替換電纜的短程無線技術,支持 723 kbps(不對稱)和 432 kbps(對稱)的速度,可以傳輸數據和語音。Bluetooth 設備的傳輸范圍大約 10 米(30 英尺)。 BlueZ 是官方 Linux Bluetooth 棧,由主機控制接口(Host Control Interface ,HCI)層、Bluetooth 協議核心、邏輯鏈路控制和適配協議(Logical Link Control and Adaptation Protocol,L2CAP)、SCO 音頻層、其他 Bluetooth 服務、用戶空間後台進程以及配置工具組成。 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 模塊、實用程序、後台進程以及配置文件。 下一步,考慮 Bluetooth CF 卡、Bluetooth USB 適配器、具有內置 CSR Bluetooth 芯片組的設備以及 Sony Bluetooth 耳機的示例,了解它們在 Linux 下是如何工作的。
Sharp Bluetooth CF 卡 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 棧。 下面的列表給出了當卡插入時必須加載的模塊。其他的 Bluetooth CF 卡,例如 Pretec CompactBT 卡和 Socket Bluetooth 卡,具有 UART 接口,但是又有各自的卡服務驅動程序(分別是 drivers/bluetooth/dtl1_cs.c 和 drivers/bluetooth/btuart_cs.c)。在本文後面,您將發現更多關於 Bluetooth UART 傳輸器的信息。 /etc/pcmcia/config 中針對 Sharp Bluetooth CF 卡的條目: card "SHARP Bluetooth Card" version "SHARP", "Bluetooth Card" bind "serial_cs" 將要加載的必需的內核模塊: insmod serial_cs insmod bluez insmod l2cap insmod hci_uart insmod bnep (for pand) insmod rfcomm (for dund) BlueZ 用戶空間後台進程、實用程序以及配置文件: hciattach ttySx any [baud_rate] [flow] hciconfig -a:檢查 HCI 接口。 hcitool -a hci0 scan 'flush:發現其他設備。 hcidump:HCI 嗅探器。 hcid:HCI 後台進程。 /etc/bluetooth/hcid.conf:hcid 所用的 HCI 後台進程配置文件,它指定了鏈接模式(主或從)、鏈接策略、詢問和掃描模式,等等。 /etc/bluetooth/pinDB:BlueZ PIN 數據庫。 hcidump:Service Discovery Protocol 後台進程。 pand:在 Bluetooth 上運行 TCP/IP(--listen 用於服務器,--connect 用於客戶機)。 /etc/bluetooth/pan/dev-up:pand 在激活 TCP/IP 時調用此腳本。此腳本能夠包含一個類似於 ifconfig bnep0 的命令,用以為 Bluetooth 接口配置 IP 地址。 hcidump:在 Bluetooth RFCOMM 上運行 PPP(--listen 用於服務器,--connect 用於客戶機)。
Belkin Bluetooth USB 適配器 Belkin Bluetooth USB 適配器擁有一個 Bluetooth CSR 芯片組,並使用 USB 傳輸器來傳輸 HCI 數據分組。因此,Linux USB 層、BlueZ USB 傳輸器驅動程序以及 BlueZ 協議棧是使設備工作的主要內核層。現在,您將了解到三層之間如何交互以使 Linux 網絡應用程序在這個設備上運行。 Linux USB 子系統類似於 PCMCIA 子系統,它們都有與移動設備交互的主機控制器設備驅動程序,並且都包含一個向主機控制器和單個設備的設備驅動程序提供服務的核心層。USB 主機控制器遵循兩個標准之一:UHCI(通用主機控制器接口)或 OHCI(開放式主機控制器接口)。由於具有 PCMCIA,單個 USB 設備的 Linux 設備驅動程序不依賴於主機控制器。經由 USB 設備傳輸的數據分為四種類型(或管道): Control Interrupt Bulk Isochronous 前兩個通常用於小型消息而後兩個則用於較大型的消息。 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)。傳送請求完成後,核心會使用以前注冊的回調函數來通知驅動程序。 針對 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 上。 具有內置 CSR Bluetooth 芯片組的母板 現在,關注一下具有內置 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。 這個母板的 UART 通道使用的傳統串行驅動程序可以從 BlueZ UART 傳輸驅動程序上收發數據。如果使用 BSCP 協議將 CSR 芯片設計為封裝 HCI 數據分組,您必須使用 hciattach (hciattach ttySx bcsp) 通知 BlueZ 鏈接驅動程序,在這裡 x 是連接到 CSR 芯片組的 UART 通道號。現在 hci_uart 與 CSR 芯片交互並且傳送 Bluetooth 數據往返於 BlueZ 棧。
Sony HBH-30 Bluetooth 耳機 前面的 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 格式。 Bluetooth 芯片組除擁有 HCI 傳輸接口以外還有 PCM 接口 PIN。例如,如果設備同時支持 GSM 和 Bluetooth,GSM 芯片組的 PCM 線路可以直接與 Bluetooth 芯片的 PCM 音頻線路連接。然後,您可能不得不在 Linux 設備上配置 Bluetooth 芯片組,以通過 HCI 傳輸接口而不是 PCM 接口收發 SCO 音頻數據分組。