您的位置 首页 被动

根据以太网和现场总线控制系统完成嵌入式HTTP服务器的规划

基于以太网和现场总线控制系统实现嵌入式HTTP服务器的设计-为了实现设计目标,嵌入式HTTP服务器一般应采用功能较强的能用PC、工业PC、或高档MPU作为硬件平台,嵌入式实时操作系统作为软件平台进行平发。硬件平台应具备以太网口和一个或多个通信模块,比如RS232、RS485、CAN通信卡等。嵌入式实时操作系统实现了TCP/IP等网络协议,并提供实时任务、进程管理、内存管理、文件系统、API等功能。

导言

操控网络一般指以操控“事物方针”为特征的计算机网络体系,简称Infranet(infrastructure network),它处在企业网(Intranet)的底层,构成了整个企业网的根底。近些年来,在操控网络中选用了现场总线(Field Bus)和工业以太网Ethernet)两种技能。呈现这种状况首要有两个原因:榜首,现在存在多种现场总线规范,不同的规范选用彻底不同的通讯协议,也便是说现场总线的开放性不行;第二,以太网尽管可以处理开放性的问题,并具有本钱低价、技能老练等长处,但因为以太网开端是被规划用于以资源同享为意图的计算机局域网,因而在实时性和可靠性上暂时还不能彻底满意工业操控的要求。事实上,现在一个较大规划的操控网络往往归纳选用了这两种技能。在现场层,因为着重实时性、可靠性和安全性,常选用现场总线技能;在监控办理层,考虑到选用不同规范的操控网段之间的集成以及与高层企业信息网络的集成,一般选用以太网技能。现场层的现场总线操控体系FCS(Field Control System)或其它设备级轻质网络经过网关或嵌入式HTTP服务器与高层以太网相连。这样,不只选用不同协议的操控网段可以完结互联,并且各个操控网段能方便地与高层企业信息网互通,然后终究完结企业网的管控一体化和对现场设备的Internet长途监控。经过以上剖析可以看出,操控网络中的网关或嵌入式HTTP服务器起着衔接现场层和监迭办理层的效果,因而它是整个操控网络的要害设备。

网关或嵌入式HTTP服务器与传统的嵌入式体系比较,有一些不同的特性。传统的嵌入式体系是面向运用、有一些不同的特性。传统的嵌入式体系是面向运用、面向产品的,着重本钱和高效规划体系,因而本质上不具有通用性和可移植性。网关或嵌入式HTTP服务器因为处在现场层和监控办理层的中心,因而它与详细运用和产品是一种弱耦合的联系。一同,技能开展的趋势是:硬件本钱越来越低,功用越来越强,越来越多的芯片和板卡具有“渠道”的特色,适用于多种运用场合。嵌入式实时操作体系(Embedded Real Time OperaTIong System)的开展更是为嵌入式软件供给了一个通用的软件渠道。综上所述,在网关或嵌入式HTTP服务器规划中,考虑经过选用适宜的硬件和嵌入式实时操作体系,使整个体系具有恰当的通用性和可移植性。关于衔接不同的设备级轻质网络或不同的运用,只需求经过替换硬件模块和对代码作最小的修正即可完结。

1、 依据Linux的嵌入式HTTP服务器的结构

为了完结规划方针,嵌入式HTTP服务器一般应选用功用较强的能用PC、工业PC、或高级MPU作为硬件渠道,嵌入式实时操作体系作为软件渠道进行平发。硬件渠道应具有以太网口和一个或多个通讯模块,比方RS232、RS485、CAN通讯卡等。嵌入式实时操作体系完结了TCP/IP等网络协议,并供给实时使命、进程办理、内存办理、文件体系、API等功用。

Linux操作体系是一种多进程,多用户的通用操作。因为它具有免费、源码揭露、内核可削减、支撑多线程、网络功用强大、规划精巧、

依据以太网和现场总线操控体系完结嵌入式HTTP服务器的规划

