版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 3 章 嵌入式远程监控系统设计与实现1.1课程设计目的通过本课程设计, 要对嵌入式系统的开发有比较深入的学习和分析。通过对 WEB 编程、服务器的架设、 驱动程序的开发这些步骤的深入研究,掌握构建一个完备的嵌入式系统的开发流程。1.2课程设计要求通过本课程设计,熟练前面几章的内容。在此基础上,编写相关驱动程序,以及CGI和数据处理程序完成基于WEB 的嵌入式远程控制系统。通过本章的课程设计,可以初步了解一个嵌入式系统的基本构建过程,学习如何在ARM系统上搭建嵌入式服务器,并通过CGI 控制外部设备的一般方法。1.3系统简介嵌入式WEB服务器及远程测控总的思想就是网络化仪器。完成的目标就是设
2、计基于Linux操作系统的远程测控系统,并且讨论实践中的可行性,我们通过普通的浏览器就可以对远端现场的控制和测量以及获取远端现场的图像信息。使用嵌入式WEB服务器的好处有这样几点:( 1) 远程监控终端仅需要安装浏览器即可,无需开发专门的应用软件,降低系统成本。( 2)浏览器所在的监控终端平台与WEB所在的服务器平台无关,监控终端可以采用多种操作系统,真正实现了跨平台。( 3)操作界面简单统一,表达直观生动,用户无需经过专门培训。 ( 4)易于扩展新的功能,系统升级仅需在Web 服务器一端添加相应模块,与远程监控终端无关,降低系统升级维护费用。系统整体结构如下:图 3.1 系统整体结构远程监控
3、系统所涉及的知识点很多,主要包括Linux操作系统,内核移植,文件系统的移植,服务器的移植, CGI 程序的移植, CGI 脚本的编写,设备驱动的调试和 JavaScript 脚本, TCP 服务器与客户端, UDP 服务器与客户端, Java 中的多线程技术, Java 画图板及各种控件的添加。下面提供几张已经做好的测控服务器的图片,先达到一个感性的认识。图 3.2 是一个实时视频及温度测量远程监控系统, 它将采集到的图像以及温度参数在网页中显示出来。图 3.2 ARM9远程实时视频及温度测量在这一章中我们将学习一个基本的嵌入式远程监控系统的搭建, 由于涉及到的知识点较多,我们只能把其中最主
4、要的知识简要地描述, 更多更详细的设计可以参考手册后面的参考文献。通过对本章的学习,读者可以了解架设一个嵌入式 WEB 服务器的全过程及其要点。1.4嵌入式 WEB 服务器移植1.4.1BOA的移植1、下载 BOA 源码下载地址 : /或者 / 。最新发行版本:0.94.13 下载 boa-0.94.13.tar.gz,注意:从 boa 上下载的是 boa-0.94.13.tar.gz,按照一般解压步骤进行解压:# tar xzf boa-0.94.13.tar.gz2、生成 Makefile 文件生成 Makefil
5、e文件直接运行src/configure文件。3、修改 Makefile 文件修改 Makefile文件修改CC = gcc为 CC = arm-linux-gcc修改CPP = gcc - E为 CPP = arm-linux-gcc -E4、编译# make 生成 boa 文件# arm-linux-strip boa去掉文本信息,使boa变小# make生成boa文件# arm-linux-strip boa去掉文本信息,使boa变小5、 BOA的配置BOA 需要在 /etc 目录下建立一个boa 目录,里面放入BOA 的主要配置文件boa.conf。在 BOA 源码目录下已有一个示例b
6、oa.conf,可以在其基础上进行修改。(a)、 Group 的修改修改Group nogroup为 Group 0由于在 /etc/group 文件中没有 nogroup 组,所以设成 0。另外在 /etc/passwd 中有 nobody 用户,所以 User nobody 不用修改。(注意如果没有 nobody 用户,也需要将 User 设成 0)(b) 、 ScriptAlias 的修改指示 CGI 脚本的存放位置。修改ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/为 ScriptAlias /cgi-bin/ /var/www/cgi-bin/Scri
7、ptAlias /index.html /var/www/index.html指示网页存放的位置。(c)、 ServerName 的设置修改ServerName .here/为 ServerName .here/注意:该项默认为未打开,执行BOA 会异常退出,提示“gethostbyname:No such fileordirectory所”,以必须打开。其它默认设置即可。6、 BOA的运行成功配置以后, 还需要创建日志文件所在目录/var/log/boa,创建HTML文档的主目录/var/www ,将静态网页存入该目录下
8、文件和img 目录复制到 /var/www(可以将主机目录下),创建/usr/share/doc/HTML/目录下的index.htmlCGI 脚本所在录/var/www/cgi-bin,将cgi 的脚本存放在该目录下。 另外还要将 mime.types 文件复制 /etc 目录下,通常可以从 linux 主机的 /etc 目录下直接复制即可。实际运行时,可以将 index.html 文件、 img 目录和 mime.types 文件放到 CF 卡目录下,建立目录后,拷贝至相应目录。制作 run.sh:mkdir /etc/boacp /cf/boa/boa.conf /etc/boa/mkd
9、ir /var/logmkdir /var/log/boamkdir /var/wwwcp /cf/boa/index.html /var/www/cp -r /cf/boa/img /var/www/mkdir /var/www/cgi-bincp /cf/boa/mime.types /etc/cp /cf/boa/boa /./boa &启动浏览器,直接在浏览器中输入07/ ,出现 BOA TEST 的欢迎网页。静态 HTML 调试成功。1.4.2CGI 脚本测试为了测试刚才建立的BOA服务器是否正确,我们可以编写一个简单例程进行测试。helloworl
10、d.c程序就起这个作用,其内容如下:#includeint main()printf(Content-type: text/htmlnn);printf(n);printf(BOA CGI TESTn);printf(n);printf(BOA CGI TESTn);printf(n);printf(n);exit(0);编写完后进行交叉编译,得到的helloworld拷贝到 var/www/cgi-bin目录下。# arm-linux-gcc -o helloworld.cgi helloworld.c在浏览器中输入22/cgi-bin/helloworld
11、可以看到BOA 测试页面,表示CGI 测试通过。1.5HTML网页设计普通的HTML页面只能提供静态的信息给用户,如果要实现网页的交互仅靠HTML是无能为力的。 在一个完整的系统中,用户提交信息输入界面的好坏将影响到系统的成败。好的输入界面可以弥补系统设计上的某些缺陷,但如何才能设计一个好的输入界面呢?HTML中表单(FORM )在CGI中是常见使用的输入界面,虽然并不十分完美,但它的确是目前www 中最强大的输入工具。FORM是由一组相关联的标签所组成,使用方法就像HTML中的其他标签一样。在FORM中提供了多种输入资料的工具,如文字输入区( Text)、下拉式菜单( select)、复选框
12、 (CheckBox) 、单选框 (RadioButton) 等等。就目前所定义的标准种, FORM 的标签可以分为 、 以及 三个大类。我们来看看具体的程序实现,下面是一段HTML 表单:CGI LED test 基于 S3C2440 的 Web 服务器的设计程序系统资源: s3c2440,16M Flash,32M SDRM,IP:0 输入要点亮的 LED:输入 LED状态 :网页中表单由字头 开始, 结束。其中action=/cgi-bin/cgi_led.cgi指明使用的 CGI里使用的是程序名为cgi_led.cgi ;method 属性指定提交数据的方法(GE
13、T 方法。我们要实现的功能很简单,就是采集现场的POSTLED还是 GET),这的状态,并在网页上输出结果。在这个实例中我们提交了两个数据,一个是数据的名字是led,另一个数据的名字是status,它们的值由用户在网页中输入。这里首先了解一下CGI 编码的规则。其规则如下:不同域(变量值对)之间用“& ”分开;变量与值之间用“”连接;空格符用“”代替;任何特殊字符用“”接相应的十六进制ASCII码代替,最后形成的格式为:name1=value1&name2=value2%name3=value3 .1.6CGI 程序设计CGI(Common Gateway Interface)通用网关接口的简
14、称。其主要的功能是在WWW 环境下,从客户端传递一些信息给WEB服务器,再由WEB服务器去启动所指定的程序来完成特定的工作。 所以简单点说, CGI 是一种通用的接口标准。CGI 可以为我们提供许多HTML( HyperText Markup Language ,超文本标记语言)无法做到的功能。比如一个计算器、顾客表格的提交以及统计、搜索引擎、 WEB 数据库等等。用 HTML 是没有办法记住客户的任何信息的。要把顾客的信息记录在服务器的硬盘上,就要用到CGI 。CGI是一种通用的接口标准。CGI程序就是符合这种接口标准的,运行在WEB服务器上的程序。它的工作就是控制信息要求,产生并传回所需的
15、文件。CGI由浏览器的输入触发这个程序。 先看看浏览器浏览网页是怎样实现的。作为一个用户首先在浏览器的地址栏中添加上要访问的主页地址并回车触发这个申请。浏览器将申请发送到服务器上。WEB服务器接收这些申请并根据.htm或 .html的后缀并认识到这是HTML文件。WEB服务器从当前硬盘或内存中读取正确的HTML文件,然后将它送回浏览器。HTML文件将被用户的浏览器解释并将结果显示在用户浏览器上。CGI程序可以用来在WEB内加入动态的内容。通过接口,浏览器能够发送一个可执行应用程序的HTTP请求,而不仅仅只是静态的HTML文件。服务器运行指定的应用程序,这个应用程序读取与请求相关的信息,获得请求
16、传过来的数值。例如使用者填写HTML表单提交了数据,浏览器将这些数据发送到WEB服务器上。WEB服务器接收这些数据并根据客户机指定的CGI程序把这些数据递交给指定的CGI程序,并使CGI在服务器上运行。CGI程序运行结束, 生成HTML页面,WEB服务器把CGI程序运行的结果送回用户浏览器。HTML文件将会被用户的浏览器解释并将结果显示在用户浏览器上。CGI的基本工作情况如下图所示:图 3.3 CGI 工作流程示意图WEB服务器与CGI程序之间通过四种途径进行通信:环境变量、命令行、标准输入和标准输出。其中负责输入的有环境变量、命令行和标准输入。命令行只用于ISINDEX查询,较少使用。环境变
17、量存放服务器向CGI程序传递的一些运行参数,比 如REQUEST_METHOD表示用户提出请求或提交数据的方法是GET还是POST 。方法(METHOD)是HTTP中对命令的称呼。GET方法通过环境变量QUERY-STRING传递用户提交的数据。经过编码的数据以问号打头追加在标识CGI脚本地址的URL后一起传给WEB服务器。服务器将其存于QUERYSTRING中, CGI程序可以通过getenv( )函数来读取。编码数据除了表单数据, 还可以是直接调用CGI脚本时追加在URL地址后面的参数。POST方法则通过标准输入( stdin)传递提交数据。编码了的表单数据独立地传送给WEB服务器,CGI
18、程序从标准输入中获得,可以用getchar( ), sscanf( ) , fread( )等函数。要注意的是数据的长度是通过读取环境变量CONTENT_LENGTH获得的,而不是通过文件尾标识符来判断。一般而言,要使用CGI程序就必须在WEB网页中迁入调用CGI程序的代码。通常的做法有三种,一是通过表单调用,二是通过超链接调用,三是通过SSI调用。在3.5 节中我们已经阐述了网页的设计,在这里重点说明使用表单调用CGI程序的办法。我们来看看到底如何从GET表单收集数据到CGI程序,下面给出了一个比较简单的C源代码:#include #include #include #include #in
19、clude #include #include #include #define DEVICE_GPIODRV /dev/gpiosint main()int fd; int led; int status;char *data;if(fd=open(DEVICE_GPIODRV,O_RDONLY | O_NONBLOCK)0) printf(open device: %sn,DEVICE_GPIODRV);perror(can not open device); exit(1);printf(Content-type:ext/html;charset=gb2312nn);printf(n);
20、printf(CGI LED DEMOn);printf(n);printf(CGI LED DEMO 1:0 led1 on 1:1 led1 offn);printf(n);data=getenv(QUERY_STRING);if(sscanf(data,led=%ld&status=%ld,&led,&status)!=2) printf(请正确输入 );printf();if(led3) printf(Please input 0=led=3!);printf();if(status1) printf(Please input 0=status=1!);printf();ioctl(f
21、d,status,led);close(fd);printf(n);exit(0);对于CGI程序来讲,当采用GET 方式提交数据时,用户提交的数据放在环境变量QUERY_STRING中。 CGI 程序从环境变量QUERY_STRING获得数据。为了解释和执行程序,CGI 必须要分析(处理)这个字符串。当你想从服务器获得数据并且不改变服务器上的数据时,应该选用 GET 。但是用 GET方式提交时,数据不经过CGI 编码,而且数据长度不能超过 1K 字节。否则只能用POST 方式了。CGI 程序的任务大概有两部分,输入任务和输出任务。输入任务就是指获取用户提交数据的过程。输入任务大概分以下几个步
22、骤: ( 1)首先从 CGI 环境变量 REQUESR_METHOD中获取 CGI 程序的提交方式; ( 2)根据提交方式的不同取出变量名和变量值。如果是Get方式 ,从环境变量 QUERY_STRING中取出编码数据;如果是POST 方式,从标准输入输出中读取相应的字符串,读取长度有环境变量CONTENT_LENGTH决定。 (3)根据 CGI编码规则取出字符串中的数据(变量名和变量值对)。在输入任务完成后, 我们得到所有的变量名和变量值对,而后就是输出任务。 输出任务主要有三个:( 1)输出 HTTP响应的头标志 。如 printf( “ Content-type: ext /htmlnn
23、 ”);它告诉 Web 服务器随后的输出是以HTML文本形式输出的。注意这个头信息中有两个换行符,这是因为 WEB 服务器需要在实际的文本信息开始之前先看见一个空行。( 2)调用其它程序(如远的测量程序、设置参数的程序、或者查询数据库的程序)。(3)输出 CGI 程序执行结果。表单提交数据测试了解了POST 和 GET 两种表单提交数据方式以及步骤后,下面进行测试。GET 方式:对于那些使用了属性 “ METHOD=GET ”的表单(或者没有 METHOD 属性,这时候 GET 是其缺省值), CGI定义为:当表单被发送到服务器端后,表单中的数据被保存在服务器上一个叫做QUERY_STRING
24、 的环境变量中。 这种表单的处理相对简单,只要读取环境变量就可以了。这一点对不同的语言有不同的做法。在C 语言中,你可以用库函数getenv(定义在标准库函数stdlib中)来把环境变量的值作为一个字符串来存取。你可以在取得了字符串中的数据后,运用一些小技巧进行类型的转换,这都是比较简单的了。 在 CGI程序中的标准输出(output )(比如在 C 中的 stdout 文件流)也是经过重定义了的。它并没有在服务器上产生任何的输出内容,而是被重定向到客户浏览器。 这样,如果编写一个 C 的CGI 程序的时候,把一个HTML文档输出到它的 stdout 上,这个 HTML 文档会被在客户端的浏览
25、器中显示出来。这也是CGI 程序的一个基本原理。上例中具体的 C 语法就不多讲了, 我们来看看它作为CGI 程序所特殊的地方。 前面已经提到标准输出的内容就是要被显示在浏览器中的内容。第一行的输出内容是必须的, 也是一个 CGI 程序所特有的:printf(Content-type:ext /html;charset=gb2312nn) ,这个输出是作为 HTML的文件头。因为CGI 不仅可以像浏览器输出HTML文本,而且可以输出图像,声音之类的东西。这一行告诉浏览器如何处理接受到的内容。在Content-Type 的定义后面跟有两行的空行,这也是不可缺少的。因为所有CGI 程序的头部输出都是
26、相近的,因而可以为其定义一个函数,来节省编程的时间。这是CGI 编程常用的一个技巧。程序在后面调用了用了库函数getevn 来得到 QUERY_STRING的内容,然后使用 sscanf函数把每个参数值取出来,要注意的是sscanf 函数的用法。其他的就没有什么了,和一般的 C 程序没有区别。 把程序编译后, 改名为 cgi_led.cgi 放在 /cgi-bin/ 目录下面, 就可以被表单调用了。这样,一个处理 GET 方式表单的 CGI 程序就大功告成了。POST 方式:下面我们来考虑另外一种表单传送方法。假设我们要实现的任务是这样的:把表单中客户输入的一段文本内容添加到服务器上的一个文本
27、文件的后面。这可以看作是一个留言版程序的雏形。显然,这个工作是无法用java script这种客户端脚本来实现,也算得上真正意义上的CGI 程序了。看起来这个问题和上面讲的内容很相近,仅仅是用不同的表单和不同的脚本(程序) 而已。但实际上, 这中间是有一些区别的。在上面的例子中,GET 的处理方法可以看作是“纯查询( pure query)”类型的, 也就是说, 它与状态无关。 同样的数据可以被提交任意的次数,而不会引起任何的问题(除了服务器的一些小小的开销)。但是现在的任务就不同了,至少它要改变一个文件的内容。因而,可以说它是与状态有关的。这也算是POST 和 GET 的区别之一。而且,GE
28、T 对于表单的长度是有限制的,而POST 则不然,这也是在这个任务中选用 POST 方法的主要原因。但相对的,对GET 的处理速度就要比POST 快一些。在 CGI 的定义中, 对于 POST 类型的表单, 其内容被送到CGI 程序的标准输入 (在 C语言中是stdin),而被传送的长度被放在环境变量CONTENT_LENGTH中。因而我们要做的就是, 在标准输入中读入CONTENT_LENGTH长度的字符串。 从标准输出读入数据听起来似乎要比从环境变量中读数据来的要容易一些,其实则不然,有一些细节地方要注意,这在下面的程序中可以看到。特别要注意的一点就是:CGI程序和一般的程序有所不同,一般
29、的程序在读完了一个文件流的内容之后,会得到一个EOF的标志。但在CGI程序的表单处理过程中,EOF是永远不会出现的,所以千万不要读多于CONTENT_LENGTH长度的字符,否这会有什么后果,谁也不知道(CGI规范中没有定义,一般根据服务器不同而有不同得处理方法) 。我们来看看到底如何从POST表单收集数据到CGI程序,下面给出了一个比较简单的C 源代码。#include#define MAXLEN 80#define EXTRA 5/* 4个字节留给字段的名字data, 1个字节留给 = */#define MAXINPUT MAXLEN+EXTRA+2/* 1个字节留给换行符,还有一个留给
30、后面的NULL */#define DATAFILE data.txt/*要被添加数据的文件*/void unencode(char *src, char *last, char *dest)for(; src != last; src+, dest+)if(*src = +)*dest = ;else if(*src = %) int code;if(sscanf(src+1, %2x, &code) != 1) code = ?;*dest = code;src +=2; else*dest = *src;*dest = ;*+dest = ;int main(void)char *len
31、str;char inputMAXINPUT, dataMAXINPUT;long len;FILE *f;printf(Content-type: text/html;charset=gb2312nn);printf(n);printf(Responsen);printf(n); printf(Responsen);printf(n);lenstr = getenv(CONTENT_LENGTH);if(lenstr = NULL | sscanf(lenstr,%ld,&len)!=1 | len MAXLEN) printf( 表单提交错误 ); printf(); else fgets
32、(input, len+1, stdin);unencode(input+EXTRA, input+len, data);f = fopen(DATAFILE, a);if(f = NULL)printf( 对不起,意外错误,不能够保存你的数据);printf(); else fputs(data, f);fclose(f);printf( 非常感谢,您的数据已经被保存 %s,data); printf();printf(n);exit(0);从本质上来看, 程序先从 CONTENT_LENGTH环境变量中得到数据的字长,然后读取相应长度的字符串。因为数据内容在传输的过程中是经过了编码的,所以
33、必须进行相应的解码。编码的规则很简单,主要的有这几条:1、 表单中每个每个字段用字段名后跟等号,再接上上这个字段的值来表示,每个字段之间的内容用 & 连结;2、 所有的空格符号用加号代替,所以在编码码段中出现空格是非法的;3、 特殊的字符比如标点符号,和一些有特定意义的字符如“+”,用百分号后跟其对应的 ACSII码值来表示。例如:如果用户输入的是:Hello there!那么数据传送到服务器的时候经过编码,就变成了data=Hello+there%21上面的unencode()函数就是用来把编码后的数据进行解码的。在解码完成后, 数据被添加到data.txt文件的尾部,并在浏览其中回显出来。
34、把文件编译完成后,把它改名为collect.cgi后放在CGI 目录中就可以被表单调用了。下面给出了其相应的表单:CGI POST testCGI POST test请输入您的留言(最多80 个字符): 事实上,这个程序只能作为例子,是不能够正式的使用的。它漏掉了很关键的一个问题:当有多个用户同时像文件写入数据是,肯定会有错误发生。而对于一个这样的程序而言,文件被同时写入的几率是很大的。因此,在比较正式的留言版程序中,都需要做一些更多的考虑,比如加入一个信号量,或者是借助于一个钥匙文件等。因为那只是编程的技巧问题,在这儿就不多说了。最后,我们来写一个浏览data.txt文件的的CGI程序,这只
35、需要把内容输出到 stdout 就可以了:#include #include #define DATAFILE ./data/data.txtint main(void)FILE *f = fopen(DATAFILE,r);int ch;if(f = NULL) printf(%s%c%c , Content-Type:text/html;charset=gb2312,13,10);printf(错误 );printf(意外错误,无法打开文件); else printf(%s%c%c , Content-Type:text/plain,13,10);while(ch=getc(f) != E
36、OF)putchar(ch);fclose(f);return 0;这个程序唯一要注意的是:它并没有把data.txt 包装成 HTML格式后再输出,而是直接作为简单文本(plain text )输出,这只要在输出的头部用text/plain类型代替text/html就可以了,浏览器会根据Content-Type 的类型自动的选择相应的处理方法。1.7设备驱动程序设计现在设计一个简单的LED控制页面。当输入1 /0时对应的LED灯亮灭。LED驱动程序使用 insmod 命令加载, CGI#include #include #include #include #include #include
37、#include #include #include #include #include #define DEVICE_NAME gpios#define GPIO_MAJOR 215程序编译后放在var/www/cgi-bin目录下。static unsigned long gpio_table = S3C2410_GPD0,S3C2410_GPD1,S3C2410_GPD2,S3C2410_GPD3,;static unsigned int gpio_cfg_table = S3C2410_GPD0_OUTP,S3C2410_GPD1_OUTP,S3C2410_GPD2_OUTP,S3C2
38、410_GPD3_OUTP,;static int sbc2440_gpios_ioctl(struct inode *inode, struct file *file,unsigned long arg)unsigned int cmd,switch(cmd)case 0:case 1:if (arg 4) return -EINVAL;s3c2410_gpio_setpin(gpio_tablearg, !cmd);return 0;default:return -EINVAL;static struct file_operations sbc2440_gpios_fops = .owner=THIS_MODULE,.ioctl=sbc2440_gpios_ioctl,;static int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年大学《数字媒体技术-游戏开发基础》考试备考试题及答案解析
- 海口书画买卖合同
- 2025年大学《化学-基础化学实验》考试参考题库及答案解析
- 2025年大学《地质工程-地质灾害防治工程》考试备考试题及答案解析
- 2025年大学《核化工与核燃料工程-核化工实验与工艺模拟实训》考试备考题库及答案解析
- 项目推广整合服务合同
- 2025年大学《秘书学-办公室管理》考试备考题库及答案解析
- 翻译兼职劳动合同
- 摊位和铺面出售合同
- 2025年大学《储能科学与工程-材料科学基础》考试模拟试题及答案解析
- 2023年新疆中考历史试题及答案解析
- 进入有限空间作业工作票
- LY/T 3148-2019木雕及其制品通用技术要求
- GB/T 29790-2020即时检验质量和能力的要求
- GA/T 1193-2014人身损害误工期、护理期、营养期评定规范
- 循环流化床锅炉检修规程
- 高考作文指导:理顺说理逻辑增强议论文生命力 课件(47张PPT)
- 国家开放大学人文英语4 unit1~8边学边练答案完整版
- 风电项目开发流程
- 2023版高三一轮总复习化学鲁科版:第9章 课题探究6 过氧碳酸钠(“鱼浮灵”)的制备及性质
- 10航天器用j18系列低磁小型矩形电连接器
评论
0/150
提交评论