版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、* 实践教学实践教学*兰州理工大学兰州理工大学计算机与通信学院2015 年春季学期嵌入式系统开发课程设计嵌入式系统开发课程设计题 目: 基于 LINUX 系统的嵌入式 WEB 服务器的设计 专业班级: 通信工程 12 级 1 班 姓 名: 王爱强 学 号: 12250110 指导教师: 张玺君 成 绩: 嵌入式系统开发课程设计 目录目录摘 要.1前 言.2一、基本原理.31.1 嵌入式 WEB 服务器概述.31.2 SOCKET 编程概述.4二、系统分析.62.1 整体结构图.62.2 连接处理模块.6三、详细设计.73.1 主程序设计.73.2 客户连接处理模块设计.83.3 客户请求解析处
2、理模块设计.83.4 发送 HTTP 协议数据头模块设计.9四、运行结果.11参考文献.14总 结.15致 谢.16附录.17 嵌入式系统开发课程设计 1摘摘 要要嵌入式 Web 服务器主要用于远程监测和控制,它不同于传统的 Web 服务器,硬件处理器能力和储存能力有限,因此操作系统等相关软件需要进行裁剪以适应嵌入式环境,开源代码的操作系统 Linu 型具有强大的网络服务功能,支持多种网络接口和网络协议栈,同时具有成本低性能稳定,扩充能力强等特点,成为嵌入式操作系统的首选。关键词: Linux ;Web 服务器; 浏览器;交叉编译 嵌入式系统开发课程设计 2 前前 言言 嵌入式系统已经成熟并且
3、得到了广泛地使用。在传统的测控系统中,为了实现多个测控点之间的信息交流,一般采用 RS-485、CAN、SPI 等总线将多个测控节点组织成一个网络,但是这样的网络专用性太强,有效地通信范围太窄,而基于 TCP/IP 协议的Web 技术得到了普及,更重要的是这些协议是可开发的、标准的、独立于平台的。把嵌入式系统和与 Web 技术结合在一起,将 Web 技术引入到测量和控制系统中,实现基于嵌入式 Web 服务器的远程控制系统,必将有良好地应用前景。嵌入式系统离不开嵌入式操作系统。目前商用的操作系统往往价格昂贵,不适应广泛应用。嵌入式 Linux 操作系统源码可开发。移植性好,支持多种硬件平台并且支
4、持几乎所有的常见网络通信协议支持的文件系统也很丰富,是一个功能完整的嵌入式操作系统并且有大量的优秀开发码源的应用软件和开发工具可以使用。因此,采用Linux 作为平台,使用 Web 技术进行远程在线测控系统的设计。嵌入式系统开发课程设计 3一、基本原理一、基本原理1.1 嵌入式 WEB 服务器概述1) WEB 服务器 通常是在远程机器上,负责对浏览器页面请求作出响应,返回 HTML 编码或类似的数据流。通俗的讲,Web 服务器传送(serves)页面使浏览器可以浏览,然而应用程序服务器提供的是客户端应用程序可以调用(call)的方法(methods)。确切一点,你可以说:Web 服务器专门处理
5、 HTTP 请求(request),但是应用程序服务器是通过很多协议来为应用程序提供(serves)商业逻辑(business logic)。 随着 Internet 技术的兴起,在嵌入式设备的管理与交互中,基于 Web 方式的应用成为目前的主流,这种程序结构也就是大家非常熟悉的 B/S 结构,即在嵌入式设备上运行一个支持脚本或 CGI 功能的 Web 服务器,能够生成动态页面,在用户端只需要通过 Web 浏览器就可以对嵌入式设备进行管理和监控,非常方便实用。2) WEB 浏览器 WEB 浏览器是个显示网页伺服器或档案系统内的 HTML 文件,并让用户与此些文件互动的一种软件。个人电脑上常见的
6、网页浏览器包括微软的 Internet Explorer、Mozilla 的 Firefox、Opera 和 Safari。浏览器是最经常使用到的客户端程序。3)嵌入式 WEB 服务器架构嵌入式系统开发课程设计 4图 1 嵌入式 WEB 服务器架构常见的嵌入式 WEB 服务器有lighttpd、shttpd、thttpd、boa、mathopd、minihttpd、appweb、goahead 等上百种。1.2 SOCKET 编程概述现在大多数的操作系统都提供了已编译好了的网络通讯程序。TCP/IP 范围内最普通的例子就是 web 客户端(浏览器) 和 web 服务器,还有就是 FTP 和Te
7、lnet 的客户端和服务器等。Socket 接口是 TCP/IP 网络的 API,Socket 接口定义了许多函数或例程,程序员可以用它们来开发 TCP/IP 网络上的应用程序。SOCKET 编程接口#include int socket(int domain, int type, int protocol);说明: socket()函数创建一个套接字参数:domain:应用程序所在主机使用的通信协议族 type:建立的套接字的类型 Protocol:使用的特定协议#include int bind(int sockfd, struct sockaddr *my_addr, socklen_t
8、 addrlen);说明:将套接字地址与所创建的套接字号联系起来参数:sockfd :调用 socket 返回的文件描述符 my_addr :指向数据结构 struct sockaddr 的指针,它保存地址(即端 口和 IP 地址)信息 addrlen :设置为 sizeof(struct sockaddr)#include int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);说明:建立套接字连接 ,成功返回 0 ,失败返回-1参数:sockfd :调用 socket 返回的文件描述符嵌入式系
9、统开发课程设计 5 serv_addr:保存着目的地端口和 IP 地址的数据结构 struct sockaddr addrlen:设置为 sizeof(struct sockaddr) #include int listen(int s, int backlog);说明:用于面向连接服务器,表明它愿意接收连接参数:sockfd :调用 socket 返回的文件描述符 backlog:在进入队列中允许的连接数目,在发生错误的时候返回-1 #include int accept(int s, struct sockaddr *addr, socklen_t *addrlen);说明:建立套接字连接
10、,成功返回文件描述符,失败-1 参数:sockfd :调用 socket 返回的文件描述符 addr :指向局部的数据结构 sockaddr_in 的指针 addrlen:设置为 sizeof(struct sockaddr_in) #include #include ssize_t send(int s, const void *buf, size_t len, int flags);说明:用于流式套接字或者数据报套接字的通讯,返回实际发送的数据的字节数,它在 错误的时候返回-1 参数:sockfd:发送数据的套接字描述符(或者是调用 socket()或者accept() msg:指向发送数
11、据的指针 len:数据长度 flags:总是设置为 0#include #include ssize_t recv(int s, void *buf, size_t len, int flags); 说明:用于流式套接字的通讯,recv()返回实际读入缓冲 的数据的字节数。或者在错误的时候返回-1 嵌入式系统开发课程设计 6 参数:sockfd:要读的 SOCKET 描述符 buf:要读的信息的缓冲区 len:缓冲的最大长度 flags:总是设置为 0二、二、系统分析系统分析2.1 整体结构图主程序:建立 TCP 类型 SOCKET 在 80 端口进行监听连接请求。接收到连接请求,将请求传送给
12、连接处理模块处理。并继续进行监听。如图 2 所示:主程序MAIN1、环境设置2、建立侦听SOCKET及客户连接处理调用主循环客户连接处理解析客户请求HTTP协议头发送HTTP协议数据头发送GIF文件发送文本文件发送JPG文件发送HTML文件发送当前目录信息 图 2 整体流程2.2 连接处理模块客户请求获取服务器资源解析客户请求字符串发送HTTP协议头发送资源数据侦听客户请求客户计算机读取客户请求资源嵌入式系统开发课程设计 7图 3 连接处理模块三、详细设计三、详细设计3.1 主程序设计1)功能说明系统的总入口,也是系统的主要控制函数。分别完成如下功能: 建立环境设置。 设置信号处理方式。 建立
13、侦听 TCP 流方式 SOCKET 并绑定 80 端口。 建立连接侦听及客户连接处理调用主循环。2)算法流程图算法流程图如图 4 所示:设置信号处理句柄进入根目录命令行处理建立TCP流SOCKET绑定监听端口设置允许客户连接数量侦听客户连接请求客户连接请求处理图 4 算法流程图3)命令行输入处理嵌入式系统开发课程设计 8用户在命令行输入参数 -i ,则将客户输入文件描述字设为 0,即标准输入。用于在本机进行测试。其他输入全部忽略。3.2 客户连接处理模块设计1)功能说明 用于初步处理客户的连接请求,并将请求信息传递给客户请求解析函数处理。2)算法具体算法如图 5 所示:打开文件描述字,并建立文
14、件描述符读取连接信息获取Refferer字段信息赋值给Refferer全局变量获取content_length字段信息调用客户请求解析模块关闭文件流图 5 算法流程图3.3 客户请求解析处理模块设计1)功能说明用于解析客户的请求,并根据请求信息调用相应的函数进行请求处理。2)算法嵌入式系统开发课程设计 9算法流程图如图 6 所示:对客户的请求字符串进行空格处理发送当前目录的INDEX.HTML文件请求目录下的index.html是否存在?发送当前目录信息是否请求目录? 是 是JPG或JPEG文件判断客户请求文件类型 否 是GIF图像文件是HTML文件是纯文本文件发送协议头:Content-ty
15、pe: image/jpeg请求资源是否存在? 是 回应请求资源不存在。 否 发送协议头:Content-type: image/gif发送协议头:Content-type: text/html发送协议头:Content-type: text/plain发送文件数据 是 否 图 6 算法流程图3.4 发送 HTTP 协议数据头模块设计1)功能说明根据参数的不同,发送不同的 HTTP 协议头信息。2)算法 函数定义为:int PrintHeader(FILE *f, int content_type)嵌入式系统开发课程设计 10发送请求成功信息:HTTP/1.0 200 OK。根据文档类型发送相
16、应的信息:fprintf(),函数中的第一个参数 f 为客户连接文件流句柄。 switch (content_type) case t: fprintf(f,Content-type: text/plainn); break; case g: fprintf(f,Content-type: image/gifn); break; case j: fprintf(f,Content-type: image/jpegn); break; case h: fprintf(f,Content-type: text/htmln); break; 发送服务器信息: fprintf(f,Server: AM
17、RLinux-httpd 0.2.4n);发送文件过期为永不过期:fprintf(f,Expires: 0n);嵌入式系统开发课程设计 11四、运行结果四、运行结果1、进入目录:rootlocalhost /# cd /UP-CUP210-II/SRC/exp/basic/04_webserver/rootlocalhost 04_webserver# lsGoogle Makefile copy.c copy.o doc httpd httpd.c httpd.o index.htmlrootlocalhost 04_webserver# 2、清除中间代码,重新编译rootlocalhost
18、 04_webserver# make cleanrm -f ./bin/httpd ./httpd *.elf *.gdb *.orootlocalhost 04_webserver# makearm-linux-gcc -DHTTPD_DOCUMENT_ROOT=/mnt/yaffs -c -o httpd.o httpd.carm-linux-gcc -DHTTPD_DOCUMENT_ROOT=/mnt/yaffs -c -o copy.o copy.carm-linux-gcc -static -o ./bin/httpd httpd.o copy.o -lpthreadarm-lin
19、ux-gcc -static -o httpd httpd.o copy.o -lpthreadrootlocalhost 04_webserver# lsGoogle Makefile copy.c copy.o doc httpd httpd.c httpd.o index.html当前目录下生成可执行程序 httpd 。4、启动 UP-CUP210-II 型实验系统,连好网线、串口线。通过串口终端挂载宿主机实验目录。rootUP-TECH yaffs# mountnfs 57:/UP-CUP210-II /mnt/nfs/6、进入串口终端的 NFS 共享实验目录。
20、rootUP-TECH yaffs# cd /mnt/nfs/SRC/exp/basic/04_webserver/rootUP-TECH 04_webserver# lsGoogle copy.c doc httpd.c index.htmlMakefile copy.o httpd httpd.o嵌入式系统开发课程设计 12rootUP-TECH 04_webserver# 6、执行程序,启动 HTTP 服务器。rootUP-TECH 04_webserver# ./httpdstarting httpd.press q to quit.wait for connection.此时 UP-
21、CUP210-II 型设备端 HTTP 服务器启动并等待连接。 打开 PC 机 Windows XP 系统上的 IE 浏览器,在地址栏输入 UP-CUP210-II 型设备 IP 地址: 99 。如图 7 所示: 图 7 输入 IP 地址输入正确的 IP 地址即可访问 UP-CUP210-II 型设备上 HTTP 提供的服务。结果如下:ARM 端:rootUP-TECH 04_webserver# ./httpdstarting httpd.press q to quit.wait for connection.buf = GET / HTTP/1.1Got
22、 buf1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint,Got buf1 application/msword, */*Got buf1 Accept-Language: zh-cnGot buf1 Accept-Encoding: gzip, deflateGot buf1 User-Agent: Mozilla/4.0 (compatible
23、; MSIE 6.0; Windows NT 嵌入式系统开发课程设计 135.1; SV1; QQPinyinSetup 620; CIBA; MAXTHON 2.0)Got buf1 Host: 99Got buf1 Connection: Keep-Alive浏览器端:如图 8 所示:图 8 浏览器端显示嵌入式系统开发课程设计 14参考文献参考文献1 孙天泽,袁文菊,张海峰.嵌入式设计及 Linux 驱动开发指南基于 ARM9 处理器M.北京:电子工业出版社,20052 于明,范书瑞,曾祥烨.ARM9 嵌入式系统设计与开发教程M.北京:电子工业出版社,20063 王
24、田苗.嵌入式系统设计与实例开发M.北京:清华大学出版社,20034 Samsung Electronics.S3C2410X 32-Bit RISC Microprocessor Users Manual,20035 周立功等. ARM嵌入式Linux系统构建与驱动开发范例.北京:北京航空航天大学出版社,20066 郑慕德. 编著 嵌入式微型计算机系统实例教程-ARM 与 LINUX. 科学出版社2006.77 王进德. 编著 嵌入式 LINUX 程序设计与应用案例. 中国电力出版社, 2007.58 王学龙著. 嵌入式 LINUX 系统设计与应用M .北京:清华大学出版社,20019 林宇,
25、郭凌云.LINUX 网络编程M.北京:人民邮电出版社,200010 张斌,高波等.LINUX 网络编程M.北京:清华大学出版社,2000嵌入式系统开发课程设计 15总总 结结 两周的课设在不知不觉中已经结束了,虽说时间不长,但是收获颇丰,不仅学到了一些新知识,巩固了以前学习的内容,增强了我的动手操作调试能力。虽说一些技术我们在课堂上野曾经学习过,但是大都停留在理论学习上,实际开发很少,而这次课程设计给了我们一个很好的边学习边实践的机会,对我们深入学习这些技术有很大的帮助,深刻体会到了这些技术的实用性。本次课程设计利用实验室提供的博创经典 UP-CUP210-II 型嵌入式实验平台,通过上位机编
26、程控制下位机进行 web 服务器的设计,使用 C 语言编程,生成目标文件,并且通过对宿主机下位机的相关上机操作,实现对书本内容的实际操作,巩固加深对嵌入式系统的认知和了解,最终在此基础上进行创新设计,了解了一个实际的网络通讯应用程序整体设计后,我们共同编写 C 程序实现对服务器的访问。 经过这段时间的学习、系统分析、方案论证、 硬件和软件设计、 调试等的努力,完成了嵌入式 web 服务器的设计制作。在系统的设计制作过程中,确实遇到了各种各样的问题,如调试思路正确但是没有能够进行找到合适的方法进行进一步的实验,设计中对于程序的编写以及目录结构的认知上存在偏差,其主要原因还是基础功不扎实,把握系统
27、的能力不足,这为我们以后的学习和工作提了一个醒。在问题的解决过程中,也提高了我的动手动脑能力,学到了许多在书本上学不到的知识。在具体的设计当中解决了诸如 httpd 服务器的搭建和 C 程序的修改,程序的调试和系统的整体认识等问题,收获很大。 做课程设计是一次再系统的学习,课程设计的完成,让我在其中学到了许多,尤其是学会了合作,懂得了合作早就的效益和成果。在这里再次感谢和我一起搭档的同学,还有对我们精心指导的老师!嵌入式系统开发课程设计 16嵌入式系统开发课程设计 17 致致 谢谢 通过近两周的努力,我们的课程设计终于完成了,这意味着这一阶段艰苦的热烈的付出即将告一段落。在整个课程设计中,我在
28、学习上和思想上都受益匪浅,这除了自身的努力外,与指导的老师、同学的关心、支持和鼓励是分不开的。 做课程设计是一次再系统的学习,课程设计的完成,让我在其中学到了许多,尤其是学会了合作,懂得了合作早就的效益和成果。在这里再次感谢和我一起搭档的同学,还有对我们精心指导的老师!嵌入式系统开发课程设计 18附录附录Httpd.c#include #include #include #include #include #include #include #include #include #include #include #include #include #include pthread.h#defi
29、ne DEBUGint KEY_QUIT=0;int TIMEOUT=30;#ifndef O_BINARY#define O_BINARY 0#endifchar referrer128;int content_length;#define SERVER_PORT 80int PrintHeader(FILE *f, int content_type) alarm(TIMEOUT); fprintf(f,HTTP/1.0 200 OKn); switch (content_type) case t: fprintf(f,Content-type: text/plainn); break; c
30、ase g: fprintf(f,Content-type: image/gifn); break; case j: fprintf(f,Content-type: image/jpegn); break; case h: fprintf(f,Content-type: text/htmln); break; 嵌入式系统开发课程设计 19 fprintf(f,Server: uClinux-httpd 0.2.2n); fprintf(f,Expires: 0n); fprintf(f,n); alarm(0); return(0);int DoJpeg(FILE *f, char *name
31、) char *buf; FILE * infile; int count;if (!(infile = fopen(name, r) alarm(TIMEOUT); fprintf(stderr, Unable to open JPEG file %s, %dn, name, errno); fflush(f); alarm(0); return -1; PrintHeader(f,j); copy(infile,f); /* prints the page */ alarm(TIMEOUT); fclose(infile); alarm(0); return 0;int DoGif(FIL
32、E *f, char *name) char *buf; FILE * infile; int count; if (!(infile = fopen(name, r) alarm(TIMEOUT); fprintf(stderr, Unable to open GIF file %s, %dn, name, errno); fflush(f); alarm(0); return -1; PrintHeader(f,g);copy(infile,f); /* prints the page */ alarm(TIMEOUT);fclose(infile); alarm(0); return 0
33、;嵌入式系统开发课程设计 20int DoDir(FILE *f, char *name) char *buf; DIR * dir; struct dirent * dirent;if (dir = opendir(name)= 0) fprintf(stderr, Unable to open directory %s, %dn, name, errno); fflush(f); return -1; PrintHeader(f,h); alarm(TIMEOUT); fprintf(f, Index of %snn,name); alarm(0);if (namestrlen(name)
34、-1 != /) strcat(name, /); while(dirent = readdir(dir) alarm(TIMEOUT); fprintf(f, %sn, name, dirent-d_name, dirent-d_name);alarm(0); closedir(dir); return 0;int DoHTML(FILE *f, char *name) char *buf; FILE *infile; int count; char * dir = 0;if (!(infile = fopen(name,r) alarm(TIMEOUT); fprintf(stderr,
35、Unable to open HTML file %s, %dn, name, errno); fflush(f); alarm(0); return -1; PrintHeader(f,h);copy(infile,f); /* prints the page */ alarm(TIMEOUT);fclose(infile);alarm(0);return 0;嵌入式系统开发课程设计 21int DoText(FILE *f, char *name) char *buf; FILE *infile; int count;if (!(infile = fopen(name,r) alarm(T
36、IMEOUT); fprintf(stderr, Unable to open text file %s, %dn, name, errno); fflush(f); alarm(0); return -1; PrintHeader(f,t);copy(infile,f); /* prints the page */ alarm(TIMEOUT);fclose(infile);alarm(0);return 0;int ParseReq(FILE *f, char *r) char *bp; struct stat stbuf; char * arg; char * c; int e; int
37、 raw;#ifdef DEBUG printf(req is %sn, r);#endif while(*(+r) != ); /*skip non-white space*/ while(isspace(*r) r+;while (*r = /) r+; bp = r; while(*r & (*(r) != ) & (*(r) != ?) r+;#ifdef DEBUG printf(bp=%s %x, r=%s n, bp, *bp,r);#endif if (*r = ?) char * e; *r = 0; arg = r+1;嵌入式系统开发课程设计 22 if (
38、e = strchr(arg, ) *e = 0; else arg = 0; *r = 0; c = bp;/*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz*/ if (c0 = 0 x20)c0=.;c1=0; /*zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz*/ if(c0 = 0) strcat(c,.);if (c & !stat(c, &stbuf) if (S_ISDIR(stbuf.st_mode) char * end = c + strlen(c); strc
39、at(c, /index.html); if (!stat(c, &stbuf) DoHTML(f, c); else *end = 0;DoDir(f,c); else if (!strcmp(r - 4, .gif) DoGif(f,c); else if (!strcmp(r - 4, .jpg) | !strcmp(r - 5, .jpeg) DoJpeg(f,c); else if (!strcmp(r - 4, .htm) | !strcmp(r - 5, .html) DoHTML(f,c); else DoText(f,c); else PrintHeader(f,h)
40、; alarm(TIMEOUT); fprintf(f, 404 File Not Foundn);fprintf(f, The requested URL was not found on this servern); alarm(0); return 0;嵌入式系统开发课程设计 23void sigalrm(int signo)/* got an alarm, exit & recycle */exit(0);int HandleConnect(int fd) FILE *f;char buf160; char buf1160;f = fdopen(fd,a+); if (!f)
41、fprintf(stderr, httpd: Unable to open httpd input fd, error %dn, errno); alarm(TIMEOUT); close(fd); alarm(0); return 0; setbuf(f, 0);alarm(TIMEOUT); if (!fgets(buf, 150, f) fprintf(stderr, httpd: Error reading connection, error %dn, errno); fclose(f); alarm(0); return 0; #ifdef DEBUG printf(buf = %s
42、n, buf);#endif alarm(0);referrer0 = 0; content_length = -1; alarm(TIMEOUT);/read other line to parse Rrferrer and content_length infomationwhile (fgets(buf1, 150, f) & (strlen(buf1) 2) alarm(TIMEOUT);#ifdef DEBUG printf(Got buf1 %sn, buf1);#endif if (!strncasecmp(buf1, Referer:, 8) char * c = bu
43、f1+8; while (isspace(*c)c+; strcpy(referrer, c); 嵌入式系统开发课程设计 24 else if (!strncasecmp(buf1, Referrer:, 9) char * c = buf1+9; while (isspace(*c)c+; strcpy(referrer, c); else if (!strncasecmp(buf1, Content-length:, 15) content_length = atoi(buf1+15); alarm(0); if (ferror(f) fprintf(stderr, http: Error continuing reading connection, error %dn, errno); fclose(f); return 0; ParseReq(f, buf);alarm(TIMEOUT); fflush(f); fclose(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年医学整形美容服务协议
- 2025年员工福利和解合同
- 2025年在线教育运营合同
- 2025年公司融资投资人增资协议
- 2025年代理合作签约协议
- 二零二五年度婴幼儿奶粉产品追溯系统建设合作协议3篇
- 2025年项目建议书编制委托人工智能+大数据合同模板2篇
- 2025年度健康养生产品居间营销合同模板4篇
- 跟着2025年新番走:《动漫欣赏》课件带你领略动漫魅力2篇
- 2025年度智能牧场羊代放牧与物联网服务合同
- 反骚扰政策程序
- 运动技能学习与控制课件第十一章运动技能的练习
- 射频在疼痛治疗中的应用
- 四年级数学竖式计算100道文档
- “新零售”模式下生鲜电商的营销策略研究-以盒马鲜生为例
- 项痹病辨证施护
- 职业安全健康工作总结(2篇)
- 怀化市数字经济产业发展概况及未来投资可行性研究报告
- 07FD02 防空地下室电气设备安装
- 教师高中化学大单元教学培训心得体会
- 弹簧分离问题经典题目
评论
0/150
提交评论