功用安稳的特色,因而近年它也被广泛用到嵌入式体系的规划中。一个运用于嵌入式体系的Linux经过削减和从头编译后只包含进程办理、内存办理、文件体系、若干个驱动程序和有用的函数等。

下面以自己参加的转子秤操控体系为例来阐明一个依据Linux的嵌入式HTTP服务器的结构。转子秤是水泥工业中的要害计量喂料设备,一条大型的生产线需求许多台转子秤,对转子秤的操控涉及到分量、转速、温度、一氧化碳含量等若干个参量。因为现场环境的高噪声、高粉尘、高电磁搅扰,无法在现场装备键盘、显现器、触摸屏等人机交互设备,无法在现场完结对设备的监控和保护。一同,一条生产线有多台转子秤,为每台转子秤装备人机交互设备也是不经济的。为此,考虑为整个体系规划一个嵌入式HTTP服务器,各转子秤操控器与嵌入式HTTP服务器用CAN总线相连。经过嵌入式HTTP服务器完结对整个体系的在线监控和长途监控。在嵌入式HTTP服务器的规划中,选用研祥公司PC104总线的486X嵌入式CPU卡作为硬件渠道,该板卡是具有128MB的在板ROM、CF卡接口以太网接口等。挑选该板卡的原因是PC104总线的功用扩展模块十分丰富,经过挑选不同的模块很简略就支撑多种总线。软件渠道方面,选用Linux2.0内核并对它作恰当削减。整个嵌入式HTTP服务器的结构简图如图1所示。

2 、依据Linux的嵌入式HTTP服务器的规划

工控范畴的嵌入式HTTP服务器应该具有如下底子功用。

①实时数据发布。实时数据首要包含体系运转进程中设备的各种状况信息。嵌入式HTTP服务器将实时数据以网页方式发布到Internet上,且动态实时改写。客户可以经过浏览器拜访这些实时信息。

②参数设置。参数包含运转参数和设备状况参数,如各种初始值、常数等。嵌入式HTTP服务器接纳到客户提交的参数设备恳求后,履行参数写入操作。

③长途实时操控。长途实时操控答应长途用户在线地操控体系中的相应履行机构,比方电机、电磁阀等。嵌入式HTTP服务器接纳到远方客户提交的操控操作恳求后,将下发操控指令驱动监控体系中相应的履行机构。

④拜访等级设置和权限认证。只要权限不低于要求拜访等级的客户,经嵌入式HTTP服务器认证后,方可进行其权限范围内的监控操作。

3 、首要完结技能

3.1 超文本传输协议

HTTP协议是一个面向业务、无状况的运用层协议。在传输层,HTTP协议运用恳求(request)/呼应(response)模型。一次简略的HTTP业务包含以下进程。首要,客户(浏览器)建议和树立一条到服务器的TCP衔接。然后,客户发送一个HTTP恳求到服务器,恳求包含办法、URI、协议版别和一个类MIME报文。服务器解析HTTP恳求后,给出相应的HTTP呼应,呼应包含协议版别、状况码、解说状况码的简略短语和一个类MIME报文。终究,开释TCP衔接。Linux操作体系为用户供给了称为BSD Socket的网络编程接口。运用其间的TCP套接口函数,可以十分方便地完结HTTP协议。

HTTP1.0为每一次HTTP恳求/呼应树立一条新的TCP衔接,因为树立一条TCP衔接要阅历3次握手,因而功率不高。HTTP1.1提出了可继续性衔接的概念。HTTP1.1只树立一次TCP衔接,而重复地运用它传送一条素的恳求/呼应音讯,减少了额定开支。在嵌入式HTTP服务器中,一般运用HTTP1.1协议。HTTP1.1协议的细节请参阅RFC2616。

3.2 通用网关接口CGI

参数设置和长途操控功用都是经过CGI(通用网关接口)程序和表单完结的。CGI运用HTML表单向Web服务器发送信息。底子语法如下:

