李 好
(唐山学院计算机科学与技术系,河北唐山063000)
基于ARM的电梯远程监控系统服务器端设计
李 好
(唐山学院计算机科学与技术系,河北唐山063000)
应用网络通信技术,开发了基于ARM的电梯运行状态的远程监控系统服务器端,为电梯在运行过程中故障的发现、分析和排除提供了设计依据。
电梯;远程监控;ARM;服务器
电梯作为机电一体化的大型机械设备,在高层建筑运输中起着非常重要的作用,是楼宇自动化必不可少的部分。但是由于电梯的结构复杂,运行可靠性要求高,使得远程监控其运行状态和故障情况成为电梯管理、维护和安全运行的迫切要求[1]。
目前国内外电梯远程监控服务器端设计大都基于x86体系结构,采用微软Windows系列操作系统,和面向对象编程语言对服务器端进行软件设计,并以传统电话线作为通信控制线路。本文给出的电梯远程监控系统服务器端设计基于ARM体系结构,采用开源嵌入式Linux作为操作系统,C++设计通信控制接口,网线作为通信线路。与国内外大多数电梯远程控制系统相比,具有功耗低、体积小、集成度高、性能稳定、执行速度快、成本低、实时性强、安全性高、生命周期长、性价比高等优势。本设计采用TQ2440ARM9开发板作为服务器端,采用PC机作为客户机端,并在客户机端安装Ubuntu 10.04操作系统,服务器和客户机使用网线连接。在服务器端构建电梯模型并完成键盘模拟电梯运行,同时用摄像头采集视频图像,进行JPEG压缩处理,然后通过网络传输,将视频图像和电梯运行数据传输至监控中心(主机)进行实时显示。
一个嵌入式Linux系统从软件角度可分为四部分:引导加载程序Bootloader,Linux内核,文件系统和应用程序[2]。
Bootloader是系统上电后运行的第一段程序。在完成对系统的初始化任务之后,将非易失性存储器中的Linux内核拷贝到RAM中,然后跳转到内核的第一条指令处继续执行,启动Linux内核。
Linux内核有两种映像:一种是非压缩内核Image,另一种是它的压缩版本zImage。嵌入式系统的存储空间一般较小,所以这里采用压缩内核的方式。编译完成后,会在内核目录arch/ARM/boot/下生成zImage内核映像文件。
把TQ2440光盘自带的Linux-2.6.30内核源码包解压到/home目录,即可开始配置。进入Linux-2.6.30内核主目录,通过cp命令,用目录下自带的配置文件,生成.config文件,然后开始配置Linux内核。使用make menuconfig命令对内核进行配置,可在原有的配置单上进行相应的修改。在配置时把系统所需要的驱动(.ko文件)添加进去。
该系统采用C/S结构,服务器端TQ2440ARM9开发板上连接ZC0301U口摄像头,用于视频获取。由于QT显示视频流难度较大,故选择图片刷新方法来实现服务器端图像的采集,通过网线将图片从服务器传到客户端实时显示。此外该系统还利用TQ2440开发板上的四个用户按键,模拟电梯运行。当按下某个按键时,会将相应的信息通过网线传到客户端,客户端管理员即可从PC机屏幕上看到当前的电梯运行状态。
进程管理采用多进程编程。进程是一个运行实体。每一个进程都有它自己的地址空间,一般情况下包括文本区域、数据区域和堆栈。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储活动过程调用的指令和本地变量。
在该系统中,系统的服务器端需要不断地发送摄像头获取的图片,同时还要将按键模拟的电梯运行数据实时地传送到客户端,这样显然不可能用同一个进程同时进行这两项任务。这时就需要利用多进程依靠时间片轮转调度策略来实现进程的并发执行。
在该模块中,首先运行server程序,程序运行后,利用fork函数创建一个新的进程称为子进程。该函数被调用一次但返回两次。两次返回的值不同:在子进程中返回的值是0,而父进程中的返回值则是新创建的子进程的PID。因此可根据fork函数的返回值确定当前是处于父进程还是子进程。将子进程PID返回给父进程的原因是:一个进程可有多个子进程,没有一个函数可以使一个进程获得其所有子进程的PID。
fork函数生成的子进程是父进程的复制品,子进程获得父进程的数据空间,堆和栈的复制品。而fork函数最常用的并不是复制原函数,而是在创建一个新的进程后,调用exec函数。exec函数启动一个新程序,替换原有的进程,因此这个新的被exec执行的进程的PID是不会改变的。在该进程管理中,首先调用fork函数创建一个新的进程,然后在新的进程中调用exec函数,执行按键模拟电梯运行程序,而在父进程中则运行服务器视频图像采集模块。
服务器视频采集由ZC0301摄像头和TQ2440ARM9开发板共同执行。由于Linux-2.6.30内核中默认是不添加摄像头驱动的,故在使用摄像头之前需要对内核进行配置和移植。
在Linux系统下,首先从TQ2440开发板自带光盘中将2.6.30内核源码包解压缩到/home目录下,进入解压出来的目录。输入命令make distclean,即可将曾编译生成的一些文件zImage以及.config文件删除掉。然后根据开发板型号选择相应的配置文件,复制该文件并重命名为.config,这样就产生一个默认的配置文件。然后在该目录下,输入命令make menuconfig即可看到内核配置界面。在这里我们需要添加摄像头驱动模块,直接将该驱动模块编译到内核中。在配置完成后按ESC键退出并保存。
在对内核配置完成后,在该目录下输入命令make zImage编译内核。将编译后的内核重新烧到开发板上,插上摄像头,在minicom下即可看到摄像头的提示信息。在开发板/dev下可以看到VIdeo0设备,说明摄像头驱动安装正确。
在摄像头可以正常使用后,使用vidcat程序从摄像头抓取图像并保存在当前目录下,利用网络图像传输模块进行图像传输。
服务器视频图像发送是将摄像头截取的视频图像从服务器端通过网络数据传输到客户端。这里采用socket套接字网络通信。在本系统中由于需要实时地掌握服务器端的数据信息,对网络传输的质量和时效性要求比较高,故采用了面向连接和具有重传策略的TCP套接字,而没有采用UDP套接字。
服务器端需要调用socket函数生成一个套接字。该函数如果调用成功,会返回一个文件描述符。文件描述符与文件的打开模式、文件的位置类型、文件的初始类型等文件对象相关联,这些信息被称作文件的上下文[3]。在使用socket进行网络传输之前,我们配置该socket。面向连接的TCP套接字的服务器端需要通过调用bind函数来配置本地信息。bind函数将socket与网络上某个IP相关联,而且需要和该IP主机上的一个端口相关联,随后就可以在该IP上对该端口进行监听服务请求。使用面向连接的socket客户端通信时,服务器端需要调用accept函数在套接字数据结构中保存本地和远端信息。listen函数使socket处于被动的监听模式,并且为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理完它们为止[4]。
客户端调用connect函数启动和远端主机直接连接。这样只有面向连接的客户端程序使用socket时才需要将此socket与远端主机相连,当然,客户端需要首先知道服务器端的IP地址以及端口号,只有这样,才能保证客户端能够找到正确的服务器端。服务器端的accept函数接收到连接请求后,如果接收成功,则会返回一个用于和客户端通信的套接字,这样服务器与客户端就可以开始通信了。
需要注意的是通信一定要保证数据读写的交互,尤其是在循环体内还有其他文件操作时,一定要考虑到同步的问题。这里需要利用read和write两个函数来进行交互以及同步。因为read函数是阻塞的,当读缓冲区没有数据时,程序会阻塞在read函数,一直到能够读到数据为止,程序才会向下进行。服务器端视频图像发送流程为:先将抓取的图片使用open函数打开放到设置的读写缓冲区,使用write函数发送到客户端,客户端使用read函数接收将数据写入到文件中,再利用write函数给服务器端一个消息,说明数据已成功接收。服务器端使用read函数来获取这个消息。
该系统中利用TQ2440开发板自带的四个用户按键模拟电梯运行,使用K1和K2分别控制电梯的上行和下行,使用K3的交替来控制电梯门的开启和关闭,使用K4来控制报警与取消报警。由于TQ2440开发板自带的内核中没有加载用户按键驱动,所以需要将用户按键驱动直接编译到内核中。将新编译生成的内核烧写到开发板上,则在设备文件中就多了一个名为IRQ_Test的设备文件。
设备驱动安装完成后,编写按键信息获取模块。定义一个存放按键信息的数组,使用open函数打开IRQ_Test设备文件,使用read函数阻塞式读取设备信息。当没有按键信息时,就会阻塞在read函数处,当有按键按下时则将信息存储在上述定义的数组中。利用循环判断数组的哪个单元有数据即可确定哪个按键被按下。创建一个网络连接和客户端进行通信。将按键信息存于buf[0],这样在将信息发送给客户端时,只需判断该单元的数据值即可进行相应的处理。
本文使用TQ2440ARM9嵌入式开发板作为电梯服务器端,并在其上构建电梯模型,完成键盘模拟电梯的运行,同时用摄像头采集视频图像,通过网络传输,将视频图像和电梯运行数据传输至监控中心进行实时显示。此设计,具有传输可靠、操作方便的特点,可较好地实现对电梯运行情况的实时监控,具有较高的商业价值。
[1] 余辉.嵌入式Linux程序设计案例与实验教程[M].北京:机械工业出版社,2009:238-248.
[2] 三恒星科技.ARM9应用实例[M].北京:电子工业出版社,2008:120-150.
[3] Scaglia Sergio.嵌入式Internet TCP/IP基础、实现及应用[M].北京:北京航空航天大学出版社,2008:215-250.
[4] 怯肇乾.嵌入式网络通信开发应用[M].北京:北京航空航天大学出版社,2010:64-105.
(责任编校:李秀荣)
Server Design of Elevator Remote Monitor System Based on ARM
LI Hao
(Department of Computer Science and Technology,Tangshan College,Tangshan 063000,China)
Using the network communications technology,the elevator remote monitor system server is developed based on ARM and it provides a basis for the elevator failure discovery,analysis and exclusion during the system running.
elevator;remote monitor;ARM;server
book=5,ebook=5
TP277
A
1672-349X(2012)03-0085-02
2012-03-14
李好(1977-),男,河北滦县人,讲师,硕士,主要从事操作系统研究。