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. c# FTP操作类(转)

    using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Net ...

  2. DataS-2

    2.4 证明对任意常数k,(称此式为公式A) 证明: ①当k1<k2时,,因此只需证明正数对公式A成立: ②当k=0或1时,显然有和满足公式A: ③假设k<i (i>1)时,都满足公 ...

  3. 使用UIDynamicAnimator创建重力感应的View

    使用UIDynamicAnimator创建重力感应的View http://www.raywenderlich.com/zh-hans/52617/uikit-力学教程 详细教程请参考上面的链接,此处 ...

  4. vscode:配置git

    1.下载git,并找到安装git的文件位置,并找到git文件夹下面的Bin文件夹    2.配置环境变量 位置:右击‘计算机’->属性->高级系统设置->环境变量 最后点击确定即可 ...

  5. Simotion 绝对值编码器使用外部开关回零

    问题来源: 西门子的1FK7二代电机,目前已经没有增量编码器.标准的编码器选项是单圈绝对值,或多圈绝对值. 在某些应用中,如印刷机的版辊.模切轴.飞剪电机等,需要使用外部开关来回零.下文描述了使用外部 ...

  6. July 21st 2017 Week 29th Friday

    If you want to fly too high in relation to the horizon forget. 要想飞得高,就该把地平线忘掉. Always keep our eyes ...

  7. February 1 2017 Week 5 Wednesday

    If you can't get a miracle, become one. 如果奇迹没有眷顾你,那就让自己变成奇迹吧. If you think you are bad luck, you did ...

  8. 035server端并发聊天

    import socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): # 里面是每个客户端连接执 ...

  9. [USACO07OPEN]吃饭Dining

    嘟嘟嘟 这应该是网络流入门题之一了,跟教辅的组成这道题很像. 把每一只牛看成书,然后对牛拆点,因为每一只牛只要一份,食物和饮料分别看成练习册和答案. #include<cstdio> #i ...

  10. 启用 DHCP

    #开启DHCP协议 Get-NetIPInterface -Dhcp Disabled|Set-NetIPInterface -Dhcp Enabled #开启本机上所有博通网卡的DHCP Get-W ...