SpringBoot+MQTT(方案二)

  1. Linux安装EMQX
  2. pom.xml
    <!-- https://mvnrepository.com/artifact/org.springframework.integration/spring-integration-mqtt -->
    <dependency>
    	<groupId>org.springframework.integration</groupId>
    	<artifactId>spring-integration-mqtt</artifactId>
    	<version>6.0.3</version>
    </dependency>
  3. application.yml
    server:
      port: 8686
      servlet:
        context-path: /mqtt
    
    spring:
      application:
        name: mqtt
      mqtt:
        url: tcp://192.168.1.97:1883
        username: admin
        password: public
        client:
          id: mqtt-client-id
  4. MQTT配置
    @Configuration
    public class MqttConfig {
    
        @Value("${spring.mqtt.url}")
        private String url;
    
        @Value("${spring.mqtt.username}")
        private String username;
    
        @Value("${spring.mqtt.password}")
        private String password;
    
        @Value("${spring.mqtt.client.id}")
        private String clientId;
    
        @Autowired
        private MqttReceiver mqttReceiver;
    
        @Bean
        public MessageChannel mqttInputChannel() {
            return new DirectChannel();
        }
    
        @Bean
        public MessageProducer inbound() { // 订阅主题
            MqttPahoMessageDrivenChannelAdapter adapter =
                    new MqttPahoMessageDrivenChannelAdapter(url, clientId+"-"+System.currentTimeMillis(),
                            "AAA/#", "BBB/#", "CCC/#");
            adapter.setCompletionTimeout(5000);
            adapter.setConverter(new DefaultPahoMessageConverter());
            adapter.setQos(1);
            adapter.setOutputChannel(mqttInputChannel());
            return adapter;
        }
    
        @Bean
        @ServiceActivator(inputChannel = "mqttInputChannel")
        public MessageHandler handler() {
            return mqttReceiver;
        }
    
        @Bean
        public MqttPahoClientFactory mqttClientFactory(){
            DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
            MqttConnectOptions options = new MqttConnectOptions();
            options.setServerURIs(new String[] { url });
            options.setUserName(username);
            options.setPassword(password.toCharArray());
            options.setCleanSession(true);
            options.setAutomaticReconnect(true);
            factory.setConnectionOptions(options);
            return factory;
        }
    
        @Bean
        @ServiceActivator(inputChannel = "mqttOutboundChannel")
        public MessageHandler mqttOutbound() {
            MqttPahoMessageHandler messageHandler =
                    new MqttPahoMessageHandler(clientId+"-"+System.currentTimeMillis(), mqttClientFactory());
            messageHandler.setAsync(true);
            messageHandler.setDefaultTopic("DefaultTopic");
            return messageHandler;
        }
    
        @Bean
        public MessageChannel mqttOutboundChannel() {
            return new DirectChannel();
        }
    
        @MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
        public interface MqttGateway {
            void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, String payload);
            void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload);
            void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, byte[] payload);
        }
    
    }
  5. 消息处理器

    @Component
    public class MqttReceiver implements MessageHandler {
    
        @Autowired
        MqttSender mqttSender;
    
        @Override
        public void handleMessage(Message<?> message) {
            MessageHeaders headers = message.getHeaders();
            String topic = (String) headers.get(MqttHeaders.RECEIVED_TOPIC);
            String payload = (String) message.getPayload();
            if (topic.indexOf("AAA")!=-1) {
                System.out.println("============================AAA");
                mqttSender.send("BBB", "BBB测试消息");
            } else if (topic.indexOf("BBB")!=-1) {
                System.out.println("============================BBB");
                mqttSender.send("CCC", "CCC测试消息");
            } else if (topic.indexOf("CCC")!=-1) {
                System.out.println("============================CCC");
            }
        }
    
    }
  6. 消息发布器
    @Component
    public class MqttSender {
    
        @Autowired
        MqttConfig.MqttGateway mqttGateway;
    
        /**
         * 发送mqtt消息
         * @param topic 主题
         * @param message 内容
         * @return void
         */
        public void send(String topic, String message) {
            mqttGateway.sendToMqtt(topic, message);
        }
    
        /**
         * 发送包含qos的消息
         * @param topic 主题
         * @param qos 质量
         * 0 表示的是订阅者没收到消息不会再次发送,消息会丢失
         * 1 表示的是会尝试重试,一直到接收到消息,但这种情况可能导致订阅者收到多次重复消息
         * 2 多了一次去重的动作,确保订阅者收到的消息有一次
         * @param messageBody 消息体
         */
        public void send(String topic, int qos, JSONObject messageBody){
            mqttGateway.sendToMqtt(topic, qos, messageBody.toString());
        }
    
        /**
         * 发送包含qos的消息
         * @param topic 主题
         * @param qos 质量
         * 0 表示的是订阅者没收到消息不会再次发送,消息会丢失
         * 1 表示的是会尝试重试,一直到接收到消息,但这种情况可能导致订阅者收到多次重复消息
         * 2 多了一次去重的动作,确保订阅者收到的消息有一次
         * @param message 消息体
         */
        public void send(String topic, int qos, byte[] message){
            mqttGateway.sendToMqtt(topic, qos, message);
        }
    
    }
  7. MQTT接口
    @RestController
    public class MqttController {
    
        @Autowired
        MqttSender mqttSender;
    
        @RequestMapping("/sendMessage")
        public void sendMessage(String topic, String message) throws MqttException {
            mqttSender.send(topic, message);
        }
    
    }
  8. MQTT测试

  9. 参考文档
    MQTT Support
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

童心同萌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值