简体   繁体   中英

Mqtt-Integration in Spring Boot

i try to integrate mqtt in my Spring Boot Java Project.

My depdency:

<dependency>
        <groupId>org.springframework.integration</groupId>
        <artifactId>spring-integration-mqtt</artifactId>
        <scope>compile</scope>
        <exclusions>
            <exclusion>
                <artifactId>jackson-module-kotlin</artifactId>
                <groupId>com.fasterxml.jackson.module</groupId>
            </exclusion>
        </exclusions>
    </dependency>

I created a Java-Class named MqttClient. Here i try this:

IMqttClient publisher = new org.eclipse.paho.client.mqttv3.MqttClient("pfad", publisherId);

I get a Error here: org.eclipse.paho.client.mqttv3.MqttClient

Error:Unhandled exception: org.eclipse.paho.client.mqttv3.MqttException

Any idea whats wrong?

Can't figure out what is the problem? I did solve the same problem in following fashion. See if it works for you. I have a mqtt gateway class defined as below.

import org.springframework.integration.annotation.MessagingGateway;

@MessagingGateway(defaultRequestChannel = "mqttPromiseOutboundChannel")
public interface MqttPromiseGateway {

    void sendToMqtt(String data);
}

When I want to send a message to Mqtt, I autowire the defined gateway class.

@Autowired
private MqttPromiseGateway mqttPromiseGateway;

Now I can send a message over that Mqtt channel using that gateway.

 mqttPromiseGateway.sendToMqtt(content);

We also define a service for MqttProducer.

@Service
public class DemoMqttProducer {

    @Bean
    public MqttPahoClientFactory mqttClientFactory() {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        MqttConnectOptions options = new MqttConnectOptions();
        options.setServerURIs(new String[] { "tcp://localhost:1883" });
        options.setUserName("myusername");
        options.setPassword("mypassword#".toCharArray());
        factory.setConnectionOptions(options);
        return factory;
    }


    @Bean
    @ServiceActivator(inputChannel = "mqttPromiseOutboundChannel")
    public MessageHandler mqttPromiseOutbound() {
        MqttPahoMessageHandler messageHandler =
                new MqttPahoMessageHandler("testClient", mqttClientFactory());
        messageHandler.setAsync(true);
        messageHandler.setDefaultTopic("Promise");
        return messageHandler;
    }

    @Bean
    public MessageChannel mqttOutboundChannel() {
        return new DirectChannel();
    }
    @Bean
    public MessageChannel mqttPromiseOutboundChannel() {
        return new DirectChannel();
    }
    @Bean
    public IntegrationFlow mqttInFlow() {
        return IntegrationFlows.from(mqttInbound())
                .transform(p -> p + ", received from MQTT")
                .handle(logger())
                .get();
    }

    @Bean
    public MessageProducerSupport mqttInbound() {
        MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter("siSampleConsumer",
                mqttClientFactory(), "Promise");
        adapter.setCompletionTimeout(5000);
        adapter.setConverter(new DefaultPahoMessageConverter());
        adapter.setQos(1);
        return adapter;
    }    

}

The method mqttInflow will get the incoming message and send it to logger. If you want to handle it differently, you need to change that method.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM