这几天正在研究android设备相互操控的问题 ,因为我们想要将手机变成一个游戏控制器。通过手机,操控智能电视里面的所有游戏(目前只实现了通过手机操控电视)。
需要先做一个安卓手机之间相互操控的demo ,来验证技术方便的可行性。
查了一些资料,现将自己的想法整理出来。没做实现,仅供参考。
设备操控需要考虑一下几个问题:
1)设备链接要求稳定,不丢包2)链接方式足够简单
基于以上两个考虑,公司放弃了使用蓝牙。因为蓝牙链接需要搜索和配对设备,这需要漫长的等待。而对于智能电视来说,可能没有蓝牙模块。权衡利弊,最终敲定使用Wifi作为数据交换的通道。
无论使用蓝牙也好,wifi也好,无非是一个数据交换的方式。但是设备的相互控制无论如何也绕不开权限这一关,我的目的就是想在不请求系统Root权限的前提下,如何去控制设备。
方案一:
这个方案来解决相互操控的问题,但是通信的数据是基于蓝牙传输的。可以来参考它的操控实现方式。这款应用叫做 Tablet Remote ,谷歌商店可以下载。
Tablet Remote可以实现两台手机之间的相互控制,如下图。
但是控制仅限于系统按键,比如回退,主页,菜单。该应用虽然有一个游戏控制界面,但经过测试,不能控制另外一台手机上的游戏。
个人觉得已经很牛逼了,完全没有敏感权限,到底是如何做到的呢。本着学习的精神,将其反编译后发现,该应用做了一个类似输入法的程序,通过取代系统输入法实现对系统的操控(具体细节待研究)。
方案二:
这个方案来解决Wifi 以及按键的发送问题。这个应用叫做 RemoteDroid ,它可以将手机化身为无线鼠标,可以控制PC鼠标的左键,右键,滚轮以及简单的文字输入,基本是我们想要的功能。 PC端需要安装服务端才可以,兼容Win平台,Linux,和Mac 。如图
既然兼容Linux平台,那么两台Android设备之间的控制,应该不是问题,重要的是我们需要对它的服务端进行改造。
这款应用使用了开源框架Java OSC,来处理Socket通信。 服务端和客户端源码均可以拿到,大家自己去反编译吧。
方案一解决了手机相互操控问题,方案二解决了手机通信问题。不知道能不能将这个两个结合起来,实现两台手机通过wifi相互操控的问题。进一步研究中……
原文链接:http://www.67tgb.com/?p=493
欢迎访问:望月听涛
1楼lfmilaoshi3天前 23:43继续研究了。。。米老师可恶的Java多线程,一直没搞懂同步的作用!
一直以为同步的时候只要锁住对象就能顺序执行了:
public class Test { final static byte[] b = new byte[0]; public static void main(String[] args) { Test t = new Test(); t.thread.start(); Test t2 = new Test(); t2.thread.start(); } Thread thread = new Thread(new Runnable() { @Override public void run() { test(); } }); public void test() { synchronized (this) { for (int n = 0; n < 100; n++) { System.out.println(thread.getName() + ":" + n); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } }但是这样是错误的!两个线程还是交替执行!
查阅了很多资料才知道上面这个锁是不正确的,两个线程锁住的this对象不是同一个,所以导致交叉执行。应该修改为:
public class Test { final static byte[] b = new byte[0]; public static void main(String[] args) { Test t = new Test(); t.thread.start(); t.test(); } Thread thread = new Thread(new Runnable() { @Override public void run() { test(); } }); public void test() { synchronized (this) { for (int n = 0; n < 100; n++) { System.out.println(thread.getName() + ":" + n); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } }这样的确就是顺序执行了,因为函数锁住的this对象是同一个,如果去除线程同步当然就会交叉执行啦。
但是我还有点不明白的是第一个例子错误的原因是其锁住的对象不是同一个,但是如果我把this改为一个全局静态常量还是不正确!理论上全局静态常量整个运行周期内存中只会有一个对象阿!不明白为什么还是不行!希望有高手可以解答。
其实我们用到同步多半是为了让线程顺序执行,比如在做Android开发的时候,我们通常希望前台显示一个进度框,后台线程去执行下载动作,下载完之后前台线程在执行余下操作如界面显示。
这个时候其实可以使用线程的join()!
oin方法大家可以查下api,它的意思是等待当前线程执行完后执行完毕才执行其他线程。也就是说如果一个类中有这样一个代码段:
thread1.start();
thread2.start();
thread1.join();
thread2.join();
do something 1;
do something 2;
那么这段代码会等待两个线程执行完毕后再执行 do something 1 和 do something 2,注意:必须先启动所有线程,再join。如果启动一个就join一个,结果是什么?对,那就会是等待thread1执行完再执行thread2,再执行后续代码。
在使用Jenkins的过程中,因为国内使用Jenkins的人还不多,只有很少开发者,所以想到去官方的freenode去看看,刚好以前还没用到过IRC的聊天方式,就尝试了一下,感觉还是挺不错的,里面有很多国外的开发者,很多好的channel可以进行交流,顺便还可以提高一下自己的英文交流水平。和大家分享一下IRC的基本配置吧,方便大家的使用,这里放出一个链接,是个很好的MIRC的教程http://www.tigernt.com/onlineDoc/icq/jcp.htm。 什么是IRC: IRC(Internet Relay Chat)是一种基于Internet的通信协议,中文一般称为互联网中继聊天。它是由芬兰人Jarkko Oikarinen于1988年首创的一种网络聊天协议。经过十年的发展,目前世界上有超过60个国家提供了IRC的服务。在人气最旺的EFnet上,您可以看到上万的使用者在同一时间使用IRC。 IRC采用客户机/服务器模式,它能使Internet用户实时地与其他用户交谈,每个用户通过客户端程序与远程主机建立连接,远程主机接受多个来自客户端程序的连接,并实现多个用户之间的实时通话。在海湾战争期间,IRC受到了全世界的关注。当时以色列特拉维夫的居民们在空袭期间通过IRC方式,向世界各地的听众现场描述所发生的事件。 IRC的工作原理非常简单,您只要在自己的PC上运行客户端软件,然后通过因特网以 IRC协议连接到一台IRC服务器上即可。它的特点是速度非常之快,聊天时几乎没有延迟的现象,并且只占用很小的带宽资源。所有用户可以在一个被称为\\\"Channel\\\"(频道)的地方就某一话题进行交谈或密谈。每个IRC的使用者都有一个Nickname(昵称),所有的沟通就在他们所在的Channel内以不同的Nickname进行交谈。 比起传统的Web聊天方式,IRC有哪些优点呢? 1. 快速刷新屏幕 在传统的Web聊天方式里,由于使用的是浏览器,需要在下载的同时进行页面解释,因此页面刷新速度通常是数秒甚至数十秒不等;而IRC是利用专门的软件进行聊天,不需要页面解释的过程,所以它的屏幕刷新速度相当快(以毫秒计),也就是说,在屏幕进行刷新的时候,你是根本感觉不到一点延迟以及任何抖动的。这对于保护视力可是有莫大的好处。 :-) 2. 保密性 IRC有极高的保密性。在一个正式的IRC服务器里,如果你不是在公共聊天室与人交谈而是代之以密聊(即常说的开小窗),那么其他任何人将无法得知你们聊了些什么,包括管理员。这就不象在某些Web聊天室里,管理员可以通过一些特定的CGI或者ASP程序来窥探到你的聊天内容。这也大概就是为什么很多黑客也采用IRC进行交流的原因之一吧。 3. 便于管理 在绝大多数的IRC服务器上,你可以随时根据需要创建自己的频道(Channel,即闲聊室),系统将自动把你设置成该频道的OP(Operator,管理员),而且你还可以随时根据需要把OP的权力赋予其他人,以进行协同管理。IRC里的OP还有各种不同的等级之分,例如Admin(Administrator)、SOP(Super Operator)、AOP(Auto Operator)、OP(Operator)等等,这都无疑为建立良好的管理制度创造了条件。 4. 其它… 例如可以播放音乐、传送文件、自编脚本程序以配合聊天等等,这些都是在普通的Web聊天室里所办不到的。事实上IRC的优点并不止于此,只有在使用中你才能慢慢体会得出:IRC的确是一种很好的聊天方式! 如何使用IRC? 1.使用WEB连接 EFnet IRC的方式: 浏览器打开 www.efnet.org (efnet是世界著名IRC聊天网) 页面左上方Nickname 输聊天名字(仅支持英文)在Channel 输入 #shanghai(前面必须有个#) 当然你也可以建立自己的频道, 比如 #myownchannel其服务器上一般有5万人 ,所以起英文名字可能要长一点,免得与其他用户重复采用另外一个界面好看些: www.mibbit.com;可以去的地方也多一些IRC Server选EFNET的,如Efnet Prison.net或Efnet umich.edu;;Nickname 起个英文名字 Channels写#shanghai 然后GO(如果上面两个选择连不进, 可以自己定义IRC server为下面其中之一:irc.dks.ca; irc.servercentral.net; irc.SHOUTcast.com;irc.nac.net; irc.mzima.net; irc.easynews.com; irc.colosolutions.net等 )上面去的是同一个位置: EFNET IRC 的#shanghai 频道EFNET只是众多IRC服务器群中间的一个,http://www.tigernt.com/onlineDoc/icq/jcp.htm 有些IRC基本介绍 2.使用mIRC 但使用WEB不是你的最佳选择,因为这种办法速度慢(启动速度慢),功能少,如果你想更多的享受聊天的乐趣,你最好下载聊天的专门软件,常用的有微软的MSCHAT,PIRCH,Kvirc和MIRC,Linux下有xchat,MIRC虽然图形界面要差一点,但是有很强大的命令行功能,还是很推荐程序员使用的。 mIRC安装后启动会自动弹出option设置栏
Nickname是聊天时使用的名称,Alternative是当你的名称已经有人使用时的备用名称,Name和Email可以不填。
点击Servers,设置IRC Servers段,我这里选择了freenode的server,可以考虑自己的地理位置离服务器的远近设置。
点击options,选中Connect on startup
选中Identd,输入User ID和系统的名称 现在已经可以使用mIRC了,后面想要自己个性化自己的设置就自己摸索吧。
点击Favorites,输入自己想进入的channel,也可以自己随便选中个channel进入就可以进入聊天室了
后面就和QQ差不多了 现在已经完成了mIRC的安装部署了,具体的命令行操作自己慢慢摸索吧,不懂就看看链接里的教程,希望使用IRC能给大家的开发和学习带来进步!