maven依赖
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.5</version>
</dependency>
推送
package com.ifreegroup.mqttserver.util.mqtt;
import com.ifreegroup.mqttserver.bean.MqttRequestInfoBean;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class MqttProducerUtil {
private MqttClient mqttClient;
private final String clientId = "PUSH" + (int) (Math.random() * 100000000);
public void setMqttClient(MqttCallback mqttCallback, String url, String userName, String password) throws
MqttException {
MqttConnectOptions options = mqttConnectOptions(url, userName, password);
if (mqttCallback == null) {
mqttClient.setCallback(new MqttCallBack());
} else {
mqttClient.setCallback(mqttCallback);
}
mqttClient.connect(options);
}
private MqttConnectOptions mqttConnectOptions(String url, String userName, String password) throws MqttException {
mqttClient = new MqttClient(url, clientId, new MemoryPersistence());
MqttConnectOptions options = new MqttConnectOptions();
options.setUserName(userName);
options.setPassword(password.toCharArray());
options.setConnectionTimeout(60);
options.setAutomaticReconnect(false);
options.setCleanSession(false);
return options;
}
public void pub(String topic, String msg) throws MqttException {
log.info("----------开始发布主题:{},消息:{}", topic, msg);
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setPayload(msg.getBytes());
MqttTopic mqttTopic = mqttClient.getTopic(topic);
MqttDeliveryToken token = mqttTopic.publish(mqttMessage);
token.waitForCompletion();
}
public void pub(String topic, String msg, int qos) throws MqttException {
log.info("----------开始发布主题:{},消息:{}", topic, msg);
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setQos(qos);
mqttMessage.setPayload(msg.getBytes());
MqttTopic mqttTopic = mqttClient.getTopic(topic);
MqttDeliveryToken token = mqttTopic.publish(mqttMessage);
token.waitForCompletion();
}
public void close() throws MqttException {
mqttClient.close();
mqttClient.disconnect();
}
public void doPush(MqttRequestInfoBean mqttRequestInfoBean) throws
MqttException {
setMqttClient(new MqttCallBack(), mqttRequestInfoBean.getUrl(), mqttRequestInfoBean.getUserName(),
mqttRequestInfoBean.getPassword());
pub(mqttRequestInfoBean.getTopic(), mqttRequestInfoBean.getMessage());
}
}
订阅
package com.ifreegroup.mqttserver.util.mqtt;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@Slf4j
@Component
public class MqttConsumerUtil {
private MqttClient mqttClient;
private final String clientId = "SUB" + (int) (Math.random() * 100000000);
@Value("${config.mq-url}")
private String mqUrl;
@Value("config.mq-username")
private String mqUserName;
@Value("${config.mq-password}")
private String mqPassword;
@Value("${config.mq-topiclist}")
private List<String> mqTopicList;
public void setMqttClient(MqttCallback mqttCallback) throws MqttException {
MqttConnectOptions options = mqttConnectOptions();
if (mqttCallback == null) {
mqttClient.setCallback(new MqttCallBack());
} else {
mqttClient.setCallback(mqttCallback);
}
mqttClient.connect(options);
}
private MqttConnectOptions mqttConnectOptions() throws MqttException {
mqttClient = new MqttClient(mqUrl, clientId, new MemoryPersistence());
MqttConnectOptions options = new MqttConnectOptions();
options.setUserName(mqUserName);
options.setPassword(mqPassword.toCharArray());
options.setConnectionTimeout(100);
options.setAutomaticReconnect(true);
options.setCleanSession(false);
return options;
}
public void sub() throws MqttException {
log.info("----------开始订阅主题----------");
for (String topic : mqTopicList) {
mqttClient.subscribe(topic);
}
}
public void sub(int qos) throws MqttException {
log.info("----------开始订阅主题----------");
for (String topic : mqTopicList) {
mqttClient.subscribe(topic, qos);
}
}
public void close() throws MqttException {
mqttClient.close();
mqttClient.disconnect();
}
}
监听
package com.ifreegroup.mqttserver.util.mqtt;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class MqttListenerUtil implements ApplicationListener<ContextRefreshedEvent> {
private final MqttConsumerUtil server;
@Autowired
public MqttListenerUtil(MqttConsumerUtil server) {
this.server = server;
}
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
try {
server.setMqttClient(new MqttCallBack());
server.sub();
} catch (MqttException e) {
log.error(e.getMessage(), e);
}
}
}
回调函数
package com.ifreegroup.mqttserver.util.mqtt;
import com.ifreegroup.mqttserver.common.response.GlobalResponse;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.http.MediaType;
@Slf4j
public class MqttCallBack implements MqttCallback {
@Override
public void connectionLost(Throwable throwable) {
log.info("断开了MQTT连接 :{}", throwable.getMessage());
log.error(throwable.getMessage(), throwable);
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
log.info("发布消息成功");
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
String response = null;
String notice = new String(message.getPayload());
log.info("收到来自 " + topic + " 的消息:{}", notice);
if (topic.equals("xxxx")) {
log.info("----------MQTT接收终端:xxxx----------");
}
}
}