##交互结构图
使用步骤
1.安装MQTT broker
mqtt broker 有很多种,这里使用apache-apollo演示
转载链接: apache-apollo服务器安装与使用
2.安装MQTTfx工具
转载链接: MQTT 1.7.1下载安装和使用
3.项目代码
3.1依赖 pom.xml
<!--MQTT-->
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
3.2 application.yml
#MQTT
mqtt:
host: tcp://localhost:61613
#topic 可以是数组
topics: test,test1,test2,test3
name: admin
password: password
3.2 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 org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
@RestController
@RequestMapping("/mqtt")
@Component
@Slf4j
public class PlatformMqtt implements MqttCallback {
@Value("${mqtt.host}")
private String HOST;
@Value("${mqtt.topics}")
private String[] TOPICS;
@Value("${mqtt.name}")
private String name;
@Value("${mqtt.password}")
private String passWord;
private MqttClient client;
//clientId即连接MQTT的客户端ID,一般以唯一标识符表示 ,这里直接弄成时间戳
String clientId = String.valueOf(System.currentTimeMillis());
@PostConstruct
public void send() {
try {
// host为主机名,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
client = new MqttClient(HOST, clientId, new MemoryPersistence());
} catch (MqttException e) {
e.printStackTrace();
}
// MQTT的连接设置
MqttConnectOptions options = new MqttConnectOptions();
// 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
options.setCleanSession(false);
// 设置连接的用户名
options.setUserName(name);
// 设置连接的密码
options.setPassword(passWord.toCharArray());
// 设置超时时间,单位为秒
options.setConnectionTimeout(10);
// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
options.setKeepAliveInterval(3600);
try {
// 设置回调
client.setCallback(this);
client.connect(options);
//设置需要订阅的主题topic,可以多个
client.subscribe(TOPICS);
} catch (Exception e) {
log.info("platform-Mqtt客户端连接异常,异常信息:" + e);
}
}
//测试
@GetMapping("/request")
public void publish(String body, String topic) throws MqttException {
log.info("请求主题为:" + topic + ",消息为:" + body);
MqttMessage message = new MqttMessage();
//MQTT消息发布服务质量 Qos :
//1.至多一次:(QoS == 0
//2.至少一次 (QoS == 1),确保信息到达,消息可能重复发生
//3.只有一次 (QoS == 2) 确保信息到达一次
message.setQos(0);
//retained :
//1.重新连接MQTT服务时,不需要接收该主题最新消息,设置retained为false;
//2.重新连接MQTT服务时,需要接收该主题最新消息,设置retained为true;
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 topic, MqttMessage mqttMessage) {
log.info("接收消息主题:" + topic);
log.info("接收消息Qos:" + mqttMessage.getQos());
log.info("接收消息内容 :" + new String(mqttMessage.getPayload()));
log.info("接收Id :" + String.valueOf(mqttMessage.getId()));
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
log.info("消息发送成功");
}
}
4.启动MQTT broker
apollo-broker run
5.mqtt客户端工具连接测试
打开mqttfx1.71
1.配置连接
配置id/端口
配置账号密码
连接成功
6.启动项目
项目启动会读取配置文件yml订阅主题
#topic 可以是数组
topics: test,test1,test2,test3
7.测试mqtt
7.1mqtt模拟设备向服务器发送消息
向test主题发送消息
收到消息
接收消息主题:test
接收消息Qos:1
接收消息内容 :hello ,test
7.2
订阅主题okok
服务器发送消息
发送成功