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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

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

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

9、為radio前端的傳輸開關。l PIO2/USB_PULL_UP(1)。復用端。UART中,可用來做PIO。USB中,用來做上拉。外部RAM應用中,用來做片選。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)決定。芯片處于深度睡眠時,管腳可以接低,當有一個時鐘請求時接高,時鐘必須有4ms的上升沿。9、USB芯片包括一全速的USB接口(

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

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

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

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

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

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

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

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

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

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

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

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

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

23、處理RFCOMM連接的管理。BlueLab中帶有連接管理器程序庫,使連接管理更加方便,但也不是非用他不可,可以自己別寫連接管理器程序。在應用程序頂層是VM。VM使得連接管理器、庫和應用程序軟件運行在受保護的內存空間中,應用程序軟件被編譯成虛擬機執(zhí)行代碼。當代碼運行時,虛擬機檢查每條指令是否有非法的內存管訪問行為。通過這種方式,VM確保了應用程序軟件不會干擾藍牙協(xié)議棧的正常運行。在調試器下運行程序時,必須將RFCOMM載入到芯片中,芯片才能驅動無線電。可是此時的應用程序是運行在PC機上的調試器下,所以也就不可能將應用程序的映像加載到芯片中。解決辦法是向芯片中下載一個空的映像這是一個包含虛擬機的固

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

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

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

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

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

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

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

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

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

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

34、)為了讓藍牙芯片發(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ù)給出了可以接受的最大查詢回復數(shù)。inq_timeout參數(shù)以秒計算的查詢過程超時。class_of_device參數(shù)作為一個過濾器:連接管理器把僅有具有此CoD的查詢回復返回給應用程序。remote_name_request_enabled參數(shù)是一個標志,指明對于沒有

35、見過的查詢結果是否對該未知設備進行設備名查詢。應用程序可以等待CM_INQUIRY_RESULT_IND或CM_INQUIRY_COMPLETE_CFM。在等待事件發(fā)生的過程中,應用程序可以允許調度器分配所有時間給其他的任務知道查詢制式事件發(fā)生。typedef struct HCI_INQ_RESULT_T inq_result; uint8 *handlesHCI_LOCAL_NAME_BYTE_PACKET_PTRS; CM_INQUIRY_RESULT_IND_T;Handles參數(shù)是一個句柄數(shù)組與通過遠端名字查詢操作得到的遠端設備名的指針有關。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ù)直接來源于藍牙核心協(xié)議(在bulelab中核心協(xié)議位于D:BlueLab28mntincludeapp bluestack中)用于HCI查詢結果事件。當所有的

37、查詢結果到達后,應用程可以得到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ù)被設置成CmInquiryComplete,表明查詢超過超時(timeout)設定。如果被設置成CmInquiryCancelled

38、表明查詢是被中途取消。如果被設置成CmInquiryMaxResponsesReached表明達到了指定的最大回復數(shù)。在這里,由于資源的限制不得不對超時和最大回復數(shù)進行設定。第一,設定超時是避免永久的查詢耗費電能。第二,設定最大回復數(shù)避免過多的回復和處理對有限的系統(tǒng)內存的占用。l 配對在查詢過程之后,應用程序會找到可供連接的設備,在建立實際連接之前,還要經(jīng)過一個過程:配對。配對過程建立了一個連接關鍵字(link key),又來加密藍牙連接上交流的數(shù)據(jù)。連接關鍵字也可以用來授權其他的設備,也就是保證連接到想要的設備。首先,要用CM_PAIR_REQ消息讓連接管理器與一個設備配對。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ù)被設置成CmMaster或者CmSlave,以確定本地設備扮演的是什么角色。Timeout參數(shù)給出取消配對給出的時間限制。Authentication參數(shù)是一個布爾型標志,TRUE表明在連接中將要使用授權功能。bd_addr參數(shù)是欲與之配對的遠端

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

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

