基于CSR硬件的藍(lán)牙開(kāi)發(fā)說(shuō)明_第1頁(yè)
基于CSR硬件的藍(lán)牙開(kāi)發(fā)說(shuō)明_第2頁(yè)
基于CSR硬件的藍(lán)牙開(kāi)發(fā)說(shuō)明_第3頁(yè)
基于CSR硬件的藍(lán)牙開(kāi)發(fā)說(shuō)明_第4頁(yè)
基于CSR硬件的藍(lán)牙開(kāi)發(fā)說(shuō)明_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上第一部分 BTM02E-08藍(lán)牙模塊一、 模塊的基本參數(shù)1、 特性支持藍(lán)牙協(xié)議1.1、1.2輸出功率等級(jí)為class2支持USB1.1和UART串口低電壓供電2.7V3.6V標(biāo)準(zhǔn)供電電壓3.3V內(nèi)置8MbitFLASH存儲(chǔ)器尺寸:mm2、 描述采用CSR公司的藍(lán)牙芯片作為核心芯片,并配以8MbitFLASH存儲(chǔ)器,SPI接口,UART接口,USB接口,PCM音頻接口,16MHz晶振,帶通濾波器,天線匹配電路等。并不是所有的應(yīng)用都適合嵌入式應(yīng)用,因?yàn)閼?yīng)用程序和固件棧必需共享片上RAM,以RFCOMM為基礎(chǔ)的應(yīng)用可用的RAM大概為幾百字節(jié)。應(yīng)用代碼必需控制在32K字以內(nèi)。

2、二、 BlueCore2-External藍(lán)牙芯片工作原理1、 關(guān)鍵特性片外8Mbit的存儲(chǔ)器可以靈活的用于系統(tǒng)解決方案。片上32Kbit的RAM用來(lái)實(shí)現(xiàn)藍(lán)牙無(wú)線傳輸中數(shù)據(jù)交換的緩沖4M波特率的異步串行接口片上可運(yùn)行多種協(xié)議棧:標(biāo)準(zhǔn)HCI協(xié)議棧,全部?jī)?nèi)嵌的RFCOMM協(xié)議棧等96Ball-VFBGA封裝2、管腳使用USB接口不用時(shí)應(yīng)接地所有IO管腳被配置成輸入時(shí),復(fù)位后將變成弱下拉不用的AIO(可編程模擬IO)管腳不使用時(shí)應(yīng)該懸空3、 內(nèi)部功能模塊USB:用來(lái)與其他數(shù)字設(shè)備的通用接口,BlueCore02扮演外圍設(shè)備角色,來(lái)回應(yīng)主機(jī)的請(qǐng)求SPI(異步串行接口):用來(lái)與其它數(shù)字設(shè)備的接口,SPI

3、口可以用來(lái)調(diào)試軟件和燒寫(xiě)外部FLASH存儲(chǔ)器UART:與其他設(shè)備通信的通用同步串口可編程IO:共有15個(gè)可編程管腳(12個(gè)數(shù)字的和3個(gè)模擬的),有運(yùn)行在片上的固件來(lái)控制4、 CSR 軟件棧CSR為BlueCore2提供了片上運(yùn)行的固件(Firmware),片上運(yùn)行的協(xié)議棧仍需HCI的支持1)HCI Stack該Firmware提供了一組特性及支持相應(yīng)特性的HCI在標(biāo)準(zhǔn)藍(lán)牙協(xié)議上做了擴(kuò)展:l 支持藍(lán)牙串口協(xié)議BCSP,一種以UART為物理層,可靠的特有協(xié)議(可選)l 提供了額外的50個(gè)系列HCI指令l 可以訪問(wèn)可編程IO端口l 訪問(wèn)藍(lán)牙時(shí)鐘l 訪問(wèn)固件上的隨機(jī)數(shù)產(chǎn)生器l 動(dòng)態(tài)配置UART(波特率

4、,校驗(yàn),數(shù)據(jù)位)l 無(wú)線傳輸使能:一個(gè)簡(jiǎn)單的命令,與一個(gè)專(zhuān)門(mén)的物理開(kāi)關(guān)有關(guān),確定radio是否可以傳輸數(shù)據(jù)l 可以讀取芯片外部管腳上的電壓,可以運(yùn)行在VM或主機(jī)上來(lái)電池的監(jiān)測(cè)l 提供一組BCCMD命令,來(lái)訪問(wèn)片上的“persist store”,該數(shù)據(jù)庫(kù)存儲(chǔ)了器件的藍(lán)牙地址,器件class,radio配置,USB/DFU常數(shù)等(Device Firmware Upgrade)l UART上break命令的應(yīng)用:用于重啟,開(kāi)機(jī)進(jìn)入低功耗,喚醒主機(jī)l 提供一組“radio test”或者BIST 指令,直接控制片上的radiol 虛擬機(jī)。固件提供虛擬機(jī)環(huán)境,來(lái)運(yùn)行應(yīng)用代碼。虛擬機(jī)需要BlueLab

5、和內(nèi)嵌協(xié)議RFCOMM(或者L2CAP,SDP),運(yùn)行在VM上的協(xié)議可以完成通過(guò)可編程IO點(diǎn)亮LED的簡(jiǎn)單工作2)BlueCore RFCOMM Stack軟件棧(將以Firmware的形式轉(zhuǎn)載到片上)直到RFCOMM層的協(xié)議都運(yùn)行在片上l 與主機(jī)接口:RS232,RFCOMM協(xié)議(如何建立無(wú)線串口連接?)l 服務(wù)發(fā)現(xiàn)協(xié)議3)虛擬機(jī)棧l 所有代碼都在片上運(yùn)行,代碼在固件旁邊運(yùn)行(代碼與固件并行運(yùn)行)l 用戶可以呼叫固件完成各種操作l 用戶的應(yīng)用代碼與堆棧是分開(kāi)的,防止對(duì)堆棧造成影響,可以隨時(shí)修改應(yīng)用代碼4) 面向應(yīng)用的應(yīng)用軟件的編寫(xiě)當(dāng)更高層的藍(lán)牙協(xié)議棧像固件一樣在片上運(yùn)行時(shí),底層將會(huì)通過(guò)片上運(yùn)

6、行的一個(gè)UART的驅(qū)動(dòng)程序提供L2CAP,RFCOMM,SDP的API給高層5、片外存儲(chǔ)器提供了8M位的存儲(chǔ)空間,字長(zhǎng)為16位。用來(lái)存儲(chǔ)代碼和配置數(shù)據(jù)6、UART接口l 信號(hào)機(jī)制。UART接口為與其他串口器件提供了一種簡(jiǎn)單的機(jī)制。采用RS232協(xié)議電平為0VVDD_PADS(IO電路的電壓),要求額外的電平轉(zhuǎn)換芯片。四種信號(hào)中,RX和TX用來(lái)傳輸數(shù)據(jù),RTS和CTS可以用來(lái)做流控(低電平有效),采用CMOS工藝。UART的波特率等參數(shù)設(shè)置有軟件來(lái)完成。l 復(fù)位。UART接口可以發(fā)送一BREAK信號(hào)復(fù)位BlueCore芯片,即RX信號(hào)線被置低的時(shí)間超過(guò)在PS 中的Key:PSKEY_HOST_I

