springboot配置MQTT 接收字节码

1、配置JAR包

		<dependency>
			<groupId>org.springframework.integration</groupId>
			<artifactId>spring-integration-stream</artifactId>
		</dependency>

		<!-- Spring Integration Mqtt -->
		<dependency>
			<groupId>org.springframework.integration</groupId>
			<artifactId>spring-integration-mqtt</artifactId>
		</dependency>
		<dependency>
			<groupId>org.eclipse.paho</groupId>
			<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
		</dependency>

2、在yml配置中增加MQTT的相关配置信息

3、设置mqtt配置类


@Configuration
@IntegrationComponentScan
@EnableConfigurationProperties({MqttProperties.class})
public class MqttConfig {

    private static final String RANDOM_ID = CommonConstant.Symbol.UNDERSCORE + RandomUtil.randomString(8);

    @Resource
    private MqttProperties mqttProperties;

    @Bean
    public MessageChannel mqttInputChannel() {
        return new DirectChannel();
    }

    @Bean
    public MessageChannel mqttOutputChannel() {
        return new DirectChannel();
    }

    @Bean
    public MessageProducer mqttInbound() {
        // set default receive topic
        String topicName = "dc3/mc/" + mqttProperties.getClient();
        if (null == mqttProperties.getReceiveTopics()) {
            mqttProperties.setReceiveTopics(new ArrayList<>());
        }
        boolean match = mqttProperties.getReceiveTopics().stream().anyMatch(topic -> topic.getName().equals(topicName));
        if (!match) {
            mqttProperties.getReceiveTopics().add(new MqttProperties.Topic(topicName, 2));
        }

        MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(
                mqttProperties.getClient() + RANDOM_ID + "_in",
                mqttClientFactory(),
                mqttProperties.getReceiveTopics().stream().map(MqttProperties.Topic::getName).toArray(String[]::new));
        adapter.setQos(mqttProperties.getReceiveTopics().stream().mapToInt(MqttProperties.Topic::getQos).toArray());
        adapter.setOutputChannel(mqttInputChannel());
        DefaultPahoMessageConverter convert = new DefaultPahoMessageConverter();
        convert.setPayloadAsBytes(true);
        adapter.setConverter(convert);
        adapter.setCompletionTimeout(mqttProperties.getCompletionTimeout());
        return adapter;
    }

    @Bean
    @ServiceActivator(inputChannel = "mqttOutputChannel")
    public MessageHandler outbound() {
        MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(
                mqttProperties.getClient() + "_out",
                mqttClientFactory());
        messageHandler.setAsync(true);
        messageHandler.setDefaultQos(mqttProperties.getDefaultSendTopic().getQos());
        messageHandler.setDefaultTopic(mqttProperties.getDefaultSendTopic().getName());
        return messageHandler;
    }

    @Bean
    public MqttPahoClientFactory mqttClientFactory() {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        factory.setConnectionOptions(getMqttConnectOptions());
        return factory;
    }

    @Bean
    public MqttConnectOptions getMqttConnectOptions() {
        MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();

        // username & password
        if (mqttProperties.getAuthType().equals(MqttProperties.AuthTypeEnum.USERNAME)) {
            mqttConnectOptions.setUserName(mqttProperties.getUsername());
            mqttConnectOptions.setPassword(mqttProperties.getPassword().toCharArray());
        }

        // tls x509
        if (mqttProperties.getAuthType().equals(MqttProperties.AuthTypeEnum.X509)) {
            mqttConnectOptions.setSocketFactory(X509Util.getSSLSocketFactory(
                    mqttProperties.getCaCrt(),
                    mqttProperties.getClientCrt(),
                    mqttProperties.getClientKey(),
                    StrUtil.isBlank(mqttProperties.getClientKeyPass()) ? "" : mqttProperties.getClientKeyPass()
            ));
            if (!StrUtil.isBlank(mqttProperties.getUsername()) && !StrUtil.isBlank(mqttProperties.getPassword())) {
                mqttConnectOptions.setUserName(mqttProperties.getUsername());
                mqttConnectOptions.setPassword(mqttProperties.getPassword().toCharArray());
            }
        }

        // disable https hostname verification
        mqttConnectOptions.setHttpsHostnameVerificationEnabled(false);
        mqttConnectOptions.setServerURIs(new String[]{mqttProperties.getUrl()});
        mqttConnectOptions.setKeepAliveInterval(mqttProperties.getKeepAlive());
        return mqttConnectOptions;

    }

}

在这个代码中       

DefaultPahoMessageConverter convert = new DefaultPahoMessageConverter();
 convert.setPayloadAsBytes(true);

这两个行用于配置接收MQTT的字节码信息。如果不进行这个配置,当MQTT发送字节码时,会自动转换为字符串。

4、设置接收MQTT消息类方法

    @Bean
    @ServiceActivator(inputChannel = "mqttInputChannel")
    public MessageHandler handlerValue() {
    	return new MessageHandler() {
			@Override
			public void handleMessage(Message<?> message) throws MessagingException {
				byte[] by = (byte[])message.getPayload();
				System.out.println(by.length);
			}
		};
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 3不是一个已知的版本。不过,以下是一个使用Spring Boot 2.x版本MQTT接收消息示例: 1. 添加依赖 在Maven项目的pom.xml文件中添加以下依赖: ```xml <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> ``` 2. 创建配置类 在Spring Boot应用程序中,我们可以使用Java配置类来配置MQTT连接。创建一个配置类来配置MQTT连接: ```java @Configuration @EnableIntegration public class MqttConfig { @Value("${mqtt.server.uri}") private String serverUri; @Value("${mqtt.username}") private String username; @Value("${mqtt.password}") private String password; @Value("${mqtt.topic}") private String topic; @Bean public IntegrationFlow mqttInFlow() { return IntegrationFlows.from( Mqtt.messageDrivenChannelAdapter( MqttClient.builder() .clientId("spring-boot-mqtt") .build(), MqttPahoMessageDrivenChannelAdapter .mqttClient(serverUri, "spring-boot-mqtt") .credentials(username, password) .build()) .autoStartup(true) .topics(topic)) .transform(Transformers.toJson()) .handle((payload, headers) -> { System.out.println("Received message: " + payload); return null; }) .get(); } } ``` 在上面的代码中,我们使用@EnableIntegration注释启用Spring Integration,并在MqttConfig类中创建了一个名为mqttInFlow的IntegrationFlow bean。这个bean使用Mqtt.messageDrivenChannelAdapter()方法创建一个MqttPahoMessageDrivenChannelAdapter,该适配器将连接到MQTT服务器并订阅给定的主题。接下来,我们使用Spring Integration的转换器将接收到的消息转换为JSON格式,然后使用handle()方法处理接收到的消息。 3. 配置应用程序属性 在application.properties文件中添加以下属性: ``` mqtt.server.uri=tcp://localhost:1883 mqtt.username=username mqtt.password=password mqtt.topic=sample/topic ``` 在上面的属性中,我们指定了MQTT服务器的URI,用户名,密码和要订阅的主题。 4. 测试 现在,我们已经设置好了MQTT接收消息的配置。启动应用程序并向指定的主题发送一条消息,然后查看控制台输出以确保消息已经被接收并处理。 这就是一个使用Spring Boot 2.x版本的MQTT接收消息的示例。注意,这只是一个简单的示例,您可以根据自己的需求进行自定义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值