前段时间,我们手上的项目需要进行android手机端的数据通信和推送。众所周知,目前安卓还没有一个固定完美和简略的框架,不像iphone。我是负责做这一块,刚开始的时候也是一头雾水,两眼发空。在网上疯狂的百度谷歌,浏览器里收藏了一堆的网页。不过经过半个月的努力钻研,总算是把androidpn这个东东完美整合到自己的项目中。
好吧,废话不多说了。
我是实用主义者,关于androidpn的技术核心,所用技术以及具体的框架结构之类的,大家可以百度,一抓一大把。
我前期主要是看以下两篇日志。
第一篇,关于下载androidpn服务端和客户端,并且实现第一个demo。这一块web推送的具体步骤,这篇日志里写的非常详细。
http://www.devdiv.com/thread-101586-1-1.html
需要补充一句的就是,这里下载的server端不是tomcat版本的,而是jetty框架。需要tomcat版本的,往下看。
第二篇,关于将server端转化为tomcat版本,并且实现服务端重启后,客户端自动连接。
http://www.iteye.com/topic/1117043#2266007
有兴趣的朋友也可以看看这哥们其他相关博文。他从理论和实际结合上分析的非常棒。
基本上,我就是靠这两篇日志,一点一滴的摸索着,并且将项目完成的。具体的理论我不再追诉,就说说我遇到的问题以及解决办法吧。
首先,基础中的基础,就是按照第一篇日志中所说,使用模拟器完成web推送。这一块非常简单,按照第一篇去做完全可行,可能出错的地方就是你忘记更改配置文件了。
后来我下载了第二篇日志中博主提供的tomcat版本服务端,放在自己本机tomcat下,并且启动。用模拟器去测试发现无法推送,配置文件也没有错。检查后发现,原来自己tomcat的端口是8080,而server中配置的是7070。只要打开config.properties,修改admin.console.port=端口号,即可。
再接着,用同一个局域网内其他机子的客户端模拟器进行测试,只要将androidpn.properties中的xmppHost=服务端所在内网IP就可以啦。比如192.168.1.150。
用真机测试,其实和模拟器没啥区别,只要配置文件不写错,原则是不会出问题的。但是我测试的时候,还是出现无法推送成功的问题。仔细检查后,原因有二。
1.客户端android版本太低,换个android4.0版本就可以。貌似是不兼容低版本。
2.真机上其他的应用中,也有应用到这个androidpn的。其中,在androidpn.properties中,apikey默认是123456789。因为那个应用和我自己本机都选择了默认的,所以我将自己这里的apikey改掉了。切记!这里有一点需要注意的,客户端androidpn.properties中更改了apikey,服务端config.properties也要随之修改。!!
OK,基本上单独的web推送就完成了。
接下来就是整合到自己项目中,也就是从自己项目后台将数据推送到客户端,至于androidpn的server端,则作为中间的桥梁。
这里需要注意一点,androidpn会在你本地数据库中新增一个表apn_user。如果你本地数据库有权限,拒绝的话,你最好自己先手动增加这么一张表。
首先,我单独启动一个新的tomcat,将server端部署到这下面,修改配置文件config。properties,jdbc.properties。jdbc.properties这个文件是配置你本地数据库的参数的,不能有错。启动后,简单测试成功,在自己项目中使用http协议将数据POST到server端这个org.androidpn.server.console.controller.NotificationController类的send方法中。具体参数名称及获取参数的代码,可以修改server端。
在这里插一句,不论时间多么紧张,至少你得追一边代码,尤其这个类。
代码写好后可以执行,断点跟踪下,只要你代码正确,配置文件没错,是可以正常推送的。
基本上,写到这里的话,应该可以满足项目需求了。如果你还需要将哪些用户在线的功能整合到你自己项目中。那你就得自己跟踪下代码了。
我项目做到这里,基本上都是在windows环境下。将项目部署到linux环境下,又出问题了。
路径问题比较容易坚决,按照后台日志中提示的地方,将路径修改下。
关键是在linux下重启server端,会发现报错,5222端口被占用。因为时间限制,能力有限,没办法修改代码,只能每次重启时,都先用命令将5222端口杀掉。
OK。基本上我写的就是这么多,还有些小细节的问题,也来不及写。以后又时间再和大家分享吧。我反正是觉得,这个东西其实也不是特别难,只要花费时间,一点点的去看,会弄懂的。
还有一点啊,如果大家是整合到自己项目中,最好把后台NotificationController对应的jsp给替换掉,免得被人登陆上,随意群发