场景

Windows上Mqtt服务器搭建与使用客户端工具MqttBox进行测试:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/112305328

SpringBoot整合MQTT服务器实现消息的发送与订阅(推送消息与接收推送):

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/112394731

在上面实现了将MQTT服务器搭建成功并且在SpringBoot中实现消息的发送与订阅。

Android中连接MQTT服务器实现发布一个消息推送给订阅者(附代码下载):

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/112461516

以及在Android中怎样实现消息的推送,即作为发布者的角色去连接MQTT服务器,那么Android怎样作为订阅者即

接收推送的消息并显示在通知栏中。

效果

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

首先你需要将MQTT服务器搭建好,参照上面的博客。

然后新建一个Android项目,在build.gradle中引入mqtt依赖

    //mqttimplementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'

然后在AndroidManifest.xml中添加网络权限

    <uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

在项目包下新建一个mqtt包,然后新建一个service叫MQTTService用来实现项目启动后连接到mqtt服务器的一些初始化操作并且实现订阅主题的操作。

package com.badao.androidmqttsubscribeclient.mqtt;import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;import androidx.annotation.Nullable;import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
public class MQTTService extends Service {private static final String TAG = "MQTTService";public static final String BROKER_URL = "tcp://你自己的MQTT服务器ip:1883";public static final String CLIENT_ID = "gongzhonghaobadaodecehngxvyuan";//订阅的主题public static final String TOPIC = "badaodechengxvyuan";public static MqttClient mqttClient;//mqtt连接配置private MqttConnectOptions mqttOptions;private String username = "admin";private String password = "admin";public MQTTService() {}@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.i(TAG, "onStartCommand: begin");try {//第三个参数代表持久化客户端,如果为null,则不持久化mqttClient = new MqttClient(BROKER_URL, CLIENT_ID, new MemoryPersistence());//mqtt连接设置mqttOptions = new MqttConnectOptions();mqttOptions.setUserName(username);mqttOptions.setPassword(password.toCharArray());//超时连接,单位为秒mqttOptions.setConnectionTimeout(10);mqttOptions.setKeepAliveInterval(20);//false代表可以接受离线消息mqttOptions.setCleanSession(false);mqttOptions.setAutomaticReconnect(true);// 设置回调mqttClient.setCallback(new PushCallback(mqttClient));Log.i(TAG, "onStartCommand: before connect");//客户端下线,其它客户端或者自己再次上线可以接收"遗嘱"消息
//            MqttTopic topic1 = mqttClient.getTopic(TOPIC);
//            mqttOptions.setWill(topic1, "close".getBytes(), 2, true);mqttClient.connect(mqttOptions);Log.i(TAG, "onStartCommand: after connect");Log.i(TAG, "连接mqtt服务器成功");//mqtt客户端订阅主题//在mqtt中用QoS来标识服务质量//QoS=0时,报文最多发送一次,有可能丢失//QoS=1时,报文至少发送一次,有可能重复//QoS=2时,报文只发送一次,并且确保消息只到达一次。int[] qos = {1};String[] topic = {TOPIC};mqttClient.subscribe(topic, qos);} catch (MqttException e) {e.printStackTrace();Log.i(TAG, e.getMessage());}return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {try {mqttClient.disconnect();} catch (MqttException e) {e.printStackTrace();}}
}

把上面的mqtt服务器的地址改为你自己的地址。

在这里还设置了回调处理类PushCallback用来实现在接收到消息后进行通知栏通知的操作。

为了实现在回调方法中通知到主线程去进行通知栏通知,这里用到了Eventbus来实现传递消息的操作。

所以还需要在项目中引入Eventbus

    //Event bus用来传递消息implementation 'org.greenrobot:eventbus:3.0.0'

然后新建上面设置的回调处理类PushCallback

