《一种在无操作系统设备中利用CGI技术实现动态WEB服务器的方法.pdf》由会员分享,可在线阅读,更多相关《一种在无操作系统设备中利用CGI技术实现动态WEB服务器的方法.pdf(16页珍藏版)》请在专利查询网上搜索。
1、(10)申请公布号 CN 103513986 A (43)申请公布日 2014.01.15 CN 103513986 A (21)申请号 201310422509.0 (22)申请日 2013.09.16 G06F 9/44(2006.01) (71)申请人 山东华辰泰尔信息科技股份有限公 司 地址 250101 山东省济南市高新 (历城) 区舜 华路2000号舜泰广场8号楼西区17层 (72)发明人 李幸福 马中骏 张会昌 张鹏 李宁 肖计伟 杨善松 (74)专利代理机构 济南金迪知识产权代理有限 公司 37219 代理人 吕利敏 (54) 发明名称 一种在无操作系统设备中利用 CGI 技术。
2、实现 动态 web 服务器的方法 (57) 摘要 本发明涉及一种在无操作系统设备中利用 CGI技术实现动态web服务器的方法, 包括步骤如 下 : 首先, HTTP 解析与组包模块对 HTTP 服务收到 的网络包进行处理 ; 然后, web 服务器总调度模块 开始根据解析出的网络参数 URI, 搜索网页文件 定义模块中的数组 : 查找 URI 请求的文件 ; 再次, 由 CGI 文件解析及函数解析模块和 CGI 函数实现 模块对 CGI 文件进行处理。该方法是在无操作系 统、 无文件系统、 无 web 库支持, 内存也非常的有 限的单片机或者是 ARM CPU 设备中进行的。本发 明使用简单、。
3、 模块化的方法为只有简单 CPU 的设 备实现动态 web 服务器的功能, 并且实现 AJAX 效 果, 增加了用户与设备进行动态交互的能力。 (51)Int.Cl. 权利要求书 2 页 说明书 10 页 附图 3 页 (19)中华人民共和国国家知识产权局 (12)发明专利申请 权利要求书2页 说明书10页 附图3页 (10)申请公布号 CN 103513986 A CN 103513986 A 1/2 页 2 1.一种在无操作系统设备中利用CGI技术实现动态web服务器的方法, 其特征在于, 该 方法包括步骤如下 : 其中, 该方法的实现包括了以下模块 : HTTP 解析与组包模块 (htt。
4、p.c) 、 web 服务器总调 度模块 (web_server.c) 、 网页文件定义模块 (web_page.c) 、 CGI 文件解析及函数解析模块 (cgi_parser.c) 和 CGI 函数实现模块 (cgi_fun) ; 该方法包括步骤如下 : (1) 首先, HTTP 解析与组包模块对 HTTP 服务收到的网络包进行处理, HTTP 解析与组包 模块按照 HTTP1.1 的格式, 解析出网络参数放到 HTTP_RQST_HEAD 结构体中 ; (2) 然后, web 服务器总调度模块开始根据解析出的网络参数 URI, 搜索网页文件定义 模块 (web_page.c) 中的数组 。
5、: web_pages数组, 查找URI请求的文件, 如果没有找到, 则返 回 404NOT FOUND 页面 ; 如果找到了对应的文件, 则首先判断是否为 CGI 文件, 如果不是, 则 直接把web_pages数组表示的文件拷贝到发送缓冲区由HTTP解析与组包模块发送 ; 如果 为 CGI 文件, 则将此文件送给 CGI 文件解析及函数解析模块中的 CGI 文件解析模块进行处 理, 然后将 CGI 函数执行的结果拷贝到发送缓冲区由 HTTP 解析与组包模块发送 ; (3) CGI 文件解析及函数解析模块中的 CGI 文件解析模块从 CGI 文件的第一个字符开 始扫描, 每当遇到 标记时, 。
6、说明标记里面是 CGI 函数, 然后把标记里面的字符串送 给 CGI 文件解析及函数解析模块中的 CGI 函数解析模块进行处理, 当 CGI 函数实现模块处 理完毕时, 返回结果就在发送缓冲区了 ; (4) CGI 函数解析模块首先将 中字符串格式的 CGI 函数名字和参数, 解析为 多个 tokens, 然后根据 tokens0 在 web_cgi_funs 中查找对应的 CGI 函数, 如果没有找 到, 则直接把 作为普通的文本放到发送缓冲区中等待发送 ; 如果找到了, 则将除了 tokens0 以外的 tokens 作为参数传递给 CGI 函数并执行 CGI 函数, 格式如下 : out。
7、buf=(*web_cgi_funsi.func)(tokensNum, cgi_cmd_tokens, outbuf, http_rqst_ head, http_resp_head); (5) CGI 函数如果需要页面传来的 GET 或者是 POST 变量, 则使用 http_get_arg_get() 函数或者是 http_post_arg_get() 函数从 http_rqst_head 中获取 ; 在使用 IP 地址设置页 面设置 IP 地址时, HTTP 解析与组包模块将 IP、 子网掩码以及网关的设置结果放到 http_ rqst_head 的 $_POST 变量中, cgi_i。
8、p_set 函数使用 http_post_arg_get(http_rqst_ head, “IP“) 得到 IP 参数, 然后进行处理 ; CGI 函数最后将结果放到发送缓冲区 ; (6) 当 CGI 文件解析及函数解析模块中的 CGI 文件解析模块将整个 CGI 文件处理完毕 时, 直接将 HTTP 协议发送的参数放在 http_resp_head 变量中和发送缓冲区送给 HTTP 解析 与组包模块进行发送发送便可。 2.根据权利要求1所述一种在无操作系统设备中利用CGI技术实现动态web服务器的 方法, 其特征在于 : 步骤 (2) 中 web_pages 描述所有 web 文件的静态数。
9、组, 此数组包括所有 web 文件的 路径名字、 类型、 尺寸和详细定义 ; 所有的 web 文件以数组的方式编写进代码中。 3.根据权利要求1所述一种在无操作系统设备中利用CGI技术实现动态web服务器的 方法, 其特征在于 : 步骤 (4) 中 web_cgi_funs 描述所有 CGI 函数的静态数组, 此数组包含所有定义的 权 利 要 求 书 CN 103513986 A 2 2/2 页 3 CGI 函数。 4. 根据权利要求 2 所述一种在无操作系统设备中利用 CGI 技术实现动态 web 服务器 的方法, 其特征在于 : 所述存放所有 web 文件的静态数组包括 HTML 文件、 。
10、CGI 文件、 图片和 CSS 文件。 5.根据权利要求3所述一种在无操作系统设备中利用CGI技术实现动态web服务器的 方法, 其特征在于 : 所述存放所有 CGI 函数的静态数组, 包含所有的 CGI 函数。所有的 CGI 函数都是以 C 语言实现。 6. 根据权利要求 1 所述一种在无操作系统设备中利用 CGI 技术实现动态 web 服务 器的方法, 其特征在于 : 所述 HTTP 协议解析与组包模块, 包括对 HTTP Command、 URI、 HTTP Version、 Host, HTTP 标准协议参数的解析, 以及 Cookies 的解析与处理。 7. 根据权利要求 1 所述一。
11、种在无操作系统设备中利用 CGI 技术实现动态 web 服务器 的方法, 其特征在于 : 所述方法还包括 AJAX 效果实现方法 : javascript 文件 get_time.js 包含一个定时器, 每隔 1 秒向 web 服务器指定的页面发送查询请求, 等 web 服务器应答后, get_time.js 变将结果在后台刷新到页面的指定区域。 权 利 要 求 书 CN 103513986 A 3 1/10 页 4 一种在无操作系统设备中利用 CGI 技术实现动态 web 服务 器的方法 技术领域 0001 本发明涉及一种在无操作系统设备中利用 CGI 技术实现动态 web 服务器的方法, 。
12、属于嵌入式 Internet 设备的技术领域。 背景技术 0002 随着物联网的发展以及网络化尤其是 web 应用的普及, 对设备的联网、 智能化等 要求也越来越高。如何使用简单的方法让简单的设备也能接入 Internet 并通过 web 对其 管理、 配置将是我们面临的一个难题。 0003 在现有技术中, 传统的以单片机或者是Cortex-M3ARM为CPU的设备一般没有实现 web 功能或者只能实现静态网页 ; 而有动态网页支持的设备一般是支持嵌入式操作系统的 CPU再使用成熟的web服务器 (如boa) 实现, 这样势必成本、 功耗以及复杂度会成倍的提高。 发明内容 0004 针对现有技。
13、术的不足, 本发明提供一种在无操作系统设备中利用 CGI 技术实 现动态 web 服务器的方法。本发明的目的在于 : 提供一种简单、 模块的化的方法在无操 作系统支持的设备中使用 CGI 技术实现动态 web 服务器。公共网关接口 CGI(Common GatewayInterface) 是 WWW 技术中最重要的技术之一, 有着不可替代的重要地位。CGI 是外 部应用程序 (CGI 程序) 与 Web 服务器之间的接口标准, 是在 CGI 程序和 Web 服务器之间传 递信息的规程。CGI 规范允许 Web 服务器执行外部程序, 并将它们的输出发送给 Web 浏览 器, CGI 将 Web 。
14、的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。 0005 本发明的技术方案如下 : 0006 一种在无操作系统设备中利用 CGI 技术实现动态 web 服务器的方法, 包括步骤如 下 : 0007 其中, 该方法的实现包括了以下模块 : HTTP 解析与组包模块 (http.c) 、 web 服务器 总调度模块 (web_server.c) 、 网页文件定义模块 (web_page.c) 、 CGI 文件解析及函数解析 模块 (cgi_parser.c) 和 CGI 函数实现模块 (cgi_fun) ; 所述 HTTP 协议解析与组包模块, 用 于解析 HTTP 协议 ; 所述 we。
15、b 服务器总调度模块, 用于整个 web 服务器的调度, 包括根据 URI 查找对应的文件、 错误处理 ; 所述 CGI 文件解析及函数解析模块中的 CGI 文件解析模块, 用 于解析 CGI 文件, 分析出 CGI 文件中嵌入在 标记中 CGI 函数的名字和参数 ; 所述 CGI函数解析模块, 将CGI文件解析模块解析出来的函数名字与CGI函数执行体相对应并执 行 ; 0008 该方法包括步骤如下 : 0009 (1) 首先, HTTP 解析与组包模块对 HTTP 服务收到的网络包进行处理, HTTP 解析与 组包模块按照 HTTP1.1 的格式, 解析出网络参数放到 HTTP_RQST_H。
16、EAD 结构体中 ; 所述的网 络参数包括 Command、 URI、 Version、 Host、 Cookies 等参数 ; 所述 HTTP_RQST_HEAD 结构体 说 明 书 CN 103513986 A 4 2/10 页 5 包含 HTTP 协议的规定的参数 : 例如 GET 的参数放到 $_GET 数组中, POST 的参数放到 $_ POST 数组中, Cookies 放到 $_COOKIE 中 ; 0010 (2) 然后, web 服务器总调度模块开始根据解析出的网络参数 URI, 搜索网页文件 定义模块 (web_page.c) 中的数组 : web_pages 数组, 查。
17、找 URI 请求的文件, 如果没有找 到, 则返回 404NOT FOUND 页面 ; 如果找到了对应的文件, 则首先判断是否为 CGI 文件, 如果 不是, 则直接把web_pages数组表示的文件拷贝到发送缓冲区由HTTP解析与组包模块发 送 ; 如果为CGI文件, 则将此文件送给CGI文件解析及函数解析模块中的CGI文件解析模块 进行处理, 然后将 CGI 函数执行的结果拷贝到发送缓冲区由 HTTP 解析与组包模块发送 ; 0011 (3) CGI 文件解析及函数解析模块中的 CGI 文件解析模块从 CGI 文件的第一个字 符开始扫描, 每当遇到 标记时, 说明标记里面是 CGI 函数,。
18、 然后把标记里面的字符 串送给 CGI 文件解析及函数解析模块中的 CGI 函数解析模块进行处理, 当 CGI 函数实现模 块处理完毕时, 返回结果就在发送缓冲区了 ; 0012 (4) CGI 函数解析模块首先将 中字符串格式的 CGI 函数名字和参数, 解析 为多个 tokens, 然后根据 tokens0 在 web_cgi_funs 中查找对应的 CGI 函数, 如果没有 找到, 则直接把 作为普通的文本放到发送缓冲区中等待发送 ; 如果找到了, 则将除 了 tokens0 以外的 tokens 作为参数传递给 CGI 函数并执行 CGI 函数, 格式如下 : 0013 outbuf=。
19、(*web_cgi_funsi.func)(tokensNum, cgi_cmd_tokens, outbuf, http_ rqst_head, http_resp_head); 0014 (5) CGI 函数如果需要页面传来的 GET 或者是 POST 变量, 则使用 http_get_arg_ get() 函数或者是 http_post_arg_get() 函数从 http_rqst_head 中获取 ; 在使用 IP 地 址设置页面设置 IP 地址时, HTTP 解析与组包模块将 IP、 子网掩码以及网关的设置结果放 到 http_rqst_head 的 $_POST 变量中, cgi。
20、_ip_set 函数使用 http_post_arg_get(http_ rqst_head, “IP“) 得到 IP 参数, 然后进行处理 ; CGI 函数最后将结果放到发送缓冲区 ; 0015 (6) 当 CGI 文件解析及函数解析模块中的 CGI 文件解析模块将整个 CGI 文件处理 完毕时, 直接将 HTTP 协议发送的参数放在 http_resp_head 变量中和发送缓冲区送给 HTTP 解析与组包模块进行发送发送便可。 0016 根据本发明优选的, 步骤 (2) 中 web_pages 描述所有 web 文件的静态数组, 此数 组包括所有 web 文件的路径名字、 类型、 尺寸和。
21、详细定义 ; 所有的 web 文件以数组的方式编 写进代码中。 0017 根据本发明优选的, 步骤 (4) 中 web_cgi_funs 描述所有 CGI 函数的静态数组, 此数组包含所有定义的 CGI 函数。 0018 根据本发明优选的, 所述存放所有 web 文件的静态数组包括 HTML 文件、 CGI 文件、 图片和CSS文件。 这些文件都是以静态的方式存放在此数组, 无需专门的文件系统存放 ; 而 CGI 文件只是将 CGI 函数使用 标记插入普通的 HTML 文件形成。 0019 根据本发明优选的, 所述存放所有 CGI 函数的静态数组, 包含所有的 CGI 函数。所 有的 CGI 。
22、函数都是以 C 语言实现。保持与系统语言一致, 便于实现。 0020 根据本发明优选的, 所述 HTTP 协议解析与组包模块, 包括对 HTTP Command、 URI、 HTTP Version、 Host, HTTP 标准协议参数的解析, 以及 Cookies 的解析与处理。 0021 根据本发明优选的, 所述方法还包括 AJAX 效果实现方法 : 所述 AJAX 效果, 是指不 说 明 书 CN 103513986 A 5 3/10 页 6 需要人工刷新整个页面, 而是由浏览器自动发送查询参数, 并刷新显示在页面的部分区域 内 ; 本方法中的设备运行时间实时显示便是使用 AJAX 实现。
23、 ; javascript 文件 get_time.js 包含一个定时器, 每隔 1 秒向 web 服务器指定的页面发送查询请求, 等 web 服务器应答后, get_time.js 变将结果在后台刷新到页面的指定区域。 0022 本发明的优势在于 : 0023 1、 本发明所述的方法只需要 5K 的代码空间就能实现一个如上所述功能的 web server。 0024 2、 本发明所述的方法只需要基本的 C 语言实现整个代码, 不需要任何第三方库。 0025 3、 本发明所述的方法中, 各个模块划分明确, 算法实现简单, 运行效率非常高。 0026 4、 本发明所述的方法不需要文件系统支持。 。
24、附图说明 0027 图 1 为本发明的流程图 ; 0028 图 2 为本发明 CGI 文件解析及函数解析模块的流程图 ; 0029 图 3 为本发明的实现的自动刷新设备运行时间的 AJAX 效果图 ; 0030 图 4 为本发明的实现获取和设置设备 IP 地址效果图。 具体实施方式 0031 下面结合实施例和说明书附图对本发明做详细的说明, 但不限于此。 0032 在执行本发明所述方法之前, 0033 首先介绍该方法中用到的数据结构 0034 i.web_pages 数组主要包含所有 web 页面的描述, 包括文件的名字、 格式、 尺寸、 已经指向具体文件字符串的指针, 具体内容如下 : 00。
25、35 说 明 书 CN 103513986 A 6 4/10 页 7 0036 页面的格式可以为 HTML、 CSS、 图片、 CGI 等等。 0037 ii.而普通HTML页面的格式只是以字符串方式存储, 具体实现如下 (以login.htm 文件为例) : 0038 0039 说 明 书 CN 103513986 A 7 5/10 页 8 0040 iii.图片文件直接可以使用工具转换为C语言可识别的数组格式 (以logo.jpg文 件为例) : 0041 0042 iv.CGI 页面的格式如下 (以 get_ip.cgi 文件为例) : 0043 0044 说 明 书 CN 103513。
26、986 A 8 6/10 页 9 0045 如上所示其中需要嵌入 CGI 代码的位置, 直接将 CGI 函数及参数放入 标 记中便可, 加入要嵌入一段获取设备当前 IP 的代码, 则使用 便可, 如 果要获取子网掩码则使用 。在此方法中, getip 为一个 CGI 函数, 带一个参数, 参数可以为” ip” 、 ” mask” 、 ” gateway” 。getip 等 CGI 函数, 都被放到了 cgi_ funs 数组中, 供 CGI 函数解析模块调用。 0046 v.cgi_funs 数组格式如下 : 0047 0048 vi.CGI 函数格式如下 (以 setip 为例) : 004。
27、9 0050 说 明 书 CN 103513986 A 9 7/10 页 10 0051 实施例 1、 0052 一种在无操作系统设备中利用 CGI 技术实现动态 web 服务器的方法, 包括步骤如 下 : 0053 其中, 该方法的实现包括了以下模块 : HTTP 解析与组包模块 (http.c) 、 web 服务器 总调度模块 (web_server.c) 、 网页文件定义模块 (web_page.c) 、 CGI 文件解析及函数解析 模块 (cgi_parser.c) 和 CGI 函数实现模块 (cgi_fun) 。所述 HTTP 协议解析与组包模块, 用 于解析 HTTP 协议 ; 所。
28、述 web 服务器总调度模块, 用于整个 web 服务器的调度, 包括根据 URI 查找对应的文件、 错误处理 ; 所述 CGI 文件解析及函数解析模块中的 CGI 文件解析模块, 用 于解析 CGI 文件, 分析出 CGI 文件中嵌入在 标记中 CGI 函数的名字和参数 ; 所述 CGI函数解析模块, 将CGI文件解析模块解析出来的函数名字与CGI函数执行体相对应并执 行 ; HTML 文件、 图片、 CSS 等静态文件可以直接使用数组的方式存放在 web_pages, 而对于 CGI 动态文件, 只需要像 PHP 或者是 ASP 文件一样, 在 HTML 中插入 表示的 CGI 函数 便可。
29、。 0054 该方法包括步骤如下 : 0055 (1) 首先, HTTP 解析与组包模块对 HTTP 服务收到的网络包进行处理, HTTP 解析与 组包模块按照 HTTP1.1 的格式, 解析出网络参数放到 HTTP_RQST_HEAD 结构体中 ; 所述的网 络参数包括 Command、 URI、 Version、 Host、 Cookies 等参数 ; 所述 HTTP_RQST_HEAD 结构体 包含 HTTP 协议的规定的参数 : 例如 GET 的参数放到 $_GET 数组中, POST 的参数放到 $_ 说 明 书 CN 103513986 A 10 8/10 页 11 POST 数组。
30、中, Cookies 放到 $_COOKIE 中 ; 0056 (2) 然后, web 服务器总调度模块开始根据解析出的网络参数 URI, 搜索网页文件 定义模块 (web_page.c) 中的数组 : web_pages 数组, 查找 URI 请求的文件, 如果没有找 到, 则返回 404NOT FOUND 页面 ; 如果找到了对应的文件, 则首先判断是否为 CGI 文件, 如果 不是, 则直接把web_pages数组表示的文件拷贝到发送缓冲区由HTTP解析与组包模块发 送 ; 如果为CGI文件, 则将此文件送给CGI文件解析及函数解析模块中的CGI文件解析模块 进行处理, 然后将 CGI 。
31、函数执行的结果拷贝到发送缓冲区由 HTTP 解析与组包模块发送 ; 0057 (3) CGI 文件解析及函数解析模块中的 CGI 文件解析模块从 CGI 文件的第一个字 符开始扫描, 每当遇到 标记时, 说明标记里面是 CGI 函数, 然后把标记里面的字符 串送给 CGI 文件解析及函数解析模块中的 CGI 函数解析模块进行处理, 当 CGI 函数实现模 块处理完毕时, 返回结果就在发送缓冲区了 ; 0058 (4) CGI 函数解析模块首先将 中字符串格式的 CGI 函数名字和参数, 解析 为多个 tokens, 然后根据 tokens0 在 web_cgi_funs 中查找对应的 CGI 。
32、函数, 如果没有 找到, 则直接把 作为普通的文本放到发送缓冲区中等待发送 ; 如果找到了, 则将除 了 tokens0 以外的 tokens 作为参数传递给 CGI 函数并执行 CGI 函数, 格式如下 : 0059 outbuf=(*web_cgi_funsi.func)(tokensNum, cgi_cmd_tokens, outbuf, http_ rqst_head, http_resp_head); 0060 (5) CGI 函数如果需要页面传来的 GET 或者是 POST 变量, 则使用 http_get_arg_ get() 函数或者是 http_post_arg_get() 。
33、函数从 http_rqst_head 中获取 ; 在使用 IP 地 址设置页面设置 IP 地址时, HTTP 解析与组包模块将 IP、 子网掩码以及网关的设置结果放 到 http_rqst_head 的 $_POST 变量中, cgi_ip_set 函数使用 http_post_arg_get(http_ rqst_head, “IP“) 得到 IP 参数, 然后进行处理 ; CGI 函数最后将结果放到发送缓冲区 ; 0061 (6) 当 CGI 文件解析及函数解析模块中的 CGI 文件解析模块将整个 CGI 文件处理 完毕时, 直接将 HTTP 协议发送的参数放在 http_resp_hea。
34、d 变量中和发送缓冲区送给 HTTP 解析与组包模块进行发送发送便可。 0062 步骤 (2) 中 web_pages 描述所有 web 文件的静态数组, 此数组包括所有 web 文 件的路径名字、 类型、 尺寸和详细定义 ; 所有的 web 文件以数组的方式编写进代码中。 0063 步骤 (4) 中 web_cgi_funs 描述所有 CGI 函数的静态数组, 此数组包含所有定义 的 CGI 函数。 0064 所述存放所有 web 文件的静态数组包括 HTML 文件、 CGI 文件、 图片和 CSS 文件。这 些文件都是以静态的方式存放在此数组, 无需专门的文件系统存放 ; 而 CGI 文件。
35、只是将 CGI 函数使用 标记插入普通的 HTML 文件形成。 0065 所述存放所有 CGI 函数的静态数组, 包含所有的 CGI 函数。所有的 CGI 函数都是 以 C 语言实现。保持与系统语言一致, 便于实现。 0066 所述 HTTP 协议解析与组包模块, 包括对 HTTP Command、 URI、 HTTP Version、 Host, HTTP 标准协议参数的解析, 以及 Cookies 的解析与处理。 0067 实施例 2、 0068 如实施例 1 所述的一种在无操作系统设备中利用 CGI 技术实现动态 web 服务器的 方法, 其区别在于, 所述方法还包括AJAX效果实现方法。
36、 : 所述AJAX效果, 是指不需要人工刷 说 明 书 CN 103513986 A 11 9/10 页 12 新整个页面, 而是由浏览器自动发送查询参数, 并刷新显示在页面的部分区域内 ; 本方法中 的设备运行时间实时显示便是使用 AJAX 实现 ; javascript 文件 get_time.js 包含一个定 时器, 每隔 1 秒向 web 服务器指定的页面发送查询请求, 等 web 服务器应答后, get_time.js 变将结果在后台刷新到页面的指定区域。 0069 所述 get_time.js 的实现如下 : 0070 0071 0072 AJAX 具体发送到的 web 服务器文件。
37、由 url 变量定义, 在此为 get_time.cgi, 然后 get_time.cgi文件将使用CGI函数getsystime获取当前设备运行世界, 并将结果返回给浏 览器便可。 0073 get_time.cgi 文件定义如下 : 0074 说 明 书 CN 103513986 A 12 10/10 页 13 说 明 书 CN 103513986 A 13 1/3 页 14 图 1 说 明 书 附 图 CN 103513986 A 14 2/3 页 15 图 2 图 3 说 明 书 附 图 CN 103513986 A 15 3/3 页 16 图 4 说 明 书 附 图 CN 103513986 A 16 。