标题:
一种实用的嵌入式Web服务器设计
[打印本页]
作者:
rise_ming
时间:
2013-3-31 09:10
标题:
一种实用的嵌入式Web服务器设计
其中:mS为估算的页面内容最大尺寸,sizeof(pT)则为该页面对应模板的实际大小(以上两者均以字节为单位)。
按上式估算出页面的最大尺寸后,为保证对页面分配内存时空间的连续性,根据所有页面的最大尺寸和,一次性分配一个较大的内存空间,并将该空间按各个页面所对应的最大尺寸依次与该页面对应的管理结构内的文件内容指针相关联。这样,每次因配置的修改导致页面内容发生变化时,仅需对该指针所指向的空间内容进行修改即可,而仅在保存配置数据时,通过配置文件更新函数将其存储在Flash中。这样既避免了为修改页面文件内容而申请内存的操作,又避免了为存储页面内容而频繁进行的Flash读写操作,从而提高了该EWS的效率。
对于EWS中动态页面的生成则要经过动态数据解析以及解析数据的模板页面回填这两个过程。在通常的Web交互中,大量动态数据是通过表单的形式体现在html页面设计之中的。而一般上送的表单数据(文件上传除外)在GET和POST两种方法下,除了在HTTP请求报文中出现位置的不同外(GET方法下位于请求行,POST方法下位于实体主体部分),其组织形式并无差别,如下所示:
e_1-v_1&e_2=v_2...&e_N=v_N
其中e_N代表表单数据中的元素名,v_N代表该元素的取值。
因此,当连接管理模块从请求报文中提取出表单数据后,即可对这两种方法下的提交数据采用相同的解析方法。CGIC采用以下方法来实现其解析过程。
首先,通过对表单数据字符串的节点分析,用一个单向链表来对表单数据中的每个元素进行维护,在链表成员中包括了对元素名及其值的管理,并针对不同的元素类型提供了一系列接口。解析步骤如下:
① 用于获取列表框取值的函数接口cgiFormSelectSingle。
② 用于获取文本框取值的函数接口cgiFormString。
③ 用于获取复选框取值的函数接口cgiFormCheckboxMultiple。
在需要访问元素时,只需提供相应的元素名,就可方便地使用这些接口对管理链表遍历来获得相应元素的取值。
当CGIC移植时,只需对相应元素解析对应的函数进行所选系统的修改即可。需要注意的是,对列表和复选框等非字符取值的获取,还需按照用户定义的取值设置,对相应的接口进行一定的修改,以适应用户对元素取值范围的灵活要求。
所谓解析数据的模板页面回填,是指在动态页面设计中,按照模板中的页面显示格式,将页面中各元素的取值写入html模板文件中的对应位置。html标签代码如下:
<input name="devName" type="text"
value="***"size="15"/>
它在页面上表示一元素名为“devName”,取值为“***”的文本框,在数据回填到模板页面时,需要根据具体的取值如“dev1”写到原“***”的对应位置上去。结果如下:
<input name="devName" type="text"
value="dev1" size="15" />
本文采用以下方法来实现这一处理过程。首先,设计页面模板时在每个需要进行动态修改的页面元素前加上不同的注释语句,对以上html标签,可加的注释语句如下(单独一行):
<! devName_id>
在每次解析完表单数据并且需要对动态页面进行重新生成时,就可以通过对模板文件的逐行读取,来查找相应的注释语句,从而确定数据更新的位置。然后再根据具体的元素取值生成新的html标签字符串,用来对注释语句后的标签字符串进行替换。通过以上过程,即可方便地实现解析数据的模板页面回填,从而生成相应的动态页面。
2.4 文件下载和上传的功能实现
文件下载和上传是服务器经常具有的一项功能,相对来说文件下载较为简单,只需将下载时访问的URL定位于目标文件,然后再由服务器将该文件的内容直接上送给浏览器。而文件上传功能的实现则相对复杂,下面对其设计过程进行详细的说明。
首先,要实现文件的上传,在其页面设计时必须采用POST方法来对表单数据进行提交,并且需要在页面中将其编码方式修改为“multipart/formdata”,否则将无法在浏览器端进行文件上传。然后,通过html表单中的文件元素来进行上传文件的选择。
通过以上设置,上传给服务器的http报文数据将以multipart的编码形式出现。其特点是,在每个表单元素项的前后均加有一行分界字符串。以文件元素为例,其格式如下:
7db01d60ffc
ContentDisposition: formdata; name="file"; filename="1.TXT" ContentType: text/plain
This is a txt file.
7db01d60ffc
其中,“7db01d60ffc”为分界字符串。CGIC也提供了对该格式的解析支持。它首先提取出分界字符串,然后再通过cgiParsePostMultipartInput函数的操作来实现报文中各表单元素数据以及文件数据的解析。提取出文件数据后,即可将文件内容按指定的路径保存在相应的Flash存储区中。
3 性能测试
通过以上各环节,即可实现一个相对完整的EWS。综合以上各个模块。
在主频600 MHz的TMS320DM642处理器上对该EWS从收到请求建立连接到响应结束断开连接的时间进行测试,EWS性能测试如表1所列。
表1 EWS性能测试表
其中,由于采用了框架结构进行设计,在访问索引主页时,涉及的访问请求次数较多,所以其测试时间相比其他单次请求来说要较长一些。总体来看,该EWS具有比较快速的服务响应时间,能够满足具体应用环境的要求。
结语
本文在BOA和CGIC的基础上,通过对其代码的修改以及HTTP协议报文的分析,将原本运行于Linux平台上独立的两个程序进行有机的结合,成功地将其整合为DSP/BIOS中的一个任务,并提出了一种适合一般嵌入式系统使用的访问权限及对Web页面的管理及动态生成机制。同时,完成了文件的上传与下载功能,成功实现了一个相对完整的EWS。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0