42、法的字符可以用來表明本地設備不愿意提供PIN碼。如果成功配對,連接管理器將會存儲配對設備的地址和連接關鍵字,并會向應用程序發(fā)送配對操作的確認信息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;如果配對成功Status參數(shù)被設置成為CmPairingComplete,不成功被設置為CmPairingTimeout。bd_addr參數(shù)被設置為配對藍牙設備的地址。link_key參數(shù)是和對方設備將會用到的連接關鍵字。連接關鍵字將會在授權和編碼中應用。可以將連接關鍵字存儲在應用程序中,但是用CM_ADD_SM_DEVICE_REQ消息將連接關鍵字和設備的相關細節(jié)信息傳給SM(安全管理器)將會更加有效。也可以跳過配對過程而直接建立連接。但是,這樣就不會創(chuàng)建一個連接關鍵字,也就不能夠使用編碼和授權功能,所以這種連接并不安全,傳輸?shù)臄?shù)據(jù)很容易被其他設備截取。l 連接最后,應用程序請求建立一

44、個數(shù)據(jù)連接。如果應用程序是以主設備的身份建立的連接,需要發(fā)送一個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、權和編碼。Addr參數(shù)提供了將要連接的藍牙設備的地址。Target參數(shù)提供了應用程序想使用的服務的UUID,這個信息將被SDP服務所使用(UUID對應服務列表中的一個值,如果UUID的只存在說明提供此項服務)。Timeout參數(shù)給出了在放棄連接嘗試前的超時。Park參數(shù)配置了用于連接的park參數(shù)。Sniff參數(shù)配置了用于連接的sniff參數(shù)。CM_CONNECT_AS_SLAVE_REQ用來配置藍牙芯片接收連接作為從設備。這將開啟頁掃描(page scanning)。在上面兩個消息中都用到了用于配置授權的結構參數(shù),park和sniff。Park和sniff是兩種藍牙工作模式,sniff呼吸模

46、式,park等待模式。typedef struct uint16 authentication : 1; /1連接授權,0未授權 uint16 encryption : 1; /1使能加密,0關閉加密 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ù)設置

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

48、藍牙設備地址。而應用程序有這個設備的連接關鍵字,所以應用程序應該向連接管理器發(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;在配對完成以后,就可以開始建立連接。若果使能了授權和加密功能,而且遠端設備沒有在SM中注冊本地設備,本地設備就會收到一個CM_LINK_KEY_REQ 消息,這樣就需要用CM_LINK_KEY_RES 消息來向遠端設備發(fā)送連接關鍵字。(同理,如果在本地設備中注冊了某遠端設

49、備(包含其地址和連接關鍵字),若遠端設備發(fā)起連接將本地設備就不會向原端設備發(fā)送CM_LINK_KEY_REQ 消息)。Accept參數(shù)是布爾型標志,確定是接受還是拒絕連接關鍵字的請求。Addr參數(shù)將要被授權的藍牙設備的地址,key_val參數(shù)是對方設備的連接關鍵字。如果沒有連接關鍵字,可以啟動配對過程產(chǎn)生連接關鍵字,也可以把accept參數(shù)設為FALSE,拒絕建立連接。連接成功建立或者失敗后,CM將發(fā)送CM_CONNECT_CFM消息用來通知應用程序連接建立的狀態(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,/有錯誤發(fā)生 CmConnectDisconnect,/連接后又斷開連接 CmConnectDisconnectAbnormal, CmConnectRemoteRefusal, CmConnectServiceNotSupported, CmConnectFailed connect_sta

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

52、 發(fā)送數(shù)據(jù)連接建立以后就可以發(fā)送和接收數(shù)據(jù)。在CM_CONNECT_CFM中返回的數(shù)據(jù)源和接受端可以由stream library庫中的函數(shù)利用,來收發(fā)數(shù)據(jù)。當數(shù)據(jù)已經(jīng)到達源端或者離開接收端將產(chǎn)生VM_EVENT_SOURCE和VM_EVENT_SINK事件,調度器將會調用handleSourceEvent和handleSinkEven t予以處理。l 其他消息和事件的使用連接管理器支持三種指示消息,這三種消息用來異步指示連接狀態(tài)的變化,或者錯誤的發(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ù)可被設置為各種狀態(tài)。addr參數(shù)是當前指示的連接狀態(tài)的設備

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

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

溫馨提示

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

評論

0/150

提交評論