pom
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.1.0</version>
</dependency>
接收端
package com.sitech.mqtt.mqtt;
@Component
public class ReportMqtt implements MqttCallback {
@Value("${host}")
public String HOST ;
@Value("${SH_INCOMING_TOPIC}")
public String TOPIC;
@Value("${name}")
private String name;
@Value("${password}")
private String passWord ;
private MqttClient client;
private MqttConnectOptions options;
//clientId不能重复所以这里我设置为系统时间
String clientid= String.valueOf(System.currentTimeMillis());
MessageInfo info =new MessageInfo();
@PostConstruct
public void result() {
try {
// host为主机名,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
client = new MqttClient(HOST, clientid, new MemoryPersistence());
// MQTT的连接设置
options = new MqttConnectOptions();
// 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
options.setCleanSession(true);
// 设置连接的用户名
options.setUserName(name);
// 设置连接的密码
options.setPassword(passWord.toCharArray());
// 设置超时时间 单位为秒
options.setConnectionTimeout(10);
// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
options.setKeepAliveInterval(3600);
// 设置回调
client.setCallback(this);
client.connect(options);
//订阅消息
int[] Qos = {1};
String[] topic1 = {TOPIC};
client.subscribe(topic1, Qos);
} catch (Exception e) {
log.info("ReportMqtt客户端连接异常,异常信息:"+e);
}
}
@Override
public void connectionLost(Throwable throwable) {
try {
log.info("程序出现异常,DReportMqtt断线!正在重新连接...:");
client.close();
this.result();
log.info("ReportMqtt重新连接成功");
} catch (MqttException e) {
log.info(e.getMessage());
}
}
@Override
public void messageArrived(String topic, MqttMessage message) {
log.info("接收消息主题:"+ topic);
log.info("接收消息Qos:"+ message.getQos());
log.info("接收消息内容 :"+ new String(message.getPayload()));
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
log.info("消息发送成功");
}
}
package com.sitech.mqtt.mqtt;
@RestController
@RequestMapping("/mqtt")
@Component
public class PlatformMqtt implements MqttCallback {
@Value("${host}")
private String HOST;
@Value("${name}")
private String name;
@Value("${password}")
private String passWord;
private MqttClient client;
private MqttMessage message;
private final static Logger log = LoggerFactory.getLogger(PlatformMqtt.class);
String clientid= String.valueOf(System.currentTimeMillis());
@PostConstruct
public void send() {
try {
client = new MqttClient(HOST, clientid, new MemoryPersistence());
} catch (MqttException e) {
e.printStackTrace();
}
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(false);
options.setUserName(name);
options.setPassword(passWord.toCharArray());
// 设置超时时间
options.setConnectionTimeout(10);
// 设置会话心跳时间
options.setKeepAliveInterval(3600);
try {
client.setCallback(this);
client.connect(options);
} catch (Exception e) {
log.info("platform-Mqtt客户端连接异常,异常信息:"+e);
}
}
@RequestMapping("/request")
@ResponseBody
public void publish(@RequestBody InputParameter<Map<String, Object>> parameter) throws MqttException {
String body= String.valueOf(parameter.getRequestBody().get("body"));
String topic= String.valueOf(parameter.getRequestBody().get("topic"));
topic="DataTopic/"+topic;
log.info("请求主题为:"+topic+",消息为:"+body);
message = new MqttMessage();
message.setQos(0);
message.setRetained(false);
message.setPayload(body.getBytes());
client.publish(topic,message);
}
@Override
public void connectionLost(Throwable throwable) {
log.info("程序出现异常,正在重新连接...:");
try {
client.close();
send();
} catch (MqttException e) {
log.info(e.getMessage());
}
log.info("platform-Mqtt重新连接成功");
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) {
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
log.info("消息发送成功");
}
}