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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章