基于Android的虚拟桌面USB设备重映像系统的设计

2016-11-09 01:11健,2*兴,2
计算机应用与软件 2016年9期
关键词:应用层监听线程

贾 堂 曹 健,2* 官 玫 张 兴,2

1(北京大学软件与微电子学院 北京100871)2(北京大学信息科学技术学院 北京100871)



基于Android的虚拟桌面USB设备重映像系统的设计

贾堂1曹健1,2*官玫1张兴1,2

1(北京大学软件与微电子学院北京100871)2(北京大学信息科学技术学院北京100871)

虚拟桌面是基于服务器的计算模型,可提高计算机的资源管理效率。现有的虚拟桌面对USB设备支持不足,无法实现USB设备的桌面虚拟化。针对这一问题,在基于Android的虚拟桌面上设计USB设备重映像系统,实现通过虚拟桌面对USB设备的操控。该系统通过NDK构建USB设备监听模块和控制模块,利用Socket在进程间传递USB设备信息,利用基于TCP/IP协议的消息框架与服务器进行数据传输。实验结果表明,在Android虚拟桌面上对重映像的USB设备进行读写操作,其传输速率与本地USB的传输速率相当。

虚拟桌面AndroidUSB设备重映像

0 引 言

虚拟桌面是一种基于服务器的计算模型,它通过虚拟化技术将服务器上的资源以桌面系统的形式映射到移动设备、个人计算机、瘦客户机等终端设备。虚拟桌面运行于云计算数据中心,将终端设备与桌面环境解耦合[1]。用户可通过终端设备登录虚拟桌面,访问服务器资源。

虚拟桌面通过网络实现终端设备间的协同办公,具有易管控、低成本、高安全性等优点[2],已被广泛应用于大型企业的远程办公系统。然而,现有的虚拟桌面仅支持鼠标、键盘等USB设备,无法满足用户对USB存储设备、USB多媒体设备的操控需求。为解决这一问题,在Android平台上实现了USB设备重映像系统,使用户能够在虚拟桌面上对接入终端的USB设备进行读写操作,实现了U盘、硬盘、USB摄像头、智能卡读卡器等USB设备的桌面虚拟化。

1 关键技术

1.1桌面虚拟化技术

桌面虚拟化技术基于服务器虚拟化技术,它对计算机资源进行整合和抽象,向终端用户及应用程序隐去计算资源的物理特性和硬件实现细节,实现了桌面系统的远程动态访问与数据中心的统一托管。桌面虚拟化技术的架构分为四层:资源池层、桌面管理层、网络接入层和终端接入层,分别负责计算资源的部署、桌面系统的调度、网络的连接以及终端设备的接入。

1.2USB设备重映像技术

USB设备重映像技术是指运行在终端上的虚拟桌面可识别并操控与该终端连接的USB设备。系统将USB设备描述符信息通过TCP/IP协议发送至服务器虚拟机端,从而将USB设备的使用权交由虚拟桌面。同时将终端设置为USB代理,负责处理用户在虚拟桌面上对USB设备的操控请求。Android平台虚拟桌面上的USB设备重映像技术涉及Android NDK开发、虚拟桌面专用协议PCoIP、JNI接口设计以及Unix进程间的通信。

2 系统设计

2.1开发环境及功能概述

系统采用Android Studio为开发平台,以Java语言为Android应用层开发语言,以C++语言为Android Native层开发语言,利用NDK构建Android Native层核心功能模块,以Junit为系统测试框架[3]。

系统运行过程中可实时获取连接Android终端的USB设备信息,并更新用户操作界面,显示已连接的USB设备,为用户提供操作菜单。系统响应USB设备重映像操作后可将USB设备信息通过消息传递框架通知服务器,将连接Android终端的USB设备的使用权交由虚拟桌面。

2.2架构设计

虚拟桌面USB设备重映像系统由用户操作界面、设备监听模块、消息控制模块、虚拟桌面和服务器五部分组成,如图1所示。

图1 系统整体架构

系统分为应用层、JNI接口层和Native层(本地层)。其中应用层运行虚拟桌面,提供与用户交互的界面。接口层提供JNI接口,负责应用层Java程序和Native层C++动态链接库的互相调用。监听模块和控制模块位于Native层,监听模块接收并处理应用层USB设备状态广播,获取USB设备信息,响应用户的USB操作请求;控制模块调用USB函数库,接收监听模块传递的USB描述符信息,负责系统运行中线程之间的消息传递。消息传递框架基于TCP/IP协议[4],负责控制模块与服务器的数据及请求传递。服务器为虚拟桌面提供运行环境,与应用层通过PCoIP协议进行通信[5]。

