mqtt实现前后端实时交互

1.场景还原

    笔者在上篇已经介绍过mqtt相关介绍,教程链接:https://blog.csdn.net/zhangxing52077/article/details/80568244,今天笔者就实际项目中的前后端实时交互作个分享

2.设计思路

   首先,后端在工程中配置需要订阅的通配topic,主要是为了能够接收前端传过来的请求;然后前端在初始化的时候也需要订阅具体的相关主题,为了能够接收后端传来的请求,这里后端需要提供一个订阅主题的接口供前端调用

3.实现方案

① yml配置类配置

@ConfigurationProperties(prefix = "com.mqtt")
public class MqttProperties {
    private MqttInboundProperties inbound;
    private MqttOutboundProperties outbound;
    public MqttInboundProperties getInbound() {
        return inbound;
    }
    public void setInbound(MqttInboundProperties inbound) {
        this.inbound = inbound;
    }
    public MqttOutboundProperties getOutbound() {
        return outbound;
    }
    public void setOutbound(MqttOutboundProperties outbound) {
        this.outbound = outbound;
    }
}

 关于mqtt数据消费端配置类

public class MqttInboundProperties {
    private String url;
    private String username;
    private String password;
    private String clientId;
    private String topics;

    //getter,setter方法
}

关于mqtt数据生产端配置类

public class MqttOutboundProperties {
    private String urls;
    private String username;
    private String password;
    private String clientId;
    private String topic;

    //getter,setter方法
}

配置类生效配置

@Configuration
@EnableConfigurationProperties(MqttProperties.class)
public class MqttPropertiesConfiguration {

}

② 生产端

/**
 * @auther zx
 * @date 2018/9/20 20:03
 * 生产端
 */
@Configuration
public class MqttOutboundConfiguration {
    @Autowired
    private MqttProperties mqttProperties;
    @Bean
    public MqttPahoClientFactory mqttClientFactory() {
        String[] serverURIs = mqttProperties.getOutbound().getHost().split(",");
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        factory.setServerURIs(serverURIs);
        factory.setCleanSession(false);
        factory.setUserName(mqttProperties.getOutbound().getUsername());
        factory.setPassword(mqttProperties.getOutbound().getPassword());
        return factory;
    }

    @Bean
    @ServiceActivator(inputChannel = "mqttOutboundChannel")
    public MessageHandler mqttOutbound() {
        MqttPahoMessageHandler messageHandler =
                new MqttPahoMessageHandler(mqttProperties.getOutbound().getClientId(), mqttClientFactory());
        messageHandler.setAsync(true);
        messageHandler.setDefaultTopic(mqttProperties.getOutbound().getTopic());
        return messageHandler;
    }

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

}

③ 消费端(后端接收前端的传值并解析)

/**
 * @auther zx
 * @date 2018/9/20 20:06
 * 消费端
 */
@Configuration
@Slf4j
public class MqttInboundConfiguration {
    @Autowired
    private MqttProperties mqttProperties;
    @Bean
    public MessageChannel mqttInputChannel() {
        return new DirectChannel();
    }
    @Bean
    public MessageProducer inbound() {
        MqttPahoMessageDrivenChannelAdapter adapter =
                new MqttPahoMessageDrivenChannelAdapter(mqttProperties.getInbound().getHost(), mqttProperties.getInbound().getClientId(),
                        mqttProperties.getInbound().getTopic());
        adapter.setCompletionTimeout(5000);
        adapter.setConverter(new DefaultPahoMessageConverter());
        adapter.setQos(1);
        adapter.setOutputChannel(mqttInputChannel());
        return adapter;
    }

    @Bean
    @ServiceActivator(inputChannel = "mqttInputChannel")
    public MessageHandler handler() {
        return new MessageHandler() {

            @Override
            public void handleMessage(Message<?> message) throws MessagingException {
                //上传经纬度
                PushCallUtil.saveFreerideLocation(message.getPayload().toString());
            }

        };
    }
}

④ 后端推送给前端接口提供

@Component
@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
public interface MqttGateway {

    void sendToMqtt(String data);

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

    void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload);

}

好了,我是张星,欢迎加入博主技术交流群,群号:526601468

发布了215 篇原创文章 · 获赞 375 · 访问量 97万+

猜你喜欢

转载自blog.csdn.net/zhangxing52077/article/details/82836600