Springboot整合Mqtt(物联网)

1、添加 MQTT 依赖

        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-mqtt</artifactId>
        </dependency>

2、创建 MQTT 客户端工厂

管理 MQTT 客户端的创建和销毁

public class MqttClientFactory {
    private static final String BROKER_URL = "tcp://127.0.0.1:1883";
    private static final String CLIENT_ID_PREFIX = "mqtt-client-";

    public static MqttClient createClient(String clientIdSuffix) throws MqttException {
        String clientId = CLIENT_ID_PREFIX + clientIdSuffix;
        MqttClient mqttClient = new MqttClient(BROKER_URL, clientId);
        MqttConnectOptions connOpts = new MqttConnectOptions();
        connOpts.setCleanSession(true);
        connOpts.setUserName("admin");
        connOpts.setPassword("123456".toCharArray());
        connOpts.setConnectionTimeout(3000);
        connOpts.setKeepAliveInterval(20);
        mqttClient.connect(connOpts);
        return mqttClient;
    }

    public static void destroyClient(MqttClient client) throws MqttException{
        if (client != null && client.isConnected()) {
            client.disconnect();
            client.close();
        }
    }
}

3、创建 MQTT 客户端服务

管理 MQTT 客户端的生命周期,包括连接、订阅、发布、断开连接以及重连逻辑

@Slf4j
@Service
public class MqttClientService {

    private final ConcurrentMap<String, MqttClient> clientMap = new ConcurrentHashMap<>();

    public void connectAndSub(String[] topic, String clientId) throws MqttException {
        MqttClient client = MqttClientFactory.createClient(clientId);
        clientMap.put(clientId, client);
        client.subscribe(topic);
        client.setCallback(new MqttCallback() {
            @Override
            public void connectionLost(Throwable throwable) {
                log.info("连接丢失后的重连");
                tryReconnect(topic, clientId);
            }

            @Override
            public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
                log.info("处理接收到的消息");
                log.info("topic:{},mqttMessage:{}", topic, new String(mqttMessage.getPayload()));
            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {
                // 发布完成回调
                log.info("主题发布成功");
            }
        });
    }

    public void publish(String clientId, String topic, String message) throws MqttException {
        MqttClient client = clientMap.get(clientId);
        if (client != null && client.isConnected()) {
            MqttMessage mqttMessage = new MqttMessage(message.getBytes());
            mqttMessage.setQos(2);
            client.publish(topic, mqttMessage);
        }
    }

    /**
     * 断开、销毁连接
     * @param clientId
     */
    public void disConnectAndDestroy(String clientId){
        MqttClient client = clientMap.remove(clientId);
        try {
            MqttClientFactory.destroyClient(client);
        } catch (MqttException e) {
            throw new RuntimeException(e);
        }
    }

    private void tryReconnect(String[] topic, String clientId){
        // 尝试重连逻辑,可以加入重试次数限制和延时
        try {
            connectAndSub(topic, clientId);
        } catch (MqttException e) {
            throw new RuntimeException(e);
        }
    }

}

4、在 Spring Boot 应用中使用 MQTT 客户端服务

    @Resource
    private MqttClientService mqttClientService;

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 是一个用于构建独立的、生产级的 Spring 应用程序的框架。MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的消息传输协议,常用于物联网设备之间的通信。 在 Spring Boot 中使用 MQTT 可以借助 Eclipse Paho MQTT 客户端库。首先,需要在 Maven 或 Gradle 中添加相应的依赖。例如在 Maven 中: ```xml <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.5</version> </dependency> ``` 接下来,在 Spring Boot 的配置文件中配置 MQTT 连接参数,例如: ```yaml spring: mqtt: url: tcp://mqtt.example.com:1883 username: my-username password: my-password ``` 然后,可以创建一个 MQTT 客户端的 bean,并在需要使用的地方注入它: ```java import org.eclipse.paho.client.mqttv3.IMqttClient; import org.eclipse.paho.client.mqttv3.IMqttMessageListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MyMqttClient { private final IMqttClient mqttClient; @Autowired public MyMqttClient(IMqttClient mqttClient) { this.mqttClient = mqttClient; } public void subscribe(String topic, IMqttMessageListener listener) throws Exception { mqttClient.subscribe(topic, listener); } public void publish(String topic, String payload) throws Exception { mqttClient.publish(topic, payload.getBytes(), 0, false); } } ``` 在使用时,可以通过调用 `subscribe` 方法订阅指定的 MQTT 主题,并提供一个消息监听器处理收到的消息。通过调用 `publish` 方法可以向指定主题发布消息。 这只是一个简单示例,实际使用时可能需要根据具体需求进行更多的配置和处理。希望对你有帮助!如果你有更多问题,请继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值