基于VNC技术的手机云测试平台搭建

本文提出基于VNC技术的手机云测试方案,利用VMwarevSphere环境实现移动应用远程快速测试,减少测试成本,缩短周期。通过合理运用adb、libimobiledevice及noVNC开源工具,搭建WEB手机控制台,实现高效真实的测试效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【IT168 技术】随着移动互联网浪潮的到来,越来越多的App应用产品将服务于人们的日常生活。但Android平台与iOS平台的差异以及Android平台的碎化片,使得App应用与终端的适配性存在诸多问题。而对测试人员而言,智能终端的多样性也大大增加了研发和测试成本,测试周期。本篇文章主要提出了一种基本VNC技术的手机云测解决方案,希望以该技术为基础将各类智能终端接入到VMware vSphere环境中,实现移动应用的远程快速测试,大大减少产品的测试成本,缩短测试周期。

  1. 背景介绍

  目前市面上已有许多基于云计算的移动测试平台,例如Deviceanywhere、Testin云测、TA云测试、百度云测试MTC、易测云、终端池等。各个厂商推出的手机云测试平台各有特点,但对于私有云,这些平台上的手机无法接入到服务中,同时也无法对手机进行定制化的配置,因些这些云测平台对于私有云就显得无所适从。VMware vSphere是业界领先且最可靠的虚拟化平台,在企业私有云中的虚拟化管理平台中占据着非常大的比重。本文提出了一套基于VMware vSphere环境的手机云测评平台解决方案,旨在提供一套快速的部署方法,实现移动应用的远程测试,大大减少产品的测试成本,缩短测试周期。

  2. 智能终端的开源VNC应用

  VNC(Virtual Network Computer)是虚拟网络计算机的缩写,是一款优秀的远程控制工具软件,为了解决手机的远程测试,本文采用VNC技术实现对智能手机的远程控制,从而实时地查看手机当前界面。Android平台下的开源VNC实现有很多,例如Android VNC Server、Fast Droid VNC Server、Droid VNC Server、VMLite VNC Server等。iOS平台较为封闭,因此该平台下的开源VNC实现较少,并且都需要越狱,主要有Veency、VMLite VNC Server等。所有VNC Server的实现原理都大同小异,但从稳定性和兼容性考虑,本文采用了VMLite VNC Server。

  3. 基于VNC技术的手机云测集成方案

  VMware vSphere环境提供了丰富的SDK API供系统调用,考虑到性能和易用性,本文采用Perl SDK API来实现虚拟机与手机之间的绑定、解绑定,端口的转发,重启手机等操作。在设计过程中,Android和iOS平台的差异性,因此使用了两套VMware vSphere环境(即两台ESX Server),用于Linux虚拟机和MAC虚拟机的创建。另外,在使用过程中,发现Samsung S4等设备不能被VMware虚拟机识别,因此又提供了一台独立的Linux主机用于这些不能被识别的手机的挂载,整体架构见图1。

  消息的传递采用业界是最流行的AMQP,本文中使用Erlang编写的RabbitMQ作为AMQP服务器,所有的数据以JSON格式进行传输,RESTFul API Server提供了所有系统操作的接口,本文的UI Component也是以REST的方法进行接口调用来实现数据的展现、系统的操作等功能。

基于VNC技术的手机云测试平台搭建
▲图1 基于VNC技术的手机云测平台架构图

  4. Android设备的接入

  Android设备的接入主要依靠Google提供的工具包adb(Android Debug Bridge),使用该工具可以实现:

  * 运行设备的Shell命令

  * 管理模拟器或设备的端口映射

  * 计算机和设备之间的上传、下载文件

  * 将本地apk软件安装至模拟器或设备

  主机与手机间的通信、应用程序的安装或卸载、端口的转发等功能都可能通过adb携带相应的命令完成,系统中用到的adb命令如下,其中adb forward是最为重要的一条命令,主要实现主机端口与手机间VNC端口的转发,后续noVNC的实现也是通过该命令实现的。

  //获取设备列表
  adb devices
  //安装apk
  adb -s “device_id” install app.apk
  //卸载apk
  adb -s “device_id” install package_name
  //端口转发
  adb -s “device_id” forward tcp:{pc_port} tcp:{device_port}
  //关闭端口转发
  adb -s “device_id” forward --remove tcp:{pc_port}
  //重启手机
  adb -s “device_id” reboot
  //获取第三方应用列表
  adb -s "device_id" shell pm list packages -3

  Android手机与虚拟机建立连接都通过消息机制完成,所有的请求都以REST Server为中转,经RABBITMQ Server将消息投递到相应的处理器中完成,并且处理结果返还给请求方,整个过程非常类似于RPC的远程调用过程,见图2。Perl主要是将adb的命令进行了简单的封装,这样便于调用,例如adb forward的封装如下。

  # Function:forward
  # Description:Execute adb forward command
  sub forward(){
  my $device_request=shift;
  my $device_id=$device_request->{requestDevice}->{deviceName};
  my $pc_port=$device_request->{forwardPcPort};
  my $device_port=$device_request->{forwardDevicePort};
  my $websockify_port=$device_request->{websockifyPort};
  my $forward_command="adb -s \"$device_id\" forward tcp:$pc_port tcp:$device_port";
  ......
  return $coder->encode($result);
  }

