上篇随笔介绍了我们在交大新图书馆做的一个多点触摸互动墙,如今触摸俨然成了人机交互的主流方式。前段时间入手了Nokia5530,2.9英寸单点触摸屏,wifi,加速度传感器,除了没有内置GPS,基本上功能还是比较齐全的,就琢磨着用它做点有趣的东西,于是就有了这个我称为手机鼠标的东西。
原理很简单,程序分为手机端和PC端两部分,两者使用UDP通讯。手机端使用Java和Javame开发。5530使用的是S60 5th edition,它提供了触摸屏响应事件,pointerPressed(),pointerDragged(),pointerReleased(),所以我要做的就是在这些响应事件里填上发送特定字符的代码。Javame实现UDP通讯主要依靠javax.microedition.io里的Connector
类和DatagramConnection类
private DatagramConnection dc = null ;
try {
dc = (DatagramConnection)Connector.open(destiAddr);
} catch (Exception e) {
System.out.println( " Failed to send message: " + e);
}
try {
Datagram dobject = dc.newDatagram(message, length);
dc.send(dobject);
} catch (Exception e) {
System.out.println( " Failed to send message: " + e);
}
PC端用C++实现,只是一个简单的UDP接受端,接收到特定字符后,向系统发送键盘鼠标消息。发送键盘消息用keybd_event(),发送鼠标消息用mouse_event(),比如发送向右箭头按下消息
keybd_event( VK_RIGHT, 0x4D , KEYEVENTF_EXTENDEDKEY | 0 , 0 );
发送鼠标左键单击(即为press后接着一个release)
mouse_event(MOUSEEVENTF_LEFTDOWN, 0 , 0 , 0 , 0 );
mouse_event(MOUSEEVENTF_LEFTUP, 0 , 0 , 0 , 0 );
一个鼠标应该有的功能包括单击、双击、右击、移动,此外,我还想赋予它一些简单的键盘功能,当然这可以通过在手机上做一个虚拟全键盘来实现,但我考虑到实际应用中,比如老师上课时,最需要的键盘功能可能就是上下左右箭头了,用来控制PPT上下翻页,因此我想把上下左右箭头也加进去。plus,win7在alt+tab时展现出来的效果比XP炫了不少,我也想把这个加进去。那么,如何用一个简单的单点触摸屏实现这么多功能呢?
上篇随笔也提到,我的朋友charles发布了一个TUIO Mouse,他定义了一些手势,比如一个点按下后,另一个点在它左边按一下对应左键单击,在它右边按一下对应右键单击。这个手势库不错,但遗憾的是人家用的是多点触摸的iphone,咱的nokia是单点触摸。于是想到把加速度传感器利用起来,当手机在不同方位时,同样的动作触发不同的事件。比如同样是在触摸屏上单击,手机水平放置时,触发左键单击,竖直立放时触发左键双击,横向立放时则触发右键单击。同样的道理,手指在触摸屏上滑动,手机处于不同方位时,可以触发鼠标移动,触发上下左右键,也可以触发alt+tab
这里提供了详细的代码来实现获取加速度传感器信息
ok,加速度传感器,单点触摸屏,wifi,如此就构成了一个简单的无线键鼠套装。在此基础上,如果想给它更多的功能,就是件简单的照葫芦画瓢的事了。
这里提供了手机端和PC端的程序下载。手机端程序只是5530上跑过,但理论上所有S60, 5th edition的应该都能用,比如5800,N97.使用步骤如下:
1)关闭电脑防火墙;
2)运行手机端程序(运行后只是出现一个简单的白色窗口)
3)查一下电脑ip地址(比如命令行下使用ipconfig)
4)运行手机端程序,输入相应ip地址
5)连接成功后点击左上控制键,选择Start(int)打开加速度传感器
then just enjoy it~
用下来感觉其实用它上下翻翻页还可以,当鼠标还是不太灵敏
忘记说了,最重要的一点,既然使用wifi通讯,手机和PC必须在同一个无线网段内,比如共同连接到一个无线路由,或者用PC建立一个adhoc网络
hope you find it useful~