package com.badao.androidmqttsubscribeclient.mqtt;import android.util.Log;import com.badao.androidmqttsubscribeclient.bean.MessageEvent;import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.greenrobot.eventbus.EventBus;public class PushCallback implements MqttCallbackExtended {private static final String TAG = "PusherCallback";private MqttClient mqttClient = null;public PushCallback(MqttClient client) {mqttClient = client;}@Overridepublic void connectionLost(Throwable cause) {Log.i(TAG, "连接失败");}@Overridepublic void messageArrived(String topic, MqttMessage message) throws Exception {String msg = new String(message.getPayload());Log.i(TAG, "消息到达,message: " + msg);EventBus.getDefault().postSticky(new MessageEvent(msg));}@Overridepublic void deliveryComplete(IMqttDeliveryToken token) {Log.i(TAG, "消息成功发送");}@Overridepublic void connectComplete(boolean reconnect, String serverURI) {Log.i(TAG, "连接完成");}
}

在回调处理类的收到消息的回调方法中通过

EventBus.getDefault().postSticky(new MessageEvent(msg));

来实现EventBus的消息的发布,这里的参数是根据官方文档指示的新建的一个消息事件实体对象

package com.badao.androidmqttsubscribeclient.bean;public class MessageEvent {private String message;public MessageEvent(String message) {this.message = message;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}

然后为了实现消息的传递,还需要在MainActivity中进行注册事件,即在需要订阅的地方注册事件

还需要在MainActivity中设置事件的处理

    //处理事件@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)public void showTheEventMessage(MessageEvent messageEvent) {Log.i(TAG, "showTheEventMessage: show notification");showNotification(this, messageEvent.getMessage());}

在事件的处理中调用了showNotification方法,这个方法是实现在通知栏显示通知消息的

然后方法的具体实现

    public void showNotification(Context context, String content) {//1.创建通知管理器NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);NotificationCompat.Builder builder;Log.i(TAG, "showNotification:version: " + Build.VERSION.SDK_INT);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//Android 8.0版本适配NotificationChannel channel = new NotificationChannel("default", "default", NotificationManager.IMPORTANCE_HIGH);notificationManager.createNotificationChannel(channel);builder = new NotificationCompat.Builder(context, "default");} else {builder = new NotificationCompat.Builder(context);}Intent intent = new Intent(this, MsgDetailsActivity.class);intent.putExtra("msgContent",content);//2.创建通知实例Notification notification = builder.setContentTitle("通知标题").setContentText(content).setWhen(System.currentTimeMillis())//smallIcon 通知栏显示小图标//android5.0 之后通知栏图标都修改了,小图标不能含有RGB图层,也就是说图片不能带颜色,否则显示的就成白色方格了//解决方法一:为图片带颜色,targetSdkVersion改为21以下//解决方法二:只能用白色透明底的图片.setSmallIcon(R.mipmap.ic_launcher)//LargeIcon 下拉后显示的图标.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))//收到通知时的效果,这里是默认声音.setDefaults(Notification.DEFAULT_SOUND).setAutoCancel(true).setContentIntent(PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT)).build();//3.notify//notifyId每次要不一致,不然下一次的通知会覆盖上一次int notifyId = new Random().nextInt();notificationManager.notify(notifyId, notification);}

为了实现点击通知栏的消息跳转到消息详情并携带消息内容过去

新建一个MsgDetailsActivity,并添加一个TextView

    <TextViewandroid:id="@+id/msg_TextView"android:layout_width="match_parent"android:layout_height="wrap_content"/>

然后通过

        Intent intent = new Intent(this, MsgDetailsActivity.class);intent.putExtra("msgContent",content);

传递参数,在MsgDetailsActivity中接收传递过来的参数并显示

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_msg_details);String msgContent = getIntent().getStringExtra("msgContent");TextView textView = findViewById(R.id.msg_TextView);textView.setText(msgContent);}

然后运行app并且使用MqttBox发布一个相同主题的消息

可以看到在收到消息的回调方法已经执行。

示例代码下载

https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/14109723

