http://dicky-chiang.blogspot.com/2009_07_01_archive.html
先總結一下目前我所認知BT :
藍牙協議堆疊依照其功能可分四層:
* 核心協議層(HCI、LMP、L2CAP、SDP)
* 線纜替換協定層(RFCOMM)
* 電話控制協定層(TCS-BIN)
* 選用協議層(PPP、TCP、IP、UDP、OBEX、IrMC、WAP、WAE)
藍牙規範(Profile)是指藍牙通訊在那一種用途下應該使用的通訊協定和相關的規範。藍牙1.1定義的profile有13個。SIG 認為藍牙裝置有4個最基本的 Profile:
* General Access Profile(GAP)
* Service Discovery Application Profile(SDAP)
* Serial Port Profile(SPP)
* General Object Exchange Profile(GOEP)
我所關心的是核心協議層,其中
LMP(Link Management Protocol):它主要是負責base band與之間控制訊息的交換
HCI(Host Controller Interface):這個介面是用來處理Host與BT device之間的通訊,透過HCI,無論這個BT device是以USB介面還是serial port介面連接到Host,Host都可以存取BT device,聽起來很像是驅動程式,但它卻不會像驅動程式一樣去存取記憶體等資源,它的作法是HCI透過發送命令或是資料封包到BT device,這時BT device也會回覆資訊,所以簡單講,HCI提供了一個uniform的介面來存取BT device
L2CAP(Logic Link Control and Apapation Protocol):L2CAP是負責多工,從上層送來的封包過大時,它是切成適當的大小往下層送,好讓下層可以處理,反之亦然.
SDP(service discovery protocol):簡單的話,這協議定議了如何發現哪個可用的BT deivce,並且在找不到BT device時,同時也有探測的功能.
Bluez它是標準的Linux Bluetooth module,幾乎支援各個BT device
整個BT architecture中,除了硬體的RF module , base band , Link Manager之外
還需要軟體部份的L2CAP,RFcomm module,SDP,TCS 而Bluez就是負責這部份
--------------------------------------------------------------
http://dicky-chiang.blogspot.com/2009_07_01_archive.html
Bluez是官方 Linux Bluetooth stack,由主機控制介面(Host Control Interface ,HCI)層、Bluetooth 協定核心、邏輯鏈路控制和適配協定(Logical Link Control and Adaptation Protocol,L2CAP)、SCO 音訊層、其他 Bluetooth 服務、使用者空間後臺預設程式以及設定工具組成.
而bluez裡面,有一個源始碼叫 hci_core.c ,它是HCI的核心所在,而H4 procotol跟BCSP procotol全都依賴這個HCI core,而H4跟BCSP的源始碼也放在bluez裡叫hci_h4.c和hci_bcsp.c,想更深入了解的人可以先去翻閱.
那H4跟BCSP又是什麼呢?BCSP全名叫BlueCore serial Protocol,而H4是UART的規範,如果是RS232呢?那就是H3 procotol,所以這次的HCI protcol將會用到H4跟BCSP,所以在設置核心時,記得要打勾!!
己經知道BT會用到的protocol之後,再來就是要來了解是誰負責傳/收資料,誰又是負責處理資料.
負責傳/收當然就由UART負責跟硬體層溝通,接著會到serial core,這個serial core會把UART接收到的信號轉成數位,而且handle所有的資料跟接口(ports),並且對該device向tty I/O註冊,而tty I/O會再把它轉換成device並通知核心註冊一個character device,讓你能夠經由terminal對serial port下command.
而處理資料是經過一個叫HCIline discipline,Line disicpline是在同一種serial driver上使用不同科技的一種方法,它是位於serial core的上層,如果說serial是負責控制硬體傳/收資料,那line disicpline就是負責處理這些資料的方法,而且是在user space及kernel space做傳輸.
它會執行封包切割 配置並且產生相對對應的網路資料結構,然後把對應的資料傳送到對應的協定層...沒錯,它將會傳送到H4及BCSP的協定層.
而這顆chip是屬於內置CSR bluetooth並使用UART連接.因為CSR是設計為HCI資料分組,所以必為要用hciattach來通知bluez來鏈結驅動程式.
reference:
http://i-miss-erin.blogspot.com/search/label/bluetooth
thank you for this note! very informative.
回覆刪除