中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springboot如何實現mqtt物聯網

發布時間:2021-03-26 10:44:50 來源:億速云 閱讀:248 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關springboot如何實現mqtt物聯網,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

Springboot整合mybatisPlus+mysql+druid+swaggerUI+ mqtt 整合mqtt整合druid整合mybatis-plus完整pom完整yml整合swaggerUi整合log4j MQTT 物聯網系統基本架構本物聯網系列
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) {

 }
}

整合druid

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"} )

springboot如何實現mqtt物聯網

整合mybatis-plus

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>

完整yml

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

整合swaggerUi

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() + ")";
 }
}

MQTT 物聯網系統基本架構

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物聯網”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

射阳县| 鄢陵县| 内乡县| 莲花县| 慈利县| 平乐县| 宜州市| 正安县| 海阳市| 岳西县| 克拉玛依市| 西藏| 抚州市| 桓仁| 汨罗市| 常州市| 洛浦县| 浮梁县| 读书| 连云港市| 晴隆县| 冀州市| 长兴县| 双牌县| 名山县| 麟游县| 西青区| 繁昌县| 金湖县| 滨州市| 海盐县| 铁力市| 深泽县| 灵寿县| 清原| 连州市| 云南省| 百色市| 分宜县| 盐山县| 波密县|