import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.stereotype.Component;
import java.util.Random;
@Slf4j
@Component
public class MqttPushClient {
private MqttClient client;
private static volatile MqttPushClient mqttPushClient = null;
public static MqttPushClient getInstance() {
if (null == mqttPushClient) {
synchronized (MqttPushClient.class) {
if (null == mqttPushClient) {
mqttPushClient = new MqttPushClient();
}
}
}
return mqttPushClient;
}
private MqttPushClient() {
connect();
}
private void connect() {
try {
String clientId ="";
client = new MqttClient("tcp://IP:PORT", clientId, new MemoryPersistence());
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(false);
options.setUserName("账号");
options.setPassword("密码".toCharArray());
options.setConnectionTimeout(10);
options.setKeepAliveInterval(20);
try {
client.setCallback(new PushCallback());
client.connect(options);
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void publish(String topic, String message1) throws MqttException {
publish(0, false, topic, message1);
}
public void publish(int qos, boolean retained, String topic, String message1) throws MqttException {
MqttMessage message = new MqttMessage();
message.setQos(qos);
message.setRetained(retained);
message.setPayload(message1.getBytes());
MqttTopic mTopic = client.getTopic(topic);
if (null == mTopic) {
log.error("topic not exist");
}
MqttDeliveryToken token;
token = mTopic.publish(message);
token.waitForCompletion();
}
public void subscribe(String topic) {
subscribe(topic, 0);
}
public void subscribe(String topic, int qos) {
try {
client.subscribe(topic, qos);
} catch (MqttException e) {
e.printStackTrace();
}
}
}
@Slf4j
public class PushCallback implements MqttCallback {
public void connectionLost(Throwable cause) {
log.info("连接断开,可以做重连");
MqttPushClient.getInstance();
}
public void deliveryComplete(IMqttDeliveryToken token) {
log.info("消息发送结果 ---------" + token.isComplete());
}
public void messageArrived(String topic, MqttMessage message) {
log.info("接收消息主题 : " + topic);
log.info("接收消息Qos : " + message.getQos());
log.info("接收消息内容 : " + new String(message.getPayload()));
}
}