<!--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;
}
}