2.3功能设计

(1) 交互设计

系统为用户呈现接入终端的USB设备,实时响应用户操作,系统与用户的交互如图2所示。

图2 系统与用户交互

图3 系统工作流程

四个交互对象分别是用户、UI线程、监听进程和虚拟桌面。UI线程负责响应用户的请求事件,监听进程获取USB设备信息并反馈给UI线程,UI线程更新设备缓存并将USB设备以图标形式呈现给用户。响应用户对USB设备的重映像请求后,UI线程向服务器发起连接请求,经过握手操作,服务器会识别该USB设备,用户可在虚拟桌面上操控USB设备。系统工作流程如图3所示。

(2) 监听功能

为保障系统准确获取USB设备状态,监听模块应包含监听USB设备状态、获取USB设备信息、过滤与系统不兼容的设备、提供应用层接口、与UI线程通信等功能。具体而言,监听模块监听USB设备状态,获取能与系统兼容的USB设备的描述符。USB设备描述符记录了设备序列号、设备适用的协议类型、设备商和产品编号等信息。监听模块以动态链接库的形式存在于Android Native层,提供与Android应用层交互的接口。监听模块可通过进程间通信的方式,将获取的USB设备信息传递给UI线程,更新设备列表。监听模块功能如图4所示。

图4 监听模块功能

图5 监听模块工作流程

监听模块的工作流程如图5所示。

(3) 控制模块设计

系统控制模块完成USB设备信息接收、更新设备缓存触发UI重绘、线程间消息处理、与应用层交互、处理连接请求等操作。具体而言,控制模块接收监听模块传递的USB设备信息,更新设备缓存,保持与Android终端接入的USB设备同步,通过回调函数结合Android消息处理机制更新UI。控制模块与安卓应用层的交互包括模块的加载和停用、与应用层消息格式匹配等操作。同时,控制模块负责处理与服务器的连接请求[6]。控制模块功能如图6所示。

图6 控制模块功能

控制模块工作流程如图7所示。

图7 控制模块工作流程

(4) JNI接口设计

系统应用层Java程序和Native层C++程序无法直接互相调用,JNI接口用于实现Android应用程序和Native动态链接库的函数调用。系统主要JNI接口包括:加载USB设备监听模块和控制模块、监听模块处理USB设备状态广播、监听模块响应USB设备操作的请求等。

(5) 通信设计

系统模块之间的通信包括:

应用层和监听模块的通信,通过JNI接口实现,主要包括监听模块的启动与信息的交互、USB设备的操作。

应用层和控制模块的通信,包括更新UI、连接虚拟机。

监听模块和控制模块的通信,利用Socket本地套接字,绑定Android系统内部存储作为监听模块和控制模块通信的管道。

虚拟桌面与服务器之间的图像、声音传递,利用PCoIP协议(基于UDP协议)实现。

控制模块与服务器传递URB及USB数据包,利用基于TCP/IP协议的消息传递框架实现。

3 关键功能实现

3.1监听模块功能实现

监听模块在Android后台运行,交互界面设置监听模块启动框,当框内状态改变时,系统进行判断,若为选中状态,则调用创建监听进程的函数。若取消选择,则调用终止监听服务的函数。Android 3.1版本开始支持USB HOST模式,可以实现利用Android广播机制获取USB设备状态信息[7]。系统创建广播接收对象,响应USB设备状态广播消息,具体过程如图8所示。

图8 处理USB状态广播消息

监听模块注册广播接收器,接收来自系统关于USB设备状态的广播,设置事件过滤。

监听模块响应事件广播,重写响应函数:查询SQLite数据库,若USB设备型号存在于数据库中,表明该设备与重映像系统兼容,监听模块会获取并传递该USB设备信息,其伪码如下:

Loop:

Step NONE_DEVICE_DETECTED:

Jump to Loop

Step USB_DEVICE_ATTACHED:

Get Device Information

if device in database:

Transfer Device Descriptor

else:break

Step USB_DEVICE_DETACHED:

Jump to Loop

3.2控制模块功能实现

控制模块的关键功能为处理多线程和异步消息。在Native线程中控制模块通过Socket套接字获取来自监听模块的消息后,会回调应用层Java函数,发送增加设备的消息通知UI线程,更新UI。

控制模块利用Handler类实现消息的获取和发送,Handler将相应的方法放入其所在线程中执行。系统创建新线程时生成一个消息队列(MessageQueue),作为装载线程间消息的容器,同时生成一个循环Looper,用于管理消息队列。Looper负责阻塞读取队列中的消息,将消息逐个发送至对应的Handler完成响应[8]。消息处理过程如图9所示。

