MQTT+Springboot整合

1.mqttconfig配置(配置参数是从数据库查出来的)

package com.terminal.dc3.api.center.manager.config;


import com.collection.common.utils.StringUtils;
import com.collection.system.mapper.MqttConfigMapper;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

@Component
@Data
public class MqttConfig {
    @Autowired
    private MqttPushClient mqttPushClient;

    @Autowired
    private MqttConfigMapper mqttConfigMapper;

    public static ConcurrentHashMap<String, List<MqttPushClient>> mapHashMap = new ConcurrentHashMap<>();
    /**
     * 用户名
     */
    private String username;
    /**
     * 密码
     */
    private String password;
    /**
     * 连接地址
     */
    private String hostUrl;

    /**
     * 端口
     */
    private String port;
    /**
     * 客户Id
     */
    private String clientId;
    /**
     * 默认连接话题
     */
    private String defaultTopic;
    /**
     * 超时时间
     */
    private int timeout;
    /**
     * 保持连接数
     */
    private int keepalive;
    /**
     * mqtt功能使能
     */
    private boolean enabled;
    private boolean retained;
    /**
     * qos
     */
    private int qos;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getHostUrl() {
        return hostUrl;
    }

    public void setHostUrl(String hostUrl) {
        this.hostUrl = hostUrl;
    }

    public String getClientId() {
        return clientId;
    }

    public void setClientId(String clientId) {
        this.clientId = clientId;
    }

    public String getDefaultTopic() {
        return defaultTopic;
    }

    public void setDefaultTopic(String defaultTopic) {
        this.defaultTopic = defaultTopic;
    }

    public int getTimeout() {
        return timeout;
    }

    public void setTimeout(int timeout) {
        this.timeout = timeout;
    }

    public int getKeepalive() {
        return keepalive;
    }

    public void setKeepalive(int keepalive) {
        this.keepalive = keepalive;
    }

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    public int getQos() {
        return qos;
    }

    public void setQos(int qos) {
        this.qos = qos;
    }


//    @Bean
    public MqttPushClient getMqttPushClient() {
        List<com.collection.system.domain.MqttConfig> mqttConfigs = mqttConfigMapper.selectMqttConfigList(new com.collection.system.domain.MqttConfig());
        for (com.collection.system.domain.MqttConfig mq : mqttConfigs
        ) {
            mq.setHost("tcp://" + mq.getHost() + ":" + mq.getPort());
            if (mq.getEnabled()) {
                String mqtt_topic[] = StringUtils.split(mq.getTopic(), ",");

                mqttPushClient.connect(mq.getHost(), mq.getClientId(), mq.getUsername(),
                        mq.getPassword(), mq.getTimeout(), mq.getKeepalive());//连接

                if (mqtt_topic != null) {
                    for (int i = 0; i < mqtt_topic.length; i++) {
                        mqttPushClient.subscribe(mqtt_topic[i], mq.getQos().intValue());//订阅主题

                    }
                }
            }
        }
        return mqttPushClient;
    }
}

2.MqttPushClient客户端配置

package com.terminal.dc3.api.center.manager.config;

import com.collection.common.core.redis.RedisCache;
import com.collection.common.utils.QueueUtils;
import com.collection.common.utils.SecurityUtils;
import com.collection.common.utils.StringUtils;
import com.collection.common.utils.ip.IpUtils;
import com.collection.common.utils.uuid.IdUtils;
import com.collection.ems.domain.MqttDatasLog;
import com.collection.ems.mapper.MqttDatasLogMapper;
import com.terminal.dc3.driver.service.mqtt.PushCallback;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;


@Component
public class MqttPushClient {
    private static final Logger logger = LoggerFactory.getLogger(MqttPushClient.class);

    @Autowired
    private PushCallback pushCallback;


    private static MqttConfig mqttConfig;

    @Autowired
    public void setMqttConfig(MqttConfig mqttConfig) {
        this.mqttConfig = mqttConfig;
    }
    private static MqttClient client;

    private static MqttClient getClient() {
        return client;
    }

    private static void setClient(MqttClient client) {
        MqttPushClient.client = client;
    }


    private static MqttDatasLogMapper mqttDatasLogMapper;

