springboot集成MQTT,生产者+消费者+MQTT.FX辅助测试

前言:项目为智能家居物联网项目,需要与嵌入式对接,通过MQTT短消息队列进行通信。
本项目为springboot+springcloud,辅助工具mqtt.fx,下载链接https://pan.baidu.com/s/130giQTKQhwSp4qeWKisrrA
//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>
            <version>1.2.0</version>
        </dependency>

mqtt生产者

@Configuration
public class MqttFunTestProducer {
     @Value("${mqtt.producer.servers}")
     private String servers;
     @Value("${mqtt.producer.client-id}")
     private String clientId;
     @Value("${mqtt.producer.default-topic}")
     private String defaultTopic;
    @Bean
    public MqttPahoClientFactory mqttClientFactory() {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        factory.setServerURIs(servers);
        return factory;
    }

    @Bean
    @ServiceActivator(inputChannel = "mqttOutboundChannel")
    public MessageHandler mqttOutbound() {
        MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(clientId, mqttClientFactory());
        messageHandler.setAsync(false);
        messageHandler.setDefaultTopic(defaultTopic);
        return messageHandler;
    }

    @Bean
    public MessageChannel mqttOutboundChannel() {
        return new DirectChannel();
    }
}
    **mqtt调用生产者**
@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
public interface TestGateway {

    void sendToMqtt(String data,@Header(MqttHeaders.TOPIC) String topic);
}

测试mqtt消息发送

@RestController
@RequestMapping("/fun")
public class MqttFunController {

    @Autowired
    private TestGateway mqttGateway;
    @RequestMapping("/testMqtt")
    public String sendMqtt(@RequestParam(value = "topic") String topic, @RequestParam(value = "message") String message) {
        mqttGateway.sendToMqtt(message, topic);
        return "SUCCESS";
    }

}

mqtt.fx链接配置
mqtt.fx链接配置

mqtt.fx订阅主题

这里的主题以“FUN”为例,订阅后
订阅主题

利用postman调用消费者,发布消息
利用postman调用消费者,发布消息

这个时候我们看下mqtt.fx的订阅界面

mqtt.fx的订阅界面

下面编写mqtt消费者,来接收生产者发布的消息
mqtt消费者

@Component
@ComponentScan({ "com.hiss.service.*" })
@Configuration
public class MqttFunConsumer {
     @Value("${mqtt.producer.servers}")
     private String servers;
     @Value("${mqtt.producer.client-id}")
     private String clientId;
     @Value("${mqtt.producer.default-topic}")
     private String defaultTopic;

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

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

    @Bean
    public MessageProducer inbound() {
        MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(clientId, mqttClientFactory(), defaultTopic);
        adapter.setCompletionTimeout(5000);
        adapter.setConverter(new DefaultPahoMessageConverter());
        adapter.setQos(1);
        adapter.setOutputChannel(mqttTestInputChannel());
        return adapter;
    }

    @Bean
    @ServiceActivator(inputChannel = "mqttTestInputChannel")
    public MessageHandler handlerTest() {
        return new MessageHandler() {

            @Override
            public void handleMessage(Message<?> message) throws MessagingException {
                try {
                    //这里拿到发布的消息内容,做具体的业务逻辑处理
                    String string = message.getPayload().toString();
                    JsonParser jsonParser = new JsonParser();
                    JsonObject object = jsonParser.parse(string).getAsJsonObject();
                    String asString = object.get("game").getAsString();
                } catch (MessagingException ex) {
                    logger.info(ex.getMessage());
                }
            }
        };
    }
}

* 生产配置详解*

—client-id:客户端id
—url:代理URL
—topics:适配器会接受到消息的一组以逗号分隔的主题
—qos:以逗号分隔的一组QoS值,可以是所有主题运用单一值,或者每一个主题一个值(列表必须同样长度)
—converter:MqttMessageConverter(可选项),默认DefaultPahoMessageConverter生成消息带字符串载荷(默认),携带头部包括:
mqtt_topic 接收消息主题
mqtt_duplicate 如果消息重复,值为true
mqtt_qos 业务质量
— DefaultPahoMessageConverter可配置为返回载荷原始byte[]类型,通过将其声明为一个实体类,并且设定payloadAsBytes属性
—client-factory:客户端工厂
—send-timeout: 发送超时-如果通道可能会阻塞,才会运用(例如当前已满的边界QueueChannel)
—error-channel:错误通道–如果使用的话,ErrorMessage消息下行异常会发送至该通道,载荷为MessagingException,包含错误消息与原因
—recovery-interval:恢复间隔–控制在故障之后适配器会尝试重新连接的时间间隔,默认为10000ms(10s)

消费配置详解
1) client-id:客户端id
2)url:代理URL
3)topics:适配器会接受到消息的一组以逗号分隔的主题
4)qos:以逗号分隔的一组QoS值,可以是所有主题运用单一值,或者每一个主题一个值(列表必须同样长度)
5)converter:MqttMessageConverter(可选项),默认DefaultPahoMessageConverter生成消息带字符串载荷(默认),携带头部包括:
mqtt_topic 接收消息主题
mqtt_duplicate 如果消息重复,值为true
mqtt_qos 业务质量
DefaultPahoMessageConverter可配置为返回载荷原始byte[]类型,通过将其声明为一个实体类,并且设定payloadAsBytes属性
6) client-factory:客户端工厂
7)send-timeout:发送超时-如果通道可能会阻塞,才会运用(例如当前已满的边界QueueChannel)
8)error-channel:错误通道–如果使用的话,ErrorMessage消息下行异常会发送至该通道,载荷为MessagingException,包含错误消息与原因
9)recovery-interval:恢复间隔–控制在故障之后适配器会尝试重新连接的时间间隔,默认为10000ms(10s)

猜你喜欢

转载自blog.csdn.net/wfanking/article/details/82658393