diff --git a/example/mica-mqtt-server-spring-boot-example/pom.xml b/example/mica-mqtt-server-spring-boot-example/pom.xml index 6bcfa2d..43a9b6b 100644 --- a/example/mica-mqtt-server-spring-boot-example/pom.xml +++ b/example/mica-mqtt-server-spring-boot-example/pom.xml @@ -11,6 +11,18 @@ ${revision} + + + + org.springframework.boot + spring-boot-dependencies + 4.0.0 + pom + import + + + + org.dromara.mica-mqtt @@ -54,21 +66,29 @@ 3.5.14 - - mysql mysql-connector-java 8.0.33 - com.alibaba druid-spring-boot-starter 1.2.20 + + + org.springframework.boot + spring-boot-starter-data-redis + + + com.fasterxml.jackson.core + jackson-databind + + + diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/MqttServerApplication.java b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/MqttServerApplication.java index 998ff16..e88448d 100644 --- a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/MqttServerApplication.java +++ b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/MqttServerApplication.java @@ -1,5 +1,6 @@ package org.dromara.mica.mqtt.server; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @@ -9,6 +10,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; */ @SpringBootApplication @EnableScheduling +@MapperScan("org.dromara.mica.mqtt.server.mapper") public class MqttServerApplication { /** diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/config/MybatisPlusConfig.java b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/config/MybatisPlusConfig.java new file mode 100644 index 0000000..39bea1a --- /dev/null +++ b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/config/MybatisPlusConfig.java @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + * + * https://www.renren.io + * + * 版权所有,侵权必究! + */ + +package org.dromara.mica.mqtt.server.config; + +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * mybatis-plus配置 + * + * @author Mark sunlightcs@gmail.com + */ +@Configuration +public class MybatisPlusConfig { + + /** + * 配置分页等 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); + // 乐观锁 + mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); + + return mybatisPlusInterceptor; + } + +} diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/config/RedisConfig.java b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/config/RedisConfig.java new file mode 100644 index 0000000..7da8f43 --- /dev/null +++ b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/config/RedisConfig.java @@ -0,0 +1,42 @@ +package org.dromara.mica.mqtt.server.config; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +@Configuration +public class RedisConfig { + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(factory); + //使用jackson进行序列化 + Jackson2JsonRedisSerializer jsonRedisSerializer = + new Jackson2JsonRedisSerializer(Object.class); + //规定序列化规则 + ObjectMapper objectMapper = new ObjectMapper(); + /** + * 第一个参数指的是序列化的域,ALL指的是字段、get和set方法、构造方法 + * 第二个参数指的是序列化哪些访问修饰符,默认是public,ANY指任何访问修饰符 + */ + objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + //指定序列化输入的类型,类必须是非final修饰的类 + objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + jsonRedisSerializer.setObjectMapper(objectMapper); + //序列化key value + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.setValueSerializer(jsonRedisSerializer); + redisTemplate.setHashKeySerializer(new StringRedisSerializer()); + redisTemplate.setHashValueSerializer(jsonRedisSerializer); + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } +} diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/controller/CarInfoController.java b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/controller/CarInfoController.java index 7cdc70d..0aef137 100644 --- a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/controller/CarInfoController.java +++ b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/controller/CarInfoController.java @@ -1,22 +1,31 @@ package org.dromara.mica.mqtt.server.controller; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.AllArgsConstructor; import org.dromara.mica.mqtt.server.entity.CarInfo; +import org.dromara.mica.mqtt.server.redis.RedisService; import org.dromara.mica.mqtt.server.service.ICarInfoService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.concurrent.TimeUnit; @RestController @RequestMapping("/car") @AllArgsConstructor public class CarInfoController { - private final ICarInfoService carInfoService; + @Autowired + ICarInfoService carInfoService; + + @Autowired + RedisService redisService; @GetMapping("/list") public List list() { return carInfoService.list(); + } @PostMapping diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/controller/ServerController.java b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/controller/ServerController.java index 0ee901d..5dc5f96 100644 --- a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/controller/ServerController.java +++ b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/controller/ServerController.java @@ -2,7 +2,7 @@ package org.dromara.mica.mqtt.server.controller; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; -import org.dromara.mica.mqtt.server.service.ServerService; +import org.dromara.mica.mqtt.server.service.impl.ServerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/entity/CarInfo.java b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/entity/CarInfo.java index b025212..ffb989f 100644 --- a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/entity/CarInfo.java +++ b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/entity/CarInfo.java @@ -1,12 +1,64 @@ package org.dromara.mica.mqtt.server.entity; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + @Data @TableName("car_info") -public class CarInfo { - private Long customerId; - private String plate; - private String enable; +public class CarInfo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** customer_id */ + private Long customerId; + + /** 白名单生效时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date enableTime; + + /** 白名单失效时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date overdueTime; + + /** 是否启动 */ + private String enable; + + /** 车牌号 */ + private String plate; + + /** 是否启用时间段 */ + private String timeSegEnable; + + /** 时间段 */ + private String segTime; + + /** 是否需要报警 */ + private String needAlarm; + + /** 用户自定义代码 */ + private String vehicleCode; + + /** 用户自定义的注释 */ + private String vehicleComment; + + /** 所属人员 */ + private Long peopleId; + + /** 是否删除 0 是未删除 2是删除 */ + private String delFlag; + + /** 同步标识 sync 0是未同步 1是已同步 */ + private String sync; + + private String sn;//设备序列号 + + private int num; + + /** 超频设备识别标签 */ + private String overclockCard; } diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/entity/Equipment.java b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/entity/Equipment.java new file mode 100644 index 0000000..f3a5bdf --- /dev/null +++ b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/entity/Equipment.java @@ -0,0 +1,48 @@ +package org.dromara.mica.mqtt.server.entity; + + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +@TableName("sys_equipment") +public class Equipment implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + + /** 设备Id */ + private Long id; + + /** 所属产品Id */ + private Long productId; + + /** 设备名称 */ + private String name; + + /** 设备序列号 */ + private String sequence; + + /** 设备Ip */ + private String ip; + + /** 设备密码 */ + private String password; + + /** 设备区域 */ + private Long spaceId; + + /** 设备位置 */ + private Long pointId; + + /** 对接状态(0未对接 1对接成功) */ + private Long state; + + /** 设备状态(0在线 1离线) */ + private String flag; + +} diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/listener/CarMessageListener.java b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/listener/CarMessageListener.java new file mode 100644 index 0000000..6e59a71 --- /dev/null +++ b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/listener/CarMessageListener.java @@ -0,0 +1,45 @@ +package org.dromara.mica.mqtt.server.listener; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.mica.mqtt.codec.message.MqttPublishMessage; +import org.dromara.mica.mqtt.server.pojo.User; +import org.dromara.mica.mqtt.core.annotation.MqttServerFunction; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; +import org.tio.core.ChannelContext; +import org.tio.core.Node; + +import java.util.Map; + +/** + * 消息监听器 + * + * @author wsq + */ +@Slf4j +@Service +public class CarMessageListener { + + + @MqttServerFunction("device/${sn}/message/up/keep_alive") + public void onKeepAliveMessage(String topic, Map topicVars, byte[] message) { + log.info("onKeepAliveMessage topic:{}", topic); + log.info("onKeepAliveMessage topicVars:{}", topicVars); + log.info("接收到心跳消息 -> Topic: {}, Payload: {}", topic, new String(message)); + // 在这里添加您的业务逻辑,例如: + // 1. 解析 payload + // 2. 更新设备在线状态 + // 3. 回复心跳响应等 + } + + @MqttServerFunction("device/${sn}/message/down/white_list_operator/reply") + public void white_list_operator_reply(String topic, byte[] payload) { + log.info("接收到消息 -> Topic: {}, Payload: {}", topic, new String(payload)); + // 在这里添加您的业务逻辑,例如: + // 1. 解析 payload + // 2. 更新设备在线状态 + // 3. 回复心跳响应等 + } + +} diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/listener/MqttConnectStatusListener2.java b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/listener/MqttConnectStatusListener2.java index bf4e791..2b62750 100644 --- a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/listener/MqttConnectStatusListener2.java +++ b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/listener/MqttConnectStatusListener2.java @@ -16,8 +16,13 @@ package org.dromara.mica.mqtt.server.listener; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; import org.dromara.mica.mqtt.core.server.event.IMqttConnectStatusListener; +import org.dromara.mica.mqtt.server.entity.Equipment; +import org.dromara.mica.mqtt.server.mapper.EquipmentMapper; +import org.dromara.mica.mqtt.server.service.IEquipmentService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.tio.core.ChannelContext; @@ -30,13 +35,25 @@ import org.tio.core.ChannelContext; @Service public class MqttConnectStatusListener2 implements IMqttConnectStatusListener { + private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(MqttConnectStatusListener2.class); + @Autowired + EquipmentMapper equipmentMapper; + @Override public void online(ChannelContext context, String clientId, String username) { - log.info("Mqtt clientId:{} username:{} online.", clientId, username); + log.info("online-context: {}", context); + Equipment equipment = new Equipment(); + equipment.setFlag("0"); + equipmentMapper.update(equipment, new QueryWrapper().eq("sequence", clientId).eq("product_id", 4L)); + log.info("设备:{}上线", clientId); } @Override public void offline(ChannelContext context, String clientId, String username, String reason) { - log.info("Mqtt clientId:{} username:{} offline reason:{}.", clientId, username, reason); + log.info("offline-context: {}", context); + Equipment equipment = new Equipment(); + equipment.setFlag("1"); + equipmentMapper.update(equipment, new QueryWrapper().eq("sequence", clientId).eq("product_id", 4L)); + log.info("设备:{}离线,offline reason:{}.", clientId, reason); } } diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/listener/MqttServerMessageListener2.java b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/listener/MqttServerMessageListener2.java deleted file mode 100644 index 416d401..0000000 --- a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/listener/MqttServerMessageListener2.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.dromara.mica.mqtt.server.listener; - -import lombok.extern.slf4j.Slf4j; -import org.dromara.mica.mqtt.codec.message.MqttPublishMessage; -import org.dromara.mica.mqtt.server.pojo.User; -import org.dromara.mica.mqtt.core.annotation.MqttServerFunction; -import org.springframework.stereotype.Service; -import org.tio.core.ChannelContext; -import org.tio.core.Node; - -import java.util.Map; - -/** - * 消息监听器示例2,MqttServerFunction 注解订阅,注意:如果自行实现了 IMqttMessageListener,MqttServerFunction 注解就不生效了。 - * - * @author wsq - */ -@Slf4j -@Service -public class MqttServerMessageListener2 { - - /** - * MQTT消息处理函数 - * - * @param topic mqtt Topic - * @param user 订阅消息的负载内容,默认 json 序列化 - */ - @MqttServerFunction("/test/object") - public void func1(String topic, User user) { - log.info("topic:{} user:{}", topic, user); - } - - @MqttServerFunction("/test/client") - public void func2(String topic, byte[] message) { - log.info("topic:{} message:{}", topic, new String(message)); - } - - /** - * MQTT消息处理函数,匹配 mqtt Topic /test/+,如何需要匹配所以消息,请使用通配符 # - * - * @param context ChannelContext,可选参数 - * @param topic 实际接收到消息的主题名称,可选参数 - * @param topicVars topic 中的 ${xxxx} 变量解析(v2.5.4支持),可选参数,注意:类型必须为 Map - * @param publishMessage 完整的MQTT发布消息对象,包含消息头和负载,可选参数 - * @param message 消息负载内容,以字节数组形式提供,可选参数,也可支持对象形式,默认 json 序列化 - */ - @MqttServerFunction("/test/${xxxx}") - public void func3(ChannelContext context, String topic, Map topicVars, MqttPublishMessage publishMessage, byte[] message) { - // 获取客户端节点信息 - Node clientNode = context.getClientNode(); - // 记录接收到的MQTT消息信息 - log.info("clientNode:{} topic:{} topicVars:{} publishMessage:{} message:{}", clientNode, topic, topicVars, publishMessage, new String(message)); - } - -} diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/mapper/EquipmentMapper.java b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/mapper/EquipmentMapper.java new file mode 100644 index 0000000..ed2da3a --- /dev/null +++ b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/mapper/EquipmentMapper.java @@ -0,0 +1,11 @@ +package org.dromara.mica.mqtt.server.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.dromara.mica.mqtt.server.entity.CarInfo; +import org.dromara.mica.mqtt.server.entity.Equipment; + +@Mapper +public interface EquipmentMapper extends BaseMapper { + +} diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/redis/RedisService.java b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/redis/RedisService.java new file mode 100644 index 0000000..09b746d --- /dev/null +++ b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/redis/RedisService.java @@ -0,0 +1,302 @@ +package org.dromara.mica.mqtt.server.redis; + + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.BoundSetOperations; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +@Component +@Slf4j +public class RedisService { + + + @Autowired + public RedisTemplate redisTemplate; + + private static final long DEFAULT_TIMEOUT = 60 * 60 * 24 * 7; + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + */ + public void setCacheObject(final String key, final T value) + { + redisTemplate.opsForValue().set(key, value); + } + + + /** + * 缓存是否存在,存在返回false,不存在返回true并存储缓存值 + * + * @param key + * @param value + */ + public Boolean setIfAbsent(final String key, final String value, long timeout, TimeUnit timeUnit) + { + try { + return redisTemplate.opsForValue().setIfAbsent(key, value, timeout, timeUnit); + } catch (Exception e) { + log.error("redis error:{}", e.getMessage()); + return false; + } + } + + /** + * 分布式加锁 + * + * @param key + * @param value + */ + public Boolean lock(final String key, final String value, long timeout, TimeUnit timeUnit) + { + try { + if (timeout <= 0) { + timeout = DEFAULT_TIMEOUT; + timeUnit = TimeUnit.SECONDS; + } + return redisTemplate.opsForValue().setIfAbsent(key, value, timeout, timeUnit); + } catch (Exception e) { + log.error("redis error:{}", e.getMessage()); + return false; + } + } + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @param timeout 时间 + * @param timeUnit 时间颗粒度 + */ + public void setCacheObject(final String key, final T value, final Long timeout, final TimeUnit timeUnit) + { + redisTemplate.opsForValue().set(key, value, timeout, timeUnit); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout) + { + return expire(key, timeout, TimeUnit.SECONDS); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @param unit 时间单位 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout, final TimeUnit unit) + { + return redisTemplate.expire(key, timeout, unit); + } + + /** + * 获取有效时间 + * + * @param key Redis键 + * @return 有效时间 + */ + public long getExpire(final String key) + { + return redisTemplate.getExpire(key); + } + + /** + * 判断 key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public Boolean hasKey(String key) + { + return redisTemplate.hasKey(key); + } + + /** + * 获得缓存的基本对象。 + * + * @param key 缓存键值 + * @return 缓存键值对应的数据 + */ + public T getCacheObject(final String key) + { + ValueOperations operation = redisTemplate.opsForValue(); + return operation.get(key); + } + + /** + * 删除单个对象 + * + * @param key + */ + public boolean deleteObject(final String key) + { + return redisTemplate.delete(key); + } + + /** + * 删除集合对象 + * + * @param collection 多个对象 + * @return + */ + public boolean deleteObject(final Collection collection) + { + return redisTemplate.delete(collection) > 0; + } + + /** + * 缓存List数据 + * + * @param key 缓存的键值 + * @param dataList 待缓存的List数据 + * @return 缓存的对象 + */ + public long setCacheList(final String key, final List dataList) + { + Long count = redisTemplate.opsForList().rightPushAll(key, dataList); + return count == null ? 0 : count; + } + + /** + * 获得缓存的list对象 + * + * @param key 缓存的键值 + * @return 缓存键值对应的数据 + */ + public List getCacheList(final String key) + { + return redisTemplate.opsForList().range(key, 0, -1); + } + + /** + * 缓存Set + * + * @param key 缓存键值 + * @param dataSet 缓存的数据 + * @return 缓存数据的对象 + */ + public BoundSetOperations setCacheSet(final String key, final Set dataSet) + { + BoundSetOperations setOperation = redisTemplate.boundSetOps(key); + Iterator it = dataSet.iterator(); + while (it.hasNext()) + { + setOperation.add(it.next()); + } + return setOperation; + } + + /** + * 获得缓存的set + * + * @param key + * @return + */ + public Set getCacheSet(final String key) + { + return redisTemplate.opsForSet().members(key); + } + + /** + * 缓存Map + * + * @param key + * @param dataMap + */ + public void setCacheMap(final String key, final Map dataMap) + { + if (dataMap != null) { + redisTemplate.opsForHash().putAll(key, dataMap); + } + } + + /** + * 获得缓存的Map + * + * @param key + * @return + */ + public Map getCacheMap(final String key) + { + return redisTemplate.opsForHash().entries(key); + } + + /** + * 往Hash中存入数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @param value 值 + */ + public void setCacheMapValue(final String key, final String hKey, final T value) + { + redisTemplate.opsForHash().put(key, hKey, value); + } + + /** + * 获取Hash中的数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return Hash中的对象 + */ + public T getCacheMapValue(final String key, final String hKey) + { + HashOperations opsForHash = redisTemplate.opsForHash(); + return opsForHash.get(key, hKey); + } + + /** + * 获取多个Hash中的数据 + * + * @param key Redis键 + * @param hKeys Hash键集合 + * @return Hash对象集合 + */ + public List getMultiCacheMapValue(final String key, final Collection hKeys) + { + return redisTemplate.opsForHash().multiGet(key, hKeys); + } + + /** + * 删除Hash中的某条数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return 是否成功 + */ + public boolean deleteCacheMapValue(final String key, final String hKey) + { + return redisTemplate.opsForHash().delete(key, hKey) > 0; + } + + /** + * 获得缓存的基本对象列表 + * + * @param pattern 字符串前缀 + * @return 对象列表 + */ + public Collection keys(final String pattern) + { + return redisTemplate.keys(pattern); + } +} diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/ICarInfoService.java b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/ICarInfoService.java index 6d0bd84..34399de 100644 --- a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/ICarInfoService.java +++ b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/ICarInfoService.java @@ -4,4 +4,6 @@ import com.baomidou.mybatisplus.extension.service.IService; import org.dromara.mica.mqtt.server.entity.CarInfo; public interface ICarInfoService extends IService { + + CarInfo selectCarInfoBySn(String sn); } diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/IEquipmentService.java b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/IEquipmentService.java new file mode 100644 index 0000000..47fc306 --- /dev/null +++ b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/IEquipmentService.java @@ -0,0 +1,9 @@ +package org.dromara.mica.mqtt.server.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.dromara.mica.mqtt.server.entity.Equipment; + +public interface IEquipmentService extends IService { + + Equipment selectEquipmentBySn(String sn); +} diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/impl/CarInfoServiceImpl.java b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/impl/CarInfoServiceImpl.java index 76ccd34..4d7fec1 100644 --- a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/impl/CarInfoServiceImpl.java +++ b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/impl/CarInfoServiceImpl.java @@ -1,11 +1,23 @@ package org.dromara.mica.mqtt.server.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.dromara.mica.mqtt.server.entity.CarInfo; import org.dromara.mica.mqtt.server.mapper.CarInfoMapper; import org.dromara.mica.mqtt.server.service.ICarInfoService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class CarInfoServiceImpl extends ServiceImpl implements ICarInfoService { + + @Autowired + CarInfoMapper carInfoMapper; + + @Override + public CarInfo selectCarInfoBySn(String sn) { + carInfoMapper.selectOne(new QueryWrapper().eq("sequence", sn)); + + return new CarInfo(); + } } diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/impl/EquipmentServiceImpl.java b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/impl/EquipmentServiceImpl.java new file mode 100644 index 0000000..c7ded54 --- /dev/null +++ b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/impl/EquipmentServiceImpl.java @@ -0,0 +1,21 @@ +package org.dromara.mica.mqtt.server.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.dromara.mica.mqtt.server.entity.Equipment; +import org.dromara.mica.mqtt.server.mapper.EquipmentMapper; +import org.dromara.mica.mqtt.server.service.IEquipmentService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class EquipmentServiceImpl extends ServiceImpl implements IEquipmentService { + + @Autowired + EquipmentMapper equipmentMapper; + + @Override + public Equipment selectEquipmentBySn(String sn) { + return equipmentMapper.selectOne(new QueryWrapper().eq("sequence", sn).eq("product_id", 4L).last("limit 1")); + } +} diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/ServerService.java b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/impl/ServerService.java similarity index 91% rename from example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/ServerService.java rename to example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/impl/ServerService.java index d858ae5..5f9059b 100644 --- a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/ServerService.java +++ b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/service/impl/ServerService.java @@ -1,4 +1,4 @@ -package org.dromara.mica.mqtt.server.service; +package org.dromara.mica.mqtt.server.service.impl; import lombok.extern.slf4j.Slf4j; import org.dromara.mica.mqtt.spring.server.MqttServerTemplate; diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/utils/SNUtils.java b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/utils/SNUtils.java new file mode 100644 index 0000000..b14f067 --- /dev/null +++ b/example/mica-mqtt-server-spring-boot-example/src/main/java/org/dromara/mica/mqtt/server/utils/SNUtils.java @@ -0,0 +1,8 @@ +package org.dromara.mica.mqtt.server.utils; + +public class SNUtils { + + public String getSn(String topic) { + return topic; + } +} diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/resources/application-dev.yml b/example/mica-mqtt-server-spring-boot-example/src/main/resources/application-dev.yml new file mode 100644 index 0000000..09ea6f8 --- /dev/null +++ b/example/mica-mqtt-server-spring-boot-example/src/main/resources/application-dev.yml @@ -0,0 +1,12 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/xa_cloud?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true + username: root + password: root + data: + redis: + host: 192.168.2.30 + password: redis2025 + database: 5 + port: 6379 diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/resources/application.yml b/example/mica-mqtt-server-spring-boot-example/src/main/resources/application.yml index fc1ece3..fa22bf7 100644 --- a/example/mica-mqtt-server-spring-boot-example/src/main/resources/application.yml +++ b/example/mica-mqtt-server-spring-boot-example/src/main/resources/application.yml @@ -1,32 +1,57 @@ server: port: 30013 + spring: application: name: mica-mqtt-server + # 环境 dev|test|prod + profiles: + active: dev + # active: prod + messages: + encoding: UTF-8 + basename: i18n/messages + # jackson时间格式化 + jackson: + time-zone: GMT+8 + date-format: yyyy-MM-dd HH:mm:ss + mvc: + pathmatch: + matching-strategy: ANT_PATH_MATCHER + servlet: + multipart: + max-file-size: 100MB + max-request-size: 100MB + enabled: true + + +#mybatis-plus: +# configuration: +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +#mybatis +#mybatis-plus: +# mapper-locations: classpath*:/mapper/**/*.xml +# #实体扫描,多个package用逗号或者分号分隔 +# typeAliasesPackage: io.renren.entity +# global-config: +# #数据库相关配置 +# db-config: +# #主键类型 +# id-type: ASSIGN_ID +# banner: false +# #原生配置 +# configuration: +# map-underscore-to-camel-case: true +# cache-enabled: false +# call-setters-on-nulls: true +# jdbc-type-for-null: 'null' +# configuration-properties: +# prefix: +# blobType: BLOB +# boolValue: TRUE - datasource: - url: jdbc:mysql://127.0.0.1:3306/xa_cloud?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC - username: root - password: root - driver-class-name: com.mysql.cj.jdbc.Driver - type: com.alibaba.druid.pool.DruidDataSource - #mybatis - mybatis-plus: - mapper-locations: classpath:/mapper/**/*.xml - #实体扫描,多个package用逗号或者分号分隔 - typeAliasesPackage: org.dromara.mica.mqtt.server.entity - global-config: - #数据库相关配置 - db-config: - #主键类型 - id-type: ASSIGN_ID - banner: false - #原生配置 - configuration: - map-underscore-to-camel-case: true - #打印日志 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # mqtt 服务端配置 mqtt: @@ -76,11 +101,13 @@ mqtt: password: mica mcp-server: # 大模型 mcp enable: true + springdoc: swagger-ui: urls: - name: swagger url: /v3/api-docs + # actuator management management: info: @@ -98,6 +125,7 @@ management: web: exposure: include: '*' + logging: level: root: info diff --git a/example/mica-mqtt-server-spring-boot-example/src/main/resources/mapper/CarInfoMapper.xml b/example/mica-mqtt-server-spring-boot-example/src/main/resources/mapper/CarInfoMapper.xml new file mode 100644 index 0000000..b169760 --- /dev/null +++ b/example/mica-mqtt-server-spring-boot-example/src/main/resources/mapper/CarInfoMapper.xml @@ -0,0 +1,7 @@ + + + + +