springboot 集成mqtt 以bytes收发消息

springboot 集成mqtt,且订阅和推送消息全部以bytes

  • maven加入依赖
<!--mqtt,其余依赖省略-->
<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-stream</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-mqtt</artifactId>
</dependency>
  • application.yml添加配置参数
spring:
  # mqtt
  mqtt:
    url: tcp://127.0.0.1:1883
    client:
      id: iot-think
    default:
      topic: topic
    completionTimeout: 3000
  • mqtt配置
@Configuration
@IntegrationComponentScan
public class MQTTConfig {

    @Value("${spring.mqtt.url}")
    private String hostUrl;

    @Value("${spring.mqtt.client.id}")
    private String clientId;

    @Value("${spring.mqtt.default.topic}")
    private String defaultTopic;

    @Value("${spring.mqtt.completionTimeout}")
    private int completionTimeout ;

    // 消息处理器
    @Resource
    private MessageHandler messageHandler;

    // 配置mqtt连接信息
    @Bean
    public MqttConnectOptions getMqttConnectOptions(){
        MqttConnectOptions mqttConnectOptions=new MqttConnectOptions();
//        mqttConnectOptions.setUserName(username);
//        mqttConnectOptions.setPassword(password.toCharArray());
        mqttConnectOptions.setServerURIs(new String[]{hostUrl});
        mqttConnectOptions.setKeepAliveInterval(2);
        return mqttConnectOptions;
    }

    // mqtt客户端工厂类
    @Bean
    public MqttPahoClientFactory mqttClientFactory() {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        factory.setConnectionOptions(getMqttConnectOptions());
        return factory;
    }

    // 发送消息处理器(推送),配置发送消息客户端
    @Bean
    @ServiceActivator(inputChannel = "mqttOutboundChannel")
    public MessageHandler mqttOutbound() {
        MqttPahoMessageHandler messageHandler =  new MqttPahoMessageHandler(clientId + +"_outbound", mqttClientFactory());
        messageHandler.setAsync(true);
        messageHandler.setDefaultTopic(defaultTopic);
        // 设置转换器,发送bytes
        DefaultPahoMessageConverter converter = new DefaultPahoMessageConverter();
        converter.setPayloadAsBytes(true);
        messageHandler.setConverter(converter);
        return messageHandler;
    }

    // 发送通道(消息生产者)
    @Bean
    public MessageChannel mqttOutboundChannel() {
        return new DirectChannel();
    }



    // 接收通道(消息消费者)
    @Bean
    public MessageChannel mqttInputChannel() {
        return new DirectChannel();
    }

    // 配置消息适配器,配置订阅客户端
    @Bean
    public MessageProducer inbound() {
        MqttPahoMessageDrivenChannelAdapter adapter =
                new MqttPahoMessageDrivenChannelAdapter(clientId+"_inbound", mqttClientFactory(), defaultTopic);
        adapter.setCompletionTimeout(completionTimeout);
        // 设置转换器,接收bytes
        DefaultPahoMessageConverter converter = new DefaultPahoMessageConverter();
        converter.setPayloadAsBytes(true);
        adapter.setConverter(converter);
        adapter.setQos(1);
        adapter.setOutputChannel(mqttInputChannel());
        return adapter;
    }

    // 通过通道获取数据
    // 接收消息处理器(订阅)
    @Bean
    @ServiceActivator(inputChannel = "mqttInputChannel")
    public MessageHandler handler() {
        return messageHandler;
    }

}
  • 配置订阅消息处理器
@Component("messageHandler")
@Slf4j
public class MQTTMessageHandler implements MessageHandler {

    @Resource
    private IotConcentratorMapper iotConcentratorMapper;


    @Override
    public void handleMessage(Message<?> message) {

        log.info("收到订阅消息: {}", message);

        String topic = message.getHeaders().get("mqtt_receivedTopic").toString();
        log.info("消息主题:{}", topic);
        Object payLoad = message.getPayload();
        
        // 如果不设置转换器这里强转byte[]会报错
        byte[] data = (byte[]) payLoad;
        
        // 这里对数据进行处理
    }
}
  • 配置发送消息网关
@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
public interface MqttGateway {

    // 不设置转换器这里以byte[]做参数会报错,需要发送消息,直接调用这个方法即可
    /**
     * 推送消息
     * @param data 数据
     * @param topic 主题
     */
    void sendToMqtt(byte[] data, @Header(MqttHeaders.TOPIC) String topic);
}

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值