我的编程空间,编程开发者的网络收藏夹
学习永远不晚

springboot如何实现mqtt物联网

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

springboot如何实现mqtt物联网

这篇文章将为大家详细讲解有关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;@Getter@Setter@Component@IntegrationComponentScan@ConfigurationProperties(prefix = "iot.mqtt")public class BykjMqttConfig {  private String url;  private String clientId;  private String defaultTopic;  private String username; private String password;  private int completionTimeout;  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;@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;@Configurationpublic class IotMqttProducerConfig { public final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private BykjMqttConfig mqttConfig;  @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; }  @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;@Configurationpublic class IotMqttSubscriberConfig { public final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private MqttReceiveHandle mqttReceiveHandle; @Autowired private BykjMqttConfig mqttConfig;  @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; }  @Bean public MessageChannel iotMqttOutboundChannel() { return new DirectChannel(); }  @Bean @ServiceActivator(inputChannel = "iotMqttOutboundChannel") public MessageHandler mqttOutbound() { MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(mqttConfig.getClientId(), mqttClientFactory()); messageHandler.setAsync(true); messageHandler.setDefaultTopic(mqttConfig.getDefaultTopic()); return messageHandler; }  @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 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; }  @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;@Component@Slf4j@Transactionalpublic 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;  }  } } }  @Override public void connectionLost(Throwable throwable) { logger.warn("连接丢失-客户端:{},原因:{}", throwable.getMessage()); }  @Override public void messageArrived(String s, MqttMessage mqttMessage) throws Exception { }  @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

#springspring: 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

#mybatismybatis-plus: mapper-locations: classpath:/mapper@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: 8082iot: mqtt: clientId: ${random.value} defaultTopic: topic shbykjTopic: shbykj_topic url: tcp://127.0.0.1:1883 username: admin password: admin completionTimeout: 3000#微信小程序相关参数shbykjWeixinAppid: wxae343ca8948f97c4shbykjSecret: 9e168c92702efc06cb12fa22680f049a#springspring: 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: 5000shbykj: checkCrc: false#mybatismybatis-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#logginglogging: config: classpath:log4j2-demo.xml

关于“springboot如何实现mqtt物联网”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

springboot如何实现mqtt物联网

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

springboot如何实现mqtt物联网

这篇文章将为大家详细讲解有关springboot如何实现mqtt物联网,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Springboot整合mybatisPlus+mysql+druid+swaggerU
2023-06-14

SpringBoot如何实现MQTT消息发送和接收

今天小编给大家分享一下SpringBoot如何实现MQTT消息发送和接收的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Spr
2023-07-05

物联网实现的any有哪些

本篇内容主要讲解“物联网实现的any有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“物联网实现的any有哪些”吧!物联网实现的any有四个,包括:1、anywhere(任何地点);2、any
2023-06-29

人工智能实现物联网革命

编程学习网:物联网正在改变我们的学习方式,因为它正在改变我们的生活方式。AI专家表示,由AI驱动的物联网将以前所未有的方式改变我们的生活。
人工智能实现物联网革命
2024-04-23

【物联网开发】-微信小程序之MQTT连接,基于MQTT实现设备-服务器-小程序的消息传输

一、前期知识准备 想要开发微信小程序,首先要有一些基础知识:html、cs、js、json等,小程序中要用到的知识框架大体相同,一个页面包括js、json、wxml、wxss格式的文件。 由于本人此前从未接触过小程序开发,本篇文章将会以新手
2023-08-17

物联网开发|如何选择一款适合你的物联网操作系统?

随着物联网产业的迅猛发展,物联网设备的种类和数量也随之快速增长。据 Gartner 预测,到 2020 年全球物联网设备将超过 260 亿个,物联网市场规模将达到 1.9 万亿美元。与传统的 IT领域不一样,物联网设备分布在各个不同领域,功
2023-06-03

MongoDB在物联网领域中如何应用

MongoDB在物联网领域中具有广泛的应用场景,主要包括以下几个方面:数据存储和管理:物联网设备产生大量的数据,包括传感器数据、日志数据、事件数据等。MongoDB作为一种NoSQL数据库,具有高性能、高可扩展性和灵活的数据模型,非常适合存
MongoDB在物联网领域中如何应用
2024-05-07

物流APP开发实现物流行业与互联网完美结合!

互联网新时代,移动客户端应运而生并随之蓬勃发展;各行业都在进行着转型;物流行业也不例外。如今寄快递也都直接扫码填写相关信息,手机端更是可以实时监控物流的配送情况。在未来发展中,物流信息化已经成为了行业的发展趋势,为了实现物流行业与互联网完美
2023-06-05

如何实现局域网与广域网互联

这篇文章主要介绍如何实现局域网与广域网互联,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实现局域网与广域网互联的主要设备是“路由器”。路由器是连接两个或多个网络的硬件设备,在网络间起网关的作用,是读取每一个数据包中的
2023-06-15

Go语言开发物联网应用的实现与优化

Go语言开发物联网应用的实现与优化随着物联网技术的快速发展,物联网应用在各个领域都得到了广泛应用。而作为一种高效、稳定、并发性能良好的编程语言,Go语言在物联网应用的开发中具有很大的优势。本文将介绍如何使用Go语言开发物联网应用,并针对物联
Go语言开发物联网应用的实现与优化
2023-11-20

Teradata如何应用在物联网数据分析领域

Teradata是一家专门从事数据分析和数据管理的公司,它的技术可以应用在物联网数据分析领域。在物联网数据分析领域,Teradata可以帮助企业处理大量的实时数据,并提供高性能的数据存储和处理能力。以下是Teradata在物联网数据分析领域
Teradata如何应用在物联网数据分析领域
2024-04-09

php如何实现购物车

php实现购物车方案购物车是电商网站必备功能,php提供了多种实现方式。会话存储购物车使用会话功能存储购物车数据,简单易行。数据库存储购物车将购物车数据存储在数据库,持久化存储,不会因关闭浏览器而丢失。对象存储购物车使用面向对象编程,自定义购物车对象,灵活且功能强大。第三方库实现购物车使用第三方库,如LaravelShoppingCart和CodeIgniterCart,提供丰富的功能和友好的API。选择合适方案取决于网站需求和技术栈,小型网站可考虑会话存储或数据库存储,持久化存储可选择对象存储或第三方库
php如何实现购物车
2024-04-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录