7、O_UART_RESET_TIMEOUT設(shè)定的值,可以用來(lái)主機(jī)復(fù)位系統(tǒng)。同樣道理,芯片也可以發(fā)送一BREAK信號(hào)來(lái)喚醒主機(jī)。l 波特率??梢酝ㄟ^(guò)公式計(jì)算結(jié)果設(shè)置任意波特率,也可以設(shè)置標(biāo)準(zhǔn)波特率。PSKEY_UART_BAUD_RATE(0X204)7、SPI(串行外圍設(shè)備接口)BlueCore使用有16位數(shù)據(jù)位和16位地址位的SPI,當(dāng)處理器運(yùn)行時(shí)或被終止時(shí)將會(huì)通過(guò)SPI交換數(shù)據(jù)l 指令周期。芯片為從設(shè)備,從SPI_MOSI接受命令,從SPI_MISO發(fā)送數(shù)據(jù)SPI復(fù)位后,CSB必需置低。寫(xiě)入時(shí),MOSI上的數(shù)據(jù)在時(shí)鐘的上升沿寫(xiě)入BlueCore。讀出時(shí),在CLK的下降沿讀出。CSB變高時(shí)結(jié)束

8、。l 寫(xiě)入過(guò)程。線串行寫(xiě)入8位的命令字(寫(xiě)指令為),接著是16位地址,然后16位的數(shù)據(jù)寫(xiě)入該地址中。芯片內(nèi)地址自動(dòng)加1,接下來(lái)的數(shù)據(jù)將連續(xù)的存儲(chǔ)于FLASH中。l 讀出過(guò)程。同上,先寫(xiě)入讀命令字C15:0(),然后寫(xiě)入讀地址A15:0,在MISO上將輸出16位的校驗(yàn)字T15:0,跟著輸出16位數(shù)據(jù)D15:0。校驗(yàn)字包括寫(xiě)入的命令字7:0,和讀出數(shù)據(jù)對(duì)應(yīng)的地址15:8,可以有效克服讀出錯(cuò)誤地址的內(nèi)容。讀過(guò)程地址自動(dòng)加1.8、PIO可由片上運(yùn)行的應(yīng)用程序或者HCI來(lái)訪問(wèn)。l PIO0/RXEN。復(fù)用端。由PS KEY 的PSKEY_TX/RX_PIO_CONTROL(0x209)來(lái)決定,可以用來(lái)作

9、為radio前端的傳輸開(kāi)關(guān)。l PIO2/USB_PULL_UP(1)。復(fù)用端。UART中,可用來(lái)做PIO。USB中,用來(lái)做上拉。外部RAM應(yīng)用中,用來(lái)做片選。l PIO3/USB_WAKE_UP。USB中,由PS KEY 中的PSKEY_USB_PIO_WAKEUP(0x2cf)l PIO4/USB_ON(1)。l PIO5/USB_DETACH(1)l PIO6/CLK_REQ。由PS Key中的 PSKEY_CLOCK_REQUEST_ENABLE(0x246)決定。芯片處于深度睡眠時(shí),管腳可以接低,當(dāng)有一個(gè)時(shí)鐘請(qǐng)求時(shí)接高,時(shí)鐘必須有4ms的上升沿。9、USB芯片包括一全速的USB接口(

10、12Mbits/s),能夠直接驅(qū)動(dòng)USB電纜而無(wú)需USB收發(fā)芯片。USB的數(shù)據(jù)線D+和D-連接到USB內(nèi)部的USB 緩沖器中,因此輸出阻抗較低。為了與電纜的特性阻抗相匹配,在和上必須串聯(lián)電阻。l 協(xié)議規(guī)定數(shù)據(jù)線輸出的最小高電平為.,為滿足此要求,VDD_USB供電端至少為.l 自供電模式。電路將由自己的供電系統(tǒng)供電,而不是來(lái)自于電纜的(),這種模式只會(huì)提供很小的電流(小于.)。要求要經(jīng)過(guò)一電阻網(wǎng)絡(luò)分壓,以便于當(dāng)變高時(shí)(連接到了)可以檢測(cè)到。USB_ON端可以由任一PIO來(lái)充當(dāng),但是必需在PSKEY_USB_PIO_VBUS中注明所選的PIO號(hào)l Detach和Wake_up信號(hào)BlueCore

11、可以提供兩個(gè)額外的信號(hào)給主機(jī):USB_DETACH和USBWAKE_UP。這兩個(gè)而外的信號(hào)在USB電纜和協(xié)議中是不存在的,但是在嵌入式系統(tǒng)應(yīng)用中卻非常有用,因?yàn)榍度胧綉?yīng)用中實(shí)際的USB電纜是不可見(jiàn)的(直接用PCB布線相連),所以不知道什么時(shí)候USB電纜應(yīng)該建立連接。Usb_detach:置高時(shí)將會(huì)使USB_D+和USB_D-變?yōu)楦呓M態(tài),相當(dāng)于斷開(kāi)總線連接。置低時(shí)將恢復(fù)連接,并等待主機(jī)恢復(fù)。USB_WAKE_UP:用來(lái)喚醒主機(jī)。只有USB_DETACH有效時(shí)才有意義,置為高電平時(shí)用來(lái)喚醒主機(jī),以重新開(kāi)始傳輸數(shù)據(jù)。它是用來(lái)替換軟件中USB WAKE_UP消息的,當(dāng)斷開(kāi)連接時(shí)不能使用。三、 外部Fl

12、ash存儲(chǔ)器藍(lán)牙的配置參數(shù)被存儲(chǔ)到Flash的PS區(qū),可以通過(guò)程序包里的PSTool工具來(lái)對(duì)其進(jìn)行操作。四、 RS232電平轉(zhuǎn)換芯片為主機(jī)與BlueCore的3.3V邏輯電平提供接口五、 復(fù)位電路高電平復(fù)位。上電時(shí),復(fù)位管腳將置高。可以確保電壓穩(wěn)定在3.3V之前芯片處于復(fù)位狀態(tài)。否則,當(dāng)電壓從1.8V降至1.6V時(shí),芯片將嘗試著從外部存儲(chǔ)器獲得指令,而此時(shí)Flash(針對(duì)3.3V供電的Flash)的供電可能沒(méi)有準(zhǔn)備好,F(xiàn)lash將返回錯(cuò)誤的指令給BlueCore,這將會(huì)導(dǎo)致固件的配置失敗。(電壓升至1.6V以上時(shí)芯片開(kāi)始工作,而3.3V還未達(dá)到,F(xiàn)lash還不能正常工作)當(dāng)使用1.8V Fla