Android中连接MQTT服务器实现订阅主题并接收消息推送在通知栏显示(附代码下载)相关推荐

  1. Android中使用EventBus事件发布/订阅框架实现事件传递

    场景 EventBus EventBus是一种用于Android的事件发布-订阅总线.它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片之间进行通信的问题,可以避免由于使用广播通信而带来的诸多 ...

  2. Android 项目必备(三十八)-->APP 消息推送

    文章目录 前言 推送的实现方式 1. C2DM 2. 轮询 3. SMS信令推送 4. MQTT协议 5. XMPP协议 6. 使用第三方平台 Android 中 MQTT 的使用 1. 集成 2. ...

  3. 微信小程序订阅消息推送(附带后台java代码)

    官方文档: 小程序前端:点击进入 小程序服务端:点击进入 一,代码实现(后端) ①定义实体类 package com.saic.fin.system.sendInfo;import lombok.Da ...

  4. 为什么微信有时无法接收到服务器,微信小程序开启了消息推送,服务器有时候接收不到...

    后台是用koa2写的,开启了自动回复后,服务器有时候接收不到微信的请求.有时候可以.连续发送的情况下多半失败,是不是接收了后,得给微信返回什么.关键代码如下: const { ToUserName, ...

  5. java连接MQTT服务器(Springboot整合MQTT)

    一.业务场景 硬件采集的数据传入EMQX平台(采用MQTT协议),java通过代码连接MQTT服务器,进行采集数据接收.解析.业务处理.存储入库.数据展示. MQTT 是基于 发布(Publish)/ ...

  6. Android平台上使用MQTT协议实现消息推送功能

    MQTT实现消息推送,效果如下 服务端下载地址:http://activemq.apache.org/download-archives.html jar包地址 百度网盘:https://pan.ba ...

  7. spring实现mqtt服务端_SpringBoot--实战开发--MQTT消息推送(六十)

    一.MQTT简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支持所有平台 ...

  8. MQTT C Client实现消息推送(入门指南)

    我自己搭建了博客,以后可能不太在CSDN上发博文了,https://www.qingdujun.com/ . MQTT(Message Queuing Telemetry Transport,消息队列 ...

  9. 友盟小米收不到推送消息_一个轻量级、可插拔的Android消息推送框架。一键集成推送(极光推送、友盟推送、华为、小米推送等)...

    XPush 一个轻量级.可插拔的Android消息推送框架.一键集成推送(极光推送.友盟推送.华为.小米推送等),提供有效的保活机制,支持推送的拓展,充分解耦推送和业务逻辑,解放你的双手! 在提iss ...

  10. SignalR 中丰富多彩的消息推送方式

    在上一篇 SignalR 文章中,演示了如何通过 SignalR 实现了简单的聊天室功能:本着简洁就是美的原则,这一篇我们也来聊聊在 SignalR 中的用户和组的概念,理解这些基础知识有助于更好的开 ...

最新文章

  1. 表达式计算 DataTable/DataRow/DataColumn Expression、JScript CodeDomProvider Eval
  2. 第十六届智能车竞赛线上比赛赛道审核 - 东北赛区第二批次
  3. CentOS下安装Telnet
  4. buffers和cache的区别
  5. CountDownLatch(线程计数器)
  6. mysql使用 BETWEEN AND 查询
  7. codeforces E. Game with String 概率
  8. Android初级教程:Android中解析方式之pull解析
  9. STM32F103移植mpu9250
  10. 【绪论】——声呐概述
  11. 有关二级菜单缓慢效果出现(transition)
  12. RESTORE DATAFILE TO A NEW LOCATION
  13. 2019商业数据分析软件有哪些
  14. 百度下拉词目前用软件工具可以刷出来吗?
  15. Java初学者作业——定义客户类(Customer),客户类的属性包括:姓名、年龄、电话、余额、账号和密码;方法包括:付款。
  16. pythonunicode编码_python unicode 编码整理
  17. 手写输入---随手写
  18. 苦学Excel、VBA,工作效率依旧低下?你该认识这个新工具了
  19. OBS Studio录屏黑屏解决办法win10
  20. 【C语言】ISBN识别码判断

热门文章

  1. 如何用原生js获取非行间样式
  2. iOS: pch 如何添加项目中
  3. unity学习之遮挡剔除
  4. CSAPP ArchLab
  5. 线段树(segment tree),看这一篇就够了
  6. 多文件自平衡云传输 (一) 资源篇 —————— 开开开山怪
  7. 深恶痛绝!关闭win10自动更新的办法
  8. 计算机毕设(附源码)JAVA-SSM京津冀畅游网设计
  9. 权力的游戏——读《原则2 :应对变化中的世界秩序》(中)
  10. 基于51单片机的指纹锁设计(附带密码解锁)