MQTT协议简介
可以理解为消息队列,发布者向终端发布,终端推送到订阅者。
相关依赖
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId>
<version>6.1.5</version>
</dependency>
连接配置
package org.dromara.project.mqtt;
import lombok.extern.slf4j.Slf4j;
import org.dromara.project.config.MqttProperties;
import org.dromara.project.constant.MqttConstant;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.core.MessageProducer;
import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler;
import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
@Configuration
@Slf4j
public class MQTTPahoClientFactory {
@Autowired
MqttProperties mqttProperties;
@Bean
public MqttPahoClientFactory mqttClientFactory() {
log.info("mqttProperties:{}", mqttProperties);
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
MqttConnectOptions options = new MqttConnectOptions();
options.setServerURIs(new String[]{mqttProperties.getServerUrl()});
options.setUserName(mqttProperties.getUserName());
options.setPassword(mqttProperties.getPassword().toCharArray());
log.info("MQTT配置:{}", options.toString());
factory.setConnectionOptions(options);
return factory;
}
@Bean
public MessageChannel mqttInputChannel() {
return new DirectChannel();
}
@Bean
public MessageChannel mqttOutboundChannel() {
return new DirectChannel();
}
@Bean
public MessageProducer inbound() {
MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter("consumerClient-paho",
mqttClientFactory(), MqttConstant.TOPIC_ARR);
adapter.setCompletionTimeout(5000);
DefaultPahoMessageConverter defaultPahoMessageConverter = new DefaultPahoMessageConverter();
adapter.setConverter(defaultPahoMessageConverter);
adapter.setQos(1);
adapter.setOutputChannel(mqttInputChannel());
return adapter;
}
@Bean
@ServiceActivator(inputChannel = "mqttOutboundChannel")
public MessageHandler outbound() {
MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler("publishClient", mqttClientFactory());
messageHandler.setAsync(true);
messageHandler.setDefaultTopic("command");
messageHandler.setDefaultQos(1);
DefaultPahoMessageConverter defaultPahoMessageConverter = new DefaultPahoMessageConverter();
messageHandler.setConverter(defaultPahoMessageConverter);
return messageHandler;
}
}
MQTT的对应的properties配置类
package org.dromara.project.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "mqtt")
public class MqttProperties {
private String serverUrl;
private String userName;
private String password;
}
MQTT的yml配置
---
mqtt:
serverUrl : tcp://127.0.0.1:1883
userName : user
password : 123456
启动后配置展示
MQTT客户端代码
package org.dromara.project.mqtt;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.dromara.project.constant.MqttConstant;
import org.dromara.project.mqttServer.MessageBaseHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.messaging.MessageHandler;
@Slf4j
@Configuration
public class MqttClient {
@Resource
private MessageBaseHandler messageBaseHandler;
@Bean
@ServiceActivator(inputChannel = "mqttInputChannel")
public MessageHandler handler() {
return message -> {
String payload = message.getPayload().toString();
String topic = message.getHeaders().get("mqtt_receivedTopic").toString();
messageBaseHandler.handleBaseMessage(message);
};
}
}
测试工具下载链接(偷个懒。。)
MQTT工具下载地址
测试工具主要配置
运行结果-接收成功