基于VNC技术的手机云测试平台搭建
▲图2 Android手机接入过程

5. iOS设备的接入

  iOS设备的接入主要依赖libimobiledevice开源包,来实现与Android设备接入类似的功能。主机与设备间的连接命令主要如下。

  //获取设备列表
  idevice_id -l
  //安装apk
  ideviceinstaller -i {package_name}
  //卸载apk
  ideviceinstaller -a {package_name} remove
  //端口转发
  tcprelay-mutiple.py -t {device_port}:{pc_port}:{device_id}
  //获取第三方应用列表
  ideviceinstaller -l

  iPhone与虚拟机建立连接同样也是通过消息机制完成,具体的流程与Android手机类似。同样,Perl也对libimobiledevice命令进行了简单的封装,这样便于调用,例如ios forward的封装如下。

  # Function:forward
  # Description:Execute libimobiledevice forward command
  sub ios_forward(){
  my $device_request=shift;
  my $device_id=$device_request->{requestDevice}->{deviceName};
  my $pc_port=$device_request->{forwardPcPort};
  my $device_port=$device_request->{forwardDevicePort};
  my $websockify_port=$device_request->{websockifyPort};
  my $forward_command="nohup tcprelay-mutiple.py -t $device_port:$pc_port:$device_id &";
  ......
  return $coder->encode($result);
  }

  6. noVNC技术的应用

  noVNC是HTML5 VNC客户端,采用HTML 5 WebSockets、Canvas和Javascript实现。由于adb和libimobiledevice已经实现了主机与智能设备之间的端口映射,要想使用noVNC只需要将主机映射的端口与websocket需要的端口进行映射。noVNC也为我们提供了这样一个非常实用的工具noVNC/utils/websockify.py。

  $ adb -s {deivce_id} forward tcp:9000 tcp:5901 / tcprelay-mutiple.py -t 9000:5900:{device_id}
  $ cd /noVNC/utils
  $ ./websockify.py 9500 127.0.0.1:9000
  WARNING: no 'numpy' module, HyBi protocol is slower or disabled
  WebSocket server settings:
  - Listen on :8000
  - Flash security policy server
  - No SSL/TLS support (no cert file)
  - proxying from :8000 to localhost:5900

  这样就可以通过noVNC提供的vnc.html或者vnc_auto.html实现WEB手机控制台。

  7. 小结

  本篇文章主要提出了一种基本VNC技术的手机云测解决方案,希望以该技术为基础将各类智能终端接入到VMware vSphere环境中,实现移动应用的远程快速测试,大大减少产品的测试成本和测试周期。通过对adb、libimobiledevice、noVNC开源工具包的合理应用,本文搭建出了一个WEB手机控制台,通过页面实时地控制手机的各种操作,使测试效果更加真实、高效。

  8. 作者简介

  俞超 软件开发工程师

  任职于某大型IT外资企业,主要从事J2EE开发、设计工作。

  参考资料

  http://mobile.51cto.com/aengine-402829.htm

  http://developer.android.com/tools/help/adb.html

  http://www.libimobiledevice.org/

  https://github.com/kanaka/noVNC

http://cloud.it168.com/a2014/0903/1663/000001663258_2.shtml

