您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關springboot如何實現mqtt物聯網,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
Springboot整合mybatisPlus+mysql+druid+swaggerUI+ mqtt 整合mqtt整合druid整合mybatis-plus完整pom完整yml整合swaggerUi整合log4j MQTT 物聯網系統基本架構本物聯網系列
mqtt)
<!--mqtt依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-integration</artifactId> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-stream</artifactId> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-mqtt</artifactId> </dependency>
yml
iot: mqtt: clientId: ${random.value} defaultTopic: topic shbykjTopic: shbykj_topic url: tcp://127.0.0.1:1883 username: admin password: admin completionTimeout: 3000
package com.shbykj.handle.mqtt; import lombok.Getter; import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.integration.annotation.IntegrationComponentScan; import org.springframework.stereotype.Component; /** * @Author: wxm * @Description: mqtt基礎配置類 */ @Getter @Setter @Component @IntegrationComponentScan @ConfigurationProperties(prefix = "iot.mqtt") public class BykjMqttConfig { /* * * 服務地址 */ private String url; /** * 客戶端id */ private String clientId; /* * * 默認主題 */ private String defaultTopic; /* * * 用戶名和密碼*/ private String username; private String password; /** * 超時時間 */ private int completionTimeout; /** * shbykj自定義主題 */ private String shbykjTopic; }
package com.shbykj.handle.mqtt.producer; import org.springframework.integration.annotation.MessagingGateway; import org.springframework.integration.mqtt.support.MqttHeaders; import org.springframework.messaging.handler.annotation.Header; /** * @description rabbitmq mqtt協議網關接口 * @date 2020/6/8 18:26 */ @MessagingGateway(defaultRequestChannel = "iotMqttInputChannel") public interface IotMqttGateway { void sendMessage2Mqtt(String data); void sendMessage2Mqtt(String data, @Header(MqttHeaders.TOPIC) String topic); void sendMessage2Mqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload); }
package com.shbykj.handle.mqtt; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.integration.channel.DirectChannel; import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory; import org.springframework.integration.mqtt.core.MqttPahoClientFactory; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHandler; import org.springframework.messaging.MessagingException; @Configuration public class IotMqttProducerConfig { public final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private BykjMqttConfig mqttConfig; /* * * MQTT連接器選項 * * */ @Bean(value = "getMqttConnectOptions") public MqttConnectOptions getMqttConnectOptions1() { MqttConnectOptions mqttConnectOptions = new MqttConnectOptions(); // 設置是否清空session,這里如果設置為false表示服務器會保留客戶端的連接記錄,這里設置為true表示每次連接到服務器都以新的身份連接 mqttConnectOptions.setCleanSession(true); // 設置超時時間 單位為秒 mqttConnectOptions.setConnectionTimeout(mqttConfig.getCompletionTimeout()); mqttConnectOptions.setAutomaticReconnect(true); mqttConnectOptions.setUserName(mqttConfig.getUsername()); mqttConnectOptions.setPassword(mqttConfig.getPassword().toCharArray()); mqttConnectOptions.setServerURIs(new String[]{mqttConfig.getUrl()}); // 設置會話心跳時間 單位為秒 服務器會每隔1.5*20秒的時間向客戶端發送心跳判斷客戶端是否在線,但這個方法并沒有重連的機制 mqttConnectOptions.setKeepAliveInterval(10); // 設置“遺囑”消息的話題,若客戶端與服務器之間的連接意外中斷,服務器將發布客戶端的“遺囑”消息。 //mqttConnectOptions.setWill("willTopic", WILL_DATA, 2, false); return mqttConnectOptions; } /** * mqtt工廠 * * @return */ @Bean public MqttPahoClientFactory mqttClientFactory() { DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory(); // factory.setServerURIs(mqttConfig.getServers()); factory.setConnectionOptions(getMqttConnectOptions1()); return factory; } @Bean public MessageChannel iotMqttInputChannel() { return new DirectChannel(); } // @Bean // @ServiceActivator(inputChannel = "iotMqttInputChannel") // public MessageHandler mqttOutbound() { // MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(mqttConfig.getClientId(), mqttClientFactory()); // messageHandler.setAsync(false); // messageHandler.setDefaultQos(2); // messageHandler.setDefaultTopic(mqttConfig.getDefaultTopic()); // return messageHandler; // } @Bean @ServiceActivator(inputChannel = "iotMqttInputChannel") public MessageHandler handlerTest() { return message -> { try { String string = message.getPayload().toString(); System.out.println(string); } catch (MessagingException ex) { ex.printStackTrace(); logger.info(ex.getMessage()); } }; } }
package com.shbykj.handle.mqtt; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.integration.channel.DirectChannel; import org.springframework.integration.core.MessageProducer; import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory; import org.springframework.integration.mqtt.core.MqttPahoClientFactory; import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter; import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler; import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHandler; import org.springframework.messaging.MessagingException; /** * @Author: xiaofu * @Description: 消息訂閱配置 * @date 2020/6/8 18:24 */ @Configuration public class IotMqttSubscriberConfig { public final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private MqttReceiveHandle mqttReceiveHandle; @Autowired private BykjMqttConfig mqttConfig; /* * * MQTT連接器選項 * * */ @Bean(value = "getMqttConnectOptions") public MqttConnectOptions getMqttConnectOptions1() { MqttConnectOptions mqttConnectOptions = new MqttConnectOptions(); // 設置是否清空session,這里如果設置為false表示服務器會保留客戶端的連接記錄,這里設置為true表示每次連接到服務器都以新的身份連接 mqttConnectOptions.setCleanSession(true); // 設置超時時間 單位為秒 mqttConnectOptions.setConnectionTimeout(10); mqttConnectOptions.setAutomaticReconnect(true); // mqttConnectOptions.setUserName(mqttConfig.getUsername()); // mqttConnectOptions.setPassword(mqttConfig.getPassword().toCharArray()); mqttConnectOptions.setServerURIs(new String[]{mqttConfig.getUrl()}); // 設置會話心跳時間 單位為秒 服務器會每隔1.5*20秒的時間向客戶端發送心跳判斷客戶端是否在線,但這個方法并沒有重連的機制 mqttConnectOptions.setKeepAliveInterval(10); // 設置“遺囑”消息的話題,若客戶端與服務器之間的連接意外中斷,服務器將發布客戶端的“遺囑”消息。 //mqttConnectOptions.setWill("willTopic", WILL_DATA, 2, false); return mqttConnectOptions; } /* * *MQTT信息通道(生產者) ** */ @Bean public MessageChannel iotMqttOutboundChannel() { return new DirectChannel(); } /* * *MQTT消息處理器(生產者) ** */ @Bean @ServiceActivator(inputChannel = "iotMqttOutboundChannel") public MessageHandler mqttOutbound() { MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(mqttConfig.getClientId(), mqttClientFactory()); messageHandler.setAsync(true); messageHandler.setDefaultTopic(mqttConfig.getDefaultTopic()); return messageHandler; } /* * *MQTT工廠 ** */ @Bean public MqttPahoClientFactory mqttClientFactory() { DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory(); // factory.setServerURIs(mqttConfig.getServers()); factory.setConnectionOptions(getMqttConnectOptions1()); return factory; } /* * *MQTT信息通道(消費者) ** */ @Bean public MessageChannel iotMqttInputChannel() { return new DirectChannel(); } /** * 配置client,監聽的topic * MQTT消息訂閱綁定(消費者) ***/ @Bean public MessageProducer inbound() { MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(mqttConfig.getClientId(), mqttClientFactory(), mqttConfig.getDefaultTopic(), mqttConfig.getShbykjTopic()); adapter.setCompletionTimeout(mqttConfig.getCompletionTimeout()); adapter.setConverter(new DefaultPahoMessageConverter()); adapter.setQos(2); adapter.setOutputChannel(iotMqttInputChannel()); return adapter; } /** * @author wxm * @description 消息訂閱 * @date 2020/6/8 18:20 */ @Bean @ServiceActivator(inputChannel = "iotMqttInputChannel") public MessageHandler handler() { return new MessageHandler() { @Override public void handleMessage(Message<?> message) throws MessagingException { //處理接收消息 try { mqttReceiveHandle.handle(message); } catch (Exception e) { logger.warn("消息處理異常"+e.getMessage()); e.printStackTrace(); } } }; } }
package com.shbykj.handle.mqtt; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.shbykj.handle.common.DataCheck; import com.shbykj.handle.common.RedisKey; import com.shbykj.handle.common.RedisUtils; import com.shbykj.handle.common.constants.Constants; import com.shbykj.handle.common.model.ShbyCSDeviceEntity; import com.shbykj.handle.common.model.sys.SysInstrument; import com.shbykj.handle.resolve.mapper.SysInstrumentMapper; import com.shbykj.handle.resolve.util.DateUtils; import com.shbykj.handle.resolve.util.ShbyCSDeviceUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.BidiMap; import org.apache.commons.collections.bidimap.DualHashBidiMap; import org.apache.commons.lang3.StringUtils; import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.MqttCallback; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.integration.mqtt.support.MqttHeaders; import org.springframework.messaging.Message; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; /* * * mqtt客戶端消息處理類 * **/ @Component @Slf4j @Transactional public class MqttReceiveHandle implements MqttCallback { private static final Logger logger = LoggerFactory.getLogger(MqttReceiveHandle.class); @Value("${shbykj.checkCrc}") private boolean checkcrc; @Autowired private SysInstrumentMapper sysInstrumentMapper; @Autowired private RedisUtils redisUtils; public static BidiMap bidiMap = new DualHashBidiMap(); //記錄bykj協議內容 public static Map<String, Map<String, Object>> devMap = new HashMap(); //記錄上限數量 // public static Map<String, ChannelHandlerContext> ctxMap = new HashMap(); public void handle(Message<?> message) { try { logger.info("{},客戶端號:{},主題:{},QOS:{},消息接收到的數據:{}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), message.getHeaders().get(MqttHeaders.ID), message.getHeaders().get(MqttHeaders.RECEIVED_TOPIC), message.getHeaders().get(MqttHeaders.RECEIVED_QOS), message.getPayload()); //處理mqtt數據 this.handle(message.getPayload().toString()); } catch (Exception e) { e.printStackTrace(); log.error("處理錯誤" + e.getMessage()); } } private void handle(String str) throws Exception { boolean flag = this.dataCheck(str); if (flag) { ShbyCSDeviceEntity shbyCSDeviceEntity = ShbyCSDeviceUtils.convertToSysInstrumentEntity(str); String deviceNumber = shbyCSDeviceEntity.getPN(); String smpId = shbyCSDeviceEntity.getSMP_ID(); String smpName = shbyCSDeviceEntity.getSMP_NAME(); String smpWt = shbyCSDeviceEntity.getSMP_WT(); if (StringUtils.isEmpty(smpId) || StringUtils.isEmpty(smpName) || StringUtils.isEmpty(smpWt)) { log.error("過濾無實際作用報文信息", str); logger.error("過濾無實際作用報文信息", str); return; } //判斷設備id是否存在數據庫中,存在才進行數據部分處理 //不存在就提醒需要添加設備: QueryWrapper<SysInstrument> wrapper = new QueryWrapper(); wrapper.eq("number", deviceNumber); wrapper.eq("is_deleted", Constants.NO); SysInstrument sysInstrument = sysInstrumentMapper.selectOne(wrapper); if (null == sysInstrument) { log.error("碳氧儀不存在或已刪除,設備號:{}", deviceNumber); logger.error("碳氧儀不存在或已刪除,設備號:{}", deviceNumber); return; } try { //增加實時數據 String instrumentId = sysInstrument.getId().toString(); String realDataKey = RedisKey.CSdevice_DATA_KEY + instrumentId; this.redisUtils.set(realDataKey, shbyCSDeviceEntity); System.out.println(shbyCSDeviceEntity); //通訊時間 String onlineTime = "shbykj_mqtt:onlines:" + instrumentId; this.redisUtils.set(onlineTime, shbyCSDeviceEntity.getDataTime(), (long) Constants.RedisTimeOut.REAL_TIME_OUT); log.info("實時數據已經更新:設備主鍵id" + instrumentId); logger.info("{} 實時數據已經更新:設備主鍵id:{}",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()),instrumentId); } catch (Exception var1) { log.error("redis處理實時報文數據邏輯異常 :" + var1.getMessage()); logger.error("redis處理實時報文數據邏輯異常 :" + var1.getMessage()); } } } private boolean dataCheck(String message) { boolean flag = DataCheck.receiverCheck(message); if (!flag) { return false; } else { int i = message.indexOf("QN="); if (i < 0) { log.warn("數據包中沒有QN號碼: " + message); logger.warn("數據包中沒有QN號碼: " + message); return false; } else { i = message.indexOf("PN="); if (i < 0) { log.warn("數據包中沒有PN號碼: " + message); logger.warn("數據包中沒有PN號碼: " + message); return false; } else { if (this.checkcrc) { flag = DataCheck.checkCrc(message); if (!flag) { log.warn("crc校驗失敗: " + message); logger.warn("數據包中沒有PN號碼: " + message); return false; } } return true; } } } } /** * 連接丟失 * * @param throwable */ @Override public void connectionLost(Throwable throwable) { logger.warn("連接丟失-客戶端:{},原因:{}", throwable.getMessage()); } /** * 消息已到達 * * @param s * @param mqttMessage * @throws Exception */ @Override public void messageArrived(String s, MqttMessage mqttMessage) throws Exception { } /** * 完成消息回調 * * @param iMqttDeliveryToken */ @Override public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { } }
pom
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency>
druid-bean.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 配置_Druid和Spring關聯監控配置 --> <bean id="druid-stat-interceptor" class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor"></bean> <!-- 方法名正則匹配攔截配置 --> <bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut" scope="prototype"> <property name="patterns"> <list> <value>com.shbykj.*.service.*.impl.*</value> </list> </property> </bean> <aop:config proxy-target-class="true"> <aop:advisor advice-ref="druid-stat-interceptor" pointcut-ref="druid-stat-pointcut" /> </aop:config> </beans>
yml
#spring spring: main: allow-bean-definition-overriding: true # mysql DATABASE CONFIG datasource: druid: filters: stat,wall,log4j2 continueOnError: true type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/mqttdb?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&allowPublicKeyRetrieval=true username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver # see https://github.com/alibaba/druid initialSize: 15 minIdle: 10 maxActive: 200 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 validationQuery: SELECT 1 testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true keepAlive: true maxPoolPreparedStatementPerConnectionSize: 50 connectionProperties: druid.stat.mergeSql: true druid.stat.slowSqlMillis: 5000
啟動類加上注解@ImportResource( locations = {"classpath:druid-bean.xml"} )
pom
<!--mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>spring-wind</artifactId> <version>1.1.5</version> <exclusions> <exclusion> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.baomidou</groupId> <version>3.1.2</version> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> <!--PageHelper分頁插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.12</version> </dependency>
yml
#mybatis mybatis-plus: mapper-locations: classpath:/mapper/*.xml typeAliasesPackage: org.spring.springboot.entity global-config: #主鍵類型 0:"數據庫ID自增", 1:"用戶輸入ID",2:"全局唯一ID (數字類型唯一ID)", 3:"全局唯一ID UUID"; id-type: 3 #字段策略 0:"忽略判斷",1:"非 NULL 判斷"),2:"非空判斷" field-strategy: 2 #駝峰下劃線轉換 db-column-underline: true #刷新mapper 調試神器 refresh-mapper: true configuration: map-underscore-to-camel-case: true cache-enabled: false
啟動類注解@MapperScan({"com.shbykj.handle.resolve.mapper"})
完整pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.shbykj</groupId> <artifactId>handle</artifactId> <version>0.0.1-SNAPSHOT</version> <name>handle</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!--注意: <scope>compile</scope> 這里是正式環境,解決啟動報錯--> <!--idea springboot啟動報SLF4J:Failed to load class “org.slf4j.impl.StaticLoggerBinder--> <!--參考:https://blog.csdn.net/u010696630/article/details/84991116--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.25</version> <scope>compile</scope> </dependency> <!-- Log4j2 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!--開啟日志注解--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- 排除 Spring-boot-starter 默認的日志配置 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!--swagger api接口生成--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> <!-- 代碼生成器的依賴 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency> <!--mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifactId>spring-wind</artifactId> <version>1.1.5</version> <exclusions> <exclusion> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.baomidou</groupId> <version>3.1.2</version> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <!--PageHelper分頁插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.12</version> </dependency> <!--devtools熱部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <scope>runtime</scope> </dependency> <!--json轉換工具--> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </dependency> <!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--工具類--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.8.1</version> </dependency> <!--google--> <!-- https://mvnrepository.com/artifact/com.google.guava/guava --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>30.0-jre</version> </dependency> <!-- 工具類庫 --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-core</artifactId> <version>5.5.0</version> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
server: port: 8082 #spring spring: devtools: restart: enabled: true main: allow-bean-definition-overriding: true # mysql DATABASE CONFIG datasource: druid: filters: stat,wall,log4j2 continueOnError: true type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/mqttdb?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&allowPublicKeyRetrieval=true username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver # see https://github.com/alibaba/druid initialSize: 15 minIdle: 10 maxActive: 200 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 validationQuery: SELECT 1 testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true keepAlive: true maxPoolPreparedStatementPerConnectionSize: 50 connectionProperties: druid.stat.mergeSql: true druid.stat.slowSqlMillis: 5000 shbykj: checkCrc: false #mybatis mybatis-plus: mapper-locations: classpath:/mapper/*.xml typeAliasesPackage: org.spring.springboot.entity global-config: #主鍵類型 0:"數據庫ID自增", 1:"用戶輸入ID",2:"全局唯一ID (數字類型唯一ID)", 3:"全局唯一ID UUID"; id-type: 3 #字段策略 0:"忽略判斷",1:"非 NULL 判斷"),2:"非空判斷" field-strategy: 2 #駝峰下劃線轉換 db-column-underline: true #刷新mapper 調試神器 refresh-mapper: true configuration: map-underscore-to-camel-case: true cache-enabled: false #logging logging: config: classpath:log4j2-demo.xml
pom
<!--swagger api接口生成--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> <!--解決報錯:swagger:Illegal DefaultValue null for parameter type integer. java.lang.NumberFormatException: For input string: "".--> <!--1.5.21的AbstractSerializableParameter.getExample()方法增加了對空字符串的判斷--> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-models</artifactId> <version>1.5.21</version> </dependency> <!-- 代碼生成器的依賴 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency>
使用
package com.shbykj.handle.web.wx; import com.baomidou.mybatisplus.core.metadata.IPage; import com.shbykj.handle.common.RetMsgData; import com.shbykj.handle.common.State; import com.shbykj.handle.common.model.sys.SysInstrument; import com.shbykj.handle.h.service.ISysInstrumentService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * 監測點接口 * * @author * @date 2021-01-15 16:49 */ @RestController @RequestMapping({"/api/wxapoint"}) @Api( tags = {"小程序 監測點接口"} ) public class CSDevicesController extends BaseController { @Autowired private ISysInstrumentService sysInstrumentService; public CSDevicesController() { } @ApiOperation( value = "分頁查詢", notes = "分頁查詢站點信息" ) @ApiImplicitParams({@ApiImplicitParam( name = "number", value = "設備編號", paramType = "query", dataType = "String" ), @ApiImplicitParam( name = "page", value = "頁碼 從1開始", required = false, dataType = "long", paramType = "query" ), @ApiImplicitParam( name = "size", value = "頁數", required = false, dataType = "long", paramType = "query" )}) @GetMapping({"/pageByNumber"}) public RetMsgData<IPage<SysInstrument>> pageByNumber(@RequestParam(required = false) String number) { RetMsgData msg = new RetMsgData(); try { IPage<SysInstrument> page1 = this.getPage(); page1 = sysInstrumentService.pageByNumber(number, page1); msg.setData(page1); } catch (Exception var5) { msg.setState(State.RET_STATE_SYSTEM_ERROR); this.logger.error(var5.getMessage()); } return msg; } }
package com.shbykj.handle.common.model.sys; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import java.util.Date; @TableName("instrument") @ApiModel("儀器配置表字段信息") public class SysInstrument implements Serializable { private static final long serialVersionUID = 1L; @TableId( value = "id", type = IdType.AUTO ) @ApiModelProperty( value = "id", name = "id", required = true ) private Long id; @TableField("name") @ApiModelProperty( value = "名稱 儀器名稱", name = "name" ) private String name; @TableField("number") @ApiModelProperty( value = "編號 儀器編號(PN)", name = "number" ) private String number; @TableField("manufacturer") @ApiModelProperty( value = "生產廠商 生產廠商", name = "manufacturer" ) private String manufacturer; @TableField("gmt_create") @ApiModelProperty( value = "創建時間", name = "gmt_create" ) private Date gmtCreate; @TableField("gmt_modified") @ApiModelProperty( value = "更新時間", name = "gmt_modified" ) private Date gmtModified; @TableField("is_deleted") @ApiModelProperty( value = "表示刪除,0 表示未刪除 默認0", name = "is_deleted" ) private Integer isDeleted; @TableField("device_type") @ApiModelProperty( value = "設備類型(PT)", name = "device_type" ) private String deviceType; public SysInstrument() { } public Long getId() { return this.id; } public String getName() { return this.name; } public String getNumber() { return this.number; } public String getManufacturer() { return this.manufacturer; } public Date getGmtCreate() { return this.gmtCreate; } public Date getGmtModified() { return this.gmtModified; } public Integer getIsDeleted() { return this.isDeleted; } public String getDeviceType() { return this.deviceType; } public void setId(final Long id) { this.id = id; } public void setName(final String name) { this.name = name; } public void setNumber(final String number) { this.number = number; } public void setManufacturer(final String manufacturer) { this.manufacturer = manufacturer; } public void setGmtCreate(final Date gmtCreate) { this.gmtCreate = gmtCreate; } public void setGmtModified(final Date gmtModified) { this.gmtModified = gmtModified; } public void setIsDeleted(final Integer isDeleted) { this.isDeleted = isDeleted; } public void setDeviceType(final String deviceType) { this.deviceType = deviceType; } public String toString() { return "SysInstrument(id=" + this.getId() + ", name=" + this.getName() + ", number=" + this.getNumber() + ", manufacturer=" + this.getManufacturer() + ", gmtCreate=" + this.getGmtCreate() + ", gmtModified=" + this.getGmtModified() + ", isDeleted=" + this.getIsDeleted() + ", deviceType=" + this.getDeviceType() + ")"; } }
pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.shbykj</groupId> <artifactId>handle_mqtt</artifactId> <version>0.0.1-SNAPSHOT</version> <name>handle_mqtt</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <skipTests>true</skipTests> </properties> <dependencies> <!--mqtt依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-integration</artifactId> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-stream</artifactId> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-mqtt</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!--注意: <scope>compile</scope> 這里是正式環境,解決啟動報錯--> <!--idea springboot啟動報SLF4J:Failed to load class “org.slf4j.impl.StaticLoggerBinder--> <!--參考:https://blog.csdn.net/u010696630/article/details/84991116--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.25</version> <scope>compile</scope> </dependency> <!-- Log4j2 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!-- 排除 Spring-boot-starter 默認的日志配置 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!--swagger api接口生成--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> <!--解決報錯:swagger:Illegal DefaultValue null for parameter type integer. java.lang.NumberFormatException: For input string: "".--> <!--1.5.21的AbstractSerializableParameter.getExample()方法增加了對空字符串的判斷--> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-models</artifactId> <version>1.5.21</version> </dependency> <!-- 代碼生成器的依賴 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency> <!--其他工具--> <!--devtools熱部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <scope>runtime</scope> </dependency> <!--json轉換工具--> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </dependency> <!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--工具類--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.8.1</version> </dependency> <!--google--> <!-- https://mvnrepository.com/artifact/com.google.guava/guava --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>30.0-jre</version> </dependency> <!-- 工具類庫 --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-core</artifactId> <version>5.5.0</version> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!--工具類--> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>spring-wind</artifactId> <version>1.1.5</version> <exclusions> <exclusion> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.baomidou</groupId> <version>3.1.2</version> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <!--PageHelper分頁插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.12</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
yml
server: port: 8082 iot: mqtt: clientId: ${random.value} defaultTopic: topic shbykjTopic: shbykj_topic url: tcp://127.0.0.1:1883 username: admin password: admin completionTimeout: 3000 #微信小程序相關參數 shbykjWeixinAppid: wxae343ca8948f97c4 shbykjSecret: 9e168c92702efc06cb12fa22680f049a #spring spring: devtools: restart: enabled: true main: allow-bean-definition-overriding: true # mysql DATABASE CONFIG datasource: druid: filters: stat,wall,log4j2 continueOnError: true type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/mqttdb?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&allowPublicKeyRetrieval=true username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver # see https://github.com/alibaba/druid initialSize: 15 minIdle: 10 maxActive: 200 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 validationQuery: SELECT 1 testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true keepAlive: true maxPoolPreparedStatementPerConnectionSize: 50 connectionProperties: druid.stat.mergeSql: true druid.stat.slowSqlMillis: 5000 shbykj: checkCrc: false #mybatis mybatis-plus: mapper-locations: classpath:/mapper/*.xml typeAliasesPackage: org.spring.springboot.entity global-config: #主鍵類型 0:"數據庫ID自增", 1:"用戶輸入ID",2:"全局唯一ID (數字類型唯一ID)", 3:"全局唯一ID UUID"; id-type: 3 #字段策略 0:"忽略判斷",1:"非 NULL 判斷"),2:"非空判斷" field-strategy: 2 #駝峰下劃線轉換 db-column-underline: true #刷新mapper 調試神器 refresh-mapper: true configuration: map-underscore-to-camel-case: true cache-enabled: false #log4j打印sql日志 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #logging logging: config: classpath:log4j2-demo.xml
關于“springboot如何實現mqtt物聯網”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。