《FORM METHOD=get/post ACTION=URL》《/FORM》

其间,METHOD特色指定将数据传送到Web服务器的办法。输入办法有两种:GET和POST。ACTION特色界说要对表单数据进行处理的CGI脚本的URL。

CGI的作业流程是首要由浏览器将用户输入的数据传递给Web服务器,Web服务器依据接纳到的数据设置环境变量并发动CGI脚本,CGI脚本从环境变量中读取所需求的数据并进行相应处理,终究运用STDOUT输出HTML方式的成果文件,经Web服务器送回浏览器,终究显现给用户。传统的CGI程序与服务器代码分隔,是一个符号CGI规范的可履行文件,并储存在CF卡等存储设备上,一般用脚本言语编写。考虑到嵌入式HTTP服务器要求速度快,功用和代码都尽或许精简的特色,可以把原先由可履行文件完结的功用用C函数完结,放在服务器代码内部,并直接从HTTP恳求报文接纳数据。与传统CGI程序比较,这种办法具有如下特色:

*不需求规范输入,CGI函数可以直接获取到浏览器送来的信息;

*不需求规范输出,CGI函数可以直接将数据送回给浏览器;

*不需求环境变量,CGI和Web服务器在同一程序中完结,不需求环境变量来交流信息。

3.3 自界说符号

要在网页中显现工控体系中很多的实时数据,惯例办法是将HTML代码直接集成到程序代码中,或许反之将C程序代码集成到HTML符号言语中。这两种办法均要求开发人员对HTML符号言语的语法细节十分了解。网页或程序结构的单方面调整都将导致整个体系全盘修正,体系不具有灵活性与可扩展性。HTML的精华在于该言语的“符号”性,各种不同符号的详细意义是由服务器和浏览器进行解析。因而,当现有符号不能满意新的运用需求时,可以自行界说新的符号,只需服务器将自界说符号解析为规范符号,然后传送给浏览器即可。在本项目中,首要的实时数据转速、分量、一氧化碳含量等状况信息,可以界说相应的符号。服务器中解析相应符号的函数相同用C言语来完结。运转时,当客户端宣布查看某实时网页的恳求后,嵌入式HTTP服务器将相应的网页文件从电子盘加载到内存进行逐项解析。当辨识出自界说符号后,就调用相应的函数。该函数回来该符号对应的当时值,并置换HTML文件流中的自界说符号。终究,嵌入式HTTP服务器将解析成果发送给客户端。实时网页的规划与相应的HTTP服务器处理程序得以别离,处于一种弱耦合相关状况。这样,网页界面的调整不会影响HTTP服务器的程序规划,HTTP服务器程序的修正也与网页界面规划无关,整个嵌入式HTTP服务器具有灵活性和可扩展性。

3.4 多线程

开端的进程界说包含程序、资源及其履行三部分,其间程序一般指代码,资源一般包含 内存资源、I/O资源、信号处理等,而程序的履行指履行上下文,这一部分后来开展为线程。在线程的概念呈现曾经,为了减小进程切换的开支,操作体系规划者逐步修正正进程的概念,答应将进程所占有的资源从其主体剥离出来,答应某些进程共离享一部分资源,例如文件、信号、数据内存、乃至代码,这便是轻质进程的概念。Linux内核的2.0.x版别就现已完结了轻质进程。运用程序可以经过一个一致的clone()体系调用接口,用不同的参数指定创立轻质进程仍是一般进程。在内核中,clone()调用经过参数传递和解说后会调用do_fork(),这个核内函数一同也是fork、vfork()体系调用的终究完结。在do_fork()中,不同的flone_flags将导致不同的行为。在LinuxThreads中,运用(CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND)参数调用clone()创立“线程”,表明同享内存、同享文件体系、同享文件描述符表,以及同享信号处理方式。Linux操作体系下,现已完结依据轻质进程的符号POSIX1003.C规范的线程库LinuxThreads。

