Mqtt连接管理工具(Maven),需Mysql。多MQTT连接多Topic,在线连接,在线重启,断线重连······

本文介绍了如何使用数据库管理MQTT连接配置,通过一个简单的Java Spring Boot Starter包简化MQTT消息的接收和发送。文章详细阐述了数据库表结构、配置填充、消息接收回调函数的创建,以及消息发送的方法。同时提供了接口拓展,支持连接的刷新与重连功能。
摘要由CSDN通过智能技术生成

MQTT连接操作步骤

前提

当你还在为连接MQTT的繁琐配置而烦恼?当你还在为添加或者删除MQTT连接/主题而一遍遍修改代码发布?快使用如下连接管理工具吧!~

一.环境准备

  1. 数据库准备,库名:dlg_mqtt_manage (库/表已有请忽略
    CREATE TABLE `dmm_mqtt_server_data`  (
      `id` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识 唯一标识',
      `server_host` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '服务器ip',
      `server_port` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '端口',
      `username` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
      `password` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码',
      `client_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客户端id,自动添加三位随机数',
      `client_topic` varchar(3072) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客户端订阅的主题(以\',\'隔开)',
      `client_clean_session` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客户端每次重连是否清除session, 0:否 1:是',
      `remark` varchar(1024) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
      `data_from` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '数据来源',
      `app_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '应用名称 (配置文件中的spring.application.name)',
      `pub_code` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '发布标识符,需要以此标识获取需要发送的消息的服务',
      `owner` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '负责人',
      `org_id` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '机构ID',
      `created_by` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',
      `created_on` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
      `modify_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '更新人',
      `modify_on` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
      `is_valid` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '是否有效 0有效;1无效',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = ' ' ROW_FORMAT = Dynamic;
    
    
  2. 根据提供的MQTT服务器信息填入数据库表中,需要注意的是 is_valid填入有效 0,app_name填你的项目的applicationName,data_from可填入信息来源eg:THDSclient_topic填入需要订阅的MQTT_TOPIC,多个以逗号(,)分割。其他根据表中内容填写
  3. 在需要接入MQTT的项目(已能连通数据库)的POM中添加如下maven包(若阿里云源没有可切换至maven自带源)
            <dependency>
                <groupId>com.dlg-tec</groupId>
                <artifactId>dlg-mqtt-spring-boot-starter</artifactId>
                <version>(Latest-Version)</version>
            </dependency>
            
    

二.使用

  1. **【消息接收】**创建回调函数类接收mqtt信息 代码如下

    注意点1:该类需注册成bean,继承MyMqttClientCallback,并实现messageArrived方法

    注意点2!!!若是需要注入使用其他Spring管理的Bean,请带上@Need2Inject注解,beanName中填入此Bean的BeanName!!! (ps:如果你是用 xxxservice的形式注入,若是没有指定名字你的BeanName就是xxxserviceImpl)

    注意点3:重要的事情说三遍,错误请try_catch,不要抛出!!! 错误请try_catch,不要抛出!!! 错误请try_catch,不要抛出!!!

    (不然会导致连接断开,触发重连,然后继续断开,重连,断开,重连~)

    // 该类需注册成bean,继承MyMqttClientCallback,并实现messageArrived方法
    @Component
    @Slf4j
    public class MyCallBack extends MyMqttClientCallback {
    
        @Need2Inject(beanName = "testService")
        @Resource
        public TestService testService;
    
        /**
         * 数据接收处
         * @param topic 订阅的topic
         * @param message 订阅到的消息内容
         */
        @Override
        public void messageArrived(String topic, MqttMessage message) throws Exception {
         try {
            // 该类为该topic对应mqtt服务器信息
            DmmMqttServerData mqttClient = getMqttClient();
            log.info("sss收到来自【 " + mqttClient.getDataFrom() + "】   topic:【   " + topic + "】 的消息:{}", new String(message.getPayload()));
         } catch (Exception e) {
               log.info("错误请自行处理,不要抛出");
         }
        }
    }
    
    
  2. 【消息发送】 注入MqttPubUtil,并调用相关方法

    @Component
    public class TestMqttPub {
        @Resource
        private MqttPubUtil mqttPubUtil;
    
        /**
         *
         * @param pubCode 发布标识,需通过此标识找到对应服务器进行发送。建议以enum形式保存
         * @param topic 发布主题
         * @param message 发布内容
         * @throws Exception 错误信息
         */
        public void pub(String pubCode,String topic,String message) throws Exception {
            mqttPubUtil.pubMessage(pubCode,topic,message);
        }
    }
    

三.拓展

若需要调用接口/指定连接等其他形式的订阅重新加载 注入后调用实现

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author 格兰德法则·祝
 * @since 2021-12-20
 */
public interface DmmMqttServerDataService  {
    /**
     * 全部连接刷新配置并重新连接
     * @throws Exception 错误信息
     */
    void reLinkAll() throws Exception;

    /**
     * 刷新指定配置通过ID
     * @param id 数据库中保存的ID
     * @throws Exception 错误信息
     */
    void reLinkById(String id) throws Exception;


    /**
     * 刷新指定配置通过Code
     * @param pubCode
     * @throws Exception 错误信息
     */
    void reLinkByPubCode(String pubCode) throws Exception;
}

四.版本

【可用】版本描述(请使用最新版)
【1.0.5】更新以前版本存在问题,去除不必要maven依赖,增加断线重连功能,增加消息回调注入功能
【1.0.6】更新业务(刷新所有连接方法,刷新指定ID/pubCode连接)
【1.0.6】更新业务(刷新所有连接方法,刷新指定ID/pubCode连接)
【1.0.7】修改断线重连时长等问题
【1.0.8】由于未知原因,还是会出现断线重连失败的可能,开放继承断线重连接口,在callBack中可自行实现断线重连(重写),断线后重连失败可添加发送消息等通知手段
【1.0.9】增加线程连接,由MQTT服务端导致的服务拒绝连接重连无法成功
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值