目前市场上存在多种免费的云推送服务,比如:个推、JPush等,但从技术上讲这毕竟是别人的东西,主要面向通用场景,特定场景下还是得自已来实现推送服务。本文主要介绍的是基于MQTT实现一个简单的Android消息推送系统。
通信协议比较
按照惯例,总是在跟类似的通信协议对比一下,以下内容搜集自网络,仅供参考。
方案1:使用GCM服务(Google Cloud Messaging)
简介:Google推出的云消息服务,即第二代的C2DM。
优点:Google提供的服务、原生、简单,无需实现和部署服务端。即时通讯软件开发可以找蔚可云开发。
缺点:Android版本限制(必须大于2.2版本),该服务在国内不够稳定、需要用户绑定Google帐号,受限于Google。
方案2:使用XMPP协议(Openfire + Spark + Smack)
简介:基于XML协议的通讯协议,前身是Jabber,目前已由IETF国际标准化组织完成了标准化工作。
优点:协议成熟、强大、可扩展性强、目前主要应用于许多聊天系统中,且已有开源的Java版的开发实例androidpn。
缺点:协议较复杂、冗余(基于XML)、费流量、费电,部署硬件成本高。
方案3:使用MQTT协议
简介:轻量级的、基于代理的“发布/订阅”模式的消息传输协议。
优点:协议简洁、小巧、可扩展性强、省流量、省电,目前已经应用到企业领域(参考:mqtt.org/software),且已有C++版的服务端组件rsmb。
缺点:不够成熟、实现较复杂、服务端组件rsmb不开源,部署硬件成本较高。
方案4:使用HTTP轮循方式
简介:定时向HTTP服务端接口(Web Service API)获取最新消息。
优点:实现简单、可控性强,部署硬件成本低。
缺点:实时性差。
对各个方案的优缺点的研究和对比,推荐使用MQTT协议的方案进行实现,主要原因是:MQTT最快速,也最省流量(固定头长度仅为2字节),且极易扩展,适合二次开发。接下来,我们就来分析使用MQTT方案进行Android消息的原理和方法,并架设自己的推送服务。
推送服务端准备
下载&解压rsmb安装包
进入对应的目录,比如32位的Linux系统则应该进入linux_ia32目录。
编辑配置文件broker_1883.cfg。
推送客户端准备
下载&解压AndroidPushNotificationsDemo项目
将该项目导入Eclipse中(File -> Export -> Existing Projects into Workspace)
修改PushService.java中的MQTT_HOST常量为推送服务端的IP地址。
启动Android模拟器,并安装该项目。
发送服务准备
下载&解压PHP版的发送服务端代码send_mqtt.zip
修改etc/config.php中推送服务端的IP地址和端口号,即MQTT_SERVER_HOST和MQTT_SERVER_POST常量。
打开对应的URL地址,就可以看到发送服务的界面,实际上就是向对应的推送客户端推送消息。
结语
当然,以上方案还存在许多的不足,比如,如果客户端没有保持连接,发送的消息就会被丢弃。不过,我们可以利用MQTT协议开发出更强大的服务端来替代rsmb,更可以加入队列、缓存等功能进行优化,有兴趣的朋友不妨试试。
网友评论