添加pom
<!--************ mqtt *****************-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId>
</dependency>
配置文件
com:
mqtt:
inbound:
url: tcp://192.168.0.1:1883
clientId: test-inbound
topics: topic1,topic2
username: root
password: 123456
outbound:
urls: tcp://192.168.0.61:1883
clientId: test-outbound
topic: topic1
username: root
password: 123456
#密码加盐
salt: 123456
配置类
@Data
@ConfigurationProperties(prefix = "com.mqtt")
public class MqttProperties {
private String salt;
private MqttInboundProperties inbound;
private MqttOutboundProperties outbound;
}
@Data
public class MqttInboundProperties {
private String url;
private String username;
private String password;
private String clientId;
private String topics;
}
@Data
public class MqttOutboundProperties {
private String urls;
private String username;
private String password;
private String clientId;
private String topic;
}
@Configuration
public class MqttOutboundConfiguration {
@Autowired
private MqttProperties mqttProperties;
@Bean
public MqttConnectOptions getMqttConnectOptions(){
MqttConnectOptions mqttConnectOptions=new MqttConnectOptions();
mqttConnectOptions.setServerURIs( mqttProperties.getOutbound().getUrls().split(","));
mqttConnectOptions.setKeepAliveInterval(100);
mqttConnectOptions.setMaxInflight(1000);
mqttConnectOptions.setUserName(mqttProperties.getOutbound().getUsername());
mqttConnectOptions.setPassword(mqttProperties.getOutbound().getPassword().toCharArray());
mqttConnectOptions.setAutomaticReconnect(true);
return mqttConnectOptions;
}
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
factory.setConnectionOptions(getMqttConnectOptions());
return factory;
}
@Bean
@ServiceActivator(inputChannel = "mqttOutboundChannel")
public MessageHandler mqttOutbound() {
MqttPahoMessageHandler messageHandler =
new MqttPahoMessageHandler(mqttProperties.getOutbound().getClientId(), mqttClientFactory());
messageHandler.setAsync(true);
messageHandler.setDefaultTopic(mqttProperties.getOutbound().getTopic());
return messageHandler;
}
@Bean
public MessageChannel mqttOutboundChannel() {
return new DirectChannel();
}
}
@Configuration
@Slf4j
public class MqttInboundConfiguration {
@Autowired
private MqttProperties mqttProperties;
@Bean
public MessageChannel mqttInputChannel() {
return new DirectChannel();
}
@Bean
public MqttConnectOptions getMqttConnectOptions(){
MqttConnectOptions mqttConnectOptions=new MqttConnectOptions();
mqttConnectOptions.setServerURIs( mqttProperties.getInbound().getUrl().split(","));
mqttConnectOptions.setKeepAliveInterval(100);
mqttConnectOptions.setMaxInflight(1000);
mqttConnectOptions.setUserName(mqttProperties.getInbound().getUsername());
mqttConnectOptions.setPassword(mqttProperties.getInbound().getPassword().toCharArray());
mqttConnectOptions.setAutomaticReconnect(true);
return mqttConnectOptions;
}
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
factory.setConnectionOptions(getMqttConnectOptions());
return factory;
}
@Bean
public MessageProducer inbound(MqttPahoClientFactory mqttPahoClientFactory) {
String[] inboundTopics = mqttProperties.getInbound().getTopics().split(",");
MqttPahoMessageDrivenChannelAdapter adapter =
new MqttPahoMessageDrivenChannelAdapter(mqttProperties.getInbound().getClientId(),
mqttPahoClientFactory,inboundTopics);
adapter.setCompletionTimeout(5000);
adapter.setConverter(new DefaultPahoMessageConverter());
adapter.setQos(1);
adapter.setOutputChannel(mqttInputChannel());
return adapter;
}
@Bean
@ServiceActivator(inputChannel = "mqttInputChannel")
public MessageHandler handler() {
return message -> log.info("收到消息:"+ message.getPayload());
}
}
发送信息的接口
@Component
@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
public interface MqttGateway {
/**
* 发送信息
* @param data
*/
void sendToMqtt(String data);
/**
* 指定主题发送信息
* @param topic
* @param payload
*/
void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, String payload);
/**
* 指定主题和qos发送信息
* @param topic
* @param qos
* @param payload
*/
void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload);
}
注意
在启动类上加上注解 @EnableConfigurationProperties(MqttProperties.class)