方法一:使用spring-integration-mqtt
与springboot集成度更高,灵活程度不如org.eclipse.paho.client.mqttv3
org.springframework.boot spring-boot-starter-integration org.springframework.integration spring-integration-stream org.springframework.integration spring-integration-mqtt
application.yml
spring:
mqtt:
enable: true
url: tcp://127.0.0.1:1883
username:
password:
#MQTT-连接服务器默认客户端ID
#生产者和消费者是单独连接服务器会使用到一个clientid(客户端id),如果是同一个clientid的话会出现Lost connection: 已断开连接; retrying...
consumerclientid: clientid1234231212_c
producerclientid: clientid1234231212_p
#连接超时,单位ms
timeout: 5000
#1.5*Keep Alive 的时间间隔心跳,单位为秒
keepalive: 2
# deviceId
#deviceId: your_deviceId
# mqtt-topic
producertopic: /master/info
consumertopic: /+/sys/motor, /+/sys/media, /+/sys/general, /+/sys/rc, /+/sys/rtk, /+/mission, /+/power, /+/v3/sys/general
MqttConfig.class
package org.young.common.mqtt;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.IntegrationComponentScan;
import org.springframework.integration.annotation.MessagingGateway;
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.integration.mqtt.support.MqttHeaders;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
@Configuration
@IntegrationComponentScan
@ConditionalOnProperty(value = "spring.mqtt.enable", havingValue = "true")
public class MqttConfig {
private static final Logger logger = LoggerFactory.getLogger(MqttConfig.class);
@Value("${spring.mqtt.username}")
private String username;
@Value("${spring.mqtt.password}")
private String password;
@Value("${spring.mqtt.url}")
private String hostUrl;
@Value("${spring.mqtt.producerclientid}")
private String producerClientId;
@Value("${spring.mqtt.producertopic}")
private String producerTopic;
//生产者和消费者是单独连接服务器会使用到一个clientid(客户端id),如果是同一个clientid的话会出现Lost connection: 已断开连接; retrying...
@Value("${spring.mqtt.consumerclientid}")
private String consumerClientId;
@Value("${spring.mqtt.consumertopic}")
private String[] consumerTopic;
@Value("${spring.mqtt.timeout}")
private int timeout; //连接超时
@Value("${spring.mqtt.keepalive}")
private int keepalive; //连接超时
//入站通道名(消费者)订阅的bean名称
public static final String CHANNEL_NAME_IN = "mqttInboundChannel";
//出站通道名(生产者)发布的bean名称
public static final String CHANNEL_NAME_OUT = "mqttOutboundChannel";
/**
* MQTT连接器选项
*
* @return {@link MqttConnectOptions}
*/
@Bean
public MqttConnectOptions getMqttConnectOptions() {
MqttConnectOptions mqt