CGI 本身制订的标准有提到可以藉由环境变量来达成此目的,而且CGI 程序也有能力取得现存在各类数据库里的数据。因此我们可以发现,CGI 可以由任何语言程序来实现,只要语言程序具有读写档案的能力。直得一提的是这样的方式也容易有安全性上的问题。图7 为CGI 示意图:
图7 CGI 示意图
目前的web-server 绝大多数都有提供执行CGI 的环境(路径端看server 设定,一般放在cgi-bin 的路径下)。当使用者用浏览器link 到一个CGI 程序时,浏览器会透过HTTP 这个通讯协议,送出一个请求(require)给远程(remote)的Web server,Web server 就会跑一个HTTPd process,这个process 会去找指定的目录下有没有这个CGI 程序,如果有的话HTTPd 会启动一个child process 来跑这个CGI 程序,也因此继承了HTTPd 所有的环境变量设定。这也就是说使用者所输入的要求会经由HTTP 通讯协议传送到Web server 的HTTPd,再经由环境变量或标准输入装置(STDIN)传递给CGI 程序[6]。CGI 程序相关的环境变量列表于下:
嵌入式网页服务器的设计
本节中,我们将说明嵌入式网页服务器 (以下简称为EWS)并与一般的服务器做一比较。同时,也将说明建立以EWS 为平台的控制系统的基本需求以及发展工具。
(1)一般网页服务器 vs. 嵌入式网页服务器:一般网页服务器基本上都是为了标准用途所设计的 (例如:NT servers、Unix ),因此它们对系统资源的需求也相对提高,如:较多的内存、高速的处理器、具分时多任务的操作系统以及其它的资源。而典型的EWS 需求则相对的少,只要数百K 的内存、低速的处理器、单工的操作系统,所以在成本及效益上反而占了极大的优势。EWS 通常可以用来传递嵌入式系统的状况,透过浏览器使用者可以很容易的取得目前系统状态、设定一级作业的执行结果。EWS 同时也可以接受使用者从浏览其传送过来的命令并加以执行,达到远程控管的效果。
(2)在线设定程序:一般的服务器设定除了提供本机上的管理程序,为了管理的方便性通常也会提供远程浏览器端的管理程序,在EWS 上也拥有同样的机制,使用者也可以透过浏览器从远程直接对EWS 做相关的参数设定。藉由EWS(嵌入式网页服务器),使用者可以透过远程的浏览器针对现场的需求做不同的设定[4],例如:网络通讯参数的变化以及RS-232 端的通讯方式改变,这个便利性可以免除管理者必须四处奔波的窘境。进而达到管理的方便及人性化。
(3)EWS 的优势:市面上有一些嵌入式网页服务器,虽然号称功能强大但却还是免不了需要使用者自行编写程序语言来开发系统。本EWS 系统除了支持使用者在建立网页服务器时不须编写任何语言外(基本模式),它还提供更具有弹性的方式让使用者自行去修改并产生自己的服务器(自订网页中的SCRJPT 规则)(进阶模式)。
EWS 的运作的原理及系统需求
一般网页服务器主要是设计透过快速的处理器来显示静态网页,而EWS 的设计重点却是如何在有限的资源中达到这些要求。因此,以下的重点是必须考虑。
(1)通讯协议的格式:HTTP/1.0 针对每一个联机提供信息的交换,透过浏览器传送相关的信息到EWS,在EWS 做出反应后就关闭此联机。因此,设计的过程中只要考虑传送的信息是什么,而后续的动作待EWS 接手后,就可以不去关注,EWS 会将此一联机需求忠实的执行完毕并关闭此一联机。
(2)EWS 提供的API:EWS 必须提供设计人员相关的响应机制并且提供HTML网页传送到浏览器端的服务[5]。这个部份的需求的功能,可以采用CGI 的方式来达成。在这种模式下,每一个透过URL 呼叫CGI 的联机将被导引到CGI 的处理程序中,透过CGI 的方式将会使得浏览器端可以呼叫及使用EWS 中的函式,并将执行结果回传到浏览器。为了达到这种功能,我们必须在符合标准的CGI格式下发展数个CGI 函数[6],供给浏览器端的不同需求。
(3)EWS 的结构:基于上一节的讨论,整个发展的EWS 包含3 个部份:HTTP 服务、CGI 服务函数、设定接口。整个结构如图8 所示:
图8: EWS 结构
本结构图最重要的一个部份在于提供HTTP 服务,此服务可以接收来自浏览器端的要求,而这个服务的来源则必须符合基本的HTTP 规格才可以。一般的网页服务器,在接收到要求时就会立刻建立一个联机,而EWS 因为是单工操作系统,所以它的运作方式完全不同,它会先将要求排入一个等待队列,然后一个一个去完成。因此,当联机数大于一个以上时,因为系统资源的关系,同时建立联机的方式为不可行的,所以对于HTTP 的服务会采用在状态记号方式来处理。
设定接口的部份,将会提供浏览器操作接口的方式以设定EWS 的网络相关参数,此接口提供使用者在远程可以直接的对EWS 做网络参数的在线设定。CGI函数,网页文件分为静态及动态显示文件,静态文件部分基本上可以直接由HTTP 服务透过档案系统传递到浏览器端,动态文件则必须先经过解译的程序将网页文件中需要以动态显示的部份,由CGI 函数取得后传送到浏览器端。档案系统,提供EWS 对档案存取的权利,基本上提供档案的开启、读取以及关闭这三种功能。透过这种档案系统,我们可以直接在EWS 上直接对以下档案类型做这三项动作:GIF、JPG、BMP、HTM。
EWS 的处理程序
在图9 中明显的呈现出HTTP 服务对联机所执行的流程及步骤。为了达到在单工操作系统中接受多个联机需求的目的,必须在此系统上架构排程序的作业程序。在此系统中,采用一个队列专门来储存每一个要求的联机,来决定新的联机是要阻断或是继续接受。而整个程序中,为了提供更大的弹性,此程序切割成两个部份,一个是固定不变的WebL_100.Lib 另外一个是User.c。其中,WebL_100.Lib为整个嵌入式网页服务器的重心,它提供了HTTP 的服务以及些其它的TCP/IP处理机制。而User.C 为此服务器开放出来让使用者可以自行设计并决定响应从Port 80 传入的联机要求[7]。
图9: EWS 运作方式
以下说明每一个状态的功能:
Block 1:
此区块会将所有的变量、封包信息以及网络环境初始化。
Block 2:
此区块包含两个函数,这两个函数提供给设计者自行编写自订的程序。
Web_Init():设计人员可以在此函数中加入想要使用的变量或命令,而这些加进去的程序在服务器启动后只会被执行一次,设计者可以加入一些只要执行一次的动作命令。例如:初始化通讯端口。
Web_Loop():设计人员可以在此函数中加入想要使用的命令,而这些加进去的程序在服务器启动后会在主循环中不断被执行次,设计者可以加入一些要重复不断执行的命令在这个函数中。例如:扫描通讯端口状态。
Block 3:
检查TCP/IP 通讯端口是否有数据,如果有数据,会向下执行Block5。否则的话程序会往Block4 执行。
Block 4:
更新I-7188E 上的七段显示器,并检查看门狗机制并回到Block 2 检查TCP/IP 是否有资料进来。
Block 5:
根据来自不同Port 的需求联机我们做不同的反应机制。
Port 80: 如果连现需求中呼叫CGI 函数程序会执行到 Block 6。如果只是单纯的网页或是图形的话程序会执行到 Block 7。
Others: .其它不同Port 的需求联机。如:Ping。
Block 6:
依照浏览器端的呼叫函数,将变量传递到对应的函数中。以下为此方块提供的CGI 函数。
CGI_DPAGE()
CGI_USER()
PRINT_PAGE()
Block 7:
将数据(网页)传送到浏览器端。完成后,程序将回到Block 2。
软件与硬件的需求
在本研究中采用了由泓格科技公司所研发之型号I-7186EX/I-7188EX 的嵌入式控制器作为控制系统的执行平台,如图10 所示。它的运算核心采用了由x86 微处理器,运算频率为80MHz,不支持浮点运算能力,内建有3 个定时器 (Timer)及1 个看门狗定时器(Watchdog Timer),同时支持软件及硬件的中断功能。在通讯部份则支持RS232/485、Ethernet 三种接口,可透过RS232 或Ethernet 下载至嵌入式控制器上进行应用及验证。至于在储存装置上,它提供了2Kbytes 的EEPROM 存放硬件开机时所需的相关数据;512Kbytes 的Flash ROM 则规划一部份作为嵌入式操作系统之用,其余的部份则用来存放使用者所自行开发的应用程序,同时可透过软件方式进行更新的特性,更满足了使用者未来在此系统上进行控制器设计时,反复修改控制参数并下载至控制器验证的需求;512Kbytes 的SRAM 则可用来存放实验过程中所获得的数据。