




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
項(xiàng)目五
藍(lán)牙無(wú)線通信技術(shù)應(yīng)用設(shè)計(jì)2022/11/1任務(wù)5.1基于BLE協(xié)議棧的串口通信【任務(wù)描述】設(shè)計(jì)藍(lán)牙模塊與PC串口通信系統(tǒng),要求藍(lán)牙模塊上電時(shí),向串口發(fā)送“HelloNEWLab!”,并在PC的串口調(diào)試軟件上顯示;另外,在串口調(diào)試軟件上發(fā)送信息給藍(lán)牙模塊時(shí),藍(lán)牙模塊收到信息后,立刻原樣返回串口接收到的數(shù)據(jù)給串口調(diào)試軟件,并顯示出來(lái)。【任務(wù)環(huán)境】硬件:NewLab平臺(tái)1套、藍(lán)牙模塊1個(gè)、PC機(jī)1臺(tái)。軟件:Windows7/10,IAR集成開(kāi)發(fā)環(huán)境,協(xié)議棧BLE-CC254x-1.3.2,串口調(diào)試助手。【必備知識(shí)點(diǎn)】藍(lán)牙技術(shù)概念藍(lán)牙協(xié)議棧安裝與使用5.1.1藍(lán)牙技術(shù)概念藍(lán)牙無(wú)線技術(shù)是全球使用范圍最廣的短距離無(wú)線標(biāo)準(zhǔn)之一,藍(lán)牙4.0版本綜合了傳統(tǒng)藍(lán)牙,高速藍(lán)牙和低功耗藍(lán)牙等三種藍(lán)牙技術(shù),它集成了藍(lán)牙技術(shù)在無(wú)線連接上的固有優(yōu)勢(shì),同時(shí)增加了高速藍(lán)牙和低功耗藍(lán)牙的特點(diǎn)。低功耗藍(lán)牙(BluetoothLowEnergy),簡(jiǎn)稱BLE,是藍(lán)牙4.0的核心規(guī)范。BLE協(xié)議棧是由藍(lán)牙技術(shù)聯(lián)盟在藍(lán)牙4.0的基礎(chǔ)上推出的低功耗藍(lán)牙通信標(biāo)準(zhǔn),雙方需要共同按照這一標(biāo)準(zhǔn)進(jìn)行正常的數(shù)據(jù)發(fā)射和接收。在BLE協(xié)議棧中包括一個(gè)小型操作系統(tǒng)(抽象層OSAL),由其負(fù)責(zé)系統(tǒng)的調(diào)度。操作系統(tǒng)的大部分代碼被封裝在庫(kù)代碼中,用戶查看不到的。對(duì)于用戶來(lái)說(shuō),只能使用API來(lái)調(diào)用相關(guān)庫(kù)函數(shù)。BLE協(xié)議棧中定義了GAP(GenericAccessProfile)和GATT(GenericAttribute)兩個(gè)基本配置文件,其中GAP層負(fù)責(zé)設(shè)備訪問(wèn)模式和進(jìn)程,包括設(shè)備發(fā)現(xiàn)、建立連接、終止連接、初始化安全特性、設(shè)備配置等;GATT層用于已連接的設(shè)備之間的數(shù)據(jù)通信。【任務(wù)實(shí)訓(xùn)步驟】第1步,搭建串口通信電路。將藍(lán)牙模塊中CC2541芯片的RX(P0.2)與JP705的EP703相連,TX(P0.3)與JP704的EP704相連,并將藍(lán)牙模塊固定在NEWLab平臺(tái)上。然后給CC2541上電(用導(dǎo)線將nBT_PWR與地相連,即JP702第2插孔(從左到右算)與CN722相連)。第2步,打開(kāi)SimpleBLEPeripheral工程。打開(kāi)C:\TexasInstruments\……\ble\SimpleBLEPeripheral\CC2541DB目錄下的SimpleBLEPeripheral.eww工程,在Workspace欄內(nèi)選擇CC2541。第3步,串口初始化。打開(kāi)工程中NPI文件夾下的npi.c文件,串口初始化函數(shù)voidNPI_InitTransport(npiCBack_tnpiCBack)對(duì)串口號(hào)、波特率、流控、校驗(yàn)位等進(jìn)行配置。voidNPI_InitTransport(npiCBack_tnpiCBack){halUARTCfg_tuartConfig;uartConfig.configured=TRUE;uartConfig.baudRate=NPI_UART_BR;uartConfig.flowControl=NPI_UART_FC;uartConfig.flowControlThreshold=NPI_UART_FC_THRESHOLD;uartConfig.rx.maxBufSize=NPI_UART_RX_BUF_SIZE;uartConfig.tx.maxBufSize=NPI_UART_TX_BUF_SIZE;uartConfig.idleTimeout=NPI_UART_IDLE_TIMEOUT;uartCEnable=NPI_UART_INT_ENABLE;uartConfig.callBackFunc=(halUARTCBack_t)npiCBack;(void)HalUARTOpen(NPI_UART_PORT,&uartConfig);return;}【任務(wù)實(shí)訓(xùn)步驟】第4步,串口發(fā)送數(shù)據(jù)。打開(kāi)simpleBLEPeripheral.c文件中的初始化函數(shù)voidSimpleBLEPeripheral_Init(uint8task_id),在此函數(shù)中添加NPI_InitTransport(NULL),在后面再加上一條上電提示HelloNEWLab!的語(yǔ)句,添加頭文件語(yǔ)句:#include“npi.h”。連接下載器和串口線,下載程序,就可以看到串口調(diào)試軟件收到HelloNEWLab!的信息,如圖所示,通過(guò)NPI_WriteTransport(uint8*,uint16)函數(shù)實(shí)現(xiàn)串口發(fā)送功能。【任務(wù)實(shí)訓(xùn)步驟】第5步,串口接收數(shù)據(jù)。在simpleBLEPeripheral.c文件聲明串口回調(diào)函數(shù)staticvoidNpiSerialCallback(uint8port,uint8events),并在voidSimpleBLEPeripheral_Init(uint8task_id)函數(shù)中傳入串口回調(diào)函數(shù),將NPI_InitTransport(NULL)修改為:NPI_InitTransport(NpiSerialCallback)。當(dāng)串口特定的事件或條件發(fā)生時(shí),操作系統(tǒng)就會(huì)使用函數(shù)指針調(diào)用回調(diào)函數(shù)對(duì)事件進(jìn)行處理。具體處理操作在回調(diào)函數(shù)中實(shí)現(xiàn)。staticvoidNpiSerialCallback(uint8port,uint8events){(void)port;uint8numBytes=0;uint8buf[128];if(events&HAL_UART_RX_TIMEOUT) //串口有數(shù)據(jù){numBytes=NPI_RxBufLen(); //讀出串口緩沖區(qū)有多少字節(jié) if(numBytes) {NPI_ReadTransport(buf,numBytes); //從串口緩沖區(qū)讀出numBytes字節(jié)數(shù)據(jù)NPI_WriteTransport(buf,numBytes);//把串口接收到的數(shù)據(jù)再打印出來(lái) }}}【任務(wù)實(shí)訓(xùn)步驟】第6步,串口顯示SimpleBLEPeripheral工程初始化信息。TI官方的例程是利用LCD來(lái)輸出信息的,我們的設(shè)備沒(méi)有LCD,但我們可以利用UART來(lái)輸出信息,具體步驟如下:1.打開(kāi)工程目錄中HAL\Target\CC2540EB\Drivers\hal_lcd.c文件,在HalLcdWriteString函數(shù)中添加以下代碼:#ifdefLCD_TO_UARTNPI_WriteTransport((uint8*)str,osal_strlen(str));//串口顯示NPI_WriteTransport("\n",1); //換行#endif2.在預(yù)編譯中添加LCD_TO_UART,
HAL_LCD=TRUE需要打開(kāi),并且在hal_lcd.c文件中添加#include“npi.h”,編譯無(wú)誤后,下載程序,模塊上電后,打開(kāi)串口調(diào)試助手,可以看到圖所示結(jié)果。【任務(wù)實(shí)訓(xùn)步驟】【技能拓展】本項(xiàng)目采用npi.c文件中現(xiàn)有的串口配置函數(shù)來(lái)實(shí)現(xiàn)串口收發(fā)功能,請(qǐng)大家在SimpleBLEPeripheral.c文件中自己編寫串口配置函數(shù),實(shí)現(xiàn)串口收發(fā)功能。任務(wù)5.2基于BLE協(xié)議棧的無(wú)線點(diǎn)燈【任務(wù)描述】使用BTool控制接口命令(BTool工具是PC端一個(gè)應(yīng)用程序,可以作為BLE主機(jī)),使PC與藍(lán)牙模塊(從機(jī))進(jìn)行連接、數(shù)據(jù)傳輸,從而通過(guò)BTool工具控制藍(lán)牙模塊上的LED燈亮和滅。【任務(wù)環(huán)境】硬件:NewLab平臺(tái)1套、藍(lán)牙模塊1個(gè)、PC機(jī)1臺(tái)。軟件:Windows7/10,IAR集成開(kāi)發(fā)環(huán)境,協(xié)議棧BLE-CC254x-1.3.2,BTool工具。【必備知識(shí)點(diǎn)】1.主機(jī)與從機(jī)數(shù)據(jù)建立連接的流程;2.BLE應(yīng)用數(shù)據(jù)傳輸過(guò)程分析。5.2.1主、從機(jī)數(shù)據(jù)建立連接流程以TI提供的SimpleBLEPeripheral和SimpleBLECentral工程為例,從機(jī)與主機(jī)之間建立連接的流程如圖5-6所示。圖5-6主從機(jī)之間建立連接流程圖5.2.2BLE應(yīng)用數(shù)據(jù)傳輸過(guò)程
主機(jī)與從機(jī)建立連接之后,會(huì)進(jìn)行服務(wù)發(fā)現(xiàn)、特征發(fā)現(xiàn)、數(shù)據(jù)讀寫等數(shù)據(jù)傳輸,應(yīng)用數(shù)據(jù)傳輸流程如圖所示。當(dāng)主機(jī)需要讀取從機(jī)中提供的應(yīng)用數(shù)據(jù)時(shí),首先主機(jī)進(jìn)行GATT數(shù)據(jù)服務(wù)發(fā)現(xiàn),給出想要發(fā)現(xiàn)的主服務(wù)UUID,只有主服務(wù)UUID匹配,才能獲得GATT數(shù)據(jù)服務(wù)。主機(jī)與從機(jī)數(shù)據(jù)傳輸過(guò)程:首先從機(jī)發(fā)起搜索請(qǐng)求,搜索正在廣播的節(jié)點(diǎn)設(shè)備,若GAP服務(wù)的UUID相匹配,則主機(jī)與節(jié)點(diǎn)設(shè)備可以建立連接。主機(jī)發(fā)起建立連接請(qǐng)求,節(jié)點(diǎn)設(shè)備響應(yīng)后,主機(jī)與從機(jī)建立連接。主機(jī)發(fā)起主服務(wù)UUID進(jìn)行GATT服務(wù)發(fā)現(xiàn)。發(fā)現(xiàn)GATT服務(wù)后,主機(jī)發(fā)送要進(jìn)行數(shù)據(jù)讀寫操作的特征值的UUID,獲取特征值的句柄,即采用發(fā)送UUID方式獲得句柄。通過(guò)句柄,對(duì)特征值進(jìn)行讀寫操作。
Profile規(guī)范是一種標(biāo)準(zhǔn)通信協(xié)議,定義了設(shè)備如何實(shí)現(xiàn)一種連接或者應(yīng)用。Profile規(guī)范存在于從機(jī)中,藍(lán)牙組織規(guī)定了一系列的標(biāo)準(zhǔn)Profile規(guī)范,例如HIDOVERGATT、防丟器、心率計(jì)等。同時(shí),產(chǎn)品開(kāi)發(fā)者也可以根據(jù)需求自己新建Profile,即非標(biāo)準(zhǔn)的Profile規(guī)范。1.GATT服務(wù)(GATTServer)BLE協(xié)議棧的GATT層是用于應(yīng)用程序在兩個(gè)連接設(shè)備之間的數(shù)據(jù)通信。當(dāng)設(shè)備連接后,主機(jī)將作為GATTClient,是從GATT服務(wù)器讀/寫數(shù)據(jù)的設(shè)備;從機(jī)將作為GATTServer,是包含客戶端(主機(jī))需要讀/寫數(shù)據(jù)的設(shè)備。在BLE從機(jī)中,每個(gè)Profile中會(huì)包含多個(gè)GATTServer,每個(gè)GATTServer代表從機(jī)的一種能力。而且每個(gè)GATTServer里又包括了多個(gè)特征值(Characteristic),每個(gè)具體的特征值,才是BLE通信的主體。例如:某電子產(chǎn)品當(dāng)前的電量是70%,所以會(huì)通過(guò)電量的特征值存在從機(jī)的profile里,這樣主機(jī)就可以通過(guò)這個(gè)特征值來(lái)讀取當(dāng)前電量。2.特征值(Characteristic)BLE主從機(jī)的通信均是通過(guò)Characteristic來(lái)實(shí)現(xiàn),可以理解為一個(gè)標(biāo)簽,通過(guò)這個(gè)標(biāo)簽可以獲取或者寫入想要的內(nèi)容。3.統(tǒng)一識(shí)別碼(UUID)GATTService和Characteristic,都需要一個(gè)唯一的UUID來(lái)標(biāo)識(shí)。GATT主服務(wù)的UUID為FFF0,特征值1、特征值2、……的UUID依次為FFF1、FFF2、……。4.句柄(handle)GATT服務(wù)將整個(gè)服務(wù)加到屬性表中,并為每個(gè)屬性分配唯一的句柄。在BLE協(xié)議棧中,數(shù)據(jù)發(fā)送包括主機(jī)向從機(jī)發(fā)送數(shù)據(jù)和從機(jī)向主機(jī)發(fā)送數(shù)據(jù),即前者是GATT的client主動(dòng)向service發(fā)送數(shù)據(jù);后者是GATT的service主動(dòng)向client發(fā)送數(shù)據(jù),其實(shí)是從機(jī)通知主機(jī)來(lái)讀數(shù)據(jù)。1.主機(jī)向從機(jī)發(fā)送數(shù)據(jù)在主從機(jī)已建立連接的狀態(tài)下,主機(jī)通過(guò)特征值的句柄對(duì)特征值的寫操作,思路如下:首先,主機(jī)對(duì)句柄、發(fā)送數(shù)據(jù)長(zhǎng)度等變量進(jìn)行填充,再調(diào)用GATT_WriteCharValue函數(shù)實(shí)現(xiàn)向從機(jī)發(fā)送數(shù)據(jù)。typedefstruct{uint16handle;uint8len;uint8value[ATT_MTU_SIZE-3]; //ATT_MTU_SIZE為23,規(guī)定長(zhǎng)度長(zhǎng)度為20uint8sig;uint8cmd;}attWriteReq_t;//*************************************************************************************attWriteReq_treq;//定義結(jié)構(gòu)體變量reqreq.handle=simpleBLECharHdl; //填充句柄req.len=1; //填充發(fā)送數(shù)據(jù)長(zhǎng)度req.value[0]=simpleBLECharVal; //填充發(fā)送數(shù)據(jù)req.sig=0; //填充信號(hào)狀態(tài)req.cmd=0; //填充命令標(biāo)志status=GATT_WriteCharValue(simpleBLEConnHandle,&req,simpleBLETaskId);2.從機(jī)向主機(jī)發(fā)送數(shù)據(jù)首先主機(jī)應(yīng)開(kāi)啟特征值的通知功能,從機(jī)再調(diào)用GATT_Notification函數(shù),或者修改帶通知功能的特征值,通知主機(jī)來(lái)讀數(shù)據(jù),實(shí)現(xiàn)從機(jī)向主機(jī)發(fā)送數(shù)據(jù),而不是像主機(jī)那樣調(diào)用GATT_WriteCharValue函數(shù)實(shí)現(xiàn)數(shù)據(jù)傳輸。在BLE協(xié)議棧中,數(shù)據(jù)接收包括主機(jī)接收從機(jī)發(fā)來(lái)數(shù)據(jù)和從機(jī)接收主機(jī)發(fā)來(lái)的數(shù)據(jù)。1.主機(jī)接收從機(jī)發(fā)送數(shù)據(jù)在主從機(jī)已建立連接的狀態(tài),主機(jī)通過(guò)特征值的句柄對(duì)特征值的讀操作,思路如下:首先,調(diào)用GATT_ReadCharValue函數(shù)讀取從機(jī)的數(shù)據(jù)。attReadReq_treq;req.handle=simpleBLECharHdl;//填充句柄status=GATT_ReadCharValue(simpleBLEConnHandle,&req,simpleBLETaskId);2.從機(jī)接收主機(jī)發(fā)送數(shù)據(jù)當(dāng)從機(jī)接收到主機(jī)發(fā)來(lái)的數(shù)據(jù)后,從機(jī)會(huì)產(chǎn)生一個(gè)GATTProfileCallback回調(diào),在simpleProfileChangeCB()回調(diào)函數(shù)中接收主機(jī)發(fā)送的數(shù)據(jù)。這個(gè)callback在從機(jī)初始化時(shí)向Profile注冊(cè)。staticsimpleProfileCBs_tsimpleBLEPeripheral_SimpleProfileCBs={simpleProfileChangeCB};//Charactersiticvaluechangecallback//RegistercallbackwithSimpleGATTprofile注冊(cè)特征值改變時(shí)的回調(diào)函數(shù)VOIDSimpleProfile_RegisterAppCBs(&simpleBLEPeripheral_SimpleProfileCBs);//************************************************************************************staticvoidsimpleProfileChangeCB(uint8paramID){uint8newValue;switch(paramID){caseSIMPLEPROFILE_CHAR1: //特征值1編號(hào)SimpleProfile_GetParameter(SIMPLEPROFILE_CHAR1,&newValue);//獲得特征值
……【任務(wù)實(shí)訓(xùn)步驟】如果沒(méi)有USBDongle板,可以采用一塊藍(lán)牙模塊來(lái)代替,這里采用代替方式。1.向藍(lán)牙模塊中寫入固件“HostTestRelease工程”,制作USBDongle板。打開(kāi)HostTestRelease.eww工程,路徑為:…\Projects\ble\HostTestApp\CC2541,在Workspace欄內(nèi)選擇“CC2541EM”。由于藍(lán)牙模塊的串口未采用流控功能,因此要禁止串口流控,方法如下:(1)打開(kāi)hal_uart.c文件,找到uint8HalUARTOpen(uint8port,halUARTCfg_t*config)函數(shù),可以看到if(port==HAL_UART_PORT_0)HalUARTOpenDMA(config);代碼,右擊選擇“gotodefinitionofHalUARTOpenDMA(config)”。(2)在staticvoidHalUARTOpenDMA(halUARTCfg_t*config)函數(shù)中增加關(guān)閉流控代碼。2.編譯程序,下載到藍(lán)牙模塊中。3.打開(kāi)BTool(安裝了BLE協(xié)議棧,就可以在【所有程序】->【TexasInstruments】中找到該工具),可看到BTool啟動(dòng)界面,需要用戶設(shè)置串口參數(shù),點(diǎn)擊【OK】連接BTool工具,連接界面如圖所示。【任務(wù)實(shí)訓(xùn)步驟】第二步,制作藍(lán)牙從機(jī)。打開(kāi)SimpleBLEPeripheral.eww工程,路徑為:…\ble\SimpleBLEPeripheral\CC2541DB,下載到另一個(gè)藍(lán)牙模塊之中。注意:參照任務(wù)5.1修改,實(shí)現(xiàn)藍(lán)牙模塊與PC的串口通信功能,以便從機(jī)的信息在串口調(diào)試軟件上顯示。第三步,使用BTool工具。1.掃描節(jié)點(diǎn)設(shè)備首先使USBDongle板(主機(jī))和藍(lán)牙模塊(從機(jī))復(fù)位,然后在BTool工具的設(shè)備控制界面區(qū)域內(nèi),選中“Discover/Connect”選項(xiàng)卡,再點(diǎn)擊“Scan”按鈕,對(duì)正在發(fā)送廣播的節(jié)點(diǎn)設(shè)備進(jìn)行掃描。默認(rèn)掃描10s,掃描完成后,會(huì)在右側(cè)的窗口中顯示掃描到的所有設(shè)備個(gè)數(shù)和設(shè)備地址,如圖所示。若不想等10s,可以單擊“Cancel”停止掃描,則在右側(cè)的窗口中顯示當(dāng)前已經(jīng)掃描到的設(shè)備個(gè)數(shù)和設(shè)備地址。【任務(wù)實(shí)訓(xùn)步驟】2.連接參數(shù)設(shè)置在建立設(shè)備連接之前,設(shè)置的參數(shù)包括:最小和最大的連接間隔、從機(jī)延時(shí)、管理超時(shí)。可以使用默認(rèn)參數(shù),也可以針對(duì)不同的應(yīng)用來(lái)調(diào)整這些參數(shù)。設(shè)置好參數(shù)后,點(diǎn)擊“Set”按鈕才能生效,注意參數(shù)修改必須在建立連接之前操作。3.建立連接在“SlaveBDA”欄選擇將與從機(jī)建立連接的節(jié)點(diǎn)設(shè)備地址,然后單擊“Establish”按鈕建立連接。此時(shí)節(jié)設(shè)備的信息會(huì)出現(xiàn)在窗口左側(cè),同時(shí)在從機(jī)的串口調(diào)試端顯示“Connected”已連接提示字符,如圖所示。【任務(wù)實(shí)訓(xùn)步驟】4.對(duì)SimpleProfile的特征值進(jìn)行操作SimpleGATTProfile中包含5個(gè)特征值,每個(gè)特征值的屬性都不相同,如表所示。特征值編號(hào)數(shù)據(jù)長(zhǎng)度(字節(jié))屬性句柄(handle)UUIDCHAR11可讀可寫0x0025FFF1CHAR21只讀0x0028FFF2C
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 日常搞笑活動(dòng)方案
- 春節(jié)云活動(dòng)策劃方案
- 春節(jié)年貨集結(jié)活動(dòng)方案
- 明溪餐飲活動(dòng)方案
- 新年游園趣味活動(dòng)方案
- 旅游安全宣傳活動(dòng)方案
- 新裝修公司市場(chǎng)策劃方案
- 無(wú)錫歷史教研活動(dòng)方案
- 春季美容活動(dòng)方案
- 春聯(lián)文化研究活動(dòng)方案
- 寧夏城市發(fā)展集團(tuán)有限責(zé)任公司招聘筆試題庫(kù)2025
- 2024-2025年材料員考試題庫(kù)含答案【典型題】
- 兒童服務(wù)培訓(xùn)課件模板
- 上海市楊浦區(qū)2024-2025學(xué)年七年級(jí)(下)期末語(yǔ)文試題(含答案)
- 創(chuàng)業(yè)設(shè)計(jì)裝修公司路演提案
- 2025年云南省公務(wù)員考試(行測(cè))真題試卷(含答案)
- 數(shù)字化經(jīng)濟(jì)本地化路徑-洞察及研究
- 2025至2030中國(guó)海洋功能性食品行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 2025年高考全國(guó)二卷英語(yǔ)高考真題
- 國(guó)家種畜禽生產(chǎn)經(jīng)營(yíng)許可證管理系統(tǒng)操作指南
- 石油化工管道施工方案
評(píng)論
0/150
提交評(píng)論