在传统的Unix服务器程序规划中,为了使服务器具有并发处理衔接的才能,一般选用父进程处理衔接,并调用fork()创立子进程来处理用户恳求的办法。这种办法的缺陷是进程创立慢,消耗资源,进程切换开支大,进程之间通讯比较困难等,不适用对资源、速度有要求的嵌入式体系。因而,在嵌入式HTTP服务器的开发中运用线程的办法。运用LinuxThreads供给的pthread_create()等函数派生出线程,也即轻质进程来处理多个HTTP恳求。

4、 作业流程和代码规划

4.1作业流程

嵌入式HTTP服务器程序开端运转时,主进程首要创立一个接口,并和主机地址绑定到一同,随后置为被迫监听状况,等候客户端衔接恳求的到来。别离用函数socket()创立一个接口,bind()绑定地址,listen()监听,accept()接纳来完结。当树立一个TCP衔接后,函数accept()回来一个新的套接口描述符,主进程就创立一个新的子线程(轻质进程)处理这个新的衔接。

子线程用于处理每详细的HTTP恳求。子线程首要解析用户的HTTP恳求。当用户恳求一个网页时,子线程查找文件体系。假如该网页文件存在,且经过权限认证,就把它从CF卡读入内存并扫描,发现有自界说符号则调用相应函数进行处理,终究把成果回来给浏览器;不然给一个简略的犯错音讯。当用户是上传数据时,子线程调用相应函数读取数据进行处理,并回来处理成果给浏览器。

4.2 代码规划

在嵌入式HTTP服务器的代码规划中,考虑到代码的移植性和扩展性,运用C言语完结了面向方针风格的代码结构。代码首要由两上数据结构request_inf和response_inf以及其上一组操作函数组成。

结构request_inf和response_inf别离用来保存HTTP恳求报文和呼应报文的一切信息。在结构界说时,应依据详细运用特色规划结构包含的成分。

嵌入式HTTP服务器的函数包含通用函数、CGI函数和自界说符号处理函数等,其间通用函数是一些与HTTP1.1协议有关的函数。

(1)通用函数

*void prase_request_line(char *,struct *request_inf)

该函数用来解析HTTP恳求报文的恳求行(Request_Line),并把相应信息存放在结构request_inf中。其间,对恳求行中URI部分的解析包含两种状况。假如用户恳求一个网页,则获取文件途径、文件类型;假如用户要求上传数据,则把数据放在一个字符数组中。然后将文件途径和类型,或许指向该数组的指针、办法、版别号信息都放入结构request_inf中。

*void prease_general_header(char*,struct*request_inf)

该函数用来解析HTTP恳求报文的调用首部(General_Header)。之所以把此函数与函数prase_request_line()分隔,是考虑到程序的修植性和扩展性。恳求行和通用首部是恳求报文中的不同部分,不不同的场合下,要求解析的信息或许存在差导师。一同,这样也能使程序结构更清楚。比方,本项目要从通用首部解析字段Keep_Alive。该字段指明一个最长的时刻或最大恳求数目,在此范围内可以坚持TCP衔接不被开释(即前文说到的HTTP1.1的继续衔接特性,persistent connecTIon)。

*void prase_request_header(char*,struct*request_inf)

void prase_entity_header(char*,struct*request_inf)

HTTP恳求报文的恳求头部用来阐明浏览器的一些信息,实体头部则用来阐明恳求报文中或许存在的实体主体信息。本项目实际上并不需求运用这两个函数来获取相关信息,但考虑到程序的扩展性和移植性,此处依然把它列出来,它们是两个空函数。

*send_status_line(int fd,struct *response_inf)

此函数用来发生一个HTTP呼应报文的状况行(Status_line)。状况行包含三部分内容,即HTTP版别、状况码以及解说状况码的简略短语。这些信息预先放在结构response_inf中。

*send_general_header(int fd,struct*response_inf)