图9 控制模块消息处理

系统的消息存放于全局消息池Message Pool中,消息池中的首个消息直接通过new()方法生成,其他消息通过Recycle()回收函数回收至消息池中[9]。

3.3JNI接口

JNI使得在Java虚拟机(JVM)内部运行的Java代码能够与用其他编程语言(C、C++和汇编语言)实现的库和应用程序进行交互[10]。系统通过JNI函数实现Android应用层和Android Native层的函数调用。

应用层的Java程序调用Native层程序时,JVM会向Native层传递两个指针,分别为JNIEnv类型和jobject类型,形式如下:

JNIEXPORT void JNICALL Java_ClassName_MethodName

(JNIEnv *env,jobject obj)

{

/*Native层函数具体实现*/

}

JNIEnv类型的指针包含JVM的接口,通过该指针可以对Java程序进行操作,如创建Java类对象、获取对象属性、调用对象的方法等。jobject obj参数为声明Native层函数的Java对象的引用。

Native层程序调用应用层Java程序时,首先获取Java类和类对象的属性和方法。JNI定义jfieldID、jmethodID类分别表示应用层Java类对象的属性和方法。JNI函数通过ID识别不同的域和方法[11]。表1列出Native层程序调用应用层程序的关键方法。

表1 Native层程序调用应用层程序的关键方法

监听模块检测到USB设备接入时,会发送增加设备的消息,控制模块响应该消息,在UI线程中回调相应的增加设备函数,UI线程将需要回调的函数ID都放入同一个结构体中统一命名,并在初始化函数设置相应的环境变量[12]。

3.4进程间通信

监听模块和控制模块运行于不同进程中,系统利用Socket实现USB设备信息在不同进程间的传递。

Socket可用于网络中计算机之间的通信,也可以用于本地不同进程之间的通信。Socket提供了多种套接字类型,系统采用AF_UNIX本地套接字来实现监听模块和控制模块之间的通信[13]。具体实现过程如图10所示。

图10 监听模块和控制模块通信

系统的监听模块作为通信Server端,首先调用Socket()函数创建AF_UNIX类型的套接字,并在Android系统内部存储中创建文件。通过调用Bind()函数绑定该文件的绝对路径:/data/data/filename,绑定成功后监听模块可对Client端的连接请求进行阻塞监听。

控制模块作为通信Client端,首先创建本地套接字,向Server端监听模块发起连接请求。监听模块通过与控制模块进行握手响应连接请求,连接成功后监听模块和控制模块可进行通信,直至其中一方调用Close()操作[14]。

4 系统测试

4.1功能测试

测试采用Nexus 5手机运行虚拟桌面Horizon View 5.0[15],Android系统版本为4.4,USB设备为HP USB2.0存储设备,容量为16 GB。测试地点网络信号良好,无明显干扰。

登录虚拟桌面后启动USB设备重映像主界面(USB Redirection),界面Arbitrator Devices一栏显示接入Android终端的USB设备,如图11所示。

图11 系统运行结果

用户可选择USB设备进行重映像,虚拟桌面识别到设备后用户即可对该USB设备进行读写操作,如图12所示。

图12 虚拟桌面识别重映像的USB设备

4.2传输速率测试

分别在Android平台上的虚拟桌面、Android手机和个人计算机上传输相同的文件(虚拟桌面和PC均运行Windows 7 64位操作系统,Android系统为4.4),测试10次后取传输速率(单位MB/s)的平均值,如图13所示。

图13 传输速率比较

测试结果显示,在Android虚拟桌面上对重映像的USB设备进行读写操作,其读写速率达到手机读写USB设备速率的97%,PC读写USB设备速率的95%。

5 结 语

本文针对现有虚拟桌面无法对USB设备进行桌面虚拟化的问题,在Android平台上设计了虚拟桌面USB设备重映像系统,实现了用户在Android虚拟桌面上对USB设备的操控。本文分析了USB设备重映像系统的功能,对系统进行架构设计和模块划分。重点分析了USB设备的状态监听和描述符信息的获取、传输。经过测试分析,用户通过该系统在Android虚拟桌面上对重映像的USB设备进行读写操作,其速率达到手机和PC读写速率的95%以上,与本地USB传输速率相当。实验显示,USB设备重映像系统运行稳定,可以应用于大型企业的虚拟化办公系统,为用户远程操控USB设备带来方便。

