




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上第一部分 BTM02E-08藍(lán)牙模塊一、 模塊的基本參數(shù)1、 特性支持藍(lán)牙協(xié)議1.1、1.2輸出功率等級為class2支持USB1.1和UART串口低電壓供電2.7V3.6V標(biāo)準(zhǔn)供電電壓3.3V內(nèi)置8MbitFLASH存儲器尺寸:mm2、 描述采用CSR公司的藍(lán)牙芯片作為核心芯片,并配以8MbitFLASH存儲器,SPI接口,UART接口,USB接口,PCM音頻接口,16MHz晶振,帶通濾波器,天線匹配電路等。并不是所有的應(yīng)用都適合嵌入式應(yīng)用,因為應(yīng)用程序和固件棧必需共享片上RAM,以RFCOMM為基礎(chǔ)的應(yīng)用可用的RAM大概為幾百字節(jié)。應(yīng)用代碼必需控制在32K字以內(nèi)。
2、二、 BlueCore2-External藍(lán)牙芯片工作原理1、 關(guān)鍵特性片外8Mbit的存儲器可以靈活的用于系統(tǒng)解決方案。片上32Kbit的RAM用來實(shí)現(xiàn)藍(lán)牙無線傳輸中數(shù)據(jù)交換的緩沖4M波特率的異步串行接口片上可運(yùn)行多種協(xié)議棧:標(biāo)準(zhǔn)HCI協(xié)議棧,全部內(nèi)嵌的RFCOMM協(xié)議棧等96Ball-VFBGA封裝2、管腳使用USB接口不用時應(yīng)接地所有IO管腳被配置成輸入時,復(fù)位后將變成弱下拉不用的AIO(可編程模擬IO)管腳不使用時應(yīng)該懸空3、 內(nèi)部功能模塊USB:用來與其他數(shù)字設(shè)備的通用接口,BlueCore02扮演外圍設(shè)備角色,來回應(yīng)主機(jī)的請求SPI(異步串行接口):用來與其它數(shù)字設(shè)備的接口,SPI
3、口可以用來調(diào)試軟件和燒寫外部FLASH存儲器UART:與其他設(shè)備通信的通用同步串口可編程IO:共有15個可編程管腳(12個數(shù)字的和3個模擬的),有運(yùn)行在片上的固件來控制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個系列HCI指令l 可以訪問可編程IO端口l 訪問藍(lán)牙時鐘l 訪問固件上的隨機(jī)數(shù)產(chǎn)生器l 動態(tài)配置UART(波特率
4、,校驗,數(shù)據(jù)位)l 無線傳輸使能:一個簡單的命令,與一個專門的物理開關(guān)有關(guān),確定radio是否可以傳輸數(shù)據(jù)l 可以讀取芯片外部管腳上的電壓,可以運(yùn)行在VM或主機(jī)上來電池的監(jiān)測l 提供一組BCCMD命令,來訪問片上的“persist store”,該數(shù)據(jù)庫存儲了器件的藍(lán)牙地址,器件class,radio配置,USB/DFU常數(shù)等(Device Firmware Upgrade)l UART上break命令的應(yīng)用:用于重啟,開機(jī)進(jìn)入低功耗,喚醒主機(jī)l 提供一組“radio test”或者BIST 指令,直接控制片上的radiol 虛擬機(jī)。固件提供虛擬機(jī)環(huán)境,來運(yùn)行應(yīng)用代碼。虛擬機(jī)需要BlueLab
5、和內(nèi)嵌協(xié)議RFCOMM(或者L2CAP,SDP),運(yùn)行在VM上的協(xié)議可以完成通過可編程IO點(diǎn)亮LED的簡單工作2)BlueCore RFCOMM Stack軟件棧(將以Firmware的形式轉(zhuǎn)載到片上)直到RFCOMM層的協(xié)議都運(yùn)行在片上l 與主機(jī)接口:RS232,RFCOMM協(xié)議(如何建立無線串口連接?)l 服務(wù)發(fā)現(xiàn)協(xié)議3)虛擬機(jī)棧l 所有代碼都在片上運(yùn)行,代碼在固件旁邊運(yùn)行(代碼與固件并行運(yùn)行)l 用戶可以呼叫固件完成各種操作l 用戶的應(yīng)用代碼與堆棧是分開的,防止對堆棧造成影響,可以隨時修改應(yīng)用代碼4) 面向應(yīng)用的應(yīng)用軟件的編寫當(dāng)更高層的藍(lán)牙協(xié)議棧像固件一樣在片上運(yùn)行時,底層將會通過片上運(yùn)
6、行的一個UART的驅(qū)動程序提供L2CAP,RFCOMM,SDP的API給高層5、片外存儲器提供了8M位的存儲空間,字長為16位。用來存儲代碼和配置數(shù)據(jù)6、UART接口l 信號機(jī)制。UART接口為與其他串口器件提供了一種簡單的機(jī)制。采用RS232協(xié)議電平為0VVDD_PADS(IO電路的電壓),要求額外的電平轉(zhuǎn)換芯片。四種信號中,RX和TX用來傳輸數(shù)據(jù),RTS和CTS可以用來做流控(低電平有效),采用CMOS工藝。UART的波特率等參數(shù)設(shè)置有軟件來完成。l 復(fù)位。UART接口可以發(fā)送一BREAK信號復(fù)位BlueCore芯片,即RX信號線被置低的時間超過在PS 中的Key:PSKEY_HOST_I
7、O_UART_RESET_TIMEOUT設(shè)定的值,可以用來主機(jī)復(fù)位系統(tǒng)。同樣道理,芯片也可以發(fā)送一BREAK信號來喚醒主機(jī)。l 波特率??梢酝ㄟ^公式計算結(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)行時或被終止時將會通過SPI交換數(shù)據(jù)l 指令周期。芯片為從設(shè)備,從SPI_MOSI接受命令,從SPI_MISO發(fā)送數(shù)據(jù)SPI復(fù)位后,CSB必需置低。寫入時,MOSI上的數(shù)據(jù)在時鐘的上升沿寫入BlueCore。讀出時,在CLK的下降沿讀出。CSB變高時結(jié)束
8、。l 寫入過程。線串行寫入8位的命令字(寫指令為),接著是16位地址,然后16位的數(shù)據(jù)寫入該地址中。芯片內(nèi)地址自動加1,接下來的數(shù)據(jù)將連續(xù)的存儲于FLASH中。l 讀出過程。同上,先寫入讀命令字C15:0(),然后寫入讀地址A15:0,在MISO上將輸出16位的校驗字T15:0,跟著輸出16位數(shù)據(jù)D15:0。校驗字包括寫入的命令字7:0,和讀出數(shù)據(jù)對應(yīng)的地址15:8,可以有效克服讀出錯誤地址的內(nèi)容。讀過程地址自動加1.8、PIO可由片上運(yùn)行的應(yīng)用程序或者HCI來訪問。l PIO0/RXEN。復(fù)用端。由PS KEY 的PSKEY_TX/RX_PIO_CONTROL(0x209)來決定,可以用來作
9、為radio前端的傳輸開關(guān)。l PIO2/USB_PULL_UP(1)。復(fù)用端。UART中,可用來做PIO。USB中,用來做上拉。外部RAM應(yīng)用中,用來做片選。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)決定。芯片處于深度睡眠時,管腳可以接低,當(dāng)有一個時鐘請求時接高,時鐘必須有4ms的上升沿。9、USB芯片包括一全速的USB接口(
10、12Mbits/s),能夠直接驅(qū)動USB電纜而無需USB收發(fā)芯片。USB的數(shù)據(jù)線D+和D-連接到USB內(nèi)部的USB 緩沖器中,因此輸出阻抗較低。為了與電纜的特性阻抗相匹配,在和上必須串聯(lián)電阻。l 協(xié)議規(guī)定數(shù)據(jù)線輸出的最小高電平為.,為滿足此要求,VDD_USB供電端至少為.l 自供電模式。電路將由自己的供電系統(tǒng)供電,而不是來自于電纜的(),這種模式只會提供很小的電流(小于.)。要求要經(jīng)過一電阻網(wǎng)絡(luò)分壓,以便于當(dāng)變高時(連接到了)可以檢測到。USB_ON端可以由任一PIO來充當(dāng),但是必需在PSKEY_USB_PIO_VBUS中注明所選的PIO號l Detach和Wake_up信號BlueCore
11、可以提供兩個額外的信號給主機(jī):USB_DETACH和USBWAKE_UP。這兩個而外的信號在USB電纜和協(xié)議中是不存在的,但是在嵌入式系統(tǒng)應(yīng)用中卻非常有用,因為嵌入式應(yīng)用中實(shí)際的USB電纜是不可見的(直接用PCB布線相連),所以不知道什么時候USB電纜應(yīng)該建立連接。Usb_detach:置高時將會使USB_D+和USB_D-變?yōu)楦呓M態(tài),相當(dāng)于斷開總線連接。置低時將恢復(fù)連接,并等待主機(jī)恢復(fù)。USB_WAKE_UP:用來喚醒主機(jī)。只有USB_DETACH有效時才有意義,置為高電平時用來喚醒主機(jī),以重新開始傳輸數(shù)據(jù)。它是用來替換軟件中USB WAKE_UP消息的,當(dāng)斷開連接時不能使用。三、 外部Fl
12、ash存儲器藍(lán)牙的配置參數(shù)被存儲到Flash的PS區(qū),可以通過程序包里的PSTool工具來對其進(jìn)行操作。四、 RS232電平轉(zhuǎn)換芯片為主機(jī)與BlueCore的3.3V邏輯電平提供接口五、 復(fù)位電路高電平復(fù)位。上電時,復(fù)位管腳將置高??梢源_保電壓穩(wěn)定在3.3V之前芯片處于復(fù)位狀態(tài)。否則,當(dāng)電壓從1.8V降至1.6V時,芯片將嘗試著從外部存儲器獲得指令,而此時Flash(針對3.3V供電的Flash)的供電可能沒有準(zhǔn)備好,F(xiàn)lash將返回錯誤的指令給BlueCore,這將會導(dǎo)致固件的配置失敗。(電壓升至1.6V以上時芯片開始工作,而3.3V還未達(dá)到,F(xiàn)lash還不能正常工作)當(dāng)使用1.8V Fla
13、sh時,復(fù)位電路可以取消,把復(fù)位管腳直接接地,因為Flash和BlueCore將同時達(dá)到1.8V 電平(3.3V和1.8V 可能不會同時達(dá)到)(根據(jù)CSR公司提供的模塊資料,在復(fù)位管腳處模塊已經(jīng)通過一10K的下拉電阻接地。根據(jù)復(fù)位要求,應(yīng)盡量延長復(fù)位時間,以確保電源供電穩(wěn)定。應(yīng)接一大點(diǎn)電容)平時可以直接接地也可以通過一個1K電阻,要保證接地可靠。六、 開關(guān)開關(guān)的反跳在軟件中實(shí)現(xiàn)。七、 PIO不用的IO管腳可以懸空,因為在IC內(nèi)部有弱下拉電阻。在模塊中,未用的AIO通過一100nF電容接地。八、 LED可以由芯片的管腳直接驅(qū)動九、 PCBSPI應(yīng)留出相應(yīng)的監(jiān)測點(diǎn),以便在卡過程中編程,校準(zhǔn),和查詢
14、芯片。十、 數(shù)據(jù)速率最大數(shù)據(jù)傳輸速率受到rs232電平轉(zhuǎn)換速率限制,比特率的設(shè)置在PS KEY中。要根據(jù)所使用的 RS232轉(zhuǎn)換器的實(shí)際速率來設(shè)置PS_KEY中的速率值。十一、低功耗節(jié)點(diǎn)應(yīng)用。電纜替代例子的底層固件層中不能應(yīng)用深度睡眠模式。MAX3243和MAX3228當(dāng)沒有有效的RS232信號時會自動進(jìn)入低功耗模式關(guān)閉器件。將FORCEON(232轉(zhuǎn)換芯片的引腳)與3.3V相連可以關(guān)閉低功耗特性(此處加入跳線使該引腳可以接到0V提供選擇)。當(dāng)將引腳FORCEOFF接3.3V時,將會使能自動低功耗模式。在RS232芯片輸入端沒有有效數(shù)據(jù)輸入時232芯片將會被關(guān)閉進(jìn)入低功耗模式。(將FORCE_
15、OFF接3.3VCC使能自動低功耗模式,而通過控制FORCEON的高低來最終確定是否真正的使用低功耗模式)。232芯片輸出的信號INVALID像BlueCore指明是否有有效信號,從而可以喚醒BlueCore。INVALID為高電平時表明輸入端輸入了有效數(shù)據(jù)。INVALID連接到了IO7,向BlueCore提供一個高電平來喚醒BlueCore。如果一個PIO被設(shè)置為輸入,輸入的低電平必須是一個有效地低電平,RS232芯片輸出的INVALID信號有可能不是一個有效地低電平,所以當(dāng)沒有有效信號輸入時,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)來設(shè)置(VM應(yīng)支持對PS的修改)。十二、軟件棧LM(Link Manager),LC(Link Controller),L2CAP,SDP和RFCOMM將以二進(jìn)制文件的形式提供(是固件),Connection manager library 和串口應(yīng)用以C代碼的形式提供,在BlueLab中編譯通過后,在VM中運(yùn)行(VM基于的是解釋機(jī)制,編譯一條執(zhí)行一條?)。1、 將要下載的固件編譯成二進(jìn)制文件并下載到Flash中
17、,通過SPI下載。2、 設(shè)置PS,通過PSTool十三、配對過程1、 RS232上電2、 如果已經(jīng)配對,它將自動嘗試建立連接,應(yīng)用里存儲了配對的設(shè)備地址。3、 如果上述過程失敗,或者沒有地址入口,從設(shè)備將會被動地等待連接請求,而主設(shè)備將會尋找從設(shè)備。一旦連接成功的建立,另一方的地址將會存入PS。第二部分 BlueLab軟件編程從功能上可以把文件庫大致分為:操作系統(tǒng)、驅(qū)動程序、用戶接口API、藍(lán)牙協(xié)議棧、連接管理庫和一些具體的應(yīng)用程序。l 理解Tasks,Timers,Schedulers在一個藍(lán)牙系統(tǒng)中,有很多工作需要維護(hù),連接管理的消息需要處理,輸入數(shù)據(jù)必須處理,輸出的數(shù)據(jù)必需發(fā)送到基帶管理
18、器上,如果要通過主機(jī)控制器與主機(jī)交互還必須編址等,所以處理器要分出不同的時間來處理不同的任務(wù)(即多線程)。每一個任務(wù)有他自己的調(diào)用堆棧,自己的IO隊列,都可以從處理器得到回應(yīng)。有一個任務(wù)用來協(xié)調(diào)其他任務(wù),叫做核心任務(wù)(kenel),也被看成調(diào)度(Schedulers)。BlueCore系統(tǒng)采取輪詢的運(yùn)行方式,處理器輪流運(yùn)行任務(wù)(而非搶占式)。當(dāng)任務(wù)阻塞時,調(diào)度停止運(yùn)行該任務(wù)(當(dāng)一個任務(wù)調(diào)用一個用于等待事件發(fā)生的系統(tǒng)調(diào)用時,任務(wù)將進(jìn)入阻塞狀態(tài))。所以當(dāng)一個任務(wù)永遠(yuǎn)不被阻塞時,其他的任務(wù)將永遠(yuǎn)不會有機(jī)會運(yùn)行。遇到上面的情況,如果你的應(yīng)用程序不能夠被阻塞,就需要關(guān)掉整個藍(lán)牙功能,但是在藍(lán)牙堆棧里有很
19、多實(shí)時性的操作要求運(yùn)行,所以不能夠這樣做。為了解決這個問題,BlueCore提供了一種環(huán)境叫做VM,來保護(hù)堆棧的正常運(yùn)行,而不會受到占用大量時間的應(yīng)用程序的影響。調(diào)度并不是直接調(diào)用應(yīng)用程序,而是調(diào)用虛擬機(jī),然后通過虛擬機(jī)解釋器的解釋,虛擬機(jī)可以執(zhí)行很多操作。這樣應(yīng)用代碼如果是一個無限循環(huán)虛擬機(jī)仍舊可以運(yùn)行應(yīng)用程序中預(yù)置的指令,所以無限循環(huán)不會無限運(yùn)行下去。l 虛擬機(jī)調(diào)度片上的調(diào)度器在給其他待處理過程分配處理時間之前僅允許處理有限的虛擬機(jī)命令。這意味著不能夠指望運(yùn)行在虛擬機(jī)上的應(yīng)用程序能快速的作出反應(yīng)。一個無限的while循環(huán)會阻止芯片進(jìn)入休眠狀態(tài)而增加功耗。而且虛擬機(jī)并不會一直運(yùn)行該循環(huán),而是
20、會在運(yùn)行一段時間以后轉(zhuǎn)而去處理藍(lán)牙協(xié)議棧和應(yīng)用程序的其他任務(wù)。(虛擬機(jī)調(diào)度是由scheduler實(shí)現(xiàn)的,調(diào)度程序的代碼可見,虛擬機(jī)則只提供了接口函數(shù)) for(;) uint16 del = sched1() ;/有事件發(fā)生處理事件,沒有事件發(fā)生返回 VmWait(del) ;/應(yīng)用程序運(yùn)行在虛擬機(jī)上,調(diào)用此函數(shù)時,虛擬機(jī)進(jìn)入等待狀態(tài),上面運(yùn)行的所用程序都將被阻塞/從而使藍(lán)牙堆棧上的實(shí)時性較強(qiáng)的操作的以進(jìn)行,而不受應(yīng)用程序的影響 l 使用bluelab庫Bluelab提供了各種庫,庫里提供了支持basic C的函數(shù)。當(dāng)連接時,所有目標(biāo)文件都會被用到,而且缺少的符號將從庫中導(dǎo)入。每一個符號都是從
21、最開始的庫(按照命令指定的順序)獲得的。也就是說應(yīng)用程序的makefile必需位于庫前重寫。Scheduler依賴于message和timer庫。一些應(yīng)用程序要求scheduler,但是并不一定這兩個庫東需要。這種情況可以用這兩個庫的簡化版來代替,將會占用更少的代碼和數(shù)據(jù)空間。應(yīng)用程序框架、連接管理器、調(diào)度器、Timer、BlueStack、I2C、消息庫和服務(wù)發(fā)現(xiàn)庫需要被解釋執(zhí)行,而剩余的庫將按原有模式運(yùn)行,不必經(jīng)過VM的解釋器。庫分為三種:1) 基本庫。提供支持運(yùn)行和調(diào)試C代碼的功能。2) CSR庫。3) 應(yīng)用程序庫。提供對運(yùn)行在BlueCore上的應(yīng)用程序的支持。這些庫的源代碼在src/
22、lib中??梢酝ㄟ^在當(dāng)前目錄下輸入make install命令來重建和安裝。這就可以使庫代碼的調(diào)試可以像應(yīng)用程序代碼調(diào)試那樣進(jìn)行源碼級的調(diào)試。BlueCore上運(yùn)行的程序為了在片上運(yùn)行最終的應(yīng)用程序,必須將它和一個完整的藍(lán)牙協(xié)議棧合并在一起。開發(fā)工具包預(yù)帶了固件映像,它允許芯片運(yùn)行底層的藍(lán)牙協(xié)議棧。圖中顯示了一個應(yīng)用程序映像與缺省的Casira映像的不同。應(yīng)用程序映像有額外的協(xié)議棧層:L2CAP,RFCOMM和SDP。這些是支持串行端口規(guī)范所需的協(xié)議棧層,也用于支持基于串行端口規(guī)范的簡單規(guī)范。這些協(xié)議棧層是由Mwzoe編寫的,統(tǒng)稱為BlueStack。在BlueLab層之上,用一個連接管理器來
23、處理RFCOMM連接的管理。BlueLab中帶有連接管理器程序庫,使連接管理更加方便,但也不是非用他不可,可以自己別寫連接管理器程序。在應(yīng)用程序頂層是VM。VM使得連接管理器、庫和應(yīng)用程序軟件運(yùn)行在受保護(hù)的內(nèi)存空間中,應(yīng)用程序軟件被編譯成虛擬機(jī)執(zhí)行代碼。當(dāng)代碼運(yùn)行時,虛擬機(jī)檢查每條指令是否有非法的內(nèi)存管訪問行為。通過這種方式,VM確保了應(yīng)用程序軟件不會干擾藍(lán)牙協(xié)議棧的正常運(yùn)行。在調(diào)試器下運(yùn)行程序時,必須將RFCOMM載入到芯片中,芯片才能驅(qū)動無線電??墒谴藭r的應(yīng)用程序是運(yùn)行在PC機(jī)上的調(diào)試器下,所以也就不可能將應(yīng)用程序的映像加載到芯片中。解決辦法是向芯片中下載一個空的映像這是一個包含虛擬機(jī)的固
24、件映像,但是不包含有效的應(yīng)用程序。主藍(lán)牙協(xié)議棧的運(yùn)行總是優(yōu)先進(jìn)行并連續(xù)不可間斷,直到有多余的處理帶寬VM才被調(diào)用。BlueStack協(xié)議棧基于消息驅(qū)動,層與層之間使用消息傳遞方法,應(yīng)用程序調(diào)度執(zhí)行消息不為空的任務(wù)。事件驅(qū)動中的事件包括BlueStack事件、PIO事件、RFCOMM源端及目的端事件等。所有事件的處理以及消息隊列中的消息處理均由調(diào)度程序來執(zhí)行。調(diào)度程序由高層應(yīng)用程序啟動,而個事件及消息處理分布在各軟件層中。在2.1版本以后,可以向片上加載應(yīng)用程序,當(dāng)連接到調(diào)試器時,片上應(yīng)用程序?qū)⒆詣雨P(guān)閉。應(yīng)用程序庫為運(yùn)行在BlueCore上的應(yīng)用程序提供了支持。這些庫的源碼位于src/lib目錄
25、下連接管理器連接管理器處理藍(lán)牙協(xié)議棧中RFCOMM層以下所有的層。如果沒有連接管理器,則需要建立ACL鏈路,為RFCOMM配置鏈路,建立并配置L2CAP鏈路,最后才能建立RFCOMM鏈路。使用連接管理器,只需一個調(diào)用就可以讓所需的所有層完成配置。大多數(shù)發(fā)送數(shù)據(jù)的應(yīng)用程序都愿意使用RFCOMM連接,但是對于那些需要從更底層級別進(jìn)入的程序,BlueLab連接管理器除了允許他們發(fā)送RFCOMM包以外,還允許他們發(fā)送L2CAP包。L2CAP是藍(lán)牙協(xié)議棧中應(yīng)用程序可以將數(shù)據(jù)送往的最低級別,因為藍(lán)牙鏈路中所有的用戶數(shù)據(jù)都必須作為L2CAP包發(fā)送。數(shù)據(jù)包是通過連接來發(fā)送的么讓每個連接必需指向某個對等的設(shè)備,
26、所以很自然,在發(fā)送任何數(shù)據(jù)包之前,連接管理器必須與對等設(shè)備配對。在mssage.h中,任務(wù)/消息標(biāo)識符0視為連接管理器保留的,而標(biāo)識符1是為應(yīng)用程序框架保留的。其實(shí)際效果是,無論程序何時向連接管理器發(fā)送消息,他都是向消息隊列0發(fā)送,而從消息管理器返回的消息總是返回到消息隊列1。不管消息的內(nèi)容是控制信息還是數(shù)據(jù)包,這個關(guān)于消息隊列數(shù)字的規(guī)則不變。連接管理器的消息都在cm_rfcomm.h中聲明。連接管理器本身在CM_RFCOMM庫libcm_rfcom.a中實(shí)現(xiàn)。l 初始化并打開連接管理器組成BlueStack和應(yīng)用藍(lán)牙協(xié)議的庫必需包含進(jìn)系統(tǒng)中。所以這些庫將自動啟動以確保協(xié)議棧的正常運(yùn)行。而連接
27、管理器不是藍(lán)牙協(xié)議棧的組成部分,是可選的獨(dú)立庫,所以他不會自動啟動。如果想使用連接管理器,必需通過一些調(diào)用初始化并打開連接管理器。首先,通過發(fā)送CM_INIT_REQ消息來初始化連接管理器。如果連接管理器成功注冊了BlueStack,它將返回CM_INIT_CFM消息。這些消息僅僅是啟動連接管理器的運(yùn)行,所以兩個消息都沒有任何參數(shù)。連接管理器運(yùn)行以后,需要將應(yīng)用程序的相關(guān)信息告訴連接管理器。BlueCore經(jīng)常將設(shè)備等級(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è)置就很重要,因為CoD作為查詢的回復(fù)被發(fā)送出去,然后被其他發(fā)現(xiàn)設(shè)備的應(yīng)用程序利用,這時包含CoD的查詢回復(fù)很有可能被該查詢設(shè)備所屏蔽。所以,如果CoD不能很好的反應(yīng)應(yīng)用程序所具有的功能,其他的應(yīng)用程序很可能甚至不會向使用者報告這個設(shè)備的存在。還需要讓連接管理器知道要用到的服務(wù)列表,來描述應(yīng)用程序中所提供的服務(wù)。這項工作處理完以后,連接管理器將會專注于處理關(guān)于這些服務(wù)的詢問,而不用應(yīng)用程序進(jìn)行額外的干預(yù)。應(yīng)用程序在CM_OPEN_CFM(這個消息已經(jīng)不推薦使用,詳見/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ù)是指向一個動態(tài)分配的內(nèi)存的指針,這個內(nèi)存用于描述應(yīng)用程序服務(wù)的服務(wù)記錄。服務(wù)記錄必須包含一個RFCOMM信道(channell)的空入口,供應(yīng)用程序的服務(wù)使用。換句話說,UUID(universal unique identifier)是由后面的三個UNIT型數(shù)來確定的。信道會由連接管理器進(jìn)行填寫。sizeSer
30、viceRecord參數(shù)是serviceRecord完整的大小,classOfDevice參數(shù)指明了設(shè)備的種類,用來回復(fù)別的設(shè)備針對本設(shè)備的查詢操作。在BlueLab28中classOfDevice參數(shù)已不適用,僅賦給值0,取而代之的是由CM_WRITE_COD_REQ消息來注冊CoD信息。這種變化是由于當(dāng)用戶放送多個CM_SERVICE_REGISTER_REQ消息來注冊多個服務(wù)時,如果提供了不同的CoD信息,當(dāng)其他設(shè)備查詢時本地連接管理器將不知道回復(fù)哪個CoD信息,所以有一個單獨(dú)的消息注冊CoD信息。在打開連接管理器以后,可以把應(yīng)用程序提到這種狀態(tài),但是也可以繼續(xù)進(jìn)行操作使用安全管理等特性
31、(Security Manager)??梢愿嬖V安全管理器信任的設(shè)備,安全管理器將會把關(guān)于這些設(shè)備的信息存放在新人設(shè)備數(shù)據(jù)庫中(Trusted Device database)。在數(shù)據(jù)庫中登記的信任設(shè)備將可以不經(jīng)過應(yīng)用程序的授權(quán)與本地設(shè)備進(jìn)行連接并執(zhí)行操作(已經(jīng)授權(quán)無需再授權(quán)了,但是否還需授權(quán)并不是自動完成,而是有應(yīng)用程序來實(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è)備的連接關(guān)鍵字(link key),trust參數(shù)如果為TRUE這名設(shè)備被信任,F(xiàn)ALSE為不信任。如果這一階段沒有連接關(guān)鍵字,將不得不跳過這一步驟。稍后可以通過配對來獲得連接關(guān)鍵字,然后調(diào)用SM。除處理消息之外,還需要啟動timer系統(tǒng)和scheduler。這些調(diào)用應(yīng)該在配對的兩方都要進(jìn)行。要知道收到CM_INIT_CFM消息后才能發(fā)送CM_OPEN_REQ消息,所以要等待消息的到來。這樣也就需要一個消息管理者來檢查消息隊列并處理事件。l 查詢在初始化
33、一個連接之前,可能會需要周圍的藍(lán)牙設(shè)備。在用戶端一般叫做發(fā)現(xiàn)設(shè)備,而在藍(lán)牙核心協(xié)議中叫做查詢。查詢由CM_INQUIRY_REQ來完成。應(yīng)用程序中應(yīng)該指明查詢的全部長度(超時)和要求回復(fù)的最大數(shù)量。在超時(timeout)的范圍內(nèi)連接管理器可能會發(fā)起不止一個查詢操作。如果達(dá)到了設(shè)定的最大回復(fù)數(shù),查詢將被中止,然后向應(yīng)用程序發(fā)送消息,消息中的某些位表明了查詢的完成。查詢操作可以得到像藍(lán)牙設(shè)備地址和設(shè)備類型(CoD)等信息,但是如果想在設(shè)備上為用戶顯示這些信息,就得了解一些關(guān)于它們的知識。(對于電纜替代,沒有什么CoD信息能夠很好地適合這種應(yīng)用,所以CoD值用一個無符號的低字節(jié)的值是0的數(shù)值來表示
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ù)以秒計算的查詢過程超時。class_of_device參數(shù)作為一個過濾器:連接管理器把僅有具有此CoD的查詢回復(fù)返回給應(yīng)用程序。remote_name_request_enabled參數(shù)是一個標(biāo)志,指明對于沒有
35、見過的查詢結(jié)果是否對該未知設(shè)備進(jìn)行設(shè)備名查詢。應(yīng)用程序可以等待CM_INQUIRY_RESULT_IND或CM_INQUIRY_COMPLETE_CFM。在等待事件發(fā)生的過程中,應(yīng)用程序可以允許調(diào)度器分配所有時間給其他的任務(wù)知道查詢制式事件發(fā)生。typedef struct HCI_INQ_RESULT_T inq_result; uint8 *handlesHCI_LOCAL_NAME_BYTE_PACKET_PTRS; CM_INQUIRY_RESULT_IND_T;Handles參數(shù)是一個句柄數(shù)組與通過遠(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á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,表明查詢超過超時(timeout)設(shè)定。如果被設(shè)置成CmInquiryCancelled
38、表明查詢是被中途取消。如果被設(shè)置成CmInquiryMaxResponsesReached表明達(dá)到了指定的最大回復(fù)數(shù)。在這里,由于資源的限制不得不對超時和最大回復(fù)數(shù)進(jìn)行設(shè)定。第一,設(shè)定超時是避免永久的查詢耗費(fèi)電能。第二,設(shè)定最大回復(fù)數(shù)避免過多的回復(fù)和處理對有限的系統(tǒng)內(nèi)存的占用。l 配對在查詢過程之后,應(yīng)用程序會找到可供連接的設(shè)備,在建立實(shí)際連接之前,還要經(jīng)過一個過程:配對。配對過程建立了一個連接關(guān)鍵字(link key),又來加密藍(lán)牙連接上交流的數(shù)據(jù)。連接關(guān)鍵字也可以用來授權(quán)其他的設(shè)備,也就是保證連接到想要的設(shè)備。首先,要用CM_PAIR_REQ消息讓連接管理器與一個設(shè)備配對。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ù)給出取消配對給出的時間限制。Authentication參數(shù)是一個布爾型標(biāo)志,TRUE表明在連接中將要使用授權(quán)功能。bd_addr參數(shù)是欲與之配對的遠(yuǎn)端
40、藍(lán)牙設(shè)備地址,僅在初始配對以嘗試建立連接時應(yīng)用。共享的連接關(guān)鍵字用一個PIN碼來建立,PIN碼必須由連接的兩端分別單獨(dú)輸入。對于沒有用戶交互接口的設(shè)備,PIN碼可以通過編程設(shè)置,這種PIN碼將是固定的。帶有固定PIN碼的設(shè)備交給用戶使用時必需附帶還有PIN碼的文檔,以便與其他設(shè)備互聯(lián)時可以輸入同樣的PIN碼。連接管理器需要從應(yīng)用程序中得到PIN碼,為了實(shí)現(xiàn)這一點(diǎn),連接管理器將會向應(yīng)用程序發(fā)送PIN碼請求CM_OIN_CODE_REQ消息:typedef struct BD_ADDR_T addr; CM_PIN_CODE_REQ_T;在該消息中,包含有一個藍(lán)牙設(shè)備地址,當(dāng)應(yīng)用程序中含有多種設(shè)備
41、的不同PIN碼時,應(yīng)用程序可以根據(jù)這個地址來查詢的到相應(yīng)的PIN碼。這個地址還可以用來讓用戶知道是那個設(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碼按位的長度,pin是一個包含PIN碼的數(shù)組。通過pin_length設(shè)置為0可以拒絕PIN碼回復(fù)。這是因為藍(lán)牙協(xié)議中不允許將PIN碼長度為0,所以這個非
42、法的字符可以用來表明本地設(shè)備不愿意提供PIN碼。如果成功配對,連接管理器將會存儲配對設(shè)備的地址和連接關(guān)鍵字,并會向應(yīng)用程序發(fā)送配對操作的確認(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;如果配對成功Status參數(shù)被設(shè)置成為CmPairingComplete,不成功被設(shè)置為CmPairingTimeout。bd_addr參數(shù)被設(shè)置為配對藍(lán)牙設(shè)備的地址。link_key參數(shù)是和對方設(shè)備將會用到的連接關(guān)鍵字。連接關(guān)鍵字將會在授權(quán)和編碼中應(yīng)用??梢詫⑦B接關(guān)鍵字存儲在應(yīng)用程序中,但是用CM_ADD_SM_DEVICE_REQ消息將連接關(guān)鍵字和設(shè)備的相關(guān)細(xì)節(jié)信息傳給SM(安全管理器)將會更加有效。也可以跳過配對過程而直接建立連接。但是,這樣就不會創(chuàng)建一個連接關(guān)鍵字,也就不能夠使用編碼和授權(quán)功能,所以這種連接并不安全,傳輸?shù)臄?shù)據(jù)很容易被其他設(shè)備截取。l 連接最后,應(yīng)用程序請求建立一
44、個數(shù)據(jù)連接。如果應(yīng)用程序是以主設(shè)備的身份建立的連接,需要發(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、權(quán)和編碼。Addr參數(shù)提供了將要連接的藍(lán)牙設(shè)備的地址。Target參數(shù)提供了應(yīng)用程序想使用的服務(wù)的UUID,這個信息將被SDP服務(wù)所使用(UUID對應(yīng)服務(wù)列表中的一個值,如果UUID的只存在說明提供此項服務(wù))。Timeout參數(shù)給出了在放棄連接嘗試前的超時。Park參數(shù)配置了用于連接的park參數(shù)。Sniff參數(shù)配置了用于連接的sniff參數(shù)。CM_CONNECT_AS_SLAVE_REQ用來配置藍(lán)牙芯片接收連接作為從設(shè)備。這將開啟頁掃描(page scanning)。在上面兩個消息中都用到了用于配置授權(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消息注冊了連接的另一端設(shè)備,這樣安全管理器(SM)就已經(jīng)有了連接關(guān)鍵字,不需要應(yīng)用程序的額外參與就可以處理授權(quán)和加密。上圖中顯示了需要連接關(guān)鍵字的一種情況,但是應(yīng)用程序并沒有通過CM_ADD_SM_ DEVICE_REQ來傳送連接關(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)用程序有這個設(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;在配對完成以后,就可以開始建立連接。若果使能了授權(quán)和加密功能,而且遠(yuǎn)端設(shè)備沒有在SM中注冊本地設(shè)備,本地設(shè)備就會收到一個CM_LINK_KEY_REQ 消息,這樣就需要用CM_LINK_KEY_RES 消息來向遠(yuǎn)端設(shè)備發(fā)送連接關(guān)鍵字。(同理,如果在本地設(shè)備中注冊了某遠(yuǎn)端設(shè)
49、備(包含其地址和連接關(guān)鍵字),若遠(yuǎn)端設(shè)備發(fā)起連接將本地設(shè)備就不會向原端設(shè)備發(fā)送CM_LINK_KEY_REQ 消息)。Accept參數(shù)是布爾型標(biāo)志,確定是接受還是拒絕連接關(guān)鍵字的請求。Addr參數(shù)將要被授權(quán)的藍(lán)牙設(shè)備的地址,key_val參數(shù)是對方設(shè)備的連接關(guān)鍵字。如果沒有連接關(guān)鍵字,可以啟動配對過程產(chǎn)生連接關(guān)鍵字,也可以把a(bǔ)ccept參數(shù)設(shè)為FALSE,拒絕建立連接。連接成功建立或者失敗后,CM將發(fā)送CM_CONNECT_CFM消息用來通知應(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,/有錯誤發(fā)生 CmConnectDisconnect,/連接后又?jǐn)嚅_連接 CmConnectDisconnectAbnormal, CmConnectRemoteRefusal, CmConnectServiceNotSupported, CmConnectFailed connect_sta
51、tus_t;Addr參數(shù)是目標(biāo)藍(lán)牙設(shè)備的地址。在成功建立基本的ACL連接后,應(yīng)用程序可以用CM_SCO_CONNECT_REQ消息來添加一個SCO連接。CM_DISCONNECT_REQ消息用來斷開一個連接。如果斷開的是SCO連接,則底層的ACL連接仍就存在(在建立SCO連接之前應(yīng)先建立ACL連接)。typedef struct link_type_t link_type; BD_ADDR_T addr; CM_DISCONNECT_REQ_T;link_type參數(shù)是將要斷開的連接類型,可以是ScoConnection或者RfcommConnection。Addr參數(shù)連接另一端設(shè)備的地址。l
52、 發(fā)送數(shù)據(jù)連接建立以后就可以發(fā)送和接收數(shù)據(jù)。在CM_CONNECT_CFM中返回的數(shù)據(jù)源和接受端可以由stream library庫中的函數(shù)利用,來收發(fā)數(shù)據(jù)。當(dāng)數(shù)據(jù)已經(jīng)到達(dá)源端或者離開接收端將產(chǎn)生VM_EVENT_SOURCE和VM_EVENT_SINK事件,調(diào)度器將會調(diào)用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ù)可被設(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地址對應(yīng)設(shè)備操作過程中發(fā)生的錯誤。錯誤可能會發(fā)生在以下幾種情況:1) 連接管理器繁忙時提出連接請求。2) 連接管理器繁忙時提出配對請求3) 連接建立前發(fā)送數(shù)據(jù)連接管理器提供了一個“取消”請求。用來取消任何配對或者有效連接,所以也不需要任何參數(shù)。這個請求消息沒有回復(fù)消息。但是對配對或連接的回復(fù)消息中會包含狀態(tài)CM_cancelled。CM_CANCEL_REQ();Message LibraryMessage庫是消息管理模塊,負(fù)責(zé)消息的動
55、態(tài)分配、消息的動態(tài)管理、消息的提取和動態(tài)處理,對應(yīng)的實(shí)現(xiàn)函數(shù)為Mssagesched()。所有的消息都可以劃分為多個消息隊列,每個消息隊列成為一個任務(wù)。對每個任務(wù)的處理在DECLARE_TASK()中說明。任務(wù)的標(biāo)志符中0和1是保留值,分別代表CM和框架任務(wù)(framework)。任何任務(wù)可以用sendMsg()向framewok(task 1)發(fā)送數(shù)據(jù)。Timertimer庫允許應(yīng)用程序在將來的一段時間里可以自動的調(diào)用一系列排隊的函數(shù)。這些回調(diào)可以發(fā)生在從函數(shù)進(jìn)入排隊起的四個小時內(nèi),并且可以周期執(zhí)行或者執(zhí)行一次。一次最多可以同時應(yīng)用30個timer。l 指定延時D_SEC(n)創(chuàng)建了一個以秒為單位的延時。這個延時可以達(dá)到四個小時,但是計時是非常粗糙的。D_mSEC(n)創(chuàng)建了以毫秒為單位的延時。這個延時最大長度為30秒,但是精度高。D_NEVER制定了一個非常長的延時并且不
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 七龍珠III:小悟空對戰(zhàn)紅緞帶軍
- 云南彈跳訓(xùn)練培訓(xùn)課件
- 石油安全培訓(xùn)課件
- 情緒管理與心理健康教育
- 培訓(xùn)課分享課件格式
- 作文競賽培訓(xùn)課件
- 急救小分隊培訓(xùn)課件
- 研究生論文在哪里看
- 川農(nóng)畢業(yè)論文怎么寫
- 中西教育方式差異
- 四升五數(shù)學(xué)暑假思維訓(xùn)練題90道
- 廣東省高速公路工程地質(zhì)勘察技術(shù)規(guī)程(2024 版)
- 耳尖放血醫(yī)學(xué)課件
- 公司綠色可持續(xù)發(fā)展規(guī)劃報告
- 2024年電阻器用陶瓷基體項目可行性研究報告
- IP授權(quán)合作框架協(xié)議
- 涼山州2010級高考情況分析暨2010年四川高考數(shù)學(xué)試題評析及復(fù)習(xí)
- 國開《學(xué)前教育科研方法》期末大作業(yè)范文1
- 院感手衛(wèi)生試題及答案
- 世界文明史學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 英語國家概況(修訂版)Chapter-18
評論
0/150
提交評論