版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、一、源代碼的構(gòu)建框架 Ortp是一種開源軟件,實(shí)現(xiàn)了 RTP 與 RTCP 協(xié)議。首先在RTP中有幾種重要的結(jié)構(gòu)體,第一種比較重要的結(jié)構(gòu)體是payload type,該結(jié)構(gòu)用于指定編碼類型,以及與其相關(guān)的時鐘速率、采樣率等一些參數(shù),參見下圖。struct _PayloadTypeint type; /*< one of PAYLOAD_* macros*/int clock_rate; /*< rtp clock rate*/char bits_per_sample;/* in case of continuous audio data */char *zero_pattern;i
2、nt pattern_length;/* other useful information for the application*/int normal_bitrate;/*in bit/s */char *mime_type; /*<actually the submime, ex: pcm, pcma, gsm*/int channels; /*< number of channels of audio */char *recv_fmtp; /* various format parameters for the incoming stream */char *send_fm
3、tp; /* various format parameters for the outgoing stream */int flags;void *user_data; 在代碼中,不同的媒體類型有不同的 payloadtype 結(jié)構(gòu)體與之對應(yīng),h263,g729,MPEG4等。 因為每種編碼都有其獨(dú)有的特點(diǎn),而且許多參數(shù)也不一樣,所以 RTP 包頭中使用 payload 域標(biāo)記負(fù)載的類型,一方面接收端可以就此判斷負(fù)載的類型,從而選擇對應(yīng)的解碼器進(jìn)行解碼播放;另一方面,代碼在進(jìn)行時間戳等方面的計算時可以更加方便一點(diǎn)。所有系統(tǒng)當(dāng)前支持的payload 類型都被放在一個數(shù)組中, 由全局變量 av_
4、profile 這個結(jié)構(gòu)體實(shí)例統(tǒng)領(lǐng)。 除了 payloadtype 結(jié)構(gòu)體外,一個更重要的結(jié)構(gòu)體是 rtpsession。該結(jié)構(gòu)體即是一個會話的抽象,與會話相關(guān)的各種信息都定義在該結(jié)構(gòu)體上或者能夠通過該結(jié)構(gòu)體找到。要使用oRTP 進(jìn)行媒體數(shù)據(jù)的傳輸,需要先創(chuàng)建一個會話,之后所有數(shù)據(jù)的傳輸都在會話上完成或 基于會話完成。rtpsession結(jié)構(gòu)體的定義如下:struct _RtpSessionRtpSession *next;/* next RtpSession, when the session are enqueued by the scheduler */int mask_pos;/* t
5、he position in the scheduler mask of RtpSession : do not move this field: it is part of the ABI since the session_set macros use it*/struct RtpProfile *profile;int pt;unsigned int ssrc;WaitPoint wp;int telephone_events_pt;/* the payload type used for telephony events */ snd,rcv;unsigned int inc_ssrc
6、_candidate;int inc_same_ssrc_count;int hw_recv_pt; /* recv payload type before jitter buffer */int recv_buf_size;RtpSignalTable on_ssrc_changed;RtpSignalTable on_payload_type_changed;RtpSignalTable on_telephone_event_packet;RtpSignalTable on_telephone_event;RtpSignalTable on_timestamp_jump;RtpSignal
7、Table on_network_error;RtpSignalTable on_rtcp_bye;struct _OList *signal_tables;struct _OList *eventqs;msgb_allocator_t allocator;RtpStream rtp;RtcpStream rtcp;RtpSessionMode mode;struct _RtpScheduler *sched;uint32_t flags;int dscp;int multicast_ttl;int multicast_loopback;void * user_data;/* FIXME: S
8、hould be a table for all session participants. */struct timeval last_recv_time; /* Time of receiving the RTP/RTCP packet. */mblk_t *pending;/* telephony events extension */mblk_t *current_tev;/* the pending telephony events */mblk_t *sd;queue_t contributing_sources;unsigned int lost_packets_test_vec
9、tor;unsigned int interarrival_jitter_test_vector;unsigned int delay_test_vector;float rtt;/*last round trip delay calculated*/OrtpNetworkSimulatorCtx *net_sim_ctx;bool_t symmetric_rtp;bool_t permissive; /*use the permissive algorithm*/bool_t use_connect; /* use connect() on the socket */bool_t ssrc_
10、set;Session 的初始化通過接口 rtp_session_init 完成,外部獲得一個新的 session是通過調(diào)用接口rtp_session_new 完成。關(guān)于 session 的其他有關(guān)配置和獲取信息的操作都可以在文件 rtpsession.c 中找到定義。使用 oRTP 進(jìn)行數(shù)據(jù)傳輸時,可以在一個任務(wù)上完成多個會話流的接收和發(fā)送。這得益于oRTP 中調(diào)度模塊的支持。要使用調(diào)度模塊,應(yīng)用需要在進(jìn)行 oRTP 的初始化時對調(diào)度進(jìn)行初始化,將需要調(diào)度管理的會話注冊到調(diào)度模塊中,這樣當(dāng)進(jìn)行接收和發(fā)送操作時,先向調(diào)度詢問當(dāng)前會話是否可以進(jìn)行發(fā)送和接收,如果不能進(jìn)行收發(fā)操作,則處理下一個會話
11、。 這有點(diǎn)類似I/O 接口上的 select 操作。調(diào)度模塊使用的數(shù)據(jù)結(jié)構(gòu)主要為 rtpscheduler,定義如下 :struct _RtpScheduler RtpSession *list;/* list of scheduled sessions*/SessionSetall_sessions; /* mask of scheduled sessions */intall_max;/* the highest pos in the all mask */SessionSet r_sessions;/* mask of sessions that have a recv event */
12、intr_max;SessionSetw_sessions;/* mask of sessions that have a send event */int w_max;SessionSete_sessions;/* mask of session that have error event */inte_max;int max_sessions;/* the number of position in the masks */ /* GMutex *unblock_select_mutex; */ortp_cond_t unblock_select_cond;ortp_mutex_tlock
13、;ortp_thread_t thread;int thread_running;struct _RtpTimer *timer;uint32_t time_; /*number of miliseconds elapsed since the start of the thread */uint32_t timer_inc;/* the timer increment in milisec */;調(diào)度結(jié)構(gòu)體中的r/w/e分別代表接收,發(fā)送,異常。Avprofile.c文件中定義了一些負(fù)載類型。接收的 rtp和 rtcp 包的解析處理函數(shù)在文件 rtpparse.c 和 rtcpparse.c
14、 文件 中實(shí)現(xiàn)。實(shí)現(xiàn)的是將包中的事件包取出放入列隊中。rtpsession_inet.c 文件中定義了數(shù)據(jù)在網(wǎng)絡(luò)中傳輸?shù)倪^程,利用socket 接口完成了。介紹了socket ,遠(yuǎn)程地址,端口的建立等設(shè)置。其相關(guān)的聲明在rtpsession_priv.h 中定義,Rtpsignaltable.c主要實(shí)現(xiàn)一些信號量的初始化,加入一個信號量,以及發(fā)射信號量。定義一些回調(diào)函數(shù)等。rtptimer.c,scheduler.c,sessionset.c等文件實(shí)現(xiàn)了調(diào)度模塊。 port.c 文件中實(shí)現(xiàn)常用的任務(wù)(如分配內(nèi)存)的創(chuàng)建及銷毀,條件變量及互斥鎖,進(jìn)程間的管道通信機(jī)制等。文件utils.c 文件中
15、講述了一些數(shù)據(jù)結(jié)構(gòu),講述了一些鏈表的操作。Str_utils.c文件中講述了一些隊列的操作。首先,隊列數(shù)據(jù)結(jié)構(gòu)由三部分組成:隊列頭、消息塊以及數(shù)據(jù)塊隊列頭指向消息塊,消息塊之間可以構(gòu)成雙向鏈表,這是隊列的基本要素。消息塊本身不帶buffer,數(shù)據(jù)是由專門的數(shù)據(jù)塊來保存的, 并被消息塊指向。 在發(fā)送上層應(yīng)用的 payload 數(shù)據(jù)之前,oRTP 會構(gòu)造一個消息塊,數(shù)據(jù)指針會指向payload, 這避免了數(shù)據(jù)拷貝。較低層的接口處理數(shù)據(jù)時依賴于消息塊結(jié)構(gòu)。接收后的數(shù)據(jù)從消息塊中拷貝到用戶buffer。接收的 rtp和 rtcp 包的解析處理函數(shù)在文件 rtpparse.c 和 rtcpparse.c
16、 文件 中實(shí)現(xiàn)。在使用oRTP 提供的 rtp 庫之前,需要先對其進(jìn)行初始化,這部分的實(shí)現(xiàn)在 oRTP.c 文件中。oRTP的初始化主要調(diào)用兩個接口:ortp_init 和 ortp_scheduler_init。其中 ortp_init完成 了 payload 的注冊,ortp_scheduler_init完成了調(diào)度任務(wù)的初始化。寫程序首先你要了解你的程序是干什么,要解決的什么問題,需要那些變量,以及各變量的關(guān)系。我們RTP的目的是實(shí)現(xiàn)對數(shù)據(jù)的打包輸出,以及對數(shù)據(jù)的接收,我們前期的工作就是實(shí)現(xiàn)各種初始化,將我們的想要的傳輸?shù)臄?shù)據(jù),地址信息等通過調(diào)用庫函數(shù)提供的接口將我們的數(shù)據(jù)傳入內(nèi)部,在做這
17、些以前,我們還需要判斷我們的系統(tǒng)參數(shù)個數(shù)是否正確,同時還要注意數(shù)據(jù)類型的一致性。一系列的初始化結(jié)束后就要進(jìn)行數(shù)據(jù)的發(fā)送與接收了,這些數(shù)據(jù)都是要經(jīng)過緩沖區(qū)的,再寫入我們的文件系統(tǒng)的,或者發(fā)送出去。整個過程結(jié)束后,就是要進(jìn)行資源的釋放。編程的難點(diǎn)是消息是怎樣交換。二、主要函數(shù)介紹rtp_session_init函數(shù)原型:void rtp_session_init (RtpSession * session, int mode)函數(shù)功能:執(zhí)行rtp會話的一些必要的初始化工作參數(shù)含義:session: rtp會話結(jié)構(gòu)體,含有一些rtp會話的基本信息mode: 傳輸模式,有以下幾種,決定本會話的一些特性
18、。RTP_SESSION_RECVONLY:只進(jìn)行rtp數(shù)據(jù)的接收RTP_SESSION_SENDONLY:只進(jìn)行rtp數(shù)據(jù)的發(fā)送RTP_SESSION_SENDRECV:可以進(jìn)行rtp數(shù)據(jù)的接收和發(fā)送執(zhí)行的操作:1) 首先判斷會話是否為空,若不是,則將會話初始化,即清零2) 根據(jù)傳輸模式設(shè)置標(biāo)志變量的值,在rtpsession中一共設(shè)置了14個標(biāo)志位3) 隨機(jī)產(chǎn)生SSRC和同步源描述信息4) 傳入全局的av_profile,即使用默認(rèn)的profile配置,profile 包含名字與負(fù)載類型,負(fù)載類型的確認(rèn)先要得到庫中的所擁有的負(fù)載,再比較是否與我們所傳入的負(fù)載相匹配,若是傳回類型號5) 套接
19、字的初始化,包含套接字的文件描述符,套接字大小6) 初始化rtp包緩沖區(qū)隊列7) 信號量的初始化,包含了7種信號量,分別為ssrc的變化 ;負(fù)載類型的改變;電話事件;電話事件包;時間戳的跳變;網(wǎng)絡(luò)錯誤;RTCP結(jié)束包。8) 發(fā)送負(fù)載類型默認(rèn)設(shè)置為0(pcmu音頻),接收負(fù)載類型默認(rèn)設(shè)置為-1(未定義)9) 將session的其他成員的值均設(shè)置一個默認(rèn)值。10) 還有抖動的設(shè)置,rtcp報告的間隔,job運(yùn)行等一些設(shè)置。rtp_session_new 函數(shù)原型:RtpSession *rtp_session_new (int mode)函數(shù)功能:建立一個會話該函數(shù)很簡單,首先為會話分配一個內(nèi)存,
20、再調(diào)用rtp_session_init()進(jìn)行會話的初始化。成功則返回一個會話。rtp_session_set_scheduling_mode函數(shù)原型:void rtp_session_set_scheduling_mode (RtpSession * session, int yesno)函數(shù)功能: RtpScheduler管理多個session的調(diào)度和收發(fā)的控制,本函數(shù)設(shè)置是否使用該session調(diào)度管理功能。參數(shù)含義:session: rtp會話結(jié)構(gòu)體yesno: 是否使用rtp session的系統(tǒng)調(diào)度功能說明:如果yesno為1,調(diào)用ortp_get_scheduler ()得到一個
21、調(diào)度器,將會話添加到調(diào)度會話集合中則表明使用系統(tǒng)的session調(diào)度管理功能,意味著可以使用以下功能:1) 可以使用session_set_select在多個rtp會話之間進(jìn)行選擇,根據(jù)時間戳判定某個會話是否到達(dá)了收發(fā)的時間。2) 可以使用rtp_session_set_blocking_mode()設(shè)置是否使用阻塞模式來進(jìn)行rtp包的發(fā)送和接收。如果yesno為0,則表明該會話不受系統(tǒng)管理和調(diào)度。關(guān)于rtp session的管理和調(diào)度,由全局的變量RtpScheduler *_ortp_scheduler來負(fù)責(zé),該變量必須通過ortp_scheduler_init() 來進(jìn)行初始化操作。在o
22、rtp_scheduler_init()rtp_scheduler_new() rtp_scheduler_init(sched)rtp_session_set_blocking_mode函數(shù)原型:void rtp_session_set_blocking_mode (RtpSession * session, int yesno)函數(shù)功能:設(shè)置是否使用阻塞模式,參數(shù)含義:session: rtp會話結(jié)構(gòu)體yesno: 是否使用阻塞模式注意,阻塞模式只有在scheduling mode被開啟的情況下才能使用。rtp_session_set_local_addr函數(shù)原型:int rtp_sess
23、ion_set_local_addr( RtpSession * session, const char * addr,int port)函數(shù)功能:設(shè)置本地rtp數(shù)據(jù)監(jiān)聽地址參數(shù)含義:session: rtp會話結(jié)構(gòu)體addr: port: 監(jiān)聽端口,如果設(shè)置為-1,則系統(tǒng)為其自動分配端口返回值: 0表示成功rtp_session_set_remote_addr函數(shù)原型:int rtp_session_set_remote_addr (RtpSession * session, const char * addr, int port)函數(shù)功能:設(shè)置RTP發(fā)送的目的地址參數(shù)含義:session:
24、 rtp會話結(jié)構(gòu)體addr: 目的IP地址port: 目的地址的監(jiān)聽端口號返回值: 0表示成功rtp_session_set_send_payload_type函數(shù)原型:int rtp_session_set_send_payload_type (RtpSession * session, int pt)函數(shù)功能:設(shè)置RTP發(fā)送數(shù)據(jù)的負(fù)載類型(即將外部的負(fù)載類型傳入會話中)參數(shù)含義:session: rtp會話結(jié)構(gòu)體pt:負(fù)載類型返回值: 0表示成功,-1表示負(fù)載未定義說明:負(fù)載類型在payloadtype.h文件中有詳細(xì)的定義,RTP接收端有著類似的負(fù)載類型設(shè)置函數(shù),int rtp_sess
25、ion_set_recv_payload_type ( RtpSession * session, int paytype ) ,注意,發(fā)送的負(fù)載類型必須與接收的負(fù)載類型一致才能正常完成收發(fā)。rtp_session_signal_connect函數(shù)原型:int rtp_session_signal_connect (RtpSession * session, const char *signal, RtpCallback cb, unsigned long user_data)函數(shù)功能:本函數(shù)提供一種方式,用于通知應(yīng)用程序各種可能發(fā)生的RTP事件(信號)??赡芡ㄟ^注冊回調(diào)函數(shù)的形式來實(shí)現(xiàn)本功能
26、。參數(shù)含義:session: rtp會話結(jié)構(gòu)體signal: 信號的名稱cb: 回調(diào)函數(shù)user_data:傳遞給回調(diào)函數(shù)的數(shù)據(jù)返回值:0表示成功怎樣實(shí)現(xiàn):將回調(diào)函數(shù)的地址,用戶數(shù)據(jù)加入RtpSignalTable表中,若成功則返回0注意參數(shù)中的信號是在rtp_session_init()中定義的7種信號量。rtp_session_send_with_ts函數(shù)原型:int rp_session_send_with_ts (RtpSession * session, const uint8_t * buffer, int len, uint32_t userts)函數(shù)功能:發(fā)送RTP數(shù)據(jù)包參數(shù)含
27、義:session: rtp會話結(jié)構(gòu)體buffer: 需要發(fā)送的RTP數(shù)據(jù)的緩沖區(qū)len: 需要發(fā)送的RTP數(shù)據(jù)的長度userts: 本RTP數(shù)據(jù)包的時間戳返回值: 成功發(fā)送到網(wǎng)絡(luò)中的字節(jié)數(shù)說明:這個函數(shù)定義了外部的接口,內(nèi)部定義了怎樣為數(shù)據(jù)打包,將包發(fā)送調(diào)用了函數(shù)_rtp_session_sendm_with_ts ,而這個函數(shù)主要的目的是講述包是怎樣在進(jìn)程中發(fā)送,講述了調(diào)度的過程。其中調(diào)用了底層的發(fā)送函數(shù)rtp_session_rtp_send,該函數(shù)利用SOCKET進(jìn)行數(shù)據(jù)的傳輸。rtp_session_recv_with_ts函數(shù)原型:int rtp_session_recv_with
28、_ts (RtpSession * session, char * buffer,int len, uint32_t time, int * have_more)函數(shù)功能:接收RTP數(shù)據(jù)包參數(shù)含義:session: rtp會話結(jié)構(gòu)體buffer: 存放接收的RTP數(shù)據(jù)的緩沖區(qū)len: 期望接收的RTP數(shù)據(jù)的長度time: 期望接收的RTP數(shù)據(jù)的時間戳have_more:標(biāo)識接收緩沖區(qū)是否還有數(shù)據(jù)沒有傳遞完。當(dāng)用戶給出的緩沖區(qū)不夠大時,為了標(biāo)識緩沖區(qū)數(shù)據(jù)未取完,則have_more指向的數(shù)據(jù)為1,期望用戶以同樣的時間戳再次調(diào)用本函數(shù);否則為0,標(biāo)識取完。rtp_session_destroy【原
29、型】: void rtp_session_destroy(RtpSession *session)【功能】:摧毀rtp會話對象,釋放資源【參數(shù)】:session已經(jīng)創(chuàng)建的RTP會話對象三、程序示例本程序選取的是RTP發(fā)送的示例#include <ortp/ortp.h>#include <signal.h>#include <stdlib.h>/條件編譯,如果不是win32系統(tǒng)則包含下面的頭文件#ifndef _WIN32 #include <sys/types.h>#include <sys/time.h>#include <
30、stdio.h>#endifint runcond=1;/當(dāng)一個信號發(fā)生時,使請求停止,在下面的退出循環(huán)中將使用void stophandler(int signum)runcond=0;static const char *help="usage: rtpsendfilename dest_ip4addr dest_port -with-clockslide <value> -with-jitter <milliseconds>n"int main(int argc, char *argv)RtpSession *session;unsign
31、ed char buffer160;int i;FILE *infile;char *ssrc;uint32_t user_ts=0;int clockslide=0;int jitter=0;/說明了系統(tǒng)參數(shù)將大于4個if (argc<4)printf("%s", help);return -1;for(i=4;i<argc;i+)if (strcmp(argvi,"-with-clockslide")=0)i+;if (i>=argc) printf("%s", help);return -1;clockslid
32、e=atoi(argvi);/將字符串換成整數(shù)型ortp_message("Using clockslide of %i milisecond every 50 packets.",clockslide);else if (strcmp(argvi,"-with-jitter")=0)ortp_message("Jitter will be added to outgoing stream.");i+;if (i>=argc) printf("%s", help);return -1;jitter=atoi(
33、argvi);/設(shè)置抖動/rtp庫的一些基本初始化ortp_init();/profile初始化,全局統(tǒng)計量清零,產(chǎn)生隨機(jī)數(shù)ortp_scheduler_init();/對一些信號集合的初始化設(shè)置,建立并開啟rtp調(diào)度器ortp_set_log_level_mask(ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR);/設(shè)置日記的級別/創(chuàng)建一個rtp會話session=rtp_session_new(RTP_SESSION_SENDONLY);rtp_session_set_scheduling_mode(session,1);rtp_session_set_block
34、ing_mode(session,1);rtp_session_set_connected_mode(session,TRUE); / 設(shè)置遠(yuǎn)程RTP客戶端的的IP和監(jiān)聽端口(即本rtp數(shù)據(jù)包的發(fā)送目的地址rtp_session_set_remote_addr(session,argv2,atoi(argv3);/設(shè)置希望發(fā)送包的負(fù)載類型rtp_session_set_payload_type(session,0);/獲取同步標(biāo)示源ssrc=getenv("SSRC");if (ssrc!=NULL) printf("using SSRC=%i.n",a
35、toi(ssrc);/ 設(shè)置輸出流的SSRC。不做此步的話將會給個隨機(jī)值rtp_session_set_ssrc(session,atoi(ssrc);/打開一個文件,準(zhǔn)備發(fā)送文件中的數(shù)據(jù)#ifndef _WIN32infile=fopen(argv1,"r");#elseinfile=fopen(argv1,"rb");#endifif (infile=NULL) perror("Cannot open file");return -1;/外部的一個動作,內(nèi)核送一個SIGINT信號給進(jìn)程,啟動stophandler這個處理函數(shù),即終
36、止進(jìn)程signal(SIGINT,stophandler);/將文件中的內(nèi)容讀入緩沖區(qū)中,并將緩沖區(qū)中的數(shù)據(jù)發(fā)送,/每發(fā)送一次,時間戳加160,如果時間片沒有到0 ,繼續(xù)發(fā)送while( (i=fread(buffer,1,160,infile)>0) && (runcond) )rtp_session_send_with_ts(session,buffer,i,user_ts);user_ts+=160;if (clockslide!=0 && user_ts%(160*50)=0)ortp_message("Clock sliding of
37、%i miliseconds now",clockslide);rtp_session_make_time_distorsion(session,clockslide);/設(shè)置時間偏移量/*this will simulate a burst of late packets */利用nanosleep()進(jìn)行延時減緩抖動if (jitter && (user_ts%(8000)=0) struct timespec pausetime, remtime;ortp_message("Simulating late packets now (%i millise
38、conds)",jitter);pausetime.tv_sec=jitter/1000;pausetime.tv_nsec=(jitter%1000)*1000000;while(nanosleep(&pausetime,&remtime)=-1 && errno=EINTR)pausetime=remtime;/退出,釋放資源fclose(infile);/關(guān)閉文件rtp_session_destroy(session);ortp_exit();ortp_global_stats_display();/打印全局統(tǒng)計變量return 0; 文件修改部
39、分,主要是在avprofile.c中av_profile_init()添加了一個負(fù)載類型,因為我們的TBCP定義為106,同時在rtpsession_priv.h中將rtcp接收函數(shù)部分的返回類型進(jìn)行了修改為mblk_t*,定義為一個函數(shù)指針,目的是為了獲得RTCP包,之前的函數(shù)只是返回接收到的數(shù)據(jù)字節(jié)數(shù)。Rtpsession_inet.c沒有做多大的修改,只是加了一個TBCP的頭文件。 在源程序中增加了tbcp.c文件和tbcp.h文件,主要講述了一些控制信息功能。四、TBCP首先是tbcp語音沖突發(fā)送消息請求,可以包含一個或多個可選域。每個TBCP Talk Burst請求消息可選域應(yīng)該包含三個子域:第一個子域是可選ID
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 水粉煙花課件教學(xué)課件
- 出游應(yīng)急預(yù)案
- 旅游業(yè)安全規(guī)范解析
- 2024年大型并網(wǎng)風(fēng)力發(fā)電機(jī)組發(fā)電機(jī)項目資金需求報告代可行性研究報告
- 物業(yè)小區(qū)危險源識別
- 吉林省2024七年級數(shù)學(xué)上冊第1章有理數(shù)1.7有理數(shù)的減法課件新版華東師大版
- 彩色的雨教案反思
- 建筑業(yè)薪酬政策
- 林業(yè)安防施工合同
- 影視制作薪酬管理
- 高一上學(xué)期英語期中考試總結(jié)發(fā)言稿整理
- 胃癌病人的護(hù)理ppt
- 臨床護(hù)理實(shí)習(xí)帶教思路技巧ppt
- 發(fā)生爐培訓(xùn)講義
- 廣東開放大學(xué)風(fēng)險投資(本2022春)-形成性考核2答案
- JJG 124-2005 電流表、電壓表、功率表及電阻表檢定規(guī)程-(高清現(xiàn)行)
- 示范區(qū)標(biāo)識及精神堡壘、文化墻施工方案
- 試油作業(yè)突發(fā)事件應(yīng)急辦法程序文件
- 健康管理師實(shí)踐操作技能考核試題題庫與答案
- 幼兒繪本故事:誰動了小白的玉米
- 孕期運(yùn)動(課堂PPT)課件(PPT 47頁)
評論
0/150
提交評論