




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
android消息推送之 apache apollo在学习apollo之前,我也学习过apache-activemq-5.9.0,并实现了android消息推送。在此过程中我也遇到了一些问题,怕这些问题会影响系统正式上线,我决定重新实现一种消息推送,作为备选方案吧。刚好公司其他人有用apollo的,我就学习了一下apollo。结合网上各种资料,包括摘抄网上的代码,我实现了一个简单的android消息推送。下面是我实现的整个过程。1、 我对apollo的认识Apollo作为一个消息中间件,连通我们的客户端和服务端,允许客户端,服务端交换消息。服务端要推送到手机的消息先发送到apollo消息队列,然后由apollo推送到手机端,反之,从手机到服务器也是如此。因此严格的说,我们的服务器,客户端都是作为apollo的客户窜存在的,而且推送的过程对于我们开发者来说是透明的,所以,我们只需要写好手机端和服务段到apollo的之间程序就可以了。2、 安装apollo(windows)1. 下载apache-apollo-1.7.1-windows-distro.zip(我用的是当前最新的,2015/8/24)。下载地址/apollo/2. 安装apolloapollo中间件其实是免安装的,我们只需要下载apache-apollo-1.7.1-windows-distro.zip,然后解压到某个文件夹就可以了。在这里我解压到D:apache-apollo-1.7.1。解压开的路径如下:3. 创建一个自己的apollo域类似与weblogic创建domain,我们可以创建一个自己的apollo,这样做的好处是我们可以根据自己的需要修改一些配置信息。创建过程如下:1 创建D:myApollo文件夹。2 cd D:myApollo。3 D:apache-apollo-1.7.1binapollo create myapollo创建成功后,在D:myApollo会有一个myapollo子文件夹,里面内容如下:其中etc/apollo.xml 存放的是端口配置信息 etc/perties 存放控制台用户名/密码信息,待会我们会用到4. 启动myapollo1 cd D:myApollomyapollobin2 apollo-broker run在这里我们也可以看到端口配置信息。5. 访问控制台在浏览器输入:61680/,就是上面黑窗口最后一行,打开如下页面然后输入用户名/密码:(admin/password),用户名密码可以在etc/perties中找到,点击登陆,然后进入控制页面,可以看到myapollo,当然目前里面是没有连接,没有消息的,因为我们还没有建立连接,发送消息。至此,我们的apollo中间件就可以正常使用了。3、 服务端程序开发服务端程序主要是建立连接,然后发布主题,供客户端订阅。新建一个java项目,项目结构如下:其中mqtt-client-0.4.0.jar的下载地址:/content/repositories/paho/org/eclipse/paho/mqtt-client/0.4.0/有人会问,我们的服务端程序,怎么会用一个client的jar包,这就是我上面所说,我们的程序是作为apollo的客户端存在的,不管我们写的是客户端程序,还是服务端程序。在之后我们要写的android客户端程序中,也是用的这个jar包。MyMqtt.java代码如下:import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;import org.eclipse.paho.client.mqttv3.MqttCallback;import org.eclipse.paho.client.mqttv3.MqttClient;import org.eclipse.paho.client.mqttv3.MqttConnectOptions;import org.eclipse.paho.client.mqttv3.MqttDeliveryToken;import org.eclipse.paho.client.mqttv3.MqttException;import org.eclipse.paho.client.mqttv3.MqttMessage;import org.eclipse.paho.client.mqttv3.MqttPersistenceException;import org.eclipse.paho.client.mqttv3.MqttTopic;import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;public class MyMqtt private String host = tcp:/localhost:61613;private String userName = admin;private String passWord = password;private MqttClient client;private static MyMqtt instance = new MyMqtt();private MqttTopic topic;private String myTopic = Topics/htjs/serverToPhone;private MqttMessage message;public static MyMqtt getInstance()return instance;private MyMqtt()try client = new MqttClient(host, Server, new MemoryPersistence();MqttConnectOptions options = new MqttConnectOptions();options.setCleanSession(false);options.setUserName(userName);options.setPassword(passWord.toCharArray();options.setConnectionTimeout(10);options.setKeepAliveInterval(20);client.setCallback(new MqttCallback() Overridepublic void connectionLost(Throwable arg0) / TODO 自动生成的方法存根Overridepublic void deliveryComplete(IMqttDeliveryToken arg0) / TODO 自动生成的方法存根Overridepublic void messageArrived(String arg0, MqttMessage arg1) throws Exception / TODO 自动生成的方法存根);client.connect(options); catch (MqttException e) / TODO 自动生成的 catch 块e.printStackTrace();public void sedMessage()try message = new MqttMessage();message.setQos(1);message.setRetained(true);message.setPayload(我向手机发送了一条消息,时间:+System.currentTimeMillis().getBytes();topic = client.getTopic(myTopic);MqttDeliveryToken token = topic.publish(message);/发布主题token.waitForCompletion(); catch (MqttPersistenceException e) / TODO 自动生成的 catch 块e.printStackTrace(); catch (MqttException e) / TODO 自动生成的 catch 块e.printStackTrace();Test.java代码如下:public class Testpublic static void main(String args)MyMqtt myMqtt = MyMqtt.getInstance();myMqtt.sedMessage();程序运行后,在apollo控制台能看到一个主题,和一个连接,如下图:主题:连接:至此,我们服务端程序已经完成,并向客户端发送了一条信息,只要客户端订阅了主题,并且上线,就可以接收到主题。4、 客户端程序(android手机)客户端只要订阅相关主题,就可接收到推送消息。我实现的功能是,程序启动后,启动一个service用于接收推送消息,当收到推送消息后,发送状态栏通知。最终效果如下如,我们可以看到一个消息通知My notification:接下来我们看程序:新建一个ApollyPush项目:这里的mqtt-client-0.4.0.jar与server端是一样的。MainActivity.java代码如下package com.example.apollypush;import android.app.Activity;import android.content.Intent;import android.os.Bundle;public class MainActivity extends Activity private static String TAG = MainActivity;Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/启动推送进程Intent intent = new Intent(MainActivity.this,PushService.class);startService(intent);package com.example.apollypush;import android.app.Activity;import android.content.Intent;import android.os.Bundle;public class MainActivity extends Activity private static String TAG = MainActivity;Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/启动推送进程Intent intent = new Intent(MainActivity.this,PushService.class);startService(intent);PushService.java代码如下:package com.example.apollypush;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;import org.eclipse.paho.client.mqttv3.MqttCallback;import org.eclipse.paho.client.mqttv3.MqttClient;import org.eclipse.paho.client.mqttv3.MqttConnectOptions;import org.eclipse.paho.client.mqttv3.MqttMessage;import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.app.Service;import android.content.Context;import android.content.Intent;import android.os.IBinder;import android.util.Log;public class PushService extends Service private static String TAG = PushService;private String host = tcp:/:61613;private String userName = admin;private String passWord = password;private MqttClient client;private MqttConnectOptions options;private String myTopics = Topics/htjs/phoneToServer, Topics/htjs/serverToPhone ;private int myQos = 2, 2 ;private ScheduledExecutorService scheduler;private NotificationManager mNotificationManager;public void onCreate() Log.i(TAG, -onCreate);init();Overridepublic int onStartCommand(Intent intent, int flags, int startId) Log.i(TAG, -onStartCommand);startReconnect();return START_STICKY;Overridepublic IBinder onBind(Intent intent) / TODO Auto-generated method stubreturn null;private void init() Log.i(TAG, -init);try / host为主机名,test为clientid即连接MQTT的客户端ID,一般以客户端唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存Log.i(TAG, host);client = new MqttClient(host, test, new MemoryPersistence();/ MQTT的连接设置options = new MqttConnectOptions();/ 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接options.setCleanSession(true);/ 设置连接的用户名options.setUserName(userName);/ 设置连接的密码options.setPassword(passWord.toCharArray();/* * Sets the connection timeout value. This value, measured in seconds, defines the maximum time interval the client will wait for the network connection to the MQTT server to be established. The default timeout is 30 seconds. A value of 0 disables timeout processing meaning the client will wait until the network connection is made successfully or fails. */options.setConnectionTimeout(10);/* * Sets the keep alive interval. This value, measured in seconds, defines the maximum time interval between messages sent or received. It enables the client to detect if the server is no longer available, without having to wait for the TCP/IP timeout. The client will ensure that at least one message travels across the network within each keep alive period. In the absence of a data-related message during the time period, the client sends a very small ping message, which the server will acknowledge. A value of 0 disables keepalive processing in the client. * The default value is 60 seconds */options.setKeepAliveInterval(20);/ 设置回调client.setCallback(new MqttCallback() Overridepublic void connectionLost(Throwable cause) / 连接丢失后,一般在这里面进行重连Log.i(TAG, connectionLost);Overridepublic void deliveryComplete(IMqttDeliveryToken token) / publish后会执行到这里Log.i(TAG, deliveryComplete- + token.isComplete();Overridepublic void messageArrived(String topicName, MqttMessage message) throws Exception / subscribe后得到的消息会执行到这里面Log.i(TAG, messageArrived-+message.toString();/*Message msg = new Message();msg.what = 1;msg.obj = topicName + - + message.toString();Log.i(TAG, msg.toString();*/mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);Notification notification = new Notification();notification.flags |= Notification.FLAG_SHOW_LIGHTS;notification.flags |= Notification.FLAG_AUTO_CANCEL;notification.defaults = Notification.DEFAULT_ALL;notification.icon = R.id.icon;notification.when = System.current
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版型钢结构瓦工施工总承包合同
- 2025版沙盘模型制作技术培训及转让合同
- 2025版新能源汽车充电站运营维护专业服务合同
- 2025版外卖配送服务合同技术升级范本
- 2025场环保产业调研与可持续发展服务协议
- 2025代收代缴水电费及环保监测服务合同
- 2025年商铺认筹与商业综合体合作框架协议
- 2025年度幼儿园食堂安全卫生管理服务协议
- 2025年度绿色建筑劳务分包合同示范文本大全
- 2025版智慧桥梁建设劳务分包合同模板
- 期权开户考试题及答案
- 建筑工程装饰预算课件
- 《民营经济促进法》解读与案例分析课件
- 山地绿化工程的安全防范措施
- 监理挂靠合同协议书
- 2025年广西南宁宾阳县昆仑投资集团有限公司招聘笔试参考题库含答案解析
- 2025-2030中国公路养护行业市场深度调研及前景趋势与投资研究报告
- 《数据采集与分析》课件
- 国家生物安全法课件
- 老年人生命教育
- 租车合同免责协议模板
评论
0/150
提交评论