sprigboot连接MQTT服务器

添加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)

要在Spring Boot应用中使用MQTT协议,可以使用Eclipse Paho MQTT客户端库。以下是基于Spring Boot的MQTT连接的步骤: 1. 添加Maven依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.5</version> </dependency> ``` 2. 配置application.properties 在application.properties文件中添加MQTT连接相关的配置: ``` mqtt.server.uri=tcp://localhost:1883 mqtt.client.id=myClient mqtt.topic=test/topic mqtt.qos=1 ``` 其中,mqtt.server.uri表示MQTT服务器的URI地址,mqtt.client.id表示客户端ID,mqtt.topic表示要订阅的主题,mqtt.qos表示消息的质量。 3. 创建MQTT客户端 在Spring Boot应用程序中创建MQTT客户端,可以使用以下代码: ```java @Autowired private MqttClient mqttClient; @Value("${mqtt.server.uri}") private String serverURI; @Value("${mqtt.client.id}") private String clientId; @PostConstruct public void init() { try { mqttClient = new MqttClient(serverURI, clientId); } catch (MqttException e) { e.printStackTrace(); } } ``` 4. 订阅主题 使用以下代码订阅主题: ```java try { mqttClient.subscribe(topic, qos); } catch (MqttException e) { e.printStackTrace(); } ``` 其中,topic是要订阅的主题,qos表示消息质量。 5. 发布消息 使用以下代码发布消息: ```java try { MqttMessage message = new MqttMessage(); message.setPayload(payload.getBytes()); message.setQos(qos); mqttClient.publish(topic, message); } catch (MqttException e) { e.printStackTrace(); } ``` 其中,payload是要发布的消息内容,qos表示消息质量,topic表示要发布的主题。 这样,就可以在Spring Boot应用程序中使用MQTT协议连接MQTT服务器,并订阅和发布MQTT消息了。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值