    @Autowired
    public void setMqttDatasLogMapper(MqttDatasLogMapper mqttDatasLogMapper) {
        this.mqttDatasLogMapper = mqttDatasLogMapper;
    }

    /**
     * 客户端连接
     *
     * @param host      ip+端口
     * @param clientID  客户端Id
     * @param username  用户名
     * @param password  密码
     * @param timeout   超时时间
     * @param keepalive 保留数
     */
    public void connect(String host, String clientID, String username, String password, int timeout, int keepalive) {
        MqttClient client;
        try {
            if (host != null && clientID != null && username != null && password != null) {
                client = new MqttClient(host, clientID, new MemoryPersistence());
                MqttConnectOptions options = new MqttConnectOptions();
                options.setCleanSession(true);
                options.setUserName(username);
                options.setPassword(password.toCharArray());
                options.setConnectionTimeout(timeout);
                options.setKeepAliveInterval(keepalive);
                options.setAutomaticReconnect(true);
                MqttPushClient.setClient(client);
                client.setCallback(pushCallback);
                client.connect(options);
            }
        } catch (Exception e) {
            logger.error("connect error", e);
        }
    }

    /**
     * 发布消息
     *
     * @param pubTopic 主题
     * @param message  内容
     * @param qos      连接方式
     */
    public void publishMessage(String pubTopic, String message, int qos) {

        //重新进行连接
        if (client == null || !client.isConnected()) {
            mqttConfig.getMqttPushClient();
            logger.info("重新获取连接  {}" + client);
        }
        MqttMessage mqttMessage = new MqttMessage();
        mqttMessage.setQos(qos);
        mqttMessage.setPayload(message.getBytes());

        if (client == null) {
            return;
        }
        MqttTopic topic = client.getTopic(pubTopic);

        //记录发送日志
        MqttDatasLog mqttDatasLog = new MqttDatasLog();
        mqttDatasLog.setDataLog(IdUtils.randomUUID());
        mqttDatasLog.setLogType(pubTopic);
        mqttDatasLog.setContent(message);
        mqttDatasLog.setOperIp(IpUtils.getHostIp());
        mqttDatasLog.setOperTime(new Date());
        mqttDatasLog.setBusinessType(0L);
        if (null != topic) {
            try {
                MqttDeliveryToken publish = topic.publish(mqttMessage);
                if (!publish.isComplete()) {
                    logger.info("发布消息成功");
                    mqttDatasLog.setStatus(0l);
                    //在队列中删除推送成功的数据
                    QueueUtils.removeQueueObject(pubTopic, new String(mqttMessage.getPayload()));
                }
            } catch (Exception e) {
                logger.error("发布消息错误 error");
                mqttDatasLog.setStatus(1l);
            }
        }
        mqttDatasLogMapper.insertMqttDatasLog(mqttDatasLog);

    }

    /**
     * 订阅某个主题
     *
     * @param topic 主题
     * @param qos   连接方式
     */
    public static void subscribe(String topic, int qos) {
        logger.info("开始订阅主题" + topic + "连接方式" + qos);
        try {
            MqttPushClient.getClient().subscribe(topic, qos);
        } catch (Exception e) {
            logger.error("开始订阅主题错误 error");
        }
    }

}

3.MQTTMessage数据类

package com.terminal.dc3.api.center.manager.config;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 消息实体对象
 *
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MQTTMessage implements Serializable {
    /**
     * MQTT主题
     */
    private String topic;

    /**
     * qos
     */
    private Integer qos = 1;

    /**
     * MQTT内容
     */
    private String content;

}

4.MQTTLicenseTask(这是我的发送数据定时器,仅供参考)

package com.collection.web.controller.ems.task;

import com.collection.common.queue.QueueCodeConstant;
import com.collection.common.utils.QueueUtils;
import com.collection.common.utils.StringUtils;
import com.collection.system.domain.MqttConfig;
import com.collection.system.mapper.MqttConfigMapper;
import com.terminal.dc3.api.center.manager.config.MqttPushClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;

@Component
@Slf4j
public class MQTTLicenseTask {

    @Resource
    private MqttConfigMapper mqttConfigMapper;


    @Resource
    private MqttPushClient mqttPushClient;

    //    @Scheduled(fixedRate = 5000) // 每1000毫秒(1秒)执行一次
    @RabbitListener(queues = QueueCodeConstant.mqtt_task_config, containerFactory = "rabbitListenerContainerFactory")
    public void executeTask() {
        List<MqttConfig> mqttConfigs = mqttConfigMapper.selectMqttConfigList(new com.collection.system.domain.MqttConfig());
        for (com.collection.system.domain.MqttConfig mq : mqttConfigs
        ) {
            String mqtt_topic[] = StringUtils.split(mq.getTopic(), ",");
            if (mqtt_topic != null) {
                for (int i = 0; i < mqtt_topic.length; i++) {
                    Object queueObject = QueueUtils.getQueueObject(mqtt_topic[i]);
                    if (queueObject != null) {
                        log.info("定时推送");
                        mqttPushClient.publishMessage(mqtt_topic[i], String.valueOf(queueObject), mq.getQos().intValue());
                    }
                }
            }
        }

    }

}

### 回答1: 我可以给你一些关于如何将MQTT整合Spring Boot应用程序中的建议。首先,你需要在你的pom.xml文件中添加依赖以使用MQTT协议。其次,你需要定义一个MQTT连接工厂,以便将其与Spring Boot应用程序集成。最后,你可以使用@ EnableMqtt注解来启用MQTT支持。 ### 回答2: MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,常用于物联网设备之间的数据传输。而Spring Boot是一个用于开发Java应用程序的框架,提供了很多便捷的功能和特性。 MQTT整合Spring Boot可以帮助我们在应用程序中实现与物联网设备的通信。具体步骤如下: 1. 导入依赖:在Spring Boot的项目中,我们可以使用MQTTJava客户端库,如Eclipse Paho。我们需要在项目的pom.xml文件中添加相关依赖。 2. 配置MQTT连接:在Spring Boot的配置文件中,我们可以指定MQTT服务器的地址、端口号、用户名、密码等连接参数。可以使用application.properties或application.yml文件进行配置。 3. 编写MQTT消息接收器:在Spring Boot中,我们可以创建一个MQTT消息接收器,用于接收来自物联网设备的消息。可以使用@Payload注解将消息内容注入到方法参数中,然后处理该消息。 4. 编写MQTT消息发布者:在Spring Boot中,我们可以创建一个MQTT消息发布者,用于向物联网设备发送消息。可以使用mqttClient.publish方法来发布消息。 5. 添加业务逻辑:在接收或发布MQTT消息的方法中,我们可以添加我们的业务逻辑,如数据处理、数据存储等。 通过以上步骤,我们可以在Spring Boot应用程序中实现与MQTT协议的整合。可以根据实际需求,进行消息的订阅和发布,从而与物联网设备进行通信。这样可以帮助我们更好地开发和管理物联网应用程序。 ### 回答3MQTT是一种轻量级的机器对机器通信协议,它被广泛应用于物联网领域。而Spring Boot是一种快速构建应用程序的开发框架。将MQTT整合Spring Boot中可以使得我们在开发物联网相关的应用程序时更加方便和高效。 首先,我们需要在Spring Boot项目中引入相应的MQTT客户端库,例如Eclipse Paho等。然后,在Spring Boot的配置文件中配置MQTT的连接信息,包括服务器地址、端口号、用户名、密码等。通过这些配置信息,我们可以建立与MQTT服务器的连接。 接下来,我们可以在Spring Boot的代码中使用MQTT客户端库提供的API进行相关操作。例如,我们可以使用订阅功能去订阅某个主题,接收来自其他设备的消息。我们也可以使用发布功能去向某个主题发送消息,供其他设备订阅。 此外,可以通过编写自定义的MQTT消息处理器来处理接收到的消息。我们可以根据实际需求,在消息处理器中编写相应的业务逻辑,例如对接收到的消息进行解析、存储或者转发等操作。 最后,通过使用Spring Boot的其他特性,例如注解驱动开发、自动配置等功能,我们可以更加简化和优化开发过程。 综上所述,将MQTT整合Spring Boot中可以提供一个快速、高效的开发环境,方便我们开发物联网相关的应用程序。同时,通过使用Spring Boot的优势,我们可以更加简化和优化开发过程,提高开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值