引言
在“软件变服务”的背景下,通过网络提供服务,即网络计算,占据了越来越重要的地位。这种模式的特点是:客户端只进行显示和输入,不进行复杂计算,应用程序和数据都运行和存储在服务器端。为了在有限的资源条件下,如手机,PDA等便携终端上实现便捷的移动桌面效果,本文提出一种基于嵌入式系统的远程桌面控制方案,其基本思想是尽可能地减少终端资源占用,最大限度地增强其适用范围,以此达到增强应用价值的目的。具体方案是通过Directvnc 的移植来实现的,由于Directvnc 与其它Unix 系统不同的是它通过轻量级图形库DirectFB 使用Linux 帧缓冲设备。DirectFB 在FrameBuffer 的基础上提供了图形加速等多种功能,显示速度快,链接库较小,可以在一定程度上节省系统资源,另外,directvnc工作在帧缓冲层,平台独立性好,摒弃了对庞大低效的X Window 等标准嵌入式系统图形化用户界面的依赖,这一功能对于资源有限的嵌入式系统和PDA 等环境下是非常有效的。
1 网络计算模式的实现
1.1 网络计算模式
系统的实现基于网络计算模式(virtual network computing,VNC),该模式由VNC 服务器、RFB(远程帧缓存) 协议和VNC 客户端3 部分组成。Directvnc 作为客户端,它使用图形用户界面显示与进行输入输出控制,通过互连网远程访问与控制服务器。RealVNC 作为服务器端,它进行大量的计算并提供帧缓存变化到客户端显示设备,减轻了客户端负荷。RealVNC 功能成熟,高效实用,完全跨平台,兼容性好,可广泛应用于多种操作系统和开发系统。系统通信通过RFB 协议来完成,RFB是一个架构在TCP/IP上远程图形用户的简单协议,通过TCP/IP 协议簇连接,是基于字节流或消息的可靠传输。它是真正的瘦客户协议。
1.2 基于RFB 的瘦客户端实现
因为RFB 工作在帧缓存级别上,所以它可以应用于所有的窗口系统,例如:X11,Windows 和Mac 系统,重要的是对客户端硬件的需求少能支持更广范围的硬件环境。
在协议的设计上,对客户端的任务实现也尽可能的简单,这体现在:
(1)显示编码源语。
显示编码源语有基于像素和基于图形两种绘图源语。RFB 的显示编码方式基于像素,其显示更新在服务器端处理,客户端仅需要显示像素数据。客户端计算简单、平台独立性好。
(2)系统最初握手阶段对像素数据格式和编码类型协商的设计。
像素格式涉及如何通过像素值来实现不同颜色的重现,最常用的像素格式是24 位或16 位真彩色。像素格式描述了像素数据存储所用的格式,定义了像素在内存中的编码方式。
(3)编码方式。
编码是根据一定的协议或格式把模拟信息转换成比特流的过程。在RFB 协议中,编码就是将每一个矩形像素点的数据转化为包含该矩形像素点的位置、宽度和高度信息以及编码类型的前缀,再加上经过此编码方式编码的数据本身。RFB 协议主要采用的编码方式是二维运动步长编码(2DRLE)的变种,如Raw、CopyRectangle、RRE(Rise-and-Run-Lengeh)、CoRRE(Compact RRE)和缺省时使用的Hextile。实际上常用的有2DRLE、Hextil 以及CopyRectangle 编码,他们为桌面提供最好的压缩方法。在RFB 中压缩编码算法比不高,但由于算法简单,故对客户端的图形显示引擎设计要求很低,客户端程序也相对简单。
(4) 显示更新机制。
RFB 的显示协议是基于一个简单的画图原理,即将每一个矩形像素点放在给定的位置(x,y)上。
帧缓存的更新通过一系列块操作来完成,这种更新像素块的操作效率较低,但是通过多种像素编码压缩方式的灵活选择可以实现网络带宽、客户端计算速度和服务器处理的速度之间的效率折中,从而实现高效率的图形显示。显示更新机制包括更新时机及刷新模式。更新时机有客户端拉动和服务器端推动两种,每种更新时机又可采用懒惰更新和急切更新两种刷新模式。RFB 更新请求是客户端驱动型的懒惰更新,只有在服务器端收到客户端的请求时才会向其发送若干命令缓冲合并后的显示更新。对于一些应用,在相同区域上的更新往往非常频繁,这样如果网络非常慢或者客户端处理能力不强时,客户端驱动的更新机制使得客户端的显示质量可以得到调整。
总之,在网络计算模式下,RFB协议尽可能地减少终端资源占用并提高网络利用率,基本提供了一个比较瘦的客户端。
2 DirectFB 图形系统
2.1 DirectFB 简介
DirectFB 项目是由德国Convergence 公司推动的Opensource 计划的一部分,是面向嵌入式设备专注于Linux Frame-Buffer 开发的小巧、强大、灵活和易于使用的图形系统,提供一些基本的图形加速、输入设备处理提取、透明窗口和多重显示层的功能,以最低限度的资源使用和开销,提供最大的硬件加速度性能。
Linux 下有多种图形子系统函数库可供选择,如Xlib、SDL、Allegro、Mesa3D 和DirectFB 等。其中DirectFB 定位于中高阶层的绘图、游戏应用、STB(Set-Top-Box)、MHP(multi-mediahome platform),支持dev/fb、osx、sdl、x11、/dev/men 等系统,它在嵌入式开发中具有很多优势:
①小巧且移植性好;
②支持硬件图形加速、输入设备的处理和抽象、无缝整合窗体系统;
③独立的资源管理;
④遵循开源许可证。
2.2 DirectFB 图形系统实现图形加速
DirectFB 图形系统构建在FrameBuffer 图形引擎之上,是一个完整的硬件抽象层,提供了对每个图形操作的软件回馈,由于这一功能还没有被底层硬件支持,因此需要一种能够提取图形的硬件设备的支持。DirectFB 体系结构如图1 所示,DirectFB 图形芯片驱动程序访问显存映射的图形处理器I/O端口向图形处理器提交命令,即实际的硬件加速的启动是在用户空间完成的。
FrameBuffer是内核中的一种驱动程序接口,它将显示设备抽象为帧缓冲区,用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间直接进行读写操作,而读写操作可以立即反映到屏幕上。DirectFB 作为抽象层可以直接访问FrameBuffer,对它进行显卡工作模式(分辨率,颜色深度,时序),映射显存等设置,并在其上直接输出图形。这种在内核级实现图形的方案加快了显示速度,节省了系统资源,从而提高效率。
2.3 DirectFB 在嵌入式系统上的移植
Directvcn 依赖DirectFB 库实现功能,需要对DirectFB 进行移植。DirectFB 的交叉编译条件是在Linux 内核2.2 以上,并运行帧缓冲(Framebuffer),以及必要的依赖库,比如zlib、libjpeg、libpng、freetype 等。完成设计的软件开发环境是:
Ubuntu8.04 操作系统,嵌入式Linux 开发环境。使用ELDK4.1交叉编译器。步骤如下:
(1) 从http://www.directfb.org/downloads/Core/获取源代码DirectFB-1.2.5.tar.gz 并解压。
(2)交叉编译依赖库并安装到指定路径下:
-prefix=/usr/local/arm/eldk-4.1/usr/bin/arm-linux
(3)设置交叉编译环境变量,如PREFIX、LDFLAGS、CFLAGS、PKG_CONFIG_PATH 等路径,配置并交叉编译DirectFB-1.2.5。
(4) 在rootfs/etc 下为directvnc 编辑配置文件directfbrc,内容如下:
编译之前,去掉Makefile 中OMAP 驱动的编译,由于它是TI 的OMAP 系列CPU 专用的,在此包中缺少头文件,会引起编译错误。#make #make install 编译成功后在/usr/directfb 下会生成图形支持库的相关文件包。
3 嵌入式远程桌面控制的实现
3.1 Directvnc 及其功能框图
Directvnc 应用VNC 服务器所使用的远程帧缓冲协议(RFB)。其协议消息分为3 个阶段:握手、初始化和协议交互。
最初的握手阶段主要是对协议版本、像素数据的格式和编码类型进行协商。第二步对报文初始化,主要是本客户端和服务器端初始化消息。最后是正常的信息交互阶段,客户端发送请求,服务器端响应并送回结果。所有的消息都由一个消息类型字节和详细的消息数据组成。因此Directvnc 的运行流程大致可以分为登陆服务器,初始化连接,信息交互和退出4部分。如图2 所示。
3.2 Directvnc 的移植
DirectVNC系列的configure没考虑做移植的配置,所以有些依赖库的路径需要改正。比如libjpeg,它会默认使用系统/usr/lib 下的库。同理需要指定头文件:Xmd.h、keysymdef.h、jpeglib.h、jconfig.h、jmorecfg.h,或者直接从系统中复制过来。当然也可以写一个用于交叉编译的Makefile。由于版本不同数据定义更新,需要注意的是dfb.c 文件的第33 行:DFBCard-Capabilities caps 应修改成DFBGraphicsDeviceDescription caps;RFB 输入协议是基于键盘和多键鼠标设备的标准共站类型,输入事件也可以由其它非标准I/0 设备产生,由于本系统采用触摸屏输入实现控制,因此可以注释掉69-70 行:
4 结语
DirectFB 在嵌入式系统中的应用,充分利用了图像加速功能,减轻了CPU 的数据处理负担,提高了系统性能。随着其广泛的应用,嵌入式GUI 的性能也将得到提高。嵌入式远程桌面控制系统平台性能的优化方面有如下可行的改进方向:对硬件加速进行优化,即将加速模块从用户空间移到硬件的驱动中,GUI 中只需要用统一的接口调用硬件加速功能,同时在GUI 中添加对显卡芯片未提供的加速功能的软件实现,这样简化了GUI 维护,提高了系统的性能。对RFB 安全机制进行改进,即利用OpenSSL 密码算法函数库实现安全通信通道,或者在正常的协议交互中对输入输出数据进行算法简单高效的加密。