Linux 無線網路技術:Bluetooth

來源:互聯網
上載者:User
作者:Sreekrishnan Venkateswaran

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

關於作者

Sreekrishnan Venkateswaran 擁有印度坎普爾市印度科技學院的電腦科學碩士學位。他從 1996 年 2 月開始為 IBM India 工作。 他的興趣包括設計裝置驅動程式和網路通訊協定。可以通過 s_krishna@in.ibm.com 與 Sreekrishnan 聯絡。

全文出自 : IBM developerWorks 中國網站

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.