场景

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中怎样实现消息的发布。

注:

博客:
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.androidmqttpublishclient.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 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服务器成功,可以进行发布消息");} 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服务器的url改为你自己的ip和端口号,以及自己的用户名和密码,获取方式可以参照上面博客。

新建完service后要在AndroidManifest中声明service

        <serviceandroid:name=".mqtt.MQTTService"android:enabled="true"android:exported="true"></service>

在service中设置了回调方法,用来处理形如连接成功、收到消息、发送消息成功等的回调。

所以需要新建一个回调方法类PushCallback

package com.badao.androidmqttpublishclient.mqtt;import android.util.Log;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;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);}@Overridepublic void deliveryComplete(IMqttDeliveryToken token) {Log.i(TAG, "消息成功发送");}@Overridepublic void connectComplete(boolean reconnect, String serverURI) {Log.i(TAG, "连接完成");}
}

根据自己的需要重写一些回调方法。

然后就是在MainActivity中的onCreate方法中启动服务,用来在启动后实现连接到mqtt服务器等操作。

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//启动服务Intent intent = new Intent(this, MQTTService.class);startService(intent);}

为了实现推送消息,在主页面添加一个按钮

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><Buttonandroid:id="@+id/publishButton"android:text="发布消息"android:layout_width="match_parent"android:layout_height="wrap_content"/></RelativeLayout>

然后在activity中设置按钮的点击事件

        Button publishButton = findViewById(R.id.publishButton);publishButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//在mqtt中用QoS来标识服务质量//QoS=0时,报文最多发送一次,有可能丢失//QoS=1时,报文至少发送一次,有可能重复//QoS=2时,报文只发送一次,并且确保消息只到达一次。MqttMessage mqttMessage = new MqttMessage();mqttMessage.setId((int) Math.random());mqttMessage.setQos(1);mqttMessage.setPayload("这是来自APP发布的消息:公众号-霸道的程序猿".getBytes());/*当设置Retain标识位的时候,该消息即为遗言消息。broker收到该消息后会保存此消息,当有新的订阅者订阅此主题时候,broker会立即发送此消息。有点类似于会话清除,不同的是遗言只有一条,后面的遗言消息会覆盖前面的。如果需要删除retain消息,可以发布一个空的retain消息,因为每个新的retain消息都会覆盖最后一个retain消息*/mqttMessage.setRetained(false);try {MQTTService.mqttClient.publish("badaodechengxvyuan",mqttMessage);} catch (MqttException e) {e.printStackTrace();}}});

在点击事件中,构造一个MqttMessage消息对象,设置其相关参数,主要是通过器payload设置其消息内容。

然后调用service的mqtt客户端的publish方法,第一个参数是主题,第二个参数是消息对象。

然后运行app

可以看到service已经启动成功,并且调用了连接成功的回调方法

然后为了收到想通主题的订阅的消息,使用MQTTBox订阅一个同样主题

然后在点击主页面的发布消息的按钮,可以看到发送成功的回调方法已经被调用

然后在Mqttbox中也已经收到了消息

