文章转载自:Springboot中使用MQTT的详细教程
注意:本文已做稍加改动,如有出处以原文章为准
一、安装 maven 包
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.5</version>
</dependency>
二、代码实现
1. 代码目录
2. MqttProperties.java
package com.voice.mqtt.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "mqtt")
public class MqttProperties {
private String clientId;
private String address;
private String username;
private String password;
}
3. application.yml
mqtt:
clientId: server_client
address: tcp://127.0.0.1:1883
username: emqx
password: public
4. MqttFactory.java
package com.voice.mqtt.factory;
import cn.hutool.extra.spring.SpringUtil;
import com.voice.mqtt.properties.MqttProperties;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
@Slf4j
public class MqttFactory {
private static MqttClient client;
/**
* 获取客户端实例
* 单例模式, 存在则返回, 不存在则初始化
*/
public static MqttClient getInstance() {
if (client == null) {
init();
}
return client;
}
/**
* 初始化客户端
*/
public static void init() {
MqttProperties configuration = SpringUtil.getBean(MqttProperties.class);
try {
client = new MqttClient(configuration.getAddress(), configuration.getClientId());
// MQTT配置对象
MqttConnectOptions options = new MqttConnectOptions();
options.setUserName(configuration.getUsername());
options.setPassword(configuration.getPassword().toCharArray());
options.setCleanSession(true);
options.setConnectionTimeout(3000);
options.setKeepAliveInterval(20);
// 设置自动重连, 其它具体参数可以查看MqttConnectOptions
options.setAutomaticReconnect(true);
if (!client.isConnected()) {
client.connect(options);
}
} catch (MqttException e) {
log.error(String.format("MQTT: 连接消息服务器[%s]失败", configuration.getAddress()));
}
}
}
5. MessageListener.java
package com.voice.mqtt.listener;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttMessageListener;
import org.eclipse.paho.client.mqttv3.MqttMessage;
@Slf4j
public class MessageListener implements IMqttMessageListener {
/**
* 处理消息
* @param topic 主题
* @param mqttMessage 消息
*/
@Override
public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
log.info(String.format("MQTT: 订阅主题[%s]发来消息[%s]", topic, new String(mqttMessage.getPayload())));
}
//使用示例
// public static void main(String[] args) {
// //订阅主题test01, 使用MessageListener来处理它的消息
// MqttUtil.subscribe("test01", new MessageListener());
// }
}
6. MqttUtil.java
package com.voice.mqtt.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.voice.mqtt.factory.MqttFactory;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttMessageListener;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import java.nio.charset.StandardCharsets;
@Slf4j
public class MqttUtil {
/**
* 发送消息
* @param topic 主题
* @param data 消息内容
*/
public static void send(String topic, Object data){
// 获取客户端实例
MqttClient client = MqttFactory.getInstance();
ObjectMapper mapper = new ObjectMapper();
try {
// 转换消息为json字符串
String json = mapper.writeValueAsString(data);
client.publish(topic, new MqttMessage(json.getBytes(StandardCharsets.UTF_8)));
} catch (JsonProcessingException e) {
log.error(String.format("MQTT: 主题[%s]发送消息转换json失败", topic));
} catch (Exception e) {
log.error(String.format("MQTT: 主题[%s]发送消息失败", topic));
}
}
/**
* 订阅主题
* @param topic 主题
* @param listener 消息监听处理器
*/
public static void subscribe(String topic, IMqttMessageListener listener) {
MqttClient client = MqttFactory.getInstance();
try {
client.subscribe(topic, listener);
} catch (MqttException e) {
log.error(String.format("MQTT: 订阅主题[%s]失败", topic));
}
}
}
7.测试
@RestController
public class TestController {
@GetMapping("/test")
public String index(){
Map<String, Object> map = new HashMap<>();
map.put("age",111);
MqttUtil.send("/room",map);
return "test";
}
}