前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >酷炫MQTT实现消息推送

酷炫MQTT实现消息推送

作者头像
先知先觉
发布2019-01-21 16:11:53
2.4K0
发布2019-01-21 16:11:53
举报
文章被收录于专栏:伟大程序猿的诞生

首先在实现本功能之前我们需要储备一下预备知识,大家可以看我的前两篇文章以及官网,了解MQTT的基本常识: MQTT入门篇

MQTT服务器Mosquitto安装及使用

MQTT官网

在步入正题之前先给大家发放个福利,介绍一款MQTT插件:MQTTLens 。

MQTTLens插件的使用

MQTTLens

1.安装:点击链接进行安装。

2.输入以下三个信息: connection name : 随便写 HostName:写服务器地址,如果自己电脑测试,就写本地地址 client ID : 唯一ID 一般是设备唯一识别码

3.保存,使用 。接下来就可以订阅或者发布消息了。

⚠️:订阅和发布的标题必须一致!!!

客户端接收MQTT消息

这里我们需要用到开源库 paho,更多paho的接收可以查看官网:paho官网

paho API

第一步:倒入依赖库PAHO

1.在APP下Gradle中添加:

代码语言:javascript
复制
dependencies {
    compile 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
    compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.1'
}

2.在project下Gradle中添加:

代码语言:javascript
复制
repositories {
        maven {
            url "https://repo.eclipse.org/content/repositories/paho-releases/"
        }
    }

第二步:添加权限

代码语言:javascript
复制
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />

第三步:开启服务

在AndroidMainFest.xml中开启MQTT服务:

代码语言:javascript
复制
    <!-- Mqtt Service -->
    <service android:name="org.eclipse.paho.android.service.MqttService" />

第四步:订阅器的实现

前面几步准备工作完成之后我们就可以正式开启今天的任务。

1.首先创建MqttAndroidClient和MqttConnectOptions,这两员大将一个是负责连接,一个是复杂属性设置的:

代码语言:javascript
复制
MqttAndroidClient mqttAndroidClient = new MqttAndroidClient(getApplicationContext(), serverUri, clientId);

MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();

2.然后去设置MqttConnectOptions属性:

代码语言:javascript
复制
    // 配置MQTT连接
    mqttConnectOptions.setAutomaticReconnect(true);
    mqttConnectOptions.setCleanSession(false);
    mqttConnectOptions.setUserName(null);
    mqttConnectOptions.setPassword(null);
    mqttConnectOptions.setConnectionTimeout(30);  //超时时间
    mqttConnectOptions.setKeepAliveInterval(60); //心跳时间,单位秒
    mqttConnectOptions.setAutomaticReconnect(true);//自动重连

以上是一些常用的属性,更多属性可以查看官网:Class MqttConnectOptions API

3.创建MQTT连接

代码语言:javascript
复制
mqttAndroidClient.connect(mqttConnectOptions);

4.设置监听

代码语言:javascript
复制
mqttAndroidClient.setCallback(new MqttCallbackExtended() {
            @Override
            public void connectComplete(boolean reconnect, String serverURI) {
                Log.e(TAG, "reconnect ---> " + reconnect + "       serverURI--->" + serverURI);
            }

            @Override
            public void connectionLost(Throwable cause) {
                Log.e(TAG, "cause ---> " + cause);
            }

            @Override
            public void messageArrived(String topic, MqttMessage message) throws Exception {
                Log.e(TAG, "topic ---> " + topic + "       message--->" + message);
                startNotification(message);
            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {
                Log.e(TAG, "token ---> " + token);
            }
        });

5.订阅消息

我们在上面connectComplete方法里面去订阅消息

代码语言:javascript
复制
    final String subscriptionTopic = "exampleAndroidTopic";

    private void subscribeToTopic() {
        try {
            mqttAndroidClient.subscribe(subscriptionTopic, 0, null, new IMqttActionListener() {
                @Override
                public void onSuccess(IMqttToken asyncActionToken) {
                    Log.e(TAG, "onFailure ---> " + asyncActionToken);
                }

                @Override
                public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                    Log.e(TAG, "onFailure ---> " + exception);
                }
            });
        } catch (MqttException e) {
            Log.e(TAG, "subscribeToTopic is error");
            e.printStackTrace();
        }
    }

到这里大公告成,已经可以接收到发送的消息了。 接下来去实现我们的Notification。

Notification通知栏

Notification使用非常简单,这里就不详细介绍,主要见代码:

代码语言:javascript
复制
    private NotificationManager notificationManager ;
    private NotificationCompat.Builder notificationBuilder ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initNotification();
    }

    private void initNotification() {
        notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationBuilder = new NotificationCompat.Builder(this);
    }

初始化完成之后我们在上面监听器的messageArrived方法中去接收消息。

代码语言:javascript
复制
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
    Log.e(TAG, "topic ---> " + topic + "       message--->" + message);
    startNotification(message);
}
代码语言:javascript
复制
private void startNotification(MqttMessage message) {
        // params
        Bitmap largeIcon = ((BitmapDrawable) getResources().getDrawable(R.mipmap.ic_launcher_round)).getBitmap();
        String info = message.toString();

        Intent intent = new Intent(MainActivity.this,JumpActivity.class);
        intent.putExtra(MESSAGE,info);

        notificationBuilder.setLargeIcon(largeIcon)
                .setSmallIcon(R.mipmap.ic_launcher_round)
                .setContentTitle("推送消息啦")
                .setContentText(info)
                .setTicker(info)
                .setContentIntent(PendingIntent.getActivity(MainActivity.this, 0, intent, 0));

        Notification notification = notificationBuilder.getNotification();

        notificationManager.notify(NOTIFICATION_ID, notification);
    }

好啦,就是这么简单,记下来让我们看一下展示效果!

⚠️:切记,地址和端口一定要匹配 不让玩死也收不到消息!!!!!!!!!!!!!!!!!!!!!!!!

效果展示

DEMO地址 : 大家只需要更换自己的IP地址就可以用了。

http://download.csdn.net/detail/github_33304260/9879717

后续会更加精彩,欢迎关注本人博客以及github https://github.com/libin7278/ImageLoader 欢迎star

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年06月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MQTTLens插件的使用
  • 客户端接收MQTT消息
    • 第一步:倒入依赖库PAHO
      • 第二步:添加权限
        • 第三步:开启服务
          • 第四步:订阅器的实现
          • Notification通知栏
          • 效果展示
          相关产品与服务
          云服务器
          云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档