1.我采用的是springboot,首先pom文件中添加mqtt需要用到的依赖

  <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId>
</dependency> <dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.0</version>
</dependency>

2.书写客户端,客户端中包括了连接服务器,订阅主题,向主题发布消息的基本操作

import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; /**
* Description:
* mqtt客户端
* @author Victor
*/
@Component
public class MqttPushClient { @Autowired
private PushCallback pushCallback; private static final Logger LOGGER = LoggerFactory.getLogger(MqttPushClient.class); private static MqttClient client; public static MqttClient getClient() {
return client;
} public static void setClient(MqttClient client) {
MqttPushClient.client = client;
} /**
* 连接
* @param host .
* @param clientID .
* @param username .
* @param password .
*/
public void connect(String host, String clientID, String username, String password) {
MqttClient client;
try {
client = new MqttClient(host, clientID, new MemoryPersistence());
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(false);
options.setUserName(username);
options.setPassword(password.toCharArray());
options.setConnectionTimeout(30);
options.setKeepAliveInterval(20);
MqttPushClient.setClient(client);
try {
client.setCallback(pushCallback);
client.connect(options);
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 发布,默认qos为0,非持久化
*
* @param topic .
* @param pushMessage .
*/
public void publish(String topic, String pushMessage) {
publish(0, false, topic, pushMessage);
} /**
* 发布主题和消息队列
*
* @param qos .
* @param retained .
* @param topic .
* @param pushMessage .
*/
public void publish(int qos, boolean retained, String topic, String pushMessage) {
MqttMessage message = new MqttMessage();
message.setQos(qos);
message.setRetained(retained);
message.setPayload(pushMessage.getBytes());
MqttTopic mTopic = MqttPushClient.getClient().getTopic(topic);
if (null == mTopic) {
LOGGER.error("topic not exist");
}
MqttDeliveryToken token;
try {
token = mTopic.publish(message);
token.waitForCompletion();
} catch (MqttPersistenceException e) {
e.printStackTrace();
} catch (MqttException e) {
e.printStackTrace();
}
} /**
* 订阅某个主题,qos默认为0
*
* @param topic .
*/
public void subscribe(String topic) {
subscribe(topic, 0);
} /**
* 订阅某个主题
*
* @param topic .
* @param qos .
*/
public void subscribe(String topic, int qos) {
try {
MqttPushClient.getClient().subscribe(topic, qos);
} catch (MqttException e) {
e.printStackTrace();
}
} }

还有对应回调函数,实现MqttCallback 接口之后要实现三个方法,如果出现需要断开重连操作就在connectionLost方法中操作,如果需要从我们订阅主题拿到数据保存到数据库,那么就在messageArrived方法里操作。SystemConstants是我写的一个

配置连接信息的类,大家改成自己的信息就好了。

import com.alibaba.fastjson.JSONObject;import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.util.StringUtils; import java.math.BigDecimal;
import java.util.Date;
import java.util.UUID; /**
* mqtt回调类
*
* @author Victor
*/
@Configuration
public class PushCallback implements MqttCallback { @Autowired
private MqttPushClient mqttPushClient; @Autowired
private DeviceDao deviceDao; @Override
public void connectionLost(Throwable cause) {
// 连接丢失后,一般在这里面进行重连
System.out.println("连接断开,可以做重连");
mqttPushClient.connect(SystemConstants.HOST_URL + ":" + SystemConstants.PORT, "consumer" + SystemConstants.CLIENT_ID, SystemConstants.USERNAME, SystemConstants.PASSWORD);
mqttPushClient.subscribe("aaa");
} @Override
public void deliveryComplete(IMqttDeliveryToken token) {
System.out.println("deliveryComplete---------" + token.isComplete());
} @Override
public void messageArrived(String topic, MqttMessage message) {
// subscribe后得到的消息会执行到这里面
System.out.println("接收消息主题 : " + topic);
System.out.println("接收消息Qos : " + message.getQos());
System.out.println("接收消息内容 : " + new String(message.getPayload()));
}
}

如果想要把mqtt配到application中启动只需要在application启动类中添加PostConstruct注解即可

/**
* 接受订阅的接口和消息,mqtt消费端
*/
@PostConstruct
public void consumeMqttClient() {
mqttPushClient.connect(SystemConstants.HOST_URL + ":" + SystemConstants.PORT, "consumer" + SystemConstants.CLIENT_ID, SystemConstants.USERNAME, SystemConstants.PASSWORD);
mqttPushClient.subscribe("aaa");
}

到此为止,mqtt集成spriongboot就完成了。

新手写博,如有不对请多指教

mqtt使用二(集成到java代码中)的更多相关文章

  1. 在java代码中执行js脚本,实现计算出字符串“(1+2)*(1+3)”的结果

            今天在公司项目中,发现一个计算运费的妙招.由于运费规则各种各样,因此写一个公式存到数据库.下次需要计算运费时,直接取出这个公式,把公式的未知变量给替换掉,然后计算出结果就是ok了. 一 ...

  2. java代码中fastjson生成字符串和解析字符串的方法和javascript文件中字符串和json数组之间的转换方法

    1.java代码中fastjson生成字符串和解析字符串的方法 List<TemplateFull> templateFulls = new ArrayList<TemplateFu ...

  3. Spring MVC框架下在java代码中访问applicationContext.xml文件中配置的文件(可以用于读取配置文件内容)

    <bean id="propertyConfigurer" class="com.****.framework.core.SpringPropertiesUtil& ...

  4. 使用mongo-java-driver3.0.2.jar和mongodb3.0在java代码中的用户验证4

    以下是使用mongo-java-driver3.0.2.jar和mongodb3.0.4在java代码中的用户验证: ServerAddress sa = new ServerAddress(host ...

  5. Android color(颜色) 在XML文件和java代码中

    Android color(颜色) 在XML文件和java代码中,有需要的朋友可以参考下. 1.使用Color类的常量,如: int color = Color.BLUE;//创建一个蓝色 是使用An ...

  6. 关于在Java代码中写Sql语句需要注意的问题

    最近做程序,时不时需要自己去手动将sql语句直接写入到Java代码中,写入sql语句时,需要注意几个小问题. 先看我之前写的几句简单的sql语句,自以为没有问题,但是编译直接报错. String st ...

  7. java代码中获取进程process id(转)

    另一方面,线程ID=进程ID+内部线程对象ID并不成立,    参考: blog.csdn.net/heyetina/article/details/6633901     如何在java代码中获取进 ...

  8. android中在java代码中设置Button按钮的背景颜色

    android中在java代码中设置Button按钮的背景颜色 1.设置背景图片,图片来源于drawable: flightInfoPanel.setBackgroundDrawable(getRes ...

  9. Java代码中获取Json的key值

    测试json字符串: {"access_token":"hkbQl5o_l67dZ7_vJRATKBwTLk9Yj5QyMuOJThAr8Baj0xWf4wxW1p4ym ...

随机推荐

  1. Electron在Windows下的环境搭建

    Electron作为一种用javascript写桌面程序的开发方式,现在已经被大众接受.下面就介绍如何在windows(>win7)下快速搭建Electron开发环境. 1. nodejs 的安 ...

  2. Python & Selenium & Pycharm 环境搭建

    最近在研究python+selenium进行自动化测试.然后用的python开发工具是Pycharm.然后,今天就跟大家讲一下怎么搭建一整套的自动化测试环境. 安装python 首先,安装python ...

  3. 佛系结对编程---四则运算(Core 第四组)

    ----by core 第四组 ( 邹卫其 范力 ) 一. 项目介绍 1. 能自动生成小学四则运算题目并给出答案,生成题目时可以选择下列参数:   1)生成题目数量   2)每道题目中运算数数量   ...

  4. wget 模拟 get post请求

    wget命令 默认采用GET请求, 如果使用POST请求, wget --post-data '' url              // 这样 POST 请求没有请求体.

  5. python UI自动化实战记录八:添加配置

    添加配置文件写入测试地址等,当环境切换时只需修改配置文件即可. 1 在项目目录下添加文件 config.ini 写入: [Domain] domain = http://test.domain.cn ...

  6. pexpect 初坑

    通过一个很坑的任务,最近认识了一个新坑: pexpect .其实基本的用法并不难,不过,我还是跟以前一样,把几个基本函数的坑蹚了个遍.有感而发,记录一下. 首先简单的介绍一下这个坑,哦不对,这个库.这 ...

  7. 在thinkphp5.0中调用ajax时, 返回的JSON 格式数据在html前台不能用时

    在thinkphp5.0中调用ajax时,如果控制器返回的数据为json格式,视图层接收到返回值即为json格式的数据,此时应该把 JSON 文本转换为 JavaScript 对象,方便调用.具体代码 ...

  8. python 爬取猫眼下的榜单(一)--单个页面

    #!/usr/bin/env python # -*- coding: utf- -*- # @Author: Dang Kai # @Date: -- :: # @Last Modified tim ...

  9. 决策树在sklearn中的实现

    1 概述 1.1 决策树是如何工作的 1.2 构建决策树 1.2.1 ID3算法构建决策树 1.2.2 简单实例 1.2.3 ID3的局限性 1.3 C4.5算法 & CART算法 1.3.1 ...

  10. python之self

    python中的self与Java中的this类似,类的函数通过self引用从而实现对类的数据类型进行访问操作. 1. self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数.(类的方法与 ...