远程机房电源控制系统设计陈铭,徐小宇,凌明(东南大学国家专用集成电路系统工程技术研究中心,南京210096)摘要:论述了在无人职守机房运用中,如何实现在远程控制机房内各计算机的电源开关。
设计方案采用软硬件相结合,以ARM7TDMI内核的SEP3203嵌入式处理器为硬件核心,通过GPIO口控制外部继电器开关,实现弱电控制交流强电输出的开关切换。
软件上以VC++编写守护进程,ASP制作网管界面,配合COM组件、ACCESS数据库和TCP/IP协议,实现远程电源控制方案。
关键词:SEP3203嵌入式处理器; COM组件; 远程电源控制; 无人职守机房;0. 引言信息技术蓬勃发展的今天,大量数据和设备集中存放、管理是大势所趋,如何合理运用有限的财力、物力和人力资源,对大规模、大面积机房甚至是异地机房进行有效的管理和操作的难题便随之出现。
“IT远程机房管理系统”由此应运而生,该系统真正的为解决该难题,实现无人职守机房提供了圆满的解决方案,创造了机房管理新理念。
目前,国内外关于机房远程控制系统的解决方案,主要是通过纯软件技术实现的,诸如IBM、赛门铁客、HP、东软等公司都有相关的软件产品,然而,结合实际的机房管理需求,软件技术却有着无法逾越的技术限制,例如远程电源的开/关控制仅靠软件技术就无法实现。
在机房,由于各种原因,譬如内存耗尽导致当机,而需要重启计算机的概率是比较频繁的,虽然有些监控软件可以实现关闭本机电源的功能,但一旦断电,软件就运行不起来了,自然就没办法再通过指令来启动电源。
本文将围绕机房运用,描述如何实现“远程电源控制系统“的软硬件相结合的设计方案。
1. 系统构成1.1电源控制结点(PowerController)每台电源控制结点提供8路交流电源插座,每路220V电压,最大30A电流。
电源控制结点在网络上受WEB服务器控制,每路电源的开关状态可控且可查询。
电源控制结点的主要软硬件清单如下:SEP3203嵌入式处理器(ARM7TDMI内核)10M/100M自适应以太网控制器MACAsixOS嵌入式多任务实时操作系统嵌入式的电源控制软件(下位机守护进程)1.2 Web服务器Web服务器集控网内所有的电源控制结点,各电源控制结点的所有电源的开关状态都保存在Web服务器上的数据库中。
Web服务器响应远程访问者的请求,对指定的电源控制结点的开关状态进行查询和设置。
Web服务器的软件构成如下:ACCESS数据库ASP网管软件COM通讯组件C++服务器守护进程2. 拓补结构图1实现远程电源控制的机房网络拓补图实现远程电源控制完全不改变原有机房的网络拓补结构,如图1所示,只是在内网中增加了一台WEB服务器,该服务器需要双网卡,一端接在内网中,另一端接入Internet; 并且把所有要控制的电脑的电源连到电源控制结点(PowerController)上,即由电源控制结点来为机房内所有电脑设备供电。
同时,所有的PowerController也接在机房的网络中,以便接受WEB服务器的控制。
一台PowerController节点可以同时提供8路(220V, 最大30A)电源输出,因此一个机房如果有N台电脑,则只需要(N+7)/8台PowerController节点就可以实现全方位的电源控制。
用户在任何一个Internet接入的电脑上可透过IE浏览器登录到远程机房服务器上的网管系统,通过ASP页面向服务器发出控制和查询指令,服务器再将指令传送给网内的特定的电源控制结点,通过电源控制结点实现控制机房内任何一台服务器/工作站/路由器的电源开关切换、以及电源状态的交互查询。
3. 电源控制结点(PowerController)的设计3.1硬件部分设计硬件上,主要通过Garfield SEP3203处理器来实现,SEP3203应用处理器是由东南大学国家专用集成电路系统工程技术研究中心设计的16/32 位RISC 微控制器,内嵌由英国ARM 公司提供的ARM7TDMI 处理器内核,主要面向低成本手持设备和其它通用嵌入式系统设备,全芯片可稳定运行在75MHz[1]。
电源控制结点的8路电源开关通过SEP3203处理器的GPIO外围端口来控制,8条GPIO(LD0~LD7)用来控制继电器的通断,8条GPIO (LD8~LD15)用来控制LED指示灯,1条PWM0控制蜂鸣器。
输出模块设计见图2(8路电源输出中的一路):图2 输出模块设计图(弱电控制强电开关)继电器选用30A额定电流。
100欧姆大功率电阻,MKP0.1uF电容构成RC滤波网络。
在RC滤波网络中,有一个器件SVR是个压敏电阻,起保护作用。
当RELAY1置低时,继电器的3和5输入端产生压降,继电器开关从2端点打向1端点,从而将输入火线Fire选通至Fire0,这样插座上就得到了220V的交流供电;当RELAY1置高时,继电器将输入火线选通至端口2,插座不再供电。
3.2 嵌入式控制软件的设计在嵌入式软件的开发过程中有主机和目标机的角色之分:主机是执行交叉编译、链接、定址过程的计算机;目标机指运行嵌入式软件的硬件平台。
首先,我们在主机环境中,使用ARM公司提供的ADS开发工具进行应用程序开发与调试,然后把应用程序转换成可以在目标机上运行的二进制代码,这一过程包含三个步骤:交叉编译、链接、定址,由交叉编译器实现[2]。
最后把二进制代码通过烧录工具写入目标机的ROM中。
电源控制结点上的软件开发过程就是嵌入式软件的开发过程,电源控制结点在网络中与WEB服务器通讯采用“客户端-服务器”模型,电源控制结点作为客户机,双方通过UDP 协议进行通讯。
因此在电源控制结点上需要运行一个TCP/IP协议栈,并且每个电源控制结点需要配置一个唯一的IP地址,以实现点对点的通讯[4]。
电源控制结点的程序流程如下面图3所示:图3 电源控制结点的程序流程图IP地址的配置不是通过DHCP来自动获取,而是在工程作业时通过烧录工具写入到电源控制结点内嵌的ROM中,在电源控制结点上电启动时,将从ROM中读取该IP地址来初始化本地TCP/IP协议栈。
在系统初始化时,电源结点上的守护进程将发送指令(网内UDP广播)到Web服务器,查询服务器的IP地址,服务器收到请求后,会把本机IP地址连同该电源控制结点上一次断电时的各开关状态发送回去。
当电源控制结点收到服务器的IP地址,并用上一次断电时的开关状态来初始化后,就完成了初始化的工作,并进入工作模式。
在工作模式下,电源结点上的守护进程接收Web服务器上的守护进程的查询和设置指令,并作出相应的处理动作,处理完后,再把处理结果发送给服务器上的守护进程。
并且每隔一定间隔(可设为30秒),电源结点上的守护进程必须发出HeartBeat信号,把当前的状态信息报告给服务器,以示正常[4]。
如果同时需要打开多个电源开关,程序将依次去打开,并自动间隔1秒钟,以防止瞬间电流过大,这就是防突波设计;另外,在执行电源Reset时,在断电与上电之间也保留3秒钟的时间间隔,以保护外部连接的计算机或者其它连接的设备。
4. 服务器端软件的设计服务器端软件由ASP网管页面、COM通讯组件、服务器守护进程这三个部分组成,三者通过TCP/IP本地环回链路以及ACCESS数据库进行数据交互,其交互关系如下图4所示:图4 WEB服务器端内部软件构成及通讯机制4.1 ASP网管页面网管页面是远程电源控制的主界面,机房管理员在远端通过受权的用户名和密码,登录到该控制页面,点击相应的按钮就可以监控远程机房中的服务器或者工作站。
网页可采用当前主流的ASP语言编写,配合ACCESS数据库及SQL检索方式,实现高效的机房IP网络集中管理。
4.2 服务器守护进程(ServerDaemon)该模块将安装在数据管理服务器上,负责与网内的多台前端管理单元进行指令和状态的交互。
服务器守护进程和前台控制单元间采用带校验的UDP包进行数据通讯。
主要的数据流程如下:当电源控制结点的开关状态发生主动或者被动地改变时,就会发出当前状态给服务器守护进程,服务器守护进程收到数据后就把最新状态更新到本地的Access数据库中,这样当远端用户登录网管页面时,就能读取到数据库中的最新数据。
当用户在IE浏览器中通过网管系统发出指令时,ASP页面会通过COM组件将指令传递给服务器守护进程,服务器守护进程将对指令译码,并把译码后的指令通过UDP包发送到网内特定的电源控制结点上去执行,最后将返回执行结果状态,并反馈回用户页面。
4.3 COM组件设计由于ASP页面无法与C语言编写的服务器守护进程进行通讯,因为必须有一个中间的通讯桥梁,而COM组件正是充当这个角色的。
COM全称components Object Model,即组件对象模型, COM可以实现程序模块之间通信的标准方法。
COM组件很好用,但是要编写实现一个COM组件很复杂,幸运的是,现在有很多RAD快速开发工具可以帮我们来完成COM组件的复杂的封装工作,例如Mircosoft VC++、Borland C++ Builder等开发工具,我们仅仅只需是编写模块通信需要的功能代码[3],在我们需要编写的COM组件中,只要实现一个函数,其原型如下:BOOL SetPower(int BlockID,int PortIndex,int Action)该函数的作用是接收网页传入的三个参数:目标电源控制结点的ID(BlockID)、电源口索引号(PortIndex)、电源开/关操作命令(Action),然后把这三个参数传给服务器守护进程,等待服务器守护进程执行完相应的电源操作后,把执行结果返回给网页。
要注意的一点是,COM 组件与服务器守护进程虽然安装在同一台服务器上,但是它们之间没办法通过系统消息队列或者管道进行通讯。
解决方法是通过UDP协议在本地建立一条环回链路进行通讯。
设计完COM组件,我们就可以在网页中使用它了,COM 组件是建立强大而实用的 Web 应用程序的关键,要使用COM 组件封装的C函数,就必须创建组件对象的实例,使用 ASP 的 Server.CreateObject 方法或在 HTML 中使用 <OBJECT> 标记可创建对象实例,使用脚本语言变量赋值语句可为对象实例指定名称,创建对象实例时,必须提供其注册名(PROGID) [5]。
ASP页面中COM组件的调用方法如下:set COM=Server.CreateObject("cmDaemon.PowerCOM") //创建COM组件对象if not isNull(COM) then //判断组件是否创建成功COM.SetPower (BlockID , PortIndex , Action) //执行COM组件中封装的函数end ifset COM=nothing //释放COM组件5. 结语至此,远程机房电源控制系统设计方案就介绍完了,其中可以继续完善的一点是电源控制节点的IP地址的获取方式,更进一步可以设计通过DHCP服务器自动获取。