示例代码下载

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

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

  1. android 张口逐帧动画,Android中实现一个简单的逐帧动画(附代码下载)

    场景 Android中的逐帧动画,就是由连续的一张张照片组成的动画. 效果 注: 实现 首先准备一组不同表情的照片,放在res/drawable下,然后在此目录下新建动画资源文件fairy.xml 这 ...

  2. Android中实现一个简单的逐帧动画(附代码下载)

    场景 Android中的逐帧动画,就是由连续的一张张照片组成的动画. 效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 ...

  3. 【STM32 x ESP8266】连接 MQTT 服务器(报文,附部分源码解析)

    MQTT 协议作为物联网非常重要的传输协议,如何使用它十分重要,如果有不理解的同学可以点击这里学习,这里只是简单介绍一下.同时这里附上MQTT 3.1.1协议中文版 pdf 的链接,对协议底层感兴趣的 ...

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

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

  5. SpringBoot连接MQTT服务器时因ClintID重复导致频繁掉线重连

    场景 SpringBoot整合MQTT服务器实现消息的发送与订阅(推送消息与接收推送): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detai ...

  6. 应用场景一:西门子PLC通过桥接器连接MQTT服务器

    应用场景描述: 云平台.MES等数据采集.设备管理系统,需要通过MQTT的方式,上传和下发数据,MQTT服务器可以获取PLC的实时状态数据,也可以下发控制指令.桥接器提供4G.WIFI和有线三种连接方 ...

  7. 移远EC200 EC20 EC600 EC800连接MQTT服务器

    前言 移远的CAT1模块EC200S连接MQTT大致流程 ,经过测试,完全有效 A:开机 就是对模块进行断电2S在上电. B:基础配置 这部分跟连TCP服务器一样 (1):发送AT,确认模块是否正常 ...

  8. Android Studio连接云服务器数据库

    Android Studio连接云服务器数据库 写在开始 1.Navicat连接云服务器数据库 2.MyEclipse开发服务端servlet的相关步骤 Android Studio端代码编写 写在开 ...

  9. 多个客户端如何同时连接到服务器上的一个端口(例如80)? [重复]

    本文翻译自:How do multiple clients connect simultaneously to one port, say 80, on a server? [duplicate] T ...

  10. DTU网关连接MQTT服务器、MQTT.fx工具测试

    4G DTU网关连接MQTT服务器+MQTT.fx工具调试 今天介绍DTU网关如何通过简单几步配置连接MQTT服务器,再使用MQTT.fx客户端进行串口测试. 一. 设备准备 1.硬件准备 DTU网关 ...

最新文章

  1. 服务器云ide_语言服务器协议如何影响IDE的未来
  2. 电脑知识:BIOS和UEFI的对比介绍!
  3. ubuntu14安装python_ubuntu14.04 安装python3.7
  4. 【T-SQL系列】新的排序函数
  5. 【bfs】调酒壶里的酸奶
  6. Spring 源码解析 -- SpringWeb请求映射解析
  7. 一个实用的String实现类(C++)
  8. python流程图自动生成_python自动化办公 自动生成PPT通报
  9. 【图像增强】基于matlab同态增晰图像增强【含Matlab源码 962期】
  10. faceframe kinect2.0 api 注意点
  11. 单片机控制10BitDA正弦信号发生器 PROTEUS 和51单片机教程(附仿真文件+源代码)
  12. 四十五、 Redis云平台CacheCloud搭建之二进制文件
  13. python单例模式解析_深度解密Python单例模式
  14. Ubuntu 11.04下thrift-0.8.0的安装 - Linux - 红黑联盟
  15. 2012年8月编程语言排行榜-C领衔称霸Obj-C强势爬升
  16. ubuntu基础命令总结
  17. 小黑仿生轮腿机器人(三)-SLAM导航
  18. 控制工程中的数学建模(3)——自动控制系统的一般模型
  19. 叮咚买菜涨势,撑起生鲜电商门面
  20. Vue2 轮播图组件 slide组件

热门文章

  1. 关于pandas的时间序列中的freq频率参数如何设置的官方参考说明【以date_range方法中的freq参数举例】
  2. RK339中安卓系统7和9升级最新webView内核步骤
  3. 福建2021高考成绩查询是什么时间,2021年福建高考成绩排名及成绩公布时间什么时候出来...
  4. mysql reconnect_在设置了MYSQL_OPT_RECONNECT之后,mysql_ping是否还有必要?
  5. aop:aspectj-autoproxy /的作用
  6. java时间戳转换工具类
  7. 红外线体温枪制作方案
  8. Git GitHub Gitee使用方法
  9. VS 错误: cout 不明确
  10. Android DEX安全攻防战