SpringBoot整合MQTT (使用官方demo)
依赖
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.3</version>
</dependency>
配置
spring:
mqtt:
clientId: test1
url: tcp://192.168.1.24:1883
username: admin
password: 123456
配置类
MyMqttClient.java
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
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.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy; @Component
public class MyMqttClient { public static MqttClient mqttClient = null;
private static MemoryPersistence memoryPersistence = null;
private static MqttConnectOptions mqttConnectOptions = null; @Autowired
private MqttRecieveCallback mqttRecieveCallback; @Autowired
private MqttTwoRecieveCallback mqttTwoRecieveCallback; @Value("${spring.mqtt.url}")
private String serverURI; @Value("${spring.mqtt.clientId}")
private String clientId; @Value("${spring.mqtt.username}")
private String username; @Value("${spring.mqtt.password}")
private String password; @PostConstruct
public void init() {
//初始化连接设置对象
mqttConnectOptions = new MqttConnectOptions();
//初始化MqttClient
if (null != mqttConnectOptions) {
// true可以安全地使用内存持久性作为客户端断开连接时清除的所有状态
mqttConnectOptions.setCleanSession(true);
// 设置连接超时
mqttConnectOptions.setConnectionTimeout(10); //设置账号密码
// mqttConnectOptions.setUserName(username);
// mqttConnectOptions.setPassword(password.toCharArray()); // 设置持久化方式
memoryPersistence = new MemoryPersistence();
if (null != memoryPersistence && null != clientId) {
try {
mqttClient = new MqttClient(serverURI, clientId, memoryPersistence);
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else { }
} else {
System.out.println("mqttConnectOptions对象为空");
} System.out.println(mqttClient.isConnected());
//设置连接和回调
if (null != mqttClient) {
if (!mqttClient.isConnected()) { // 创建回调函数对象
// MqttRecieveCallback mqttReceriveCallback = new MqttRecieveCallback();
// 客户端添加回调函数
// mqttClient.setCallback(mqttReceriveCallback);
// 创建连接
try {
System.out.println("创建连接");
mqttClient.connect(mqttConnectOptions);
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
} else {
System.out.println("mqttClient为空");
} System.out.println(mqttClient.isConnected()); if (mqttClient.isConnected()) {
try {
//添加回调方法1
mqttClient.subscribe("topic/test1", 2, mqttRecieveCallback);
//添加回调方法2
mqttClient.subscribe("topic/test2", 2, mqttTwoRecieveCallback);
} catch (MqttException e) {
e.printStackTrace();
}
}
} // 关闭连接
@PreDestroy
public void closeConnect() {
//关闭存储方式
if (null != memoryPersistence) {
try {
memoryPersistence.close();
} catch (MqttPersistenceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
System.out.println("memoryPersistence is null");
} // 关闭连接
if (null != mqttClient) {
if (mqttClient.isConnected()) {
try {
mqttClient.disconnect();
mqttClient.close();
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
System.out.println("mqttClient is not connect");
}
} else {
System.out.println("mqttClient is null");
}
} // 发布消息
public void publishMessage(String pubTopic, String message, int qos,Boolean retained) {
if (null != mqttClient && mqttClient.isConnected()) {
System.out.println("发布消息 " + mqttClient.isConnected());
System.out.println("id:" + mqttClient.getClientId());
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setQos(qos);
mqttMessage.setPayload(message.getBytes());
mqttMessage.setRetained(retained); MqttTopic topic = mqttClient.getTopic(pubTopic); if (null != topic) {
try {
MqttDeliveryToken publish = topic.publish(mqttMessage);
if (!publish.isComplete()) {
System.out.println("消息发布成功");
}
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } else {
reConnect();
} } // 重新连接
public void reConnect() {
if (null != mqttClient) {
if (!mqttClient.isConnected()) {
if (null != mqttConnectOptions) {
try {
mqttClient.connect(mqttConnectOptions);
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
System.out.println("mqttConnectOptions is null");
}
} else {
System.out.println("mqttClient is null or connect");
}
} else {
init();
} } // 订阅主题
public void subTopic(String topic) {
if (null != mqttClient && mqttClient.isConnected()) {
try {
mqttClient.subscribe(topic, 1);
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
System.out.println("mqttClient is error");
}
} // 清空主题
public void cleanTopic(String topic) {
if (null != mqttClient && !mqttClient.isConnected()) {
try {
mqttClient.unsubscribe(topic);
} catch (MqttException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
System.out.println("mqttClient is error");
}
} }
回调类一
MqttRecieveCallback.java
import org.eclipse.paho.client.mqttv3.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; @Component
public class MqttRecieveCallback implements MqttCallback, IMqttMessageListener { @Autowired
private MyMqttClient client; @Override
public void connectionLost(Throwable cause) { } @Override
public void messageArrived(String topic, MqttMessage message) {
System.out.println("Client 接收消息主题 : " + topic);
System.out.println("Client 接收消息Qos : " + message.getQos());
System.out.println("Client 接收消息内容 : " + new String(message.getPayload())); /**
* 发送消息
*/
client.publishMessage("topic/test2","2",2,false);
} @Override
public void deliveryComplete(IMqttDeliveryToken token) { } }
回调类2
MqttTwoRecieveCallback.java
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.IMqttMessageListener;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.stereotype.Component; @Component
public class MqttTwoRecieveCallback implements MqttCallback, IMqttMessageListener { @Override
public void connectionLost(Throwable cause) { } @Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
System.out.println("Client2 接收消息主题 : " + topic);
System.out.println("Client2 接收消息Qos : " + message.getQos());
System.out.println("Client2 接收消息内容 : " + new String(message.getPayload())); } @Override
public void deliveryComplete(IMqttDeliveryToken token) { } }
SpringBoot整合MQTT (使用官方demo)的更多相关文章
- SpringBoot整合SSM(代码实现Demo)
SpringBoot整合SSM 如图所示: 一.数据准备: 数据库文件:数据库名:saas-export,表名:ss_company 创建表语句: DROP TABLE IF EXISTS ss_co ...
- MongoDB系列:三、springboot整合mongoDB的简单demo
在上篇 MongoDB常用操作练习 中,我们在命令提示符窗口使用简单的mongdb的方法操作数据库,实现增删改查及其他的功能.在本篇中,我们将mongodb与spring boot进行整合,也就是在j ...
- Springboot整合elasticSearch的官方API实例
前言:在上一篇博客中,我介绍了从零开始安装ElasticSearch,es是可以理解为一个操作数据的中间件,可以把它作为数据的存储仓库来对待,它具备强大的吞吐能力和计算能力,其基于Lucene服务器开 ...
- SpringBoot整合Spring Security使用Demo
https://start.spring.io/ 生成SpringBoot项目 pom文件应该是我这样的: <?xml version="1.0" encoding=&quo ...
- springboot整合elasticsearch(基于es7.2和官方high level client)
前言 最近写的一个个人项目(传送门:全终端云书签)中需要用到全文检索功能,目前 mysql,es 都可以做全文检索,mysql 胜在配置方便很快就能搞定上线(参考这里),不考虑上手难度,es 在全文检 ...
- Java学习之SpringBoot整合SSM Demo
背景:在Java Web中Spring家族有着很重要的地位,之前JAVA开发需要做很多的配置,一堆的配置文件和部署调试一直是JavaWeb开发中的一大诟病,但现在Spring推出了SpringBoot ...
- SpringBoot整合Swagger2(Demo示例)
写在前面 由于公司项目采用前后端分离,维护接口文档基本上是必不可少的工作.一个理想的状态是设计好后,接口文档发给前端和后端,大伙按照既定的规则各自开发,开发好了对接上了就可以上线了.当然这是一种非常理 ...
- 【SpringBoot系列1】SpringBoot整合MyBatis
前言: 一直看网上说SpringBoot是解锁你的配置烦恼,一种超级快速开发的框架.一直挺想学的,正好最近也有时间,就学了下 这个是SpringBoot整合MyBatis的一个教程,用了阿里的drui ...
- 很详细的SpringBoot整合UEditor教程
很详细的SpringBoot整合UEditor教程 2017年04月10日 20:27:21 小宝2333 阅读数:21529 版权声明:本文为博主原创文章,未经博主允许不得转载. https: ...
随机推荐
- IDEA 2021.2.3 安装与破解教程
首先说明,大部分情况下,花10块钱都可以在淘宝找人直接帮你完美解决这个资源问题 所以千万不要相信一些所谓的百度结果,一般都是花费了时间却最后无法解决破解的问题 我相信任何一个想要学习软件开发的人一定要 ...
- Topcoder 12519 ScotlandYard(点对 dp+最长路)
题面传送门 题意: 有两个人 A 和 B 玩一个游戏.游戏规则大致是这样的: 有 \(n\) 个城市和三种交通工具公交.地铁和出租车. 给出三个 \(n\times n\) 的字符矩阵 \(b,m,t ...
- Redis—怎么查看Linux有没有安装Redis,如何启动Redis
1.检测是否有安装redis-cli和redis-server [root@localhost bin]# whereis redis-cli redis-cli: /usr/bin/redis-cl ...
- 02 Windows安装C语言开发工具CodeBlocks
CodeBlocks安装 使用微信扫码关注微信公众号,并回复:"C语言环境",免费获取下载链接! 1.卸载CodeBlocks(电脑未装此软件,跳过) 进入目录:C:\Pro ...
- 01 Windows安装C语言环境
安装C语言运行环境 双击打开安装文件,进行安装 配置环境变量 将: C:\MinGW\bin;添加到Path变量里面. 验证环境变量是否成功 gcc –v 出现如下图所示,证明安装成功
- 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...
- Python中的随机采样和概率分布(一)
Python(包括其包Numpy)中包含了了许多概率算法,包括基础的随机采样以及许多经典的概率分布生成.我们这个系列介绍几个在机器学习中常用的概率函数.先来看最基础的功能--随机采样. 1. rand ...
- C# / VB.NET 在Word中嵌入多媒体(视频、音频)文件
Word中可将Office(Word/Excel/PowerPoint).PDF.txt等文件作为OLE对象插入到文档中,双击该对象可直接访问或编辑该文件,除了以上常见的文件格式对象,也可以插入多媒体 ...
- 学习java 6.30
学习内容:Java的运算符与C中类似,虽是类似,还是有点区别,在这里详细说明一下,即字符以及字符串的+操作,字符的+操作执行后需要赋值给表达式中数据范围最大的类型, 字符串的+操作,当+中有字符串,则 ...
- A Child's History of England.40
Excommunication was, next to the Interdict I told you of at the close {end} of the last chapter, the ...