手机控制电脑鼠标,应用市场上已经有许多成熟的应用,但是我还是想自己来造个轮子。代码在 Github,欢迎star。
需求场景
如果你感受过南方冬天的魔法攻击,就会知道,在不开空调的湿冷的晚上,即使缩在被窝里,电脑摆在床上小桌,依然不想把手拿出来去碰鼠标。最初想做这个小工具,出发点就是自己的这个需求。
如今虽身在帝都,但最近流行的“葛优躺”又让我对这个工具有了需求——不想抬起手来去摸桌上的鼠标。果然懒才是人类的第一生产力。
简介
原理很简单:整个工具包含手机端和电脑端两个部分。手机端应用把手机上的触控滑动等动作转换成预先约定好的格式的数据,通过 Socket 连接发送到电脑,电脑端的程序解析出数据中的控制信息,相应的控制鼠标的点击、移动等。不需要连接到internet,只需要电脑和手机在同一个局域网内,在这个场景下,通常就是指连接到同一个WIFI。
目前电脑端用Java实现,手机端暂时只有Android版。欢迎有兴趣的同学贡献其他平台、其他实现。
流程
大概分为三步: 互相发现、连接并收发控制数据、断开连接。
- ** 发现 **
虽然电脑和手机同在一个局域网,但一个局域网内可能有很多的设备,茫茫人海中怎样才能发现彼此并建立连接呢。
控制数据是从手机发送到电脑的,那就是说手机需要发起建立Socket连接,电脑端要建一个ServerSocket接收数据。但是是手机需要先知道电脑的ip地址才能建立Socket连接,因此需要先发现电脑,原理是通过UDP 组播。
发现的流程如下:
- 首先,电脑端(server)启动后就开始监听一个预先约定好的组播地址1和端口A,等待手机端(client)发来的预先约定好格式的挥手信息。
- 手机端程序启动后就往这个预先约定好的组播地址1和端口A发送一个挥手信息,比如“hi_i_am_client”,然后在地址1和端口B等server回过来的挥手信息。
- sever收到client挥手信息后,在地址1和端口B回一句“hi_i_am_server”。
- client收到server的挥手信息后,可以从数据报中得到server的ip,这样client就知道了server的ip,可以用作后续建立Socket连接。发现流程完毕。
连接和控制
在上述发现流程的第3步,server收到client的“hi_i_am_client”,并回复了“hi_i_am_server”之后,就建立了一个ServerSocket,并开始在一个while(true)循环中监听真正的控制信息了。而client端拿到server的ip后就建立一个Socket连接连到这个ip和一个约定好的端口号,发送预先约定好格式的控制数据。server收到控制数据后,解析并相应的控制鼠标。断开连接
任何一端都可以断开连接。另一端会收到一个EOFException, 就可以知道对方断开了。
PS
现在的发现流程虽然是自动化的,但是依赖于server和client的启动顺序。正考虑加入另一种方式:server端把自己的ip地址和一些其他的约定信息生成一个二维码,手机端扫一扫就可以连接上了。等有时间把这个实现了。
PPS
扫码连接已实现,见 **把手机变成电脑的移动触控板 (二) **