1藍(lán)牙技術(shù)的背景 藍(lán)牙是一種短距離的射頻通信連接,最初設(shè)計的目標(biāo)是代替用來連接固定或便攜電子設(shè)備的電纜。藍(lán)牙設(shè)備工作在不需要許可證2.4GHz的工業(yè)、科學(xué)和醫(yī)療(ISM)頻帶。藍(lán)牙基帶協(xié)議同時支持電路交換和分組交換通信,并采用跳頻擴(kuò)展頻譜(FHSS)技術(shù)進(jìn)行傳輸。在北美和歐洲的大部分地區(qū),藍(lán)牙設(shè)備工作于2.402~2.480GHz的頻帶,整個頻帶被分成 79.1MHz帶寬的子信道。 藍(lán)牙協(xié)議的體系結(jié)構(gòu)分底層硬件模塊、中間協(xié)議層和高層應(yīng)用三大部分。底層硬件部分包括無線跳頻(RF)、基帶(BB)和鏈路管理(LM)部分。它們分別定義了藍(lán)牙收發(fā)器在2.4GHz頻段上,以跳頻的方式傳輸信息幀和傳輸鏈路連接的建立或拆除以及鏈路的安全和控制所必須滿足的要求。中間協(xié)議層包括邏輯鏈路控制和適應(yīng)協(xié)議(L2CAP)、服務(wù)發(fā)現(xiàn)協(xié)議(SDP)、串口仿真RFCOMM和電話通信協(xié)議(TCS)。它們分別完成數(shù)據(jù)的拆裝、服務(wù)質(zhì)量控制、協(xié)議復(fù)用、發(fā)現(xiàn)網(wǎng)絡(luò)中可用的服務(wù)及服務(wù)特性、仿真R-232串口、提供藍(lán)牙設(shè)備間話音和數(shù)據(jù)的呼叫控制信令等功能。在這兩層之間規(guī)定了一個主控制器接口(HCI)。這是協(xié)議中軟硬件之間的接口,該層以上的協(xié)議軟件實(shí)體運(yùn)行在主機(jī)上,而HCI以下的功能由藍(lán)牙設(shè)備來完成。在協(xié)議體系結(jié)構(gòu)的最上部是高層應(yīng)用的框架(Profiles)。目前僅規(guī)定了撥號網(wǎng)絡(luò)、耳機(jī)、局域網(wǎng)訪問、文件傳輸?shù)瘸R?guī)應(yīng)用,將來還會不斷增加。各種應(yīng)用程序可以通過各自對應(yīng)的Profi1e實(shí)現(xiàn)無線通信。 在這個標(biāo)準(zhǔn)的支持下,藍(lán)牙系統(tǒng)支持點(diǎn)對點(diǎn)和點(diǎn)對多點(diǎn)的連接,每個藍(lán)牙系統(tǒng)可以連接200個以上藍(lán)牙裝置。藍(lán)牙系統(tǒng)的傳輸特性是在供工業(yè)、科學(xué)和醫(yī)學(xué)領(lǐng)域自由使用的ISM 2.4GHz頻段內(nèi)用單工或全雙工的方式進(jìn)行信息傳輸。每個藍(lán)牙信道的帶寬是1MHz,它支持三個同步數(shù)據(jù)信道或同時支持 一個同步數(shù)據(jù)信道和一個異步數(shù)據(jù)信道。每個同步數(shù)據(jù)信道的數(shù)據(jù)傳輸率是64kb/s,用于語音數(shù)據(jù)的傳輸;異步數(shù)據(jù)信道的傳輸率是下行721 kb/s和上行57.6 kb/s,用于數(shù)字?jǐn)?shù)據(jù)的傳輸。若設(shè)置為上下行對稱的傳輸方式,傳輸率上下行各是432.6 kb/s。一般情況下的傳輸距離是10m(30FEET),最大可達(dá)100m,自動調(diào)整。 2 HCI概述 主控制器接口(HCI)是藍(lán)牙協(xié)議中軟硬件之間的接口,它提供了一個調(diào)用基帶、鏈路管理、狀態(tài)和控制寄存器等硬件的統(tǒng)一命令接口。藍(lán)牙設(shè)備之間進(jìn)行通信時,HCI以上的協(xié)議軟件實(shí)體在主機(jī)上運(yùn)行,而HCI以下的功能由藍(lán)牙設(shè)備來完成,兩者之間通過一個對兩端透明的傳輸層進(jìn)行交互。 如圖1所示,藍(lán)牙標(biāo)準(zhǔn)對機(jī)控制器接口(HCI)的定義如下:HCI提供了一個調(diào)用和訪問基帶控制器和鏈路控制器以及硬件狀態(tài)和控制寄存器的命令接口。這一接口提供了一個訪問藍(lán)牙基帶功能的統(tǒng)一方法。在主機(jī)端的HCI軟件和藍(lán)牙硬件的HCI固件之間存在著與藍(lán)牙協(xié)議關(guān)系并不密切的幾層中間層,我們稱之為機(jī)控制器傳輸層,它們提供數(shù)據(jù)的透明傳輸。 HCI由兩部分組成,實(shí)現(xiàn)命令接口的軟件和用來連接藍(lán)牙子系統(tǒng)和主機(jī)的物理硬件。HCI軟件的目的是使構(gòu)成接口的硬件對系統(tǒng)高層軟件來說看起來是透明的。 藍(lán)牙軟件結(jié)構(gòu)包括兩種類型的部件。數(shù)據(jù)相關(guān)部件負(fù)責(zé)數(shù)據(jù)通過鏈路的傳輸。控制相關(guān)部件則負(fù)責(zé)鏈路的控制和管理。圖2 示出了HCI軟件結(jié)構(gòu)以及與藍(lán)牙主機(jī)接口硬件的關(guān)系。 3 HCI流控制 流控制在主機(jī)到主控制器之間,用于防止將傳送到未應(yīng)答遠(yuǎn)程設(shè)備的ACL數(shù)據(jù)溢出主控制器的數(shù)據(jù)緩沖區(qū),由主機(jī)來管理主控制器的數(shù)據(jù)緩沖區(qū)。 主機(jī)通過發(fā)出Read_Buffer_Size命令進(jìn)行初始化,這個命令的返回參數(shù)可以確定主機(jī)發(fā)向主控制器的HCI ACL和SCO數(shù)據(jù)包(不包括包頭)的最大長度。另有兩個返回參數(shù)表示主控制器為等待傳輸可以緩存的HCI ACL和SCO數(shù)據(jù)分組的數(shù)量。當(dāng)只有一個與其他設(shè)備的連接或者設(shè)備處于回環(huán)模式時,主控制器利用已完成數(shù)據(jù)分組事件來控制從主機(jī)發(fā)來的數(shù)據(jù)流。事件分組包括一個鏈接句柄列表以及對應(yīng)連接上自上一個此事件以來完成的HCI包的數(shù)目;完成指的是發(fā)送、清空或回環(huán)回主機(jī)。根據(jù)這一事件的返回參數(shù)以及讀緩沖區(qū)大小命令的返回參數(shù),主控制器可以進(jìn)行流量控制。每當(dāng)主機(jī)發(fā)送一個ACL或SCO數(shù)據(jù)包,主機(jī)應(yīng)該記錄主控制器的相應(yīng)鏈路緩沖區(qū)中的剩余空間減少了一個包,當(dāng)主機(jī)收到完成包數(shù)目事件,主機(jī)知道了又有多少緩沖區(qū)空間得到釋放,主機(jī)可以算出現(xiàn)在主控制器可以接收的包數(shù)目。當(dāng)主控制器中有數(shù)據(jù)時,它必 須周期性的向主機(jī)發(fā)送完成包數(shù)目事件,直到向主機(jī)報告所有包都發(fā)送或清空,而發(fā)送的間隔由各廠家自行定義。注意,如果SCO流量控制失效,則已完成數(shù)據(jù)分組事件號就不能在SCO鏈接句柄中進(jìn)行報告。 對應(yīng)于每一個鏈接句柄,數(shù)據(jù)必須依照他們在主機(jī)生成時的順序依此在HCI數(shù)據(jù)包中發(fā)往主控制器,主控制器也同樣按順序?qū)⑦@些數(shù)據(jù)發(fā)往空中,另一設(shè)備的主控制器收到后也必須按序發(fā)向它的主機(jī),這意味著同一連接句柄上數(shù)據(jù)的順序自生成起不再改變。 在某些情況下,主控制器到主機(jī)方向的流量控制是必須的,一般采用Set_Host_Controller To_Host_Flow_Control命令來開關(guān)這個方向的流量控制。這個方向的流量控制方法類似于上述的方法。起初,主機(jī)發(fā)出Host_Buffer_Size命令,告知主控制器發(fā)向主機(jī)的ACL和SCO數(shù)據(jù)包的最大長度以及主機(jī)緩沖區(qū)可存放ACL和SCO數(shù)據(jù)包的數(shù)目。主機(jī)利用主機(jī)Host_Number_Of_Completed_ Packets命令類似于主控制器的完成包數(shù)目事件,主機(jī)完成包數(shù)目命令是不需要命令流量控制的特殊命令,在有連接或處于本地回環(huán)模式時可以隨時發(fā)送,這使得兩個方向的流量控制同樣的工作,正常的命令流也不被打斷。 當(dāng)主機(jī)收到拆鏈完成事件后,可以認(rèn)定該連接句柄上的所有發(fā)往主控制器的數(shù)據(jù)被清空,相應(yīng)數(shù)據(jù)緩沖區(qū)被釋放,主控制器不需要用完成包數(shù)目事件將這些告訴主機(jī)。如果也采用了主控制器到主機(jī)方向的流量控制,主控制器在發(fā)送了拆鏈完成事件后假設(shè)主機(jī)在收到這一事件后也清空了這一連接句柄上的所有數(shù)據(jù),主機(jī)也不需要用主機(jī)完成包數(shù)目命令將這些告訴主控制器。 4 HCI命令與事件 主機(jī)通過HCI驅(qū)動程序提供的一系列命令來控制藍(lán)牙網(wǎng)絡(luò)接口。除這些命令外,藍(lán)牙標(biāo)準(zhǔn)還定義了一級由藍(lán)牙網(wǎng)絡(luò)接口中的HCI固件產(chǎn)生的事件,用來指示接口的狀態(tài)變化。 HCI命令和事件與來自無連接和同步連接的數(shù)據(jù)一起通過HCI傳輸接口硬件進(jìn)行傳輸。這些數(shù)據(jù)的復(fù)用方式對接口來說是確定的。圖3 示出了其工作情況。 HCI提供一種統(tǒng)一的方法訪問藍(lán)牙硬件。HCI 鏈路命令提供主機(jī)控制與其他藍(lán)牙設(shè)備鏈路層連接的能力,一般這些命令導(dǎo)致鏈路管理器與遠(yuǎn)端設(shè)備交換鏈路管理器協(xié)議命令。HCI策略命令用來影響本地或遠(yuǎn)端鏈路管理器的行為,這些命令提供主機(jī)影響鏈路管理器如何管理微微網(wǎng)的方法。主控制器和基帶命令、信息命令及狀態(tài)命令用于主機(jī)訪問主控制器上的不同的寄存器。 HCI命令需要一定的時間完成,因此這些命令的處理結(jié)果將以事件的形式返回主機(jī)。如對于大部分的HCI命令主控制器完成后生成一個命令完成事件,這個事件包含了完成命令的返回參數(shù)。為了使主機(jī)具備發(fā)現(xiàn)HCI傳輸層差錯的能力,在主機(jī)發(fā)出命令和收到主控制器響應(yīng)之間我們判斷是否超時,由于不同HCI傳輸層的差異,建議采用一秒作為此定時器的默認(rèn)值。 HCI是通過包的方式來傳送數(shù)據(jù)、命令和事件的,所有在主機(jī)和主控制器之間的通信都以包的形式進(jìn)行。包括每個命令的返回參數(shù)都通過特定的事件包來傳輸。HCI有數(shù)據(jù)、命令和事件三種包,其中數(shù)據(jù)包是雙向的,命令包只能從主機(jī)發(fā)往主控制器,而事件包始終是主控制器發(fā)向主機(jī)的。主機(jī)發(fā)出的大多數(shù)命令包都會觸發(fā)主控制器產(chǎn)生相應(yīng)的事件包作為響應(yīng)。包的格式如圖4所示。 (1)命令包分為六種類型: ● 鏈路控制命令; ● 鏈路政策和模式命令; ● 主機(jī)控制和基帶命令; ● 信息命令; ● 狀態(tài)命令; ● 測試命令。 (2)事件包可分為三種類型: ● 通用事件,包括命令完成包(Command Complete)和命令狀態(tài)包(Command Status); ● 測試事件; ● 出錯時發(fā)生的事件,如產(chǎn)生丟失(Flush Occured)和數(shù)據(jù)緩沖區(qū)溢出(Data Buffer Overflow)。 (3)數(shù)據(jù)包則可分為ACL和SCO的數(shù)據(jù)包。 5 HCI模塊結(jié)構(gòu) HCI模塊根據(jù)協(xié)議規(guī)定,完成協(xié)議功能、封裝 HCI命令以及上層協(xié)議的數(shù)據(jù),處理下層事件。 HCI命令事件處理模塊完成命令的封裝和事件的解析,在收到上層協(xié)議或應(yīng)用的調(diào)用命令請求后,模塊完成命令包的封裝,而后調(diào)用發(fā)送函數(shù)將數(shù)據(jù)傳到數(shù)據(jù)收發(fā)模塊。當(dāng)接收函數(shù)收到HCI事件時,調(diào)用HCI命令事件處理模塊的事件處理函數(shù),處理完畢后依據(jù)事件的性質(zhì),將響應(yīng)傳到上層協(xié)議或應(yīng)用。 HCI數(shù)據(jù)處理模塊完成ACL和SCO數(shù)據(jù)的封裝處理,但對凈荷不作任何解析和處理。收發(fā)函數(shù)主要完成與數(shù)據(jù)收發(fā)模塊的通信,對收到的數(shù)據(jù)根據(jù)數(shù)據(jù)的類型,分別調(diào)用命令事件處理模塊或數(shù)據(jù)處理模塊予以處理。 6 HCI傳輸層 HCI的傳輸層定義了三類數(shù)據(jù)如何在藍(lán)牙網(wǎng)絡(luò)接口和藍(lán)牙主機(jī)間進(jìn)行傳輸。HCI傳輸層定義了每一類數(shù)據(jù)如何封裝和通過接口硬件進(jìn)行復(fù)用。目前藍(lán)牙規(guī)范定義了三個HCI傳輸層:UART傳輸層;RS232傳輸層;USB傳輸層。下面以RS232傳輸層為例對HCI傳輸層作具體的說明。 HCI RS232傳輸層的目標(biāo)是在藍(lán)牙主機(jī)和藍(lán)牙主控制器之間的物理RS232接口上使用藍(lán)牙HCI。通過RS232傳輸層可以發(fā)出四種HCI分組,但主控制器接口不能區(qū)分四種HCI類型。在分組之前必須加上8位的分組指示器以區(qū)分分組類型。0x01表示指令分組,0x02表示ACL數(shù)據(jù)分組,0x03表示SCO 數(shù)據(jù)分組,0x04表示事件分組,另外還有0x05表示錯誤消息分組,0x06表示協(xié)商分組。錯誤消息分組用于將錯誤報告給發(fā)送端;而協(xié)商分組用于協(xié)商通信設(shè)置和協(xié)議。在RS232鏈路上發(fā)送任何字節(jié)之前,都應(yīng)當(dāng)在主控制器和主機(jī)之間對波特率、奇偶校驗(yàn)值類型、終止位和協(xié)議模式進(jìn)行協(xié)商。每發(fā)送一個以上HCI分組時,一個8位序列號將加1,除非是重發(fā)一個錯誤的分組。 同步機(jī)制可以選擇RTS/CTS或分界符。在不能使用RTS/CTS時,將采用含16位CRC的幀和含COBS的分界符0x7e作為檢錯和重新同步的手段。 16位CRC應(yīng)附在分組末尾,結(jié)束分界符0x7e之前。起始分界符0x7e后緊跟著分組類型指示段。COBS 是PPP的改進(jìn),不考慮數(shù)據(jù)模式,它將產(chǎn)生低于5%的開銷。在此采用一種簡單糾錯方案,發(fā)送端將僅重發(fā)含有錯誤的分組。 |