<think>嗯,用户想手动搭建OpenStack云平台,需要详细步骤。之前用户提供过几个零散的引用片段,涉及nova服务启动、neutron服务创建和镜像挂载操作,这些确实是搭建OpenStack的关键动作。用户可能是个系统管理员或云计算学习者,正在尝试本地部署私有云。ta特意提到“手动搭建”,说明需要避开自动化工具直接操作底层组件,可能是为了学习原理或定制化部署。从引用内容看,ta的环境应该是CentOS系统,并且接触过iaas镜像挂载这类基础操作。需要重点注意几个技术细节:控制节点是核心,必须明确基础环境配置包括哪些服务(mysql/rabbitmq/memcached这些);用户引用的挂载操作提示了镜像准备方式,但实际部署时可能需要区分操作系统的yum源和OpenStack专属仓库;neutron和nova的联动配置最容易出错,要特别标注网络规划部分。之前的回答已经覆盖了基础部署流程,但用户可以还需要这些延伸帮助:如果是多节点部署要怎么调整?遇到服务启动失败如何排查?如何验证各组件功能?这些问题可以作为后续生成的思考方向。</think> 手动搭建 OpenStack 云平台需严谨执行以下步骤(以**Train/Yoga版本为例,基于CentOS 7/8环境**),核心分为六个阶段: --- ### 🔧 阶段一:基础环境准备(控制节点) 1. **系统配置** ```bash # 关闭防火墙和SELinux systemctl stop firewalld; systemctl disable firewalld setenforce 0; sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 配置主机名解析 echo "192.168.100.10 controller" >> /etc/hosts echo "192.168.100.20 compute" >> /etc/hosts ``` 2. **安装数据库(MariaDB)** ```bash yum install mariadb mariadb-server python2-PyMySQL -y systemctl start mariadb; systemctl enable mariadb mysql_secure_installation # 按提示设置root密码 ``` 3. **消息队列(RabbitMQ)** ```bash yum install rabbitmq-server -y systemctl start rabbitmq-server; systemctl enable rabbitmq-server rabbitmqctl add_user openstack RABBIT_PASS # 替换为实际密码 rabbitmqctl set_permissions openstack ".*" ".*" ".*" ``` --- ### ☁️ 阶段二:认证服务(Keystone) 1. **创建数据库** ```sql CREATE DATABASE keystone; GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS'; GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'KEYSTONE_DBPASS'; ``` 2. **安装与配置** ```bash yum install openstack-keystone httpd mod_wsgi -y ``` 修改 `/etc/keystone/keystone.conf`: ```ini [database] connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone [token] provider = fernet ``` 3. **启动服务** ```bash su -s /bin/sh -c "keystone-manage db_sync" keystone keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone systemctl start httpd; systemctl enable httpd ``` --- ### 🔗 阶段三:网络服务(Neutron) 1. **控制节点配置** ```bash # 创建服务实体(引用[2]) openstack service create --name neutron --description "OpenStack Networking" network ``` 关键配置文件 `/etc/neutron/neutron.conf`: ```ini [DEFAULT] core_plugin = ml2 service_plugins = router allow_overlapping_ips = true transport_url = rabbit://openstack:RABBIT_PASS@controller ``` 2. **计算节点配置** ```bash yum install openstack-neutron-linuxbridge ebtables ipset -y ``` 修改 `/etc/neutron/plugins/ml2/linuxbridge_agent.ini`: ```ini [linux_bridge] physical_interface_mappings = provider:ens33 # 替换为实际网卡名 ``` --- ### 💻 阶段四:计算服务(Nova) 1. **控制节点** ```bash # 启动核心服务(引用[1]) systemctl start openstack-nova-api openstack-nova-scheduler openstack-nova-conductor openstack-nova-novncproxy systemctl enable openstack-nova-api openstack-nova-scheduler openstack-nova-conductor openstack-nova-novncproxy ``` 2. **计算节点** 配置 `/etc/nova/nova.conf`: ```ini [vnc] enabled = true server_listen = 0.0.0.0 server_proxyclient_address = $my_ip # 替换为计算节点IP novncproxy_base_url = http://controller:6080/vnc_auto.html ``` --- ### 📦 阶段五:镜像服务(Glance) 1. **上传系统镜像** ```bash openstack image create "cirros" \ --file cirros-0.5.2-x86_64-disk.img \ --disk-format qcow2 --container-format bare \ --public ``` 2. **验证镜像** ```bash openstack image list ``` --- ### ⚙️ 阶段六:创建虚拟网络与实例 1. **创建租户网络** ```bash openstack network create --internal private-net openstack subnet create --network private-net --subnet-range 192.168.200.0/24 private-subnet ``` 2. **启动测试实例** ```bash openstack server create --image cirros --flavor m1.tiny --network private-net test-vm ``` --- ### 📌 注意事项 1. **依赖项检查** 所有服务启动前需确认: ```bash systemctl status mariadb rabbitmq-server httpd # 确保关键服务正常运行 ``` 2. **日志排查** 常见错误查看位置: ```bash tail -f /var/log/keystone/keystone.log # Keystone认证问题 journalctl -u neutron-server.service # 网络服务异常 ``` 3. **镜像源配置(引用[3])** 本地源挂载示例: ```bash mount /dev/cdrom /opt/centos/ # 挂载系统ISO mount chinaskills_cloud_iaas.iso /mnt/ # 挂载IaaS镜像 cp -rvf /mnt/* /opt/openstack/ ``` > 部署文档推荐:[OpenStack Yoga Install Guide](https://docs.openstack.org/yoga/install/) > 环境差异提示:网络配置(OVS/vSwitch)、存储后端(Ceph/LVM)需根据实际调整架构图[^4] --- **
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值