13、sh時(shí),復(fù)位電路可以取消,把復(fù)位管腳直接接地,因?yàn)镕lash和BlueCore將同時(shí)達(dá)到1.8V 電平(3.3V和1.8V 可能不會(huì)同時(shí)達(dá)到)(根據(jù)CSR公司提供的模塊資料,在復(fù)位管腳處模塊已經(jīng)通過(guò)一10K的下拉電阻接地。根據(jù)復(fù)位要求,應(yīng)盡量延長(zhǎng)復(fù)位時(shí)間,以確保電源供電穩(wěn)定。應(yīng)接一大點(diǎn)電容)平時(shí)可以直接接地也可以通過(guò)一個(gè)1K電阻,要保證接地可靠。六、 開(kāi)關(guān)開(kāi)關(guān)的反跳在軟件中實(shí)現(xiàn)。七、 PIO不用的IO管腳可以懸空,因?yàn)樵贗C內(nèi)部有弱下拉電阻。在模塊中,未用的AIO通過(guò)一100nF電容接地。八、 LED可以由芯片的管腳直接驅(qū)動(dòng)九、 PCBSPI應(yīng)留出相應(yīng)的監(jiān)測(cè)點(diǎn),以便在卡過(guò)程中編程,校準(zhǔn),和查詢

14、芯片。十、 數(shù)據(jù)速率最大數(shù)據(jù)傳輸速率受到rs232電平轉(zhuǎn)換速率限制,比特率的設(shè)置在PS KEY中。要根據(jù)所使用的 RS232轉(zhuǎn)換器的實(shí)際速率來(lái)設(shè)置PS_KEY中的速率值。十一、低功耗節(jié)點(diǎn)應(yīng)用。電纜替代例子的底層固件層中不能應(yīng)用深度睡眠模式。MAX3243和MAX3228當(dāng)沒(méi)有有效的RS232信號(hào)時(shí)會(huì)自動(dòng)進(jìn)入低功耗模式關(guān)閉器件。將FORCEON(232轉(zhuǎn)換芯片的引腳)與3.3V相連可以關(guān)閉低功耗特性(此處加入跳線使該引腳可以接到0V提供選擇)。當(dāng)將引腳FORCEOFF接3.3V時(shí),將會(huì)使能自動(dòng)低功耗模式。在RS232芯片輸入端沒(méi)有有效數(shù)據(jù)輸入時(shí)232芯片將會(huì)被關(guān)閉進(jìn)入低功耗模式。(將FORCE_

15、OFF接3.3VCC使能自動(dòng)低功耗模式,而通過(guò)控制FORCEON的高低來(lái)最終確定是否真正的使用低功耗模式)。232芯片輸出的信號(hào)INVALID像BlueCore指明是否有有效信號(hào),從而可以喚醒BlueCore。INVALID為高電平時(shí)表明輸入端輸入了有效數(shù)據(jù)。INVALID連接到了IO7,向BlueCore提供一個(gè)高電平來(lái)喚醒BlueCore。如果一個(gè)PIO被設(shè)置為輸入,輸入的低電平必須是一個(gè)有效地低電平,RS232芯片輸出的INVALID信號(hào)有可能不是一個(gè)有效地低電平,所以當(dāng)沒(méi)有有效信號(hào)輸入時(shí),RS232芯片的輸出端變?yōu)楦呓M態(tài),需要加入下拉電阻,以確保PIO7輸入為低電平,是芯片進(jìn)入睡眠狀態(tài)

16、(PIO中有弱下拉)。為能使PIO能產(chǎn)生中斷,需將其設(shè)置為輸入并合理設(shè)置PSKEY_DEEP_SLEEP_PIO_WEEK,如果使用VM可以使用VmDeepSleepEnable(1)來(lái)設(shè)置(VM應(yīng)支持對(duì)PS的修改)。十二、軟件棧LM(Link Manager),LC(Link Controller),L2CAP,SDP和RFCOMM將以二進(jìn)制文件的形式提供(是固件),Connection manager library 和串口應(yīng)用以C代碼的形式提供,在BlueLab中編譯通過(guò)后,在VM中運(yùn)行(VM基于的是解釋機(jī)制,編譯一條執(zhí)行一條?)。1、 將要下載的固件編譯成二進(jìn)制文件并下載到Flash中

17、,通過(guò)SPI下載。2、 設(shè)置PS,通過(guò)PSTool十三、配對(duì)過(guò)程1、 RS232上電2、 如果已經(jīng)配對(duì),它將自動(dòng)嘗試建立連接,應(yīng)用里存儲(chǔ)了配對(duì)的設(shè)備地址。3、 如果上述過(guò)程失敗,或者沒(méi)有地址入口,從設(shè)備將會(huì)被動(dòng)地等待連接請(qǐng)求,而主設(shè)備將會(huì)尋找從設(shè)備。一旦連接成功的建立,另一方的地址將會(huì)存入PS。第二部分 BlueLab軟件編程從功能上可以把文件庫(kù)大致分為:操作系統(tǒng)、驅(qū)動(dòng)程序、用戶接口API、藍(lán)牙協(xié)議棧、連接管理庫(kù)和一些具體的應(yīng)用程序。l 理解Tasks,Timers,Schedulers在一個(gè)藍(lán)牙系統(tǒng)中,有很多工作需要維護(hù),連接管理的消息需要處理,輸入數(shù)據(jù)必須處理,輸出的數(shù)據(jù)必需發(fā)送到基帶管理

18、器上,如果要通過(guò)主機(jī)控制器與主機(jī)交互還必須編址等,所以處理器要分出不同的時(shí)間來(lái)處理不同的任務(wù)(即多線程)。每一個(gè)任務(wù)有他自己的調(diào)用堆棧,自己的IO隊(duì)列,都可以從處理器得到回應(yīng)。有一個(gè)任務(wù)用來(lái)協(xié)調(diào)其他任務(wù),叫做核心任務(wù)(kenel),也被看成調(diào)度(Schedulers)。BlueCore系統(tǒng)采取輪詢的運(yùn)行方式,處理器輪流運(yùn)行任務(wù)(而非搶占式)。當(dāng)任務(wù)阻塞時(shí),調(diào)度停止運(yùn)行該任務(wù)(當(dāng)一個(gè)任務(wù)調(diào)用一個(gè)用于等待事件發(fā)生的系統(tǒng)調(diào)用時(shí),任務(wù)將進(jìn)入阻塞狀態(tài))。所以當(dāng)一個(gè)任務(wù)永遠(yuǎn)不被阻塞時(shí),其他的任務(wù)將永遠(yuǎn)不會(huì)有機(jī)會(huì)運(yùn)行。遇到上面的情況,如果你的應(yīng)用程序不能夠被阻塞,就需要關(guān)掉整個(gè)藍(lán)牙功能,但是在藍(lán)牙堆棧里有很

