2010年1月26日 星期二

linux bluetooth

Linux Bluetooth

Bluetooth 是用於替換電纜的短程無線技術,支援 723 kbps(不對稱)和 432 kbps(對稱)的速度,可以傳輸資料和語音。Bluetooth 設備的傳輸範圍大約 10 米(30 英尺)。(關於 Bluetooth 規範,請參閱 參考資料。)

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 音頻資料分組。

沒有留言:

張貼留言