diff --git a/pom.xml b/pom.xml
index 027df8ec6e2cb33045bbb024e60a7636024bb59e..f19ab673692c286c82fcd1f66b5aaaffc132b484 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,6 +13,7 @@
smqttx-rule
smqttx-ui
smqttx-metric
+ smqttx-solon-plugin
smqttx-spring-boot-starter
smqttx-integrate
diff --git a/smqttx-solon-plugin/pom.xml b/smqttx-solon-plugin/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f6b7bd034c23d60f1daba03634d387192f18e0e0
--- /dev/null
+++ b/smqttx-solon-plugin/pom.xml
@@ -0,0 +1,41 @@
+
+
+
+ 4.0.0
+
+
+ smqttx
+ io.github.quickmsg
+ 2.0.11
+
+
+ smqttx-solon-plugin
+
+ smqttx-solon-plugin
+
+
+ UTF-8
+
+
+
+
+ org.noear
+ solon
+ 2.5.11
+ provided
+
+
+ io.github.quickmsg
+ smqttx-core
+ 2.0.11
+
+
+ smqttx-ui
+ io.github.quickmsg
+ 2.0.11
+
+
+
+
+
diff --git a/smqttx-solon-plugin/src/main/java/io/github/quickmsg/solon/SolonBootstrapConfig.java b/smqttx-solon-plugin/src/main/java/io/github/quickmsg/solon/SolonBootstrapConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..326225ddc5b2104ba0c7831e005c303bf52eee52
--- /dev/null
+++ b/smqttx-solon-plugin/src/main/java/io/github/quickmsg/solon/SolonBootstrapConfig.java
@@ -0,0 +1,74 @@
+package io.github.quickmsg.solon;
+
+import ch.qos.logback.classic.Level;
+import io.github.quickmsg.common.config.AuthConfig;
+import io.github.quickmsg.common.config.BootstrapConfig;
+import io.github.quickmsg.common.rule.RuleChainDefinition;
+import io.github.quickmsg.common.rule.source.SourceDefinition;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.noear.solon.annotation.Configuration;
+import org.noear.solon.annotation.Inject;
+
+import java.util.List;
+
+/**
+ * @author luxurong
+ * @since noear
+ */
+@Getter
+@Setter
+@ToString
+@Inject("${smqtt}")
+@Configuration
+public class SolonBootstrapConfig {
+
+ /**
+ * sfl4j日志级别
+ *
+ * @see Level
+ */
+ private String logLevel;
+
+ /**
+ * tcp配置
+ */
+ private BootstrapConfig.TcpConfig tcp;
+
+ /**
+ * http配置
+ */
+ private BootstrapConfig.HttpConfig http;
+
+ /**
+ * websocket配置
+ */
+ private BootstrapConfig.WebsocketConfig ws;
+
+ /**
+ * 集群配置配置
+ */
+ private BootstrapConfig.ClusterConfig cluster;
+
+ /**
+ * meter配置
+ */
+ private BootstrapConfig.MeterConfig meter;
+
+ /**
+ * 规则定义
+ */
+ private List rules;
+
+ /**
+ * 规则定义
+ */
+ private List sources;
+
+ /**
+ * auth
+ */
+ private AuthConfig auth;
+
+}
diff --git a/smqttx-solon-plugin/src/main/java/io/github/quickmsg/solon/config/AutoMqttConfiguration.java b/smqttx-solon-plugin/src/main/java/io/github/quickmsg/solon/config/AutoMqttConfiguration.java
new file mode 100644
index 0000000000000000000000000000000000000000..a1bddcaa7b76d0153cad693bf9c4b8340dfdb54e
--- /dev/null
+++ b/smqttx-solon-plugin/src/main/java/io/github/quickmsg/solon/config/AutoMqttConfiguration.java
@@ -0,0 +1,55 @@
+package io.github.quickmsg.solon.config;
+
+import ch.qos.logback.classic.Level;
+import io.github.quickmsg.common.utils.IPUtils;
+import io.github.quickmsg.core.Bootstrap;
+import io.github.quickmsg.solon.SolonBootstrapConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.noear.solon.annotation.Bean;
+import org.noear.solon.annotation.Configuration;
+
+/**
+ * @author luxurong
+ */
+@Slf4j
+@Configuration
+public class AutoMqttConfiguration {
+
+
+ /**
+ * 配置异常切面
+ *
+ * @param solonBootstrapConfig {@link SolonBootstrapConfig}
+ * @return {@link Bootstrap}
+ */
+ @Bean
+ public Bootstrap startServer(SolonBootstrapConfig solonBootstrapConfig) {
+ return Bootstrap.builder()
+ .rootLevel(Level.toLevel(solonBootstrapConfig.getLogLevel()))
+ .tcpConfig(solonBootstrapConfig.getTcp())
+ .httpConfig(solonBootstrapConfig.getHttp())
+ .websocketConfig(solonBootstrapConfig.getWs())
+ .clusterConfig(solonBootstrapConfig.getCluster())
+ .ruleChainDefinitions(solonBootstrapConfig.getRules())
+ .sourceDefinitions(solonBootstrapConfig.getSources())
+ .meterConfig(solonBootstrapConfig.getMeter())
+ .authConfig(solonBootstrapConfig.getAuth())
+ .meterConfig(solonBootstrapConfig.getMeter())
+ .build()
+ .start()
+ .doOnSuccess(this::printUiUrl).block();
+ }
+
+ public void printUiUrl(Bootstrap bootstrap) {
+ String start = "\n-------------------------------------------------------------\n\t";
+ start += String.format("Smqtt mqtt connect url %s:%s \n\t", IPUtils.getIP(), bootstrap.getTcpConfig().getPort());
+ if (bootstrap.getHttpConfig() != null ) {
+ Integer port = 60000;
+ start += String.format("Smqtt-Admin UI is running AccessURLs:\n\t" +
+ "Http Local url: http://localhost:%s/smqtt/admin" + "\n\t" +
+ "Http External url: http://%s:%s/smqtt/admin" + "\n" +
+ "-------------------------------------------------------------", port, IPUtils.getIP(), port);
+ }
+ log.info(start);
+ }
+}
diff --git a/smqttx-solon-plugin/src/main/java/io/github/quickmsg/solon/config/EnableMqttServer.java b/smqttx-solon-plugin/src/main/java/io/github/quickmsg/solon/config/EnableMqttServer.java
new file mode 100644
index 0000000000000000000000000000000000000000..44f30d33887445d059c6d61b6fb4a35ecc503c1f
--- /dev/null
+++ b/smqttx-solon-plugin/src/main/java/io/github/quickmsg/solon/config/EnableMqttServer.java
@@ -0,0 +1,19 @@
+package io.github.quickmsg.solon.config;
+
+
+import io.github.quickmsg.solon.SolonBootstrapConfig;
+import org.noear.solon.annotation.Import;
+
+import java.lang.annotation.*;
+
+/**
+ * @author luxurong
+ * @author noear
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Import(classes = {SolonBootstrapConfig.class, AutoMqttConfiguration.class},
+ profilesIfAbsent = {"classpath:META-INF/solon_def/smqttx-def.yml"})
+@Documented
+public @interface EnableMqttServer {
+}
diff --git a/smqttx-solon-plugin/src/main/resources/META-INF/solon_def/smqttx-def.yml b/smqttx-solon-plugin/src/main/resources/META-INF/solon_def/smqttx-def.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b423661d0df358c0c09e19fa4184991388dde3b8
--- /dev/null
+++ b/smqttx-solon-plugin/src/main/resources/META-INF/solon_def/smqttx-def.yml
@@ -0,0 +1,53 @@
+smqtt:
+ logLevel: INFO # 系统日志
+ tcp: # tcp配置
+ port: 1883 # mqtt端口号
+ wiretap: false # 二进制日志 前提是 smqtt.logLevel = DEBUG
+ bossThreadSize: 8 # boss线程 默认=cpu核心数
+ workThreadSize: 16 # work线程 默认=cpu核心数*2
+ businessThreadSize: 32 # 业务线程数 默认=cpu核心数*10
+ businessQueueSize: 100000 #业务队列 默认=100000
+ messageMaxSize: 4194304 # 接收消息的最大限制 默认4194304(4M)
+ lowWaterMark: 4000000 # 不建议配置 默认 32768
+ highWaterMark: 80000000 # 不建议配置 默认 65536
+ # globalReadWriteSize: 10000000,100000000 全局读写大小限制
+ # channelReadWriteSize: 10000000,100000000 单个channel读写大小限制
+ options:
+ SO_BACKLOG: 2000
+ ssl: # ssl配置
+ enable: false # 开关
+ key: /user/server.key # 指定ssl文件 默认系统生成
+ crt: /user/server.crt # 指定ssl文件 默认系统生成
+ acl:
+ aclPolicy: NONE # NONE or FILE or JDBC
+ filePath: D:\smq-business\config\acl\basic_policy.csv # FILE时配置filePath
+ jdbcAclConfig:
+ driver: com.mysql.jdbc.Driver
+ url: jdbc:mysql://localhost:3306/smqtt
+ username: root
+ password: 123
+ auth:
+ fixed:
+ username: smqtt
+ password: smqtt
+ http: # http相关配置 端口固定60000
+ enable: true # 开关
+ accessLog: true # http访问日志
+ ssl: # ssl配置
+ enable: false
+ admin: # 后台管理配置
+ enable: true # 开关
+ username: smqtt # 访问用户名
+ password: smqtt # 访问密码
+ ws: # websocket配置
+ enable: true # 开关
+ port: 8999 # 端口
+ path: /mqtt # ws 的访问path mqtt.js请设置此选项
+ cluster: # 集群配置
+ enable: false # 集群开关
+ addresses: ["127.0.0.1"]
+ meter:
+ meterType: PROMETHEUS # INFLUXDB , PROMETHEUS
+
+
+