19、多實(shí)時(shí)性的操作要求運(yùn)行,所以不能夠這樣做。為了解決這個(gè)問(wèn)題,BlueCore提供了一種環(huán)境叫做VM,來(lái)保護(hù)堆棧的正常運(yùn)行,而不會(huì)受到占用大量時(shí)間的應(yīng)用程序的影響。調(diào)度并不是直接調(diào)用應(yīng)用程序,而是調(diào)用虛擬機(jī),然后通過(guò)虛擬機(jī)解釋器的解釋?zhuān)摂M機(jī)可以執(zhí)行很多操作。這樣應(yīng)用代碼如果是一個(gè)無(wú)限循環(huán)虛擬機(jī)仍舊可以運(yùn)行應(yīng)用程序中預(yù)置的指令,所以無(wú)限循環(huán)不會(huì)無(wú)限運(yùn)行下去。l 虛擬機(jī)調(diào)度片上的調(diào)度器在給其他待處理過(guò)程分配處理時(shí)間之前僅允許處理有限的虛擬機(jī)命令。這意味著不能夠指望運(yùn)行在虛擬機(jī)上的應(yīng)用程序能快速的作出反應(yīng)。一個(gè)無(wú)限的while循環(huán)會(huì)阻止芯片進(jìn)入休眠狀態(tài)而增加功耗。而且虛擬機(jī)并不會(huì)一直運(yùn)行該循環(huán),而是

20、會(huì)在運(yùn)行一段時(shí)間以后轉(zhuǎn)而去處理藍(lán)牙協(xié)議棧和應(yīng)用程序的其他任務(wù)。(虛擬機(jī)調(diào)度是由scheduler實(shí)現(xiàn)的,調(diào)度程序的代碼可見(jiàn),虛擬機(jī)則只提供了接口函數(shù)) for(;) uint16 del = sched1() ;/有事件發(fā)生處理事件,沒(méi)有事件發(fā)生返回 VmWait(del) ;/應(yīng)用程序運(yùn)行在虛擬機(jī)上,調(diào)用此函數(shù)時(shí),虛擬機(jī)進(jìn)入等待狀態(tài),上面運(yùn)行的所用程序都將被阻塞/從而使藍(lán)牙堆棧上的實(shí)時(shí)性較強(qiáng)的操作的以進(jìn)行,而不受應(yīng)用程序的影響 l 使用bluelab庫(kù)Bluelab提供了各種庫(kù),庫(kù)里提供了支持basic C的函數(shù)。當(dāng)連接時(shí),所有目標(biāo)文件都會(huì)被用到,而且缺少的符號(hào)將從庫(kù)中導(dǎo)入。每一個(gè)符號(hào)都是從

21、最開(kāi)始的庫(kù)(按照命令指定的順序)獲得的。也就是說(shuō)應(yīng)用程序的makefile必需位于庫(kù)前重寫(xiě)。Scheduler依賴于message和timer庫(kù)。一些應(yīng)用程序要求scheduler,但是并不一定這兩個(gè)庫(kù)東需要。這種情況可以用這兩個(gè)庫(kù)的簡(jiǎn)化版來(lái)代替,將會(huì)占用更少的代碼和數(shù)據(jù)空間。應(yīng)用程序框架、連接管理器、調(diào)度器、Timer、BlueStack、I2C、消息庫(kù)和服務(wù)發(fā)現(xiàn)庫(kù)需要被解釋執(zhí)行,而剩余的庫(kù)將按原有模式運(yùn)行,不必經(jīng)過(guò)VM的解釋器。庫(kù)分為三種:1) 基本庫(kù)。提供支持運(yùn)行和調(diào)試C代碼的功能。2) CSR庫(kù)。3) 應(yīng)用程序庫(kù)。提供對(duì)運(yùn)行在BlueCore上的應(yīng)用程序的支持。這些庫(kù)的源代碼在src/

22、lib中??梢酝ㄟ^(guò)在當(dāng)前目錄下輸入make install命令來(lái)重建和安裝。這就可以使庫(kù)代碼的調(diào)試可以像應(yīng)用程序代碼調(diào)試那樣進(jìn)行源碼級(jí)的調(diào)試。BlueCore上運(yùn)行的程序?yàn)榱嗽谄线\(yùn)行最終的應(yīng)用程序,必須將它和一個(gè)完整的藍(lán)牙協(xié)議棧合并在一起。開(kāi)發(fā)工具包預(yù)帶了固件映像,它允許芯片運(yùn)行底層的藍(lán)牙協(xié)議棧。圖中顯示了一個(gè)應(yīng)用程序映像與缺省的Casira映像的不同。應(yīng)用程序映像有額外的協(xié)議棧層:L2CAP,RFCOMM和SDP。這些是支持串行端口規(guī)范所需的協(xié)議棧層,也用于支持基于串行端口規(guī)范的簡(jiǎn)單規(guī)范。這些協(xié)議棧層是由Mwzoe編寫(xiě)的,統(tǒng)稱(chēng)為BlueStack。在BlueLab層之上,用一個(gè)連接管理器來(lái)

23、處理RFCOMM連接的管理。BlueLab中帶有連接管理器程序庫(kù),使連接管理更加方便,但也不是非用他不可,可以自己別寫(xiě)連接管理器程序。在應(yīng)用程序頂層是VM。VM使得連接管理器、庫(kù)和應(yīng)用程序軟件運(yùn)行在受保護(hù)的內(nèi)存空間中,應(yīng)用程序軟件被編譯成虛擬機(jī)執(zhí)行代碼。當(dāng)代碼運(yùn)行時(shí),虛擬機(jī)檢查每條指令是否有非法的內(nèi)存管訪問(wèn)行為。通過(guò)這種方式,VM確保了應(yīng)用程序軟件不會(huì)干擾藍(lán)牙協(xié)議棧的正常運(yùn)行。在調(diào)試器下運(yùn)行程序時(shí),必須將RFCOMM載入到芯片中,芯片才能驅(qū)動(dòng)無(wú)線電??墒谴藭r(shí)的應(yīng)用程序是運(yùn)行在PC機(jī)上的調(diào)試器下,所以也就不可能將應(yīng)用程序的映像加載到芯片中。解決辦法是向芯片中下載一個(gè)空的映像這是一個(gè)包含虛擬機(jī)的固

24、件映像,但是不包含有效的應(yīng)用程序。主藍(lán)牙協(xié)議棧的運(yùn)行總是優(yōu)先進(jìn)行并連續(xù)不可間斷,直到有多余的處理帶寬VM才被調(diào)用。BlueStack協(xié)議?;谙Ⅱ?qū)動(dòng),層與層之間使用消息傳遞方法,應(yīng)用程序調(diào)度執(zhí)行消息不為空的任務(wù)。事件驅(qū)動(dòng)中的事件包括BlueStack事件、PIO事件、RFCOMM源端及目的端事件等。所有事件的處理以及消息隊(duì)列中的消息處理均由調(diào)度程序來(lái)執(zhí)行。調(diào)度程序由高層應(yīng)用程序啟動(dòng),而個(gè)事件及消息處理分布在各軟件層中。在2.1版本以后,可以向片上加載應(yīng)用程序,當(dāng)連接到調(diào)試器時(shí),片上應(yīng)用程序?qū)⒆詣?dòng)關(guān)閉。應(yīng)用程序庫(kù)為運(yùn)行在BlueCore上的應(yīng)用程序提供了支持。這些庫(kù)的源碼位于src/lib目錄