目前USB设备重映像功能是作为独立的轻量级Android应用而存在,用户需手动加载功能模块。如何将USB设备重映像功能融合到虚拟桌面应用中,从而使系统可以自动加载设备监听、控制模块,是本文未来的改进方向。

[1] Matthew Portnoy.Virtualization Essentials[M].USA:Sybex,2012:7-15.

[2] 丁顺,李明禄,翁楚良,等.一种基于虚拟机的安全监测方法[J].计算机应用与软件,2012,29(6):51-56.

[3] Do H,Rothermel G,Kinneer A.Prioritizing JUnit Test Cases:An Empirical Assessment and Cost-Benefits Analysis[J].Empirical Software Engineering,2006,11(1):33-70.

[4] Degermark M,Engan M,Nordgren B,et al.Low-loss TCP/IP header compression for wireless networks[J].Wireless Networks,1997,3(5):375-387.

[5] Calyam P,Patali R,Berryman A,et al.Utility-directed resource allocation in virtual desktop clouds[J].Computer Networks,2011,55(18):4112-4130.

[6] Zhou Y M,Guo H H.A Research of USB Device Redirection Mechanism over IP network in Desktop Cloud System[C]//Proceedings of the Advances in Intelligent Systems Research,2012.

[7] 张智.USB3.0 Host Model设计与实现[D].北京大学,2011.

[8] Jun L,Hua-jun W.The Analyzing of Android Handler Misleading Usage and Avoiding It[J].Software,2013,34(3):147-148.

[9] Fang C W,Xie W B.Android-based Message Encryption Implementation[J] .Communications Technology,2012,45(6):14-16,20.

[10] 黄玉坤,陈榕,裴喜龙,等.基于跨语言对象迁移策略的复合本地对象模型[J].计算机研究与发展,2015,52(1):141-155.

[11] Lee Y H,Chandrian P,Li B.Efficient Java Native Interface for Android Based Mobile Devices[C]//Proceedings of 2011 IEEE 10th International Conference on Trust, Security and Privacy in Computing and Communications.IEEE,2011:1202-1209.

[12] Shabtai A,Kanonov U,Elovici Y,et al.“Andromaly”:a behavioral malware detection framework for android devices[J].Journal of Intelligent Information Systems,2012,38(1):161-190.

[13] Stevens W R,Rago S A.Advanced Programming in the UNIX Environment[M].3rd ed.Addison-Wesley Professional,2013.

[14] 黎源,王会进.Linux下面向对象的Socket程序设计研究[J].计算机应用与软件,2010,27(12):27-28,36.

[15] Jason Langone, Andre Leibovici.VMware View 5 Desktop Virtualization Solutions[M].Packt Publishing,2012 :16-18.

DESIGN OF USB REDIRECTION SYSTEM FOR VIRTUAL DESKTOP BASED ON ANDROID

Jia Tang1Cao Jian1,2*Guan Mei1Zhang Xing1,2

1(School of Software and Microelectronics,Peking University,Beijing 100871,China)2(SchoolofElectronicsEngineeringandComputerScience,PekingUniversity,Beijing100871,China)

Virtual desktop is a server-based computing model and can improve the efficiency of resource management on computers.Existing virtual desktop cannot realise desktop virtualisation of USB devices due to insufficient USB device support.To tackle this problem,we designed the USB redirection system on Android-based virtual desktop,and implemented the operation of USB devices through virtual desktop.The system exploits NDK to construct USB device monitor module and control module,exploits Socket to transmit USB device information between processes,and exploits TCP/IP-based message framework to transmit data with server.Experimental results demonstrated that to make the read and write operation on redirected USB device on Android-based virtual desktop has the data transmission rate similar to the rate on local USB.

Virtual desktopAndroidUSB device redirection

2015-04-24。PKU-ITU合作项目。贾堂,硕士生,主研领域:桌面虚拟化技术,软硬件协同设计。曹健,讲师。官玫,硕士生。张兴,教授。

TP30

A

10.3969/j.issn.1000-386x.2016.09.058

猜你喜欢
应用层监听线程
基于C#线程实验探究
英国风真无线监听耳机新贵 Cambridge Audio(剑桥)Melomania Touch
千元监听风格Hi-Fi箱新选择 Summer audio A-401
基于国产化环境的线程池模型研究与实现
网络监听的防范措施
浅谈linux多线程协作
基于分级保护的OA系统应用层访问控制研究
新一代双向互动电力线通信技术的应用层协议研究
应召反潜时无人机监听航路的规划
物联网技术在信息机房制冷系统中的应用