send_response_header(int fd,struct*response_inf)

send_entity_header(int fd,struct*response_inf)

这三个函数别离用来发生HTTP呼应报文的通用首部、呼应首部(Response_header)和实体首部。嵌入式HTTP服务器是一个瘦服务器,功用十分简略。因而HTTP呼应报文的通用首部、呼应首部和实体首部中的可选字段许多是不需求的,还有许多是固定不变的,例如Last_modified和Content_type字段。Last_modified字段指出资源前次被修正的时刻并由接纳方解说。假如接纳方已有此资源的复制,但此复制比Last-Modified域所指定的要旧,那该复制便是过期的。因为网页文件中含有自界说符号,具有实时性,所以此字段底子没有含有Content_type字段指出实体的媒体类型,本项目中的嵌入式HTTP服务器被规划成只支撑HTML类型,因而该字段的内容总是Content_type=text/html。有关服务器和资源的一切标题域信息都被放入结构response_inf中。

*send_white_line(int fd)

此函数用于实体首部和实体之间传送一个空白行。

*void send_entity_body(int fd,char *buff_file)

此函数用来传递实体主体,实体主体实际上是一个处理后的网页文件,它被放在指针buff_file指向的缓冲区内。

*void zero_request_inf(struct*request_inf)

void zero_response_inf(struct*response_inf)

这两个函数用于结构request_inf和response_inf清零。

*void get_file(struct*request_inf,struct * response_inf,char*buff_file,void*,void*)

该函数用来处理用户HTTL恳求。首要,函数会查看request_inf结构,判别用户是恳求一个网页文件仍是上传数据。当用户恳求网页文件时,函数将依据request_inf结构中的文件途径信息,在文件体系录找此文件。假如文件不存在或不具有权限,则函数将状况码和解说短语写入结构response_inf,然后直接回来;不然读取文件并调用自界说符号处理函数,对符号进行处理,处理过的网页文件被放入buff_file指向的缓冲区内,并把状况码、解说短路和与实体有关的一些信息写入结构response_inf。当用户上传数据时,该函数调用CGI处理函数向CAN总线网络发送帧,然后将状况码和解说短路写入结构response_inf。运用状况码和解说短语只能用“200,OK”或“500,Internal Server Error”等,简略反映履行状况。用户要获取详细信息,可待一段适宜的时刻后恳求网页文件。函数中两个void指针别离指向自界说符号处理函数和CGI处理函数,或许对应的函数指针数组。

(2)自界说符号处理函数和CGI处理函数

自界说符号处理函数用于对自界说的处理,每一类自界说符号对对应一种自界说符号处理函数,同一类自界说符号的不同数据点运用参数来区别,比方转子秤1的分量符号可以用weight1来表明。一切的自界说符号处理函数被放在一同,构成一个函数指针数组。自界说符号处理函数向CAN总线网络发送长途帧和接纳数据帧,获取相应的状况信息。CGI总线网络发送长途帧和接纳数据帧,获取相应的状况信息。CGI处理函数用变量名来区别,同一类变量对应一种CGI处理函数。与自界说符号处理函数相似,一切的CGI处理函数也被放在一同,构成一个函数指针数组。因为自界说符号函数和CGI处理函数类型很多,这儿就不列举了。

5、结语

咱们规划的嵌入式HTTP服务器具有杰出的通用性和可移植性。经过替换或添加PC104通讯模块,该服务器可以支撑不同的现场总线,或一同衔接几种不同的设备级轻质网络。一同在服务器代码规划中,用C言语完结了面向方针风格的代码结构。这样,假如要求服务器端具有更多的特性,只需求简略修正结构request_inf、response_inf、操作函数和网页文件即可到达意图。这种规划思路不只适用于嵌入式HTTP服务器,跟着硬件技能尤其是嵌入式操作体系技能的开展,它相同可以运用到其它嵌入式产品的开发中。

责任编辑:gt

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/86836.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部