25、下連接管理器連接管理器處理藍(lán)牙協(xié)議棧中RFCOMM層以下所有的層。如果沒(méi)有連接管理器,則需要建立ACL鏈路,為RFCOMM配置鏈路,建立并配置L2CAP鏈路,最后才能建立RFCOMM鏈路。使用連接管理器,只需一個(gè)調(diào)用就可以讓所需的所有層完成配置。大多數(shù)發(fā)送數(shù)據(jù)的應(yīng)用程序都愿意使用RFCOMM連接,但是對(duì)于那些需要從更底層級(jí)別進(jìn)入的程序,BlueLab連接管理器除了允許他們發(fā)送RFCOMM包以外,還允許他們發(fā)送L2CAP包。L2CAP是藍(lán)牙協(xié)議棧中應(yīng)用程序可以將數(shù)據(jù)送往的最低級(jí)別,因?yàn)樗{(lán)牙鏈路中所有的用戶數(shù)據(jù)都必須作為L(zhǎng)2CAP包發(fā)送。數(shù)據(jù)包是通過(guò)連接來(lái)發(fā)送的么讓每個(gè)連接必需指向某個(gè)對(duì)等的設(shè)備,

26、所以很自然,在發(fā)送任何數(shù)據(jù)包之前,連接管理器必須與對(duì)等設(shè)備配對(duì)。在mssage.h中,任務(wù)/消息標(biāo)識(shí)符0視為連接管理器保留的,而標(biāo)識(shí)符1是為應(yīng)用程序框架保留的。其實(shí)際效果是,無(wú)論程序何時(shí)向連接管理器發(fā)送消息,他都是向消息隊(duì)列0發(fā)送,而從消息管理器返回的消息總是返回到消息隊(duì)列1。不管消息的內(nèi)容是控制信息還是數(shù)據(jù)包,這個(gè)關(guān)于消息隊(duì)列數(shù)字的規(guī)則不變。連接管理器的消息都在cm_rfcomm.h中聲明。連接管理器本身在CM_RFCOMM庫(kù)libcm_rfcom.a中實(shí)現(xiàn)。l 初始化并打開(kāi)連接管理器組成BlueStack和應(yīng)用藍(lán)牙協(xié)議的庫(kù)必需包含進(jìn)系統(tǒng)中。所以這些庫(kù)將自動(dòng)啟動(dòng)以確保協(xié)議棧的正常運(yùn)行。而連接

27、管理器不是藍(lán)牙協(xié)議棧的組成部分,是可選的獨(dú)立庫(kù),所以他不會(huì)自動(dòng)啟動(dòng)。如果想使用連接管理器,必需通過(guò)一些調(diào)用初始化并打開(kāi)連接管理器。首先,通過(guò)發(fā)送CM_INIT_REQ消息來(lái)初始化連接管理器。如果連接管理器成功注冊(cè)了BlueStack,它將返回CM_INIT_CFM消息。這些消息僅僅是啟動(dòng)連接管理器的運(yùn)行,所以兩個(gè)消息都沒(méi)有任何參數(shù)。連接管理器運(yùn)行以后,需要將應(yīng)用程序的相關(guān)信息告訴連接管理器。BlueCore經(jīng)常將設(shè)備等級(jí)(class of device CoD)設(shè)置成混雜型。這可能并不適用于當(dāng)前應(yīng)用。例如耳機(jī)應(yīng)用程序,要把CoD中Major Device Class設(shè)置為Audio,并使耳機(jī)規(guī)

28、范適應(yīng)次要設(shè)備。這樣正確的設(shè)置就很重要,因?yàn)镃oD作為查詢的回復(fù)被發(fā)送出去,然后被其他發(fā)現(xiàn)設(shè)備的應(yīng)用程序利用,這時(shí)包含CoD的查詢回復(fù)很有可能被該查詢?cè)O(shè)備所屏蔽。所以,如果CoD不能很好的反應(yīng)應(yīng)用程序所具有的功能,其他的應(yīng)用程序很可能甚至不會(huì)向使用者報(bào)告這個(gè)設(shè)備的存在。還需要讓連接管理器知道要用到的服務(wù)列表,來(lái)描述應(yīng)用程序中所提供的服務(wù)。這項(xiàng)工作處理完以后,連接管理器將會(huì)專(zhuān)注于處理關(guān)于這些服務(wù)的詢問(wèn),而不用應(yīng)用程序進(jìn)行額外的干預(yù)。應(yīng)用程序在CM_OPEN_CFM(這個(gè)消息已經(jīng)不推薦使用,詳見(jiàn)/docs/cm_rfcomm)中向連接管理器傳遞CoD和服務(wù)記錄信息。typedef struct u

29、int8 * serviceRecord; /* pointer to service record */ uint16 sizeServiceRecord; uint32 classOfDevice; CM_SERVICE_REGISTER_REQ_T;serviceRecord參數(shù)是指向一個(gè)動(dòng)態(tài)分配的內(nèi)存的指針,這個(gè)內(nèi)存用于描述應(yīng)用程序服務(wù)的服務(wù)記錄。服務(wù)記錄必須包含一個(gè)RFCOMM信道(channell)的空入口,供應(yīng)用程序的服務(wù)使用。換句話說(shuō),UUID(universal unique identifier)是由后面的三個(gè)UNIT型數(shù)來(lái)確定的。信道會(huì)由連接管理器進(jìn)行填寫(xiě)。sizeSer

30、viceRecord參數(shù)是serviceRecord完整的大小,classOfDevice參數(shù)指明了設(shè)備的種類(lèi),用來(lái)回復(fù)別的設(shè)備針對(duì)本設(shè)備的查詢操作。在BlueLab28中classOfDevice參數(shù)已不適用,僅賦給值0,取而代之的是由CM_WRITE_COD_REQ消息來(lái)注冊(cè)CoD信息。這種變化是由于當(dāng)用戶放送多個(gè)CM_SERVICE_REGISTER_REQ消息來(lái)注冊(cè)多個(gè)服務(wù)時(shí),如果提供了不同的CoD信息,當(dāng)其他設(shè)備查詢時(shí)本地連接管理器將不知道回復(fù)哪個(gè)CoD信息,所以有一個(gè)單獨(dú)的消息注冊(cè)CoD信息。在打開(kāi)連接管理器以后,可以把應(yīng)用程序提到這種狀態(tài),但是也可以繼續(xù)進(jìn)行操作使用安全管理等特性

31、(Security Manager)??梢愿嬖V安全管理器信任的設(shè)備,安全管理器將會(huì)把關(guān)于這些設(shè)備的信息存放在新人設(shè)備數(shù)據(jù)庫(kù)中(Trusted Device database)。在數(shù)據(jù)庫(kù)中登記的信任設(shè)備將可以不經(jīng)過(guò)應(yīng)用程序的授權(quán)與本地設(shè)備進(jìn)行連接并執(zhí)行操作(已經(jīng)授權(quán)無(wú)需再授權(quán)了,但是否還需授權(quán)并不是自動(dòng)完成,而是有應(yīng)用程序來(lái)實(shí)現(xiàn)的)。要使用安全管理器(SM),應(yīng)用程序可以發(fā)送CM_ADD_SM_DEVICE_REQ消息,消息中要包含將往SM中添加的可信任設(shè)備的詳細(xì)信息。typedef struct BD_ADDR_T addr; uint8 link_keySIZE_LINK_KEY; bool

