Linux Bluetooth
Bluetooth 是用于替換電纜的短程無線技術(shù),支持 723 kbps(不對稱)和 432 kbps(對稱)的速度,可以傳輸數(shù)據(jù)和語音。Bluetooth 設(shè)備的傳輸范圍大約 10 米(30 英尺)。
BlueZ 是官方 Linux Bluetooth 棧,由主機控制接口(Host Control Interface ,HCI)層、Bluetooth 協(xié)議核心、邏輯鏈路控制和適配協(xié)議(Logical Link Control and Adaptation Protocol,L2CAP)、SCO 音頻層、其他 Bluetooth 服務(wù)、用戶空間后臺進程以及配置工具組成。
Bluetooth 規(guī)范支持針對 Bluetooth HCI 數(shù)據(jù)分組的 UART(通用異步接收器/傳送器)和 USB 傳輸機制。BlueZ 棧對這兩個傳輸機制(drivers/Bluetooth/)都支持。BlueZ BNEP(Bluetooth 網(wǎng)絡(luò)封裝協(xié)議)實現(xiàn)了 Bluetooth 上的以太網(wǎng)仿真,這使 TCP/IP 可以直接運行于 Bluetooth 之上。BNEP 模塊(net/bluetooth/bnep/)和用戶模式 pand 后臺進程實現(xiàn)了 Bluetooth 個人區(qū)域網(wǎng)(PAN)。BNEP 使用 register_netdev 將自己作為以太網(wǎng)設(shè)備注冊到 Linux 網(wǎng)絡(luò)層,并使用上面為 WLAN 驅(qū)動程序描述的 netif_rx 來填充 sk_buffs 并將其發(fā)送到協(xié)議棧。BlueZ RFCOMM(net/bluetooth/rfcomm/) 提供 Bluetooth 上的串行仿真,這使得串行端口應(yīng)用程序(如 minicom)和協(xié)議(如點對點協(xié)議(PPP))不加更改地在 Bluetooth 上運行。RFCOMM 模塊和用戶模式 dund 后臺進程實現(xiàn)了 Bluetooth 撥號網(wǎng)絡(luò)。下面的列表給出了配置 Bluetooth 上的各種協(xié)議服務(wù)所必需的 BlueZ 模塊、實用程序、后臺進程以及配置文件。
下一步,考慮 Bluetooth CF 卡、Bluetooth USB 適配器、具有內(nèi)置 CSR Bluetooth 芯片組的設(shè)備以及 Sony Bluetooth 耳機的示例,了解它們在 Linux 下是如何工作的。
Sharp Bluetooth CF 卡
Sharp Bluetooth CF 卡使用 UART 傳輸器來傳送 HCI 數(shù)據(jù)分組。除了 serial_cs 是與 Linux PCMCIA 核心交互的卡服務(wù)驅(qū)動程序之外,Linux PCMCIA/CF 層與 Sharp 卡的其他操作系統(tǒng)的交互類似于針對 Intersil WLAN CF 卡所解釋的交互。serial_cs 驅(qū)動程序(將在下面的 “GSM 上的 Linux GPRS 和數(shù)據(jù)”一節(jié)中做進一步解釋)模擬了 Sharp CF 卡上的串行端口。BlueZ hci_uart 鏈接驅(qū)動程序與 Bluetooth UART 通道交互并將模擬的串行端口連接到 BlueZ 棧。
下面的列表給出了當卡插入時必須加載的模塊。其他的 Bluetooth CF 卡,例如 Pretec CompactBT 卡和 Socket Bluetooth 卡,具有 UART 接口,但是又有各自的卡服務(wù)驅(qū)動程序(分別是 drivers/bluetooth/dtl1_cs.c 和 drivers/bluetooth/btuart_cs.c)。在本文后面,您將發(fā)現(xiàn)更多關(guān)于 Bluetooth UART 傳輸器的信息。
/etc/pcmcia/config 中針對 Sharp Bluetooth CF 卡的條目:
card "SHARP Bluetooth Card"
version "SHARP", "Bluetooth Card"
bind "serial_cs"
將要加載的必需的內(nèi)核模塊:
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:發(fā)現(xiàn)其他設(shè)備。
hcidump:HCI 嗅探器。
hcid:HCI 后臺進程。
/etc/bluetooth/hcid.conf:hcid 所用的 HCI 后臺進程配置文件,它指定了鏈接模式(主或從)、鏈接策略、詢問和掃描模式,等等。
/etc/bluetooth/pinDB:BlueZ PIN 數(shù)據(jù)庫。
hcidump:Service Discovery Protocol 后臺進程。
pand:在 Bluetooth 上運行 TCP/IP(--listen 用于服務(wù)器,--connect 用于客戶機)。
/etc/bluetooth/pan/dev-up:pand 在激活 TCP/IP 時調(diào)用此腳本。此腳本能夠包含一個類似于 ifconfig bnep0 的命令,用以為 Bluetooth 接口配置 IP 地址。
hcidump:在 Bluetooth RFCOMM 上運行 PPP(--listen 用于服務(wù)器,--connect 用于客戶機)。
Belkin Bluetooth USB 適配器
Belkin Bluetooth USB 適配器擁有一個 Bluetooth CSR 芯片組,并使用 USB 傳輸器來傳輸 HCI 數(shù)據(jù)分組。因此,Linux USB 層、BlueZ USB 傳輸器驅(qū)動程序以及 BlueZ 協(xié)議棧是使設(shè)備工作的主要內(nèi)核層,F(xiàn)在,您將了解到三層之間如何交互以使 Linux 網(wǎng)絡(luò)應(yīng)用程序在這個設(shè)備上運行。
Linux USB 子系統(tǒng)類似于 PCMCIA 子系統(tǒng),它們都有與移動設(shè)備交互的主機控制器設(shè)備驅(qū)動程序,并且都包含一個向主機控制器和單個設(shè)備的設(shè)備驅(qū)動程序提供服務(wù)的核心層。USB 主機控制器遵循兩個標準之一:UHCI(通用主機控制器接口)或 OHCI(開放式主機控制器接口)。由于具有 PCMCIA,單個 USB 設(shè)備的 Linux 設(shè)備驅(qū)動程序不依賴于主機控制器。經(jīng)由 USB 設(shè)備傳輸?shù)臄?shù)據(jù)分為四種類型(或管道):
Control
Interrupt
Bulk
Isochronous
前兩個通常用于小型消息而后兩個則用于較大型的消息。
USB 設(shè)備插入時,主機控制器使用控制管道來枚舉它并給它分配設(shè)備地址(1 到 127)。主機控制器設(shè)備驅(qū)動程序讀取的設(shè)備描述符包含關(guān)于設(shè)備的信息,例如 class、subclass 和 protocol。Linux 的 usbcore 內(nèi)核模塊支持 USB 主機控制器和 USB 設(shè)備。并包含 USB 設(shè)備驅(qū)動程序可以使用的函數(shù)和數(shù)據(jù)結(jié)構(gòu)。USB 驅(qū)動程序利用 usbcore 及自己的 class/subclass/protocol 信息(請參閱 include/linux/usb.h 中的 struct usb_driver)注冊了兩個入口點:probe 和 disconnect。當相應(yīng)的 USB 設(shè)備被附加時,usbcore 用枚舉期間從設(shè)備配置描述符中讀取的 class 信息來匹配已注冊的 class 信息,并將設(shè)備與相應(yīng)的驅(qū)動程序綁定。這個核心使用一種叫做 USB Request Block 或 URB(在 include/linux/usb.h 中定義)的數(shù)據(jù)結(jié)構(gòu),來異步地管理主機和設(shè)備之間的數(shù)據(jù)傳輸。設(shè)備驅(qū)動程序使用這些例程來請求各種類型的數(shù)據(jù)傳輸(control、interrupt、bulk 或 isochronous)。傳送請求完成后,核心會使用以前注冊的回調(diào)函數(shù)來通知驅(qū)動程序。
針對 Bluetooth USB 設(shè)備而言,HCI 命令使用 Control 管道傳輸,HCI 事件使用 Interrupt 管道,Asynchronous (ACL) 數(shù)據(jù)使用 Bulk 管道,而 Synchronous (SCO) 音頻數(shù)據(jù)使用 Isochronous 管道。Bluetooth 規(guī)范為 Bluetooth USB 設(shè)備定義了 class/subclass/protocol 代碼 0xE/0x01/0x01。BlueZ USB 傳輸驅(qū)動程序(drivers/bluetooth/hci_usb.c)將該 class/subclass/protocol 信息注冊到 Linux USB 核心。Belkin USB 適配器插入時,主機控制器設(shè)備驅(qū)動程序會枚舉它。因為在枚舉期間從適配器讀取的設(shè)備描述符與 hci_usb 驅(qū)動程序注冊到 USB 核心的信息相匹配,所以這個驅(qū)動程序可附加到 Belkin USB 設(shè)備。由 hci_usb 驅(qū)動程序從以上描述的各個端點讀取的 HCI、ACL 和 SCO 數(shù)據(jù)被透明傳送到 BlueZ 協(xié)議棧。一旦做完這些,通過使用以上描述的 BlueZ 服務(wù)和工具,Linux TCP/IP 應(yīng)用程序就可以運行在 BlueZ BNEP 上,而串行應(yīng)用程序則可以運行在 BlueZ RFCOMM 上。
具有內(nèi)置 CSR Bluetooth 芯片組的母板
現(xiàn)在,關(guān)注一下具有內(nèi)置 Bluetooth 芯片組的設(shè)備上的 Bluetooth 網(wǎng)絡(luò)數(shù)據(jù)流?紤]一種擁有內(nèi)置 CSR Bluetooth 芯片組的手持設(shè)備與使用 UART 接口的系統(tǒng)的連接。針對 UART 接口而言,在 Bluetooth 設(shè)備和系統(tǒng)之間傳輸 HCI 數(shù)據(jù)分組的可用協(xié)議有 BlueCore Serial Protocol (BCSP)、H4/UART 和 H3/RS232。而 H4 充當通過 UART 傳輸 Bluetooth 數(shù)據(jù)的標準方法。UART 是在規(guī)范中定義的來自 CSR 的專有 BCSP 協(xié)議,支持錯誤校驗和重傳。BCSP 用在基于 CSR BlueCore 芯片的非 USB 設(shè)備上,包括 PCMCIA 和 CF 卡。BlueZ 支持 BCSP 和 H4。
這個母板的 UART 通道使用的傳統(tǒng)串行驅(qū)動程序可以從 BlueZ UART 傳輸驅(qū)動程序上收發(fā)數(shù)據(jù)。如果使用 BSCP 協(xié)議將 CSR 芯片設(shè)計為封裝 HCI 數(shù)據(jù)分組,您必須使用 hciattach (hciattach ttySx bcsp) 通知 BlueZ 鏈接驅(qū)動程序,在這里 x 是連接到 CSR 芯片組的 UART 通道號,F(xiàn)在 hci_uart 與 CSR 芯片交互并且傳送 Bluetooth 數(shù)據(jù)往返于 BlueZ 棧。
Sony HBH-30 Bluetooth 耳機
前面的 Bluetooth 設(shè)備示例展示了網(wǎng)絡(luò)數(shù)據(jù)流,F(xiàn)在,通過查看 Sony Ericsson Bluetooth 耳機來考慮 Bluetooth 音頻 (SCO) 數(shù)據(jù)的傳輸。在耳機可以開始與 Linux 設(shè)備通信以前,它必須被 Linux 設(shè)備上的 Bluetooth 鏈路層檢測出來。因此,您必須將耳機置于發(fā)現(xiàn)模式(通過按下耳機上的一個按鈕)。另外,您需要通過 Linux 設(shè)備上的 BlueZ 配置耳機的 PIN。Linux Bluetooth 設(shè)備上使用 BlueZ SCO API 的應(yīng)用程序現(xiàn)在可以發(fā)送音頻數(shù)據(jù)到耳機上。音頻數(shù)據(jù)應(yīng)當是耳機 可以理解的格式(例如,Sony 耳機的 A-law PCM [Pulse Code Modulation] 格式)。有些公共主域?qū)嵱贸绦蚩梢詫⒁纛l(甚至文本文件)轉(zhuǎn)換為各種 PCM 格式。
Bluetooth 芯片組除擁有 HCI 傳輸接口以外還有 PCM 接口 PIN。例如,如果設(shè)備同時支持 GSM 和 Bluetooth,GSM 芯片組的 PCM 線路可以直接與 Bluetooth 芯片的 PCM 音頻線路連接。然后,您可能不得不在 Linux 設(shè)備上配置 Bluetooth 芯片組,以通過 HCI 傳輸接口而不是 PCM 接口收發(fā) SCO 音頻數(shù)據(jù)分組。
摘自 賽迪網(wǎng)