引言
Windows Phone 7是微软发布手机操作系统。据国外媒体报道,微软公司执行官史蒂夫-鲍尔默北京时间2月15日在移动通信大展上发布了公司一代手机操作系统,Windows Phone 7. 微软称,公司将通过一代手机操作系统Windows Phone 7,将旗下Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。2010年10月11日晚上9点30分,微软公司正式发布了智能手机操作系统Windows Phone 7,并同时宣布了首批采用Windows Phone 7的智能手机有9款,早将于10月21日上市。微软执行官史蒂夫·鲍尔默在发布会上说,"我荣幸的向各位介绍Windows Phone 7系列手机操作系统。在市场充斥着相同功能及体验产品,我激励团队要拿出一个可以带来全新移动体验的解决方案。"鲍尔默说到,"手机的发展要求产品真正契合用户生活脚步、满足社交需求并提供各种无缝体验。Windows Phone 7系列手机操作系统的发布,是这一历程的转折点。
目前,对于我们国内大多数的Windows Phone 7开发者来说,模拟器是调试程序的选择。因此,和硬件相关的一些功能就没有办法进行测试。加速度传感器是Windows Phone 7中一个基本的传感器,很多应用软件和游戏软件都需要用到它,因此,使用其他手段来模拟重力加速度传感器是一个十分有用的尝试。
线索
Windows Phone 7 的模拟器本质上是一个x86的虚机,而里面跑着一个Windows Phone 7 OS的完整镜像。该模拟器模拟了很多外围设备(例如声音、网络),当然这个外围设备列表有望在以后扩展。如果你的PC机具有多点触摸的屏幕的话,该虚机也是支持多点触摸的。它使用宿主PC上的GPU来对图形进行加速。它能够模拟x86的环境并且可以在里面运行托管代码的一个原因在于。NET Compact Framework的运行时支持x86和ARM架构(为两种架构提供了JIT,在两种环境中均可无缝的运行托管代码)。
在今年8月,Windows Phone 7开发工具还是Beta版本的时候,山羊胡大叔的Blog《给你的Windows Phone 7模拟器加入GPS和加速度传感器模拟功能》中,已经给出了一种途径,其方法是:使用一台真实的HD2来获取加速度传感器的数据,然后把这些数据再传回WCF服务;同时Windows Phone 7的应用程序通过这个WCF服务来获取加速度传感器的值。由于手头没有HD2设备,所以就无法去尝试和验证这个方法。
准备工作
1. 安装Windows Phone 7的开发工具,这个我就不再啰嗦了。
2. 网络摄像头一个,普通的就可以。
3. 去Codeplex网站开源项目AccelKit。
4. 解压AccelKit以后,里面包括EmuClasses、Executable、src这三个文件夹和Print_This_Cutout这个pdf文件。EmuClasses文件夹中的文件可以引入到我们的应用程序中,实现加速度传感器数值的读取;Executable文件夹中的文件用来运行在桌面PC上,控制摄像头,并保存数据;src中的文件是对应的控制摄像头程序的源程序。
5. 将Print_This_Cutout.pdf文件打印,并用剪刀剪裁其中一个Windows Phone 7的面板,将其固定于一块板子上。
开始测试
1. 启动Executable文件夹中的accelKit.exe文件,开启摄像头。
2. 开启Windows Phone 7模拟器,运行带有加速度传感器的应用程序。
3. 在摄像头前晃动带有Windows Phone 7面板的板子,检验效果。
实现原理
摄像头对捕捉到的图像进行分析,识别Windows Phone 7面板的移动加速度,按照一定的时间间隔发送给本地的端口:https://127.0.0.1:88/。
我们在写Windows Phone 7的应用程序时,利用WebClient来获取88端口的数据:
。.
WebClient wc;
wc = new WebClient();
wc.AllowReadStreamBuffering = false;
wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
wc.DownloadStringAsync(new Uri(https://127.0.0.1:88/));
。.
void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error != null) { timer.Begin(); return; }
if (e.Result == null) { timer.Begin(); return; }
string[] vc = e.Result.Split(new Char[] {‘,’, ‘ ’});
double x = Convert.ToDouble(vc[0]);
double y = Convert.ToDouble(vc[1]);
double z = Convert.ToDouble(vc[2]);
}
具体可以参考EmuClasses文件中的文件。
注意
1. 目前该方法只实现了重力加速度,没有实现运动方向的加速度,即给出的X/Y/Z这三个值是在垂直方向上的加速度。
2. PC机上运行的摄像头程序会比较耗费CPU资源,建议分辨率不用调太高,可以识别就行。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。