32、_t trust; CM_ADD_SM_DEVICE_REQ_T;Addr參數(shù)是將要添加進(jìn)SM中的設(shè)備的地址。Link_key參數(shù)同時(shí)給出了設(shè)備的連接關(guān)鍵字(link key),trust參數(shù)如果為T(mén)RUE這名設(shè)備被信任,F(xiàn)ALSE為不信任。如果這一階段沒(méi)有連接關(guān)鍵字,將不得不跳過(guò)這一步驟。稍后可以通過(guò)配對(duì)來(lái)獲得連接關(guān)鍵字,然后調(diào)用SM。除處理消息之外,還需要啟動(dòng)timer系統(tǒng)和scheduler。這些調(diào)用應(yīng)該在配對(duì)的兩方都要進(jìn)行。要知道收到CM_INIT_CFM消息后才能發(fā)送CM_OPEN_REQ消息,所以要等待消息的到來(lái)。這樣也就需要一個(gè)消息管理者來(lái)檢查消息隊(duì)列并處理事件。l 查詢?cè)诔跏蓟?/p>

33、一個(gè)連接之前,可能會(huì)需要周?chē)乃{(lán)牙設(shè)備。在用戶端一般叫做發(fā)現(xiàn)設(shè)備,而在藍(lán)牙核心協(xié)議中叫做查詢。查詢由CM_INQUIRY_REQ來(lái)完成。應(yīng)用程序中應(yīng)該指明查詢的全部長(zhǎng)度(超時(shí))和要求回復(fù)的最大數(shù)量。在超時(shí)(timeout)的范圍內(nèi)連接管理器可能會(huì)發(fā)起不止一個(gè)查詢操作。如果達(dá)到了設(shè)定的最大回復(fù)數(shù),查詢將被中止,然后向應(yīng)用程序發(fā)送消息,消息中的某些位表明了查詢的完成。查詢操作可以得到像藍(lán)牙設(shè)備地址和設(shè)備類(lèi)型(CoD)等信息,但是如果想在設(shè)備上為用戶顯示這些信息,就得了解一些關(guān)于它們的知識(shí)。(對(duì)于電纜替代,沒(méi)有什么CoD信息能夠很好地適合這種應(yīng)用,所以CoD值用一個(gè)無(wú)符號(hào)的低字節(jié)的值是0的數(shù)值來(lái)表示

34、)為了讓藍(lán)牙芯片發(fā)起查詢操作,要使用:typedef struct uint8 max_responses; Delay inq_timeout; uint32 class_of_device; uint16 remote_name_request_enabled; CM_INQUIRY_REQ_T;max_responses參數(shù)給出了可以接受的最大查詢回復(fù)數(shù)。inq_timeout參數(shù)以秒計(jì)算的查詢過(guò)程超時(shí)。class_of_device參數(shù)作為一個(gè)過(guò)濾器:連接管理器把僅有具有此CoD的查詢回復(fù)返回給應(yīng)用程序。remote_name_request_enabled參數(shù)是一個(gè)標(biāo)志,指明對(duì)于沒(méi)有

35、見(jiàn)過(guò)的查詢結(jié)果是否對(duì)該未知設(shè)備進(jìn)行設(shè)備名查詢。應(yīng)用程序可以等待CM_INQUIRY_RESULT_IND或CM_INQUIRY_COMPLETE_CFM。在等待事件發(fā)生的過(guò)程中,應(yīng)用程序可以允許調(diào)度器分配所有時(shí)間給其他的任務(wù)知道查詢制式事件發(fā)生。typedef struct HCI_INQ_RESULT_T inq_result; uint8 *handlesHCI_LOCAL_NAME_BYTE_PACKET_PTRS; CM_INQUIRY_RESULT_IND_T;Handles參數(shù)是一個(gè)句柄數(shù)組與通過(guò)遠(yuǎn)端名字查詢操作得到的遠(yuǎn)端設(shè)備名的指針有關(guān)。typedef struct BD_ADD

36、R_T bd_addr; page_scan_rep_mode_t page_scan_rep_mode; uint8_t page_scan_period_mode; page_scan_mode_t page_scan_mode; uint24_t dev_class; /* Lower 3 bytes only used */ bt_clock_offset_t clock_offset; HCI_INQ_RESULT_T;這些參數(shù)直接來(lái)源于藍(lán)牙核心協(xié)議(在bulelab中核心協(xié)議位于D:BlueLab28mntincludeapp bluestack中)用于HCI查詢結(jié)果事件。當(dāng)所有的

37、查詢結(jié)果到達(dá)后,應(yīng)用程可以得到CM_INQUIRY_COMPLETE_CFM_T消息typedef struct inquiry_status_t status; CM_INQUIRY_COMPLETE_CFM_T;typedef enum CmInquiryComplete, CmInquiryCancelled, CmInquiryMaxResponsesReached inquiry_status_t;從Sutatus參數(shù)中可以得知為什么查詢完成。如果該參數(shù)被設(shè)置成CmInquiryComplete,表明查詢超過(guò)超時(shí)(timeout)設(shè)定。如果被設(shè)置成CmInquiryCancelled

38、表明查詢是被中途取消。如果被設(shè)置成CmInquiryMaxResponsesReached表明達(dá)到了指定的最大回復(fù)數(shù)。在這里,由于資源的限制不得不對(duì)超時(shí)和最大回復(fù)數(shù)進(jìn)行設(shè)定。第一,設(shè)定超時(shí)是避免永久的查詢耗費(fèi)電能。第二,設(shè)定最大回復(fù)數(shù)避免過(guò)多的回復(fù)和處理對(duì)有限的系統(tǒng)內(nèi)存的占用。l 配對(duì)在查詢過(guò)程之后,應(yīng)用程序會(huì)找到可供連接的設(shè)備,在建立實(shí)際連接之前,還要經(jīng)過(guò)一個(gè)過(guò)程:配對(duì)。配對(duì)過(guò)程建立了一個(gè)連接關(guān)鍵字(link key),又來(lái)加密藍(lán)牙連接上交流的數(shù)據(jù)。連接關(guān)鍵字也可以用來(lái)授權(quán)其他的設(shè)備,也就是保證連接到想要的設(shè)備。首先,要用CM_PAIR_REQ消息讓連接管理器與一個(gè)設(shè)備配對(duì)。typedef

39、struct role_t role; /* are we going to be master or slave? */ Delay timeout; bool_t authentication; BD_ADDR_T bd_addr; CM_PAIR_REQ_T;typedef enum CmMaster, CmSlave role_t;Role參數(shù)被設(shè)置成CmMaster或者CmSlave,以確定本地設(shè)備扮演的是什么角色。Timeout參數(shù)給出取消配對(duì)給出的時(shí)間限制。Authentication參數(shù)是一個(gè)布爾型標(biāo)志,TRUE表明在連接中將要使用授權(quán)功能。bd_addr參數(shù)是欲與之配對(duì)的遠(yuǎn)端

40、藍(lán)牙設(shè)備地址,僅在初始配對(duì)以嘗試建立連接時(shí)應(yīng)用。共享的連接關(guān)鍵字用一個(gè)PIN碼來(lái)建立,PIN碼必須由連接的兩端分別單獨(dú)輸入。對(duì)于沒(méi)有用戶交互接口的設(shè)備,PIN碼可以通過(guò)編程設(shè)置,這種PIN碼將是固定的。帶有固定PIN碼的設(shè)備交給用戶使用時(shí)必需附帶還有PIN碼的文檔,以便與其他設(shè)備互聯(lián)時(shí)可以輸入同樣的PIN碼。連接管理器需要從應(yīng)用程序中得到PIN碼,為了實(shí)現(xiàn)這一點(diǎn),連接管理器將會(huì)向應(yīng)用程序發(fā)送PIN碼請(qǐng)求CM_OIN_CODE_REQ消息:typedef struct BD_ADDR_T addr; CM_PIN_CODE_REQ_T;在該消息中,包含有一個(gè)藍(lán)牙設(shè)備地址,當(dāng)應(yīng)用程序中含有多種設(shè)備

41、的不同PIN碼時(shí),應(yīng)用程序可以根據(jù)這個(gè)地址來(lái)查詢的到相應(yīng)的PIN碼。這個(gè)地址還可以用來(lái)讓用戶知道是那個(gè)設(shè)備在要求與之連接。應(yīng)用程序要發(fā)送CM_PIN_CODE_RES作為上面消息的回應(yīng)。typedef struct BD_ADDR_T addr; uint8 pin_length; uint8 pinHCI_MAX_PIN_LENGTH; CM_PIN_CODE_RES_T;Addr參數(shù)是欲與之建立連接設(shè)備的地址,pin_length是PIN碼按位的長(zhǎng)度,pin是一個(gè)包含PIN碼的數(shù)組。通過(guò)pin_length設(shè)置為0可以拒絕PIN碼回復(fù)。這是因?yàn)樗{(lán)牙協(xié)議中不允許將PIN碼長(zhǎng)度為0,所以這個(gè)非

42、法的字符可以用來(lái)表明本地設(shè)備不愿意提供PIN碼。如果成功配對(duì),連接管理器將會(huì)存儲(chǔ)配對(duì)設(shè)備的地址和連接關(guān)鍵字,并會(huì)向應(yīng)用程序發(fā)送配對(duì)操作的確認(rèn)信息CM_PAIR_CFM。typedef struct pair_status_t status; BD_ADDR_T bd_addr; uint8 link_keySIZE_LINK_KEY; CM_PAIR_CFM_T;typedef enum CmPairingComplete, CmPairingTimeout, CmPairingCancelled, CmPairingFail, CmPairingNotFinished pair_status

43、_t;如果配對(duì)成功Status參數(shù)被設(shè)置成為CmPairingComplete,不成功被設(shè)置為CmPairingTimeout。bd_addr參數(shù)被設(shè)置為配對(duì)藍(lán)牙設(shè)備的地址。link_key參數(shù)是和對(duì)方設(shè)備將會(huì)用到的連接關(guān)鍵字。連接關(guān)鍵字將會(huì)在授權(quán)和編碼中應(yīng)用??梢詫⑦B接關(guān)鍵字存儲(chǔ)在應(yīng)用程序中,但是用CM_ADD_SM_DEVICE_REQ消息將連接關(guān)鍵字和設(shè)備的相關(guān)細(xì)節(jié)信息傳給SM(安全管理器)將會(huì)更加有效。也可以跳過(guò)配對(duì)過(guò)程而直接建立連接。但是,這樣就不會(huì)創(chuàng)建一個(gè)連接關(guān)鍵字,也就不能夠使用編碼和授權(quán)功能,所以這種連接并不安全,傳輸?shù)臄?shù)據(jù)很容易被其他設(shè)備截取。l 連接最后,應(yīng)用程序請(qǐng)求建立一

