藍(lán)牙通信技術(shù)的模型解析與開(kāi)發(fā)
關(guān)鍵詞: 藍(lán)牙技術(shù);無(wú)線通信;解析
前言
藍(lán)牙技術(shù)是基于WPAN(Wireless Personal Area Network)的無(wú)線網(wǎng)絡(luò)連接技術(shù),是以短程無(wú)線電收發(fā)技術(shù)為固定與移動(dòng)設(shè)備通信環(huán)境建立了一個(gè)短程無(wú)線電的特別連接。它建立一個(gè)通用的無(wú)線電空中接口以及控制軟件的公開(kāi)標(biāo)準(zhǔn),使無(wú)線通信技術(shù)和計(jì)算機(jī)技術(shù)緊密結(jié)合,使不同廠家生產(chǎn)的便攜式設(shè)備在沒(méi)有電線或電纜相互連接的情況下在近距離范圍內(nèi)具有互用、互操作的性能,代替固定與移動(dòng)通訊設(shè)備之間的電纜。利用Ericsson藍(lán)牙開(kāi)發(fā)包EBDK(Ericsson Bluetooth Development Kit),可以快速開(kāi)發(fā)出建立在藍(lán)牙通信技術(shù)之上的應(yīng)用,加速產(chǎn)品開(kāi)發(fā)的進(jìn)度。
藍(lán)牙系統(tǒng)模塊分析
藍(lán)牙協(xié)議體系結(jié)構(gòu)框架如圖1所示。
從軟件和硬件來(lái)劃分,藍(lán)牙協(xié)議體系結(jié)構(gòu)可分為底層硬件模塊,中間協(xié)議層(軟件模塊)和高端應(yīng)用層三大部分。鏈路管理層(LM),基帶層(BB)和射頻層(RF)屬于藍(lán)牙的硬件模塊。
中間協(xié)議層包括邏輯鏈路控制和適配協(xié)議(1.2CAP),服務(wù)發(fā)現(xiàn)協(xié)議(SDP),串口仿真協(xié)議(RFCOMM)和電話通信協(xié)議(TCS)。藍(lán)牙協(xié)議棧的最上部是高端應(yīng)用層,它對(duì)應(yīng)于各種應(yīng)用模型的profile,是profile的一部分。
主控制器接口HCI(Host Controller Interface)是藍(lán)牙協(xié)議中軟硬件之間的接口。它提供一個(gè)調(diào)用下層基帶,鏈路控制層,狀態(tài)和控制寄存器等統(tǒng)一的命令接口。HCI協(xié)議以上的協(xié)議軟件實(shí)體運(yùn)行在主機(jī)上,而HCI以下的功能由藍(lán)牙設(shè)備來(lái)完成,兩者之間通過(guò)傳輸層進(jìn)行交互。HCI提供對(duì)基帶控制器和鏈路管理器的命令接口,以及對(duì)硬件狀態(tài)和控制注冊(cè)成員的訪問(wèn)。該接口還提供對(duì)藍(lán)牙基帶的統(tǒng)一訪問(wèn)模式。
EBDK硬件結(jié)構(gòu)
EBDK上的硬件分布結(jié)構(gòu)如圖2所示。Radio模塊是藍(lán)牙硬件的射頻模擬部分,包括射頻發(fā)射器和射頻接收器,以跳頻技術(shù)實(shí)現(xiàn)頻率擴(kuò)展,進(jìn)行ISM頻段頻率信號(hào)的發(fā)送和接收?;鶐K則對(duì)物理信道進(jìn)行管理,鏈路控制模塊進(jìn)行通信鏈路的建立、鑒權(quán)。
軟件功能分析
軟件分為兩部分:運(yùn)行在主PC上的主機(jī)軟件和在藍(lán)牙基帶設(shè)備上運(yùn)行的ROM程序。EBDK主機(jī)軟件在win98、NT PC上運(yùn)行,通過(guò)RS-232或USB連接到EBDK。結(jié)構(gòu)示意圖如圖3所示。
主機(jī)軟件功能機(jī)制
主機(jī)軟件有兩個(gè)主線程,一個(gè)執(zhí)行主應(yīng)用程序和傳輸數(shù)據(jù)包,另一個(gè)處理接收界面信息,如圖4所示。
圖4中左邊的圓圈代表主應(yīng)用程序線程,右邊的圓圈代表接收器線程。接收器線程采用Microsoft定義的通信事件,一旦接收到一個(gè)通信事件(通常是接收緩沖區(qū)有一序列字符),就會(huì)產(chǎn)生一個(gè)windows消息,同時(shí)將接收到的字符序列送到包組裝器進(jìn)行數(shù)據(jù)包的組裝。主應(yīng)用程序處理windows消息隊(duì)列發(fā)現(xiàn)有輸入字符的消息后,就進(jìn)行數(shù)據(jù)包的組裝,或者接收到用戶界面的變化,對(duì)windows的控制或輸入信息轉(zhuǎn)換成的數(shù)據(jù)流進(jìn)行處理,進(jìn)行數(shù)據(jù)包的整合,因?yàn)橥ǔJ盏降臄?shù)據(jù)不是一個(gè)完整的數(shù)據(jù)包。主程序判別出數(shù)據(jù)包的類型,然后進(jìn)行圖形用戶界面的更新或發(fā)送數(shù)據(jù)包的相應(yīng)處理。
通信過(guò)程
以EBDK中的Demo程序?yàn)槔?,其通信過(guò)程流程如圖5。
EBDK主機(jī)軟件結(jié)構(gòu)為分層模塊化形式,每一層都進(jìn)行了封裝,其他層只有通過(guò)接口才能訪問(wèn)。
如果用戶應(yīng)用程序發(fā)送了一序列數(shù)據(jù),數(shù)據(jù)在到達(dá)RS-232之前,首先會(huì)進(jìn)行包的組裝,生成通信協(xié)議格式的數(shù)據(jù)包,在發(fā)送數(shù)據(jù)包之前還必須檢測(cè)指令完成狀態(tài)機(jī)。指令完成狀態(tài)機(jī)指示從發(fā)送前一條指令之后系統(tǒng)是否仍在等待指令完成事件。如果狀態(tài)是空閑(IDLL)則發(fā)送數(shù)據(jù)包,如果狀態(tài)是等待指令完成(WAITING_FOR_CMD_COMF)用戶程序則被通知稍候再試。
在接收方向上,執(zhí)行的操作與之相反。接收來(lái)的數(shù)據(jù)首先經(jīng)過(guò)包組裝器,組裝成標(biāo)準(zhǔn)的數(shù)據(jù)包格式,然后解開(kāi)包,抽取包中的數(shù)據(jù),進(jìn)行指令解碼,獲得數(shù)據(jù)中包含的指令。在指令被發(fā)送到指令處理器之前,仍然要檢測(cè)指令完成事件,以確定前一條指令是否已經(jīng)被處理。之后,才被指令處理器處理,處理的結(jié)果反饋到應(yīng)用程序進(jìn)行界面的修改或通信狀態(tài)的改變處理。
指令通信示例
以一個(gè)簡(jiǎn)單的示例來(lái)說(shuō)明數(shù)據(jù)流動(dòng)的全過(guò)程。
從EBDK的通信界面發(fā)送一條指令:
cmd cclk 0x2345
并按回車,將產(chǎn)生一個(gè)Windows事件調(diào)用字符串分析器對(duì)以空格分界的字符串進(jìn)行標(biāo)記和處理,生成一條消息字符序列。這個(gè)字符序列是對(duì)應(yīng)指令的HCI位字符流。這個(gè)字符序列被封裝到數(shù)據(jù)包中,經(jīng)過(guò)通信過(guò)程中的一系列過(guò)程發(fā)送給RS-232DLL,RS-232DLL再立即將它放到COMM口上,攜帶HCI指令的電信號(hào)從PC 的COM或USB口發(fā)出,沿著RS-232或USB線,到達(dá)EBDK的COM或USB中,穿過(guò)RS-232緩沖區(qū)buffer以及Mother Board進(jìn)入基帶連接器和基帶設(shè)備。基帶的ROM程序?qū)⑾⒔獯a并執(zhí)行。在這種情況下,它生成一個(gè)數(shù)據(jù)幀,在空中通過(guò)電磁波傳輸。這個(gè)幀通過(guò)與Radio Module的接口,以串行序列的形式從射頻天線發(fā)送出去。
射頻信號(hào)被附近的一個(gè)EBDK獲取,它的射頻模塊將射頻調(diào)制信號(hào)轉(zhuǎn)換為一個(gè)數(shù)字信號(hào),再以串行形式送到基帶設(shè)備。基帶控制和一個(gè)HCI數(shù)據(jù)包或事件包,再由基帶設(shè)備將該包通過(guò)RS-232(或USB)線送到PC。PC的CPU收到一個(gè)中斷指示收到一些字節(jié)數(shù)據(jù),這些數(shù)據(jù)被送到緩沖器中,然后被RS-232包組裝器(Packet Builder)進(jìn)行處理。應(yīng)用程序收到一個(gè)消息指明有一個(gè)數(shù)據(jù)包要處理,最后根據(jù)抽取出來(lái)的指令,調(diào)用相應(yīng)的函數(shù)進(jìn)行操作。這樣就完成了一個(gè)消息通信的過(guò)程。
要以程序編程實(shí)現(xiàn)上述的過(guò)程,就需要在程序中設(shè)置上述操作中的軟件接口動(dòng)作機(jī)制。在C++中以一個(gè)通信類可以實(shí)現(xiàn)上述的基本操作。
一個(gè)基本的藍(lán)牙通信對(duì)象應(yīng)該具有以下的基本操作接口。
發(fā)送消息:
LssuoCommand:發(fā)送指令
TransmitRewData:發(fā)送數(shù)據(jù)
接收消息:
CommandCompleteSuccess:指令成功完成
CommandPending:指令延遲
CotRxPacket:收到數(shù)據(jù)包
ReadyForData:準(zhǔn)備接收數(shù)據(jù)
DisconnectionOccurred:發(fā)生連接中斷
GotBTAddress:獲得藍(lán)牙通信地址
而在實(shí)際通信操作中,要分為通信客戶端和通信服務(wù)器端。因此,在基本的通信對(duì)象的基礎(chǔ)上要派生出Client 和Server對(duì)象,分別就具體的操作進(jìn)行處理。
另外需要一個(gè)包組裝器專門(mén)處理數(shù)據(jù)包:
On_WMC_RXD_DATA:處理接收到數(shù)據(jù)之后的動(dòng)作
PackelComplete:包接收完畢的動(dòng)作
InvalidPacket:判斷包是否有效
在VC++中,可以利用藍(lán)牙工程模板自動(dòng)生成,因此藍(lán)牙通信包軟件的開(kāi)發(fā)具有易于實(shí)現(xiàn)和易與其他軟件捆綁的特點(diǎn)。
結(jié)語(yǔ)
本文分析了基于EBDK的藍(lán)牙通信的整個(gè)過(guò)程以及軟件實(shí)現(xiàn)機(jī)制,可以作為藍(lán)牙通信的應(yīng)用開(kāi)發(fā)的借鑒。具備了Ericsson藍(lán)牙開(kāi)發(fā)工具包之后,由于藍(lán)牙軟件包具有捆綁性與易實(shí)現(xiàn)性,可以在此基礎(chǔ)上直接進(jìn)行應(yīng)用的開(kāi)發(fā),也可以從藍(lán)牙通信的軟件實(shí)現(xiàn)機(jī)制上理出應(yīng)用的實(shí)現(xiàn)思路?!?
評(píng)論