基于Mqtt协议Paho项目实现Android消息推送

Paho项目官方地址:

Paho项目对Mqtt协议进行了一层封装,本文通过对Paho项目的学习与修改,简单的实现Android推送功能。

服务端的部署

服务端的选择,笔者只测试过Apollo: 官网地址: 以及Mosquitto服务器: 官网地址

  • 前者安装配置比较方便,可以在后台中直观的查看当前连接的客户端、发布、订阅的Topic以及消息,但是需要单独写一个服务端来发送消息。

  • 后者需要安装Cygwin,相对Apollo服务器安装起来较为繁琐,但是好处之一是可以通过命令行直接发布消息。

总之,两者都是非常强大的服务器,笔者也只是刚刚入门还有很多功能需要继续探索,本文为了演示效果选择Mosquitto服务器来演示。
关于Mosquitto服务器的部署,可以参考上一篇文章,传送门。

客户端的实现

客户端的实现基于Paho项目,主要使用其中的MqttClient类来实现与服务端的连接以及对消息的订阅。

重要的一点,在本地进行测试的时候,其中的serverURI不要使用localhost或者127.0.0.1,换成自己本机的实际i地址

因为某些原因只贴出部分关键代码进行分析:

首选需要初始化MqttClient以及MqttConnectionOptions:

初始化MqttConnectOptions,这里需要配置了Mosquitto服务器设置的用户的用户名与密码,并设置了连接超时时间以及心跳包发送间隔时间,这些根据自己的需求进行配置即可。

private void initMqttConnectionOptions() {        conOpt = new MqttConnectOptions();        conOpt.setCleanSession(true);        conOpt.setUserName(userName);        conOpt.setPassword(passWord.toCharArray());        conOpt.setConnectionTimeout(CONNECTION_TIMEOUT);        conOpt.setKeepAliveInterval(KEEP_ALIVE_INTERVAL);    }

初始化MqttClient,其中host即serverUri,这里是本地进行测试,但是需要注意的是需要使用实际的ip地址,而非localhost。
另外设置了回调接口,当收到订阅的消息时候通过Handler发送并进行处理。

    private void initMqttClient() {        // TODO Auto-generated method stub        initMqttConnectionOptions();        try {            client = new MqttClient(host, "LHY", null);            client.setCallback(mCallBack);            // 开始连接             connect();        } catch (MqttException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    private MqttCallback mCallBack = new MqttCallback() {        @Override        public void messageArrived(String topic, MqttMessage message)                throws Exception {            // TODO Auto-generated method stub            if (message != null) {                Log.d(TAG, "messageArrived, topic: " + topic + "; message: "                        + new String(message.getPayload()));                Message msg = Message.obtain();                Map map = new HashMap();                map.put("topic", topic);                map.put("mqttMsg", message);                msg.what = HandlerType.MESSAGEARRIVED.getType();                msg.obj = map;                handler.sendMessage(msg);            }        }        @Override        public void deliveryComplete(IMqttDeliveryToken token) {            // TODO Auto-generated method stub            if (token != null) {                try {                    Log.d(TAG, "deliveryComplete: "                            + new String(token.getMessage().getPayload()));                } catch (MqttException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }        }        @Override        public void connectionLost(Throwable cause) {            // TODO Auto-generated method stub            Log.d(TAG, "connectionLost");            // 重连机制        }    };

当连接成功之后,通过client.subscribe()方法来订阅主题,内部最终通过socket来完成和服务端的消息的交互,此时我们通过Mosquitto服务器发送指定Topic的消息,客户端就可以接收到了。

    Log.d(TAG, getString(R.string.connect_success));    try {        client.subscribe(mqttTopic, QOS);    } catch (Exception e) {        e.printStackTrace();    }

演示Gif:

直接发布中文或者使用utf-8编码的时候,客户端中接收到的消息会乱码,因此需要转成GBK编码格式

更多相关文章

  1. Android(安卓)NDK开发之旅32--云服务器Ubuntu下搭建NDK环境,并编
  2. android单元测试中的多线程以及handler消息传递
  3. 用.Net打造一个移动客户端(Android/IOS)的服务端框架NHM(三)——搭建
  4. android窗体加载过程剖析之消息处理的注册机制
  5. 精品软件 推荐 铁路订票网站12306手机订票客户端 家,就在身边
  6. Android通过Okhttp3实现socket长连接
  7. [置顶] 【一步一个脚印】Tomcat+MySQL为自己的APP打造服务器(1)服
  8. android handler,looper,messageQueue重点记录
  9. Android消息推送:第三方消息推送平台详细解析

随机推荐

  1. C#中DateTime与时间戳转换的实例代码
  2. Asp.net MVC 对输入的字符串字段做Trim处
  3. C#中自定义控件如何实现TextBox禁止粘贴
  4. 理解Asp.Net中WebForm的生命周期_实用技
  5. C#中如何实现微信红包功能的示例代码分享
  6. 详解VS2015自带LocalDB数据库用法实例
  7. 关于C#如何实现的UDP收发请求工具类的示
  8. 简单使用的ASP.NET验证码实例代码
  9. C#开发微信门户及应用(五)之用户分组信息
  10. 详细介绍ASP.NET Core静态文件的使用教程