44、個(gè)數(shù)據(jù)連接。如果應(yīng)用程序是以主設(shè)備的身份建立的連接,需要發(fā)送一個(gè)CM_CONNECT_AS_MASTER_REQ消息。typedef struct uint16 max_framesize ; cm_auth_config_t use; BD_ADDR_T bd_addr; uint16 target; /* for sdp search */ Delay timeout; cm_park_config_t park; cm_sniff_config_t sniff; uint16 profile_server_chan; CM_CONNECT_AS_MASTER_REQ_T;Use參數(shù)配置授

45、權(quán)和編碼。Addr參數(shù)提供了將要連接的藍(lán)牙設(shè)備的地址。Target參數(shù)提供了應(yīng)用程序想使用的服務(wù)的UUID,這個(gè)信息將被SDP服務(wù)所使用(UUID對(duì)應(yīng)服務(wù)列表中的一個(gè)值,如果UUID的只存在說(shuō)明提供此項(xiàng)服務(wù))。Timeout參數(shù)給出了在放棄連接嘗試前的超時(shí)。Park參數(shù)配置了用于連接的park參數(shù)。Sniff參數(shù)配置了用于連接的sniff參數(shù)。CM_CONNECT_AS_SLAVE_REQ用來(lái)配置藍(lán)牙芯片接收連接作為從設(shè)備。這將開(kāi)啟頁(yè)掃描(page scanning)。在上面兩個(gè)消息中都用到了用于配置授權(quán)的結(jié)構(gòu)參數(shù),park和sniff。Park和sniff是兩種藍(lán)牙工作模式,sniff呼吸模

46、式,park等待模式。typedef struct uint16 authentication : 1; /1連接授權(quán),0未授權(quán) uint16 encryption : 1; /1使能加密,0關(guān)閉加密 cm_auth_config_t;typedef struct uint16 max_intval; uint16 min_intval; cm_park_config_t;typedef struct uint16 max_intval; uint16 min_intval; uint16 attempt; uint16 timeout; cm_sniff_config_t;如果use參數(shù)設(shè)置

47、成了要求授權(quán)和加密,哪么連接關(guān)鍵字是必要的。如果應(yīng)用程序已經(jīng)調(diào)用CM_ADD_SM_DEVICE_REQ消息注冊(cè)了連接的另一端設(shè)備,這樣安全管理器(SM)就已經(jīng)有了連接關(guān)鍵字,不需要應(yīng)用程序的額外參與就可以處理授權(quán)和加密。上圖中顯示了需要連接關(guān)鍵字的一種情況,但是應(yīng)用程序并沒(méi)有通過(guò)CM_ADD_SM_ DEVICE_REQ來(lái)傳送連接關(guān)鍵字和設(shè)備細(xì)節(jié)給安全管理器()。在這種情況下,連接管理器不得不從應(yīng)用程序的到連接關(guān)鍵字,向應(yīng)用程序發(fā)送CM_LINK_KEY_REQ消息:typedef struct BD_ADDR_T addr; CM_LINK_KEY_REQ_T;Addr參數(shù)是準(zhǔn)備給其授權(quán)的

