久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

springboot 實現mqtt物聯網的示例代碼

瀏覽:182日期:2023-03-19 16:36:52

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;@Configurationpublic 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 */@Configurationpublic 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@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; } } } } /** * 連接丟失 * * @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 class='com.alibaba.druid.support.spring.stat.DruidStatInterceptor'></bean> <!-- 方法名正則匹配攔截配置 --> <bean 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/*.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#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#logginglogging: 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() + ')'; }}整合log4j

https://www.jb51.net/article/152599.htm

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物聯網的文章就介紹到這了,更多相關springboot 實現mqtt物聯網內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 国产精品99久久久久久久久久久久 | 成人不卡视频 | 一级全毛片 | 羞羞视频在线观看入口 | 亚洲欧洲日韩在线 | 夜夜操天天干 | 电影91久久久 | 中文字幕 国产 | 黄色欧美一级片 | 国产精品久久久爽爽爽麻豆色哟哟 | 五月天在线婷婷 | 毛片视频观看 | 国产在线观看91一区二区三区 | 中文字幕日韩一区二区不卡 | 在线中文视频 | 一本色道精品久久一区二区三区 | 亚洲欧洲一区二区 | 久久午夜视频 | 国产精品久久久久久久午夜片 | 国产成人精品久久 | www一区二区 | 99精品电影 | 色呦呦网站在线观看 | 激情欧美一区二区 | 视频一区二区三区在线观看 | 久久久毛片 | 精品国产精品三级精品av网址 | 久久免费99精品久久久久久 | 久久精品视频免费观看 | 在线一区观看 | 国产美女在线观看 | 91综合在线观看 | 日本一区二区三区免费观看 | 免费v片 | 97人人超碰 | 91观看 | 精品国产乱码久久久久久密桃99 | 午夜草民福利电影 | 成人免费视频视频在线观看 免费 | 久久久久久久久一区二区三区 | 午夜精品久久久久久 | 亚洲 欧美 日韩在线 | 狠狠做深爱婷婷综合一区 | 国产精彩视频 | 九九热最新地址 | 97人人爱| 欧州一区二区三区 | 麻豆色呦呦 | 四虎影院在线免费播放 | 欧美中文在线观看 | 91在线高清观看 | 禁果av一区二区三区 | 免费av中国 | 日韩在线二区 | 日韩一区二区精品 | 亚洲网在线 | 成人免费高清 | 男人的天堂久久 | 久久久久9999国产精品 | 国产精品一区久久 | av在线干 | 福利二区视频 | 久久99国产精品 | 精品久久99 | 美女天堂网 | 亚洲欧美精品一区二区三区 | 最新亚洲黄色网址 | 污视频免费网站观看 | 久久av综合网 | 日韩一区欧美 | 久久精品国产亚卅av嘿嘿 | 成人区一区二区三区 | 免费看国产片在线观看 | 日韩一区免费观看 | 一区二区福利 | 免费看国产一级片 | 女人毛片a毛片久久人人 | 欧美精品一二三区 | 亚洲精品3区 | 91一区| 91人人 | 成人激情视频在线观看 | 亚洲视频免费观看 | 亚洲精品一区二区三区蜜桃久 | 日韩欧美在线视频观看 | 中文字幕在线三区 | 国产成人精品av | 可以免费观看的av | 欧美激情一区二区 | 中文字幕一区二区在线观看 | 久久久久久成人 | 国产日韩精品视频 | 99国产精品久久久 | 亚洲欧美综合 | 中文在线视频 | 黄色片在线免费观看 | 99精品欧美一区二区三区 | 日日摸夜夜添夜夜添高潮视频 | 日韩一区二区三区在线 | 精品国产乱码久久久久久1区2区 | 国产农村妇女精品久久 | 91免费观看 | 91九色最新| 99久久99热这里只有精品 | 亚洲天堂一区二区 | 国产精品久久久久一区二区三区 | 久久久国产一区二区三区 | 精品亚洲一区二区三区 | 一区二区三区久久 | 中文字幕在线视频第一页 | 国产a级毛片| 激情久久久久 | 欧洲免费毛片 | 国产精品极品美女在线观看免费 | 亚洲情综合五月天 | 欧美性猛xxx | 亚洲一级在线观看 | 九九热精品视频 | 亚洲精品在线看 | 国产一区二区三区免费 | 欧美精品免费在线 | 你懂的在线视频播放 | 日韩久久精品一区二区 | 91精品久久久久久久久久入口 | 日韩在线资源 | 欧美激情在线精品一区二区三区 | 欧美a一级 | 久久久久久一区二区 | 成年人免费在线视频 | 精品日韩中文字幕 | 天堂精品| 91亚洲免费| 国产精品久久久久久久久久久新郎 | 日本久久久久 | www.日韩在线观看 | 欧美狠狠操 | 天天操天天干天天插 | 久久婷婷国产麻豆91天堂 | 欧美成人一区二区三区片免费 | 午夜一区二区三区 | av片在线观看网站 | 91高清在线 | h片观看 | 欧美一区二区免费 | 波多野结衣先锋影音 | 一级亚洲| 欧美在线一区二区三区 | 亚洲国产高清在线 | 欧美freesex交免费视频 | 天堂资源 | 成人在线欧美 | 97视频在线免费观看 | 在线免费视频一区 | 国产视频综合 | 国产精品久久精品 | 日韩大尺度电影在线观看 | 成人福利在线 | 亚洲乱码二区 | 在线精品一区 | 中文字幕欧美在线观看 | 日韩一区二区在线视频 | 美女黄视频网站 | 黄色毛片视频网站 | 国产精品污www在线观看 | 欧美久久成人 | 黄色大片免费网站 | 午夜影院普通用户体验区 | 激情欧美一区二区 | 亚洲+变态+欧美+另类+精品 | 97在线观看视频 | 亚洲精品成人久久久 | 中文字幕视频在线播放 | 91在线精品视频 | 亚洲精品一区二区三区蜜桃下载 | 亚洲欧美一区二区三区在线 | 午夜精品一区二区三区在线播放 | 日韩一区二区三区在线观看 | 亚洲精品久久久久久久久久久 | 超碰一区 | 人妖天堂狠狠ts人妖天堂狠狠 | 久久夜视频 | 日韩在线视频精品 | 欧洲精品一区 | www国产成人免费观看视频 | 成人精品国产 | 精品久久久久久久久福利 | 国产一区二区三区免费看 | 国产福利精品一区 | 爱草在线 | 一区二区三区四区在线 | 超碰免费观看 | 91免费版在线观看 | 精品无码久久久久久国产 | 国产一区二区久久 | 色综合成人 | 日韩在线视频一区 | 久久亚洲一区二区三区四区 | 日韩精品久久久久久 | 野狼在线社区2017入口 | 亚洲 中文 欧美 日韩 在线观看 | 天堂资源av| 亚洲人成中文字幕在线观看 | 亚洲人免费视频 | 成人午夜视频在线 | 精品99久久久久久 | 久在线 | 免费看片国产 | 九热精品| 成人亚洲精品久久久久软件 | 国产精品久久久久久婷婷天堂 | 天天草天天干 | 国产激情亚洲 | 毛片一级片 | 久久66| 美女国产网站 | 日本视频在线 | 国产精品久久一区 | 91高清视频在线观看 | 久久天堂 | 国产精品一区二区三区在线播放 | av在线三级 | 日韩欧美大片在线观看 | 午夜免费福利视频 | 亚洲精品一区二区三区中文字幕 | 91精品国产乱码久久久久久久久 | 久久性| 国产一区91 | 宅男lu666噜噜噜在线观看 | 国产精品视频一区二区三区四 | 欧洲一区二区三区 | 国产精品高潮呻吟av久久4虎 | 亚洲国产免费看 | 欧洲亚洲视频 | 国产精品久久久久久久久晋中 | 在线免费成人 | 国产美女自拍视频 | 日韩精品在线观看免费 | a级毛片免费高清视频 | 黄色一级免费观看 | 国产精品视屏 | 蜜桃一区二区三区 | 国产欧美精品一区二区三区 | 综合久久精品 | 超碰人人艹 | 久久福利 | 亚洲 欧美 日韩在线 | 日韩综合网 | 午夜tv免费观看 | 日本天天操 | 日韩影院在线 | 免费一区二区 | 国产精品毛片一区二区三区 | 久久久久黄色 | 国产色 | 国产精品一区二区无线 | 久久久久久久国产精品 | 羞羞视频免费在线观看 | 午夜播影院 | 黄色一级片黄色一级片 | 色约约精品免费看视频 | 91麻豆精品国产91久久久资源速度 | 欧美一区二区三区在线视频观看 | 日韩成人在线一区 | 亚洲人成人一区二区在线观看 | 色香蕉视频 | 99精品久久| 午夜一区二区三区在线观看 | 免费一级欧美在线观看视频 | 日本a v在线播放 | 久久美女 | 久久人人爽人人爽人人片av不 | 色啪网站 | 91av在线免费看 | 欧美video| 精久久 | 在线观看成人小视频 | 久久99国产精品久久99大师 | 99草免费视频 | 精品国产三级a在线观看 | 国产成人av网站 | 成年人在线看片 | 伊人电影综合 | 四虎影院网 | 一区二区免费视频观看 | 99精品免费 | 亚洲a网| 日本美女一区二区 | 日韩在线免费 | 中文字幕亚洲欧美 | 久久天堂 | 毛片入口 | 中文字幕免费在线 | aaa在线 | 一区二区在线免费观看 | 99爱爱视频| 大香萑| 亚洲一区二区在线播放 | 日韩和的一区二区 | 麻豆亚洲 | 国产精品看片 | 午夜大片网 | 久久视频精品 | 欧美性一区二区三区 | 欧美在线观看禁18 | 成人国产精品久久 | 国色天香成人网 | 亚洲协和影视 | 视频在线一区二区 | 国产视频一二三区 | 超碰在线看 | 一级黄色生活视频 | 操操操操操操操操操操操操操操 | 日韩高清国产一区在线 | 国产成人在线免费观看视频 | 黄色小视频在线观看 | 亚洲午夜视频在线观看 | 日本天天操 | 色噜噜在线 | 凹凸日日摸日日碰夜夜爽孕妇 | 亚洲另类视频 | 一区免费看 | 青青草免费在线 | 亚洲电影一区二区 | 99免费精品 | 日韩在线播放一区 | 91高清视频在线观看 | 99精品欧美一区二区蜜桃免费 | 久久99深爱久久99精品 | 三区免费视频 | 久草新免费 | 欧美日韩精品一区二区在线播放 | 中文字幕日韩久久 | 国产一级在线观看 | 国产精品一区二区在线 | 欧美性v| 欧美三级视频在线播放 | 亚洲三级免费观看 | 免费的黄色网 | 黄色av网站在线观看 | 亚洲福利一区二区 | 国产成人一区二区三区 | 久久久99精品免费观看 | 超碰综合 | 国产精品成人一区二区 | 国产一区二区av在线 | 日韩午夜激情视频 | 日本人做爰大片免费观看一老师 | 夜夜夜操操操 | 性培育学校羞耻椅子调教h 欧美精品网站 | 一区中文字幕 | 羞羞视频在线免费 | 黑人巨大精品欧美一区二区小视频 | 日日射av | 超碰免费在线观看 | 91观看 | 成人免费的视频 | 国产精品久久久久无码av | 欲色av| 国产精品a一区二区三区网址 | 北条麻妃一区二区免费播放 | 精品亚洲在线 | 色噜噜狠狠狠综合曰曰曰88av | 精品久久久久久久久久久久 | 国产视频中文字幕 | 午夜视频在线观看网站 | 国产精品久久久久久福利一牛影视 | 玖玖在线免费视频 | 久久青青| 亚洲高清一区二区三区 | 人人澡人人射 | 欧美三级视频在线播放 | 国产精品不卡 | 成人伊人| 99久久婷婷国产综合亚洲 | 九九九九九九精品任你躁 | 中文字幕av一区二区三区免费看 | 日韩欧美国产一区二区 | 久久久国产精品 | 操操网| 亚洲日韩欧美一区二区在线 | 国产99久久精品一区二区永久免费 | 午夜成年人 | 精品一区二区在线观看 | 欧美精品一区二区三区蜜桃视频 | www.涩涩视频 | 一级免费在线视频 | 九九爱爱视频 | 欧美日韩一区二区三区在线观看 | 国产精品日韩精品 | 天天干天天看天天操 | 男女黄色免费网站 | 午夜av影视 | 日本黄色大片 | 中文字幕 国产精品 | 欧美精品一区二区三区视频 | 在线观看av不卡 | 一区二区三区高清 | 亚洲不卡在线观看 | 理论片87福利理论电影 | 亚洲综合二区 | 日韩三级视频 | 亚洲精品国产a久久久久久 国产毛片毛片 | 久久手机免费视频 | 激情欧美一区二区三区中文字幕 | 热久久这里只有精品 | 欧美精品一区二区三区中文字幕 | 国产精品一区二区无线 | 午夜影视剧场 | 91社区在线高清 | 久久青青视频 | 樱桃小丸子在线观看 | 狠狠夜夜 | 在线观看一区 | 日日操视频 | 精品国产99| 欧美日韩一区二区在线 | 九色在线视频 | 国产欧美日韩一区二区三区 | 国产在线小视频 | 亚洲国产成人在线 | 国产成人自拍一区 | 久久一| 亚洲一区久久 | 欧美精品一区二区三区蜜桃视频 | 亚洲免费视频在线观看 | 欧美激情精品久久久久久 | 中文字幕av在线播放 | 国产精品久久久久久久久免费高清 | 精品久久久久久亚洲综合网 | 美日韩精品视频 | 黄色一级片在线看 | 亚洲高清在线视频 | 中文字幕一区二区三区日韩精品 | 久久精彩视频 | 久久国产一区二区三区 | 日韩日韩日韩日韩日韩日韩 | 国产精品自拍视频网站 | 亚洲三级在线观看 | 亚洲毛片在线 | 欧美日韩国产一区二区三区 | 免费视频爱爱太爽了 | 亚洲女人的天堂 | 精品国产欧美一区二区 | 日韩一区二区在线观看 | 亚洲国产欧美日韩 | 一区二区在线视频 | 天天久久 | 亚洲网站在线免费观看 | 欧美人成在线观看 | 看片地址 | 亚洲国产精品久久久久秋霞蜜臀 | 国产综合亚洲精品一区二 | av网站观看| 天天草天天干 | 在线看www | 天天夜夜操 | 国产情侣一区二区三区 | 欧美亚洲一区二区三区 | 亚洲精品视频导航 | 亚洲艹| 99久久这里只有精品 | 亚洲久草 | 亚洲欧美日韩一区二区 | 亚洲精品视频区 | 国产成人免费视频 | 黄视频网站免费看 | 国产精品视频久久久 | 黄色片免费在线观看 | 亚洲精品免费观看 | 波多野结衣一区二区三区四区 | 中文字幕av亚洲精品一部二部 | 99免费视频 | 日韩在线中文字幕 | 国产高清精品一区二区三区 | 欧美久久久久久久 | 精品在线一区二区 | 国产在线视频一区 | 日韩中文字幕国产 | 亚洲人在线播放 | 一区视频在线 | 国产高清在线观看 | 精品视频一区二区三区四区 | 午夜影视 | 999精品在线| 一级全黄少妇性色生活片免费 | 国产日韩一区 | 天天综合网久久综合网 | 国产无套一区二区三区久久 | 国产日韩一区二区 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 日韩一区二区三区精品 | 精品视频在线免费观看 | 久久精品久久精品 | 影音先锋中文字幕一区 | 欧美日韩一区二区三区在线观看 | 欧美日韩电影一区二区三区 | 国产精品成人久久久久 | 国产91在线观看 | 午夜免费视频网站 | 99精品视频在线 | 欧美成人毛片 | 91传媒在线播放 | 超级乱淫片国语对白免费视频 | av看片网 | 九九热在线视频免费观看 | 亚洲免费视频在线观看 | 中文字幕 国产精品 | 午夜精品久久久久久久 | 国产精品久久久久久久岛一牛影视 | 天天草天天干天天 | 亚洲男人天堂网 | 国产午夜精品一区二区三区免费 | 亚洲福利在线观看 | 欧美二区三区视频 | 精品一区二区三区蜜桃 | 粉嫩高清一区二区三区精品视频 | 国产精品久久久久久久毛片 | 日韩色区 | 久久一二区 | 国产成人av电影 | 亚洲一区二区在线 | 久久久精品免费观看 | 欧美日一区二区 | 午夜免费一区二区播放 | 亚洲精品一区二区三区 | 欧美日韩一二三 | jizz在线看片 | 动漫泳衣美女 | 久久9精品 | 一区二区三区高清不卡 | 欧美三级网址 | 婷婷欧美 | 午夜视频一区二区 | 国产精品久久久久久久久久久久久 | 欧美理论片在线观看 | 日本天天操 | 四虎最新影视 | 狠狠干av| 国产精品久久二区 | 浴室洗澡偷拍一区二区 | 国产中文视频 | 日韩一级黄色大片 | 欧洲成人在线观看 | 日韩久久久久久 | 国外成人在线视频网站 | 久久涩 | 91久久艹 | 久久精品国产亚卅av嘿嘿 | 欧美精品一区在线 | 91在线资源 | 视频1区2区| 一区二区三区视频免费在线观看 | 国产一区二区h | 男女视频免费看 | 国产欧美久久久久久 | 精品久久久久久久久久久久 | 国产一区二区在线看 | 欧美国产精品一区 | 国产日韩欧美综合 | 伊人天堂网 | 欧美 国产精品 | 久久综合亚洲 | 奇米色777欧美一区二区 | www.天天草 | 欧美久久久久久久久久久久 | 干干日日 | 国产精品久久久久久久久免费桃花 | 亚洲风情在线观看 | 91污在线 | 中文字幕二区 | 国产精品久久久久久久一区探花 | 亚洲欧美网站 | av免费网站 | 午夜午夜精品一区二区三区文 | 国外成人在线视频 | 成人亚洲电影 | 色婷婷综合网 | 欧美日韩视频在线 | 91精品国产91久久久久久密臀 | 青青草在线视频免费观看 | 成人在线 | 久久大 | 丁香婷婷久久久综合精品国产 | 极品久久 | 一区二区日本 | 亚洲欧美高清 | 99久久精品免费 | 久久久久久久久久久亚洲 | 999精品视频 | 亚洲成av人影片在线观看 | 久久久久久久av | 人人爽视频 | 免费观看电视在线高清视频 | 日本不卡在线 | 君岛美绪一区二区三区 | 精品一区二区三区在线观看 | 国产精品资源在线 | 欧洲成人午夜免费大片 | 一区二区三区国产在线观看 | 在线第一页 | 日韩中文字幕在线观看 | 日韩一区二区三区在线视频 | 亚洲二区在线播放 | a免费在线 | 国产欧美精品一区二区三区四区 | 中文字幕乱码一区二区三区 | 看片国产| 一区二区三区高清不卡 | 国产一区二区三区在线视频 | 日本不卡高字幕在线2019 | 爱草在线| 久久国产精彩视频 | 国产在线91 | 国产传媒毛片精品视频第一次 | 久久综合av|