<!--mqttv3依赖-->
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.2</version>
</dependency>

MqttTool.java

package com.mingshine.navcloud.mqtt;

import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
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;

import javax.annotation.PostConstruct;

@Component
public class MqttTool {
Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
private OnMessageCallback onMessageCallback;

private final String HOST = "tcp://XXXXXXXX:1883"; //连接ip
private final String TOPIC_CLOUD_DATA = "NAV-CLOUD";
private final String TOPIC_SYS = "$SYS/brokers/+/clients/+/connected";
// private final String TOPIC_SYS = "$SYS/brokers/+/clients/#";

// private final String[] TOPIC = new String[]{"NAV-CLOUD", "$SYS/brokers/+/clients/#", "$SYS/brokers/+/clients/+/connected", "$SYS/brokers/+/clients/+/disconnected"}; //订阅队列
private final String mClientId = "NAV-CLOUD-SERVER-1"; //连接id,注意不要和已有的连接id重复

private MqttClient mClient;
private MqttConnectOptions mConnOpts;
private String mUserName = "admin";
private String mPassWord = "password";

@PostConstruct
public void init() {
start();
}

private void start() {
try {
mClient = new MqttClient(HOST, mClientId, new MemoryPersistence());
mConnOpts = new MqttConnectOptions();
mConnOpts.setCleanSession(true); // 清空session
mConnOpts.setConnectionTimeout(10);// 设置超时时间
mConnOpts.setKeepAliveInterval(20);// 设置会话心跳时间
mConnOpts.setUserName(mUserName);
mConnOpts.setPassword(mPassWord.toCharArray());
mClient.setCallback(onMessageCallback); // 设置回调函数
mClient.connect(mConnOpts); // 创立连接
mClient.subscribe(TOPIC_CLOUD_DATA, 0); // 订阅
// mClient.subscribe(TOPIC_SYS, 1); // 订阅
} catch (Exception e) {
e.printStackTrace();
}
}

public void publish(String topic, byte[] payload) {
try {
this.mClient.publish(topic, payload, 1, false);
} catch (MqttException e) {
e.printStackTrace();
}
}

public void close() {
try {
this.mClient.close();
} catch (MqttException e) {
e.printStackTrace();
}
}

public void reConnect() throws Exception {
if (this.mClient != null) {
logger.info("开始重连");
this.mClient.connect(this.mConnOpts);
mClient.subscribe(TOPIC_CLOUD_DATA, 0); // 订阅
mClient.subscribe(TOPIC_SYS, 1); // 订阅
}
}

}

OnMessageCallback.java

package com.mingshine.navcloud.mqtt;

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class OnMessageCallback implements MqttCallback {
public Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
private MqttTool mMqttTool;

public void connectionLost(Throwable cause) {
// 连接丢失后,一般在这里面进行重连
System.out.println("连接断开,可以做重连");
while (true) {
try {
Thread.sleep(5000L);
mMqttTool.reConnect();
break;
} catch (Exception e) {
e.printStackTrace();
}
}
}

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()));
// String msg = new String(message.getPayload());
JSONObject jsonObject = JSON.parseObject(msg);
String clientId = String.valueOf(jsonObject.get("clientid"));
if (topic.endsWith("disconnected")) {
logger.info("客户端已掉线:{}", clientId);
} else {
logger.info("客户端已上线:{}", clientId);
}

}

public void deliveryComplete(IMqttDeliveryToken token) {
System.out.println("deliveryComplete---------" + token.isComplete());
}


}

DeviceCloudController.java

package com.mingshine.navcloud.controller;

import com.mingshine.navcloud.base.BaseController;
import com.mingshine.navcloud.base.BaseResult;
import com.mingshine.navcloud.mqtt.MqttTool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@CrossOrigin
@RestController
@RequestMapping("/device-cloud")
public class DeviceCloudController extends BaseController {

@Autowired
private MqttTool mMqttTool;

@RequestMapping("/sendCmd2Device")
public BaseResult<?> sendCmd2Device(String serialNum) {
BaseResult<?> result = BaseResult.result();
mMqttTool.publish(serialNum, "你好".getBytes());
return result;
}


}