48、藍(lán)牙設(shè)備地址。而應(yīng)用程序有這個(gè)設(shè)備的連接關(guān)鍵字,所以應(yīng)用程序應(yīng)該向連接管理器發(fā)送CM_LINK_KEY_RES消息,將link key傳給CM。typedef struct bool_t accept; BD_ADDR_T addr; uint8 key_valSIZE_LINK_KEY; CM_LINK_KEY_RES_T;在配對(duì)完成以后,就可以開(kāi)始建立連接。若果使能了授權(quán)和加密功能,而且遠(yuǎn)端設(shè)備沒(méi)有在SM中注冊(cè)本地設(shè)備,本地設(shè)備就會(huì)收到一個(gè)CM_LINK_KEY_REQ 消息,這樣就需要用CM_LINK_KEY_RES 消息來(lái)向遠(yuǎn)端設(shè)備發(fā)送連接關(guān)鍵字。(同理,如果在本地設(shè)備中注冊(cè)了某遠(yuǎn)端設(shè)

49、備(包含其地址和連接關(guān)鍵字),若遠(yuǎn)端設(shè)備發(fā)起連接將本地設(shè)備就不會(huì)向原端設(shè)備發(fā)送CM_LINK_KEY_REQ 消息)。Accept參數(shù)是布爾型標(biāo)志,確定是接受還是拒絕連接關(guān)鍵字的請(qǐng)求。Addr參數(shù)將要被授權(quán)的藍(lán)牙設(shè)備的地址,key_val參數(shù)是對(duì)方設(shè)備的連接關(guān)鍵字。如果沒(méi)有連接關(guān)鍵字,可以啟動(dòng)配對(duì)過(guò)程產(chǎn)生連接關(guān)鍵字,也可以把a(bǔ)ccept參數(shù)設(shè)為FALSE,拒絕建立連接。連接成功建立或者失敗后,CM將發(fā)送CM_CONNECT_CFM消息用來(lái)通知應(yīng)用程序連接建立的狀態(tài)。typedef struct connect_status_t status; BD_ADDR_T addr; uint16 rf

50、c_frame_size; Source source ; Sink sink ; uint16 conn_server_chan; CM_CONNECT_CFM_T;typedef enum CmConnectComplete, CmConnectTimeout, CmConnectCancelled,/有錯(cuò)誤發(fā)生 CmConnectDisconnect,/連接后又?jǐn)嚅_(kāi)連接 CmConnectDisconnectAbnormal, CmConnectRemoteRefusal, CmConnectServiceNotSupported, CmConnectFailed connect_sta

51、tus_t;Addr參數(shù)是目標(biāo)藍(lán)牙設(shè)備的地址。在成功建立基本的ACL連接后,應(yīng)用程序可以用CM_SCO_CONNECT_REQ消息來(lái)添加一個(gè)SCO連接。CM_DISCONNECT_REQ消息用來(lái)斷開(kāi)一個(gè)連接。如果斷開(kāi)的是SCO連接,則底層的ACL連接仍就存在(在建立SCO連接之前應(yīng)先建立ACL連接)。typedef struct link_type_t link_type; BD_ADDR_T addr; CM_DISCONNECT_REQ_T;link_type參數(shù)是將要斷開(kāi)的連接類(lèi)型,可以是ScoConnection或者RfcommConnection。Addr參數(shù)連接另一端設(shè)備的地址。l

52、 發(fā)送數(shù)據(jù)連接建立以后就可以發(fā)送和接收數(shù)據(jù)。在CM_CONNECT_CFM中返回的數(shù)據(jù)源和接受端可以由stream library庫(kù)中的函數(shù)利用,來(lái)收發(fā)數(shù)據(jù)。當(dāng)數(shù)據(jù)已經(jīng)到達(dá)源端或者離開(kāi)接收端將產(chǎn)生VM_EVENT_SOURCE和VM_EVENT_SINK事件,調(diào)度器將會(huì)調(diào)用handleSourceEvent和handleSinkEven t予以處理。l 其他消息和事件的使用連接管理器支持三種指示消息,這三種消息用來(lái)異步指示連接狀態(tài)的變化,或者錯(cuò)誤的發(fā)生。連接管理器用CM_CONNECT_STATUS_IND消息通知用戶RFCOMM連接狀態(tài)的變化。typedef struct connect_s

53、tatus_t status; BD_ADDR_T addr; CM_CONNECT_STATUS_IND_T;typedef enum CmConnectComplete, CmConnectTimeout, CmConnectCancelled, CmConnectDisconnect, CmConnectDisconnectAbnormal, CmConnectRemoteRefusal, CmConnectServiceNotSupported, CmConnectFailed connect_status_t;status參數(shù)可被設(shè)置為各種狀態(tài)。addr參數(shù)是當(dāng)前指示的連接狀態(tài)的設(shè)備

54、的地址。typedef struct cm_error_t error;BD_ADDR_T addr; CM_ERROR_IND_T;error參數(shù)是與addr地址對(duì)應(yīng)設(shè)備操作過(guò)程中發(fā)生的錯(cuò)誤。錯(cuò)誤可能會(huì)發(fā)生在以下幾種情況:1) 連接管理器繁忙時(shí)提出連接請(qǐng)求。2) 連接管理器繁忙時(shí)提出配對(duì)請(qǐng)求3) 連接建立前發(fā)送數(shù)據(jù)連接管理器提供了一個(gè)“取消”請(qǐng)求。用來(lái)取消任何配對(duì)或者有效連接,所以也不需要任何參數(shù)。這個(gè)請(qǐng)求消息沒(méi)有回復(fù)消息。但是對(duì)配對(duì)或連接的回復(fù)消息中會(huì)包含狀態(tài)CM_cancelled。CM_CANCEL_REQ();Message LibraryMessage庫(kù)是消息管理模塊,負(fù)責(zé)消息的動(dòng)

55、態(tài)分配、消息的動(dòng)態(tài)管理、消息的提取和動(dòng)態(tài)處理,對(duì)應(yīng)的實(shí)現(xiàn)函數(shù)為Mssagesched()。所有的消息都可以劃分為多個(gè)消息隊(duì)列,每個(gè)消息隊(duì)列成為一個(gè)任務(wù)。對(duì)每個(gè)任務(wù)的處理在DECLARE_TASK()中說(shuō)明。任務(wù)的標(biāo)志符中0和1是保留值,分別代表CM和框架任務(wù)(framework)。任何任務(wù)可以用sendMsg()向framewok(task 1)發(fā)送數(shù)據(jù)。Timertimer庫(kù)允許應(yīng)用程序在將來(lái)的一段時(shí)間里可以自動(dòng)的調(diào)用一系列排隊(duì)的函數(shù)。這些回調(diào)可以發(fā)生在從函數(shù)進(jìn)入排隊(duì)起的四個(gè)小時(shí)內(nèi),并且可以周期執(zhí)行或者執(zhí)行一次。一次最多可以同時(shí)應(yīng)用30個(gè)timer。l 指定延時(shí)D_SEC(n)創(chuàng)建了一個(gè)以秒為單位的延時(shí)。這個(gè)延時(shí)可以達(dá)到四個(gè)小時(shí),但是計(jì)時(shí)是非常粗糙的。D_mSEC(n)創(chuàng)建了以毫秒為單位的延時(shí)。這個(gè)延時(shí)最大長(zhǎng)度為30秒,但是精度高。D_NEVER制定了一個(gè)非常長(zhǎng)的延時(shí)并且不

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論