diff --git a/nxhs-service/pom.xml b/nxhs-service/pom.xml index 325f9be..73c6fa8 100644 --- a/nxhs-service/pom.xml +++ b/nxhs-service/pom.xml @@ -63,25 +63,25 @@ spring-boot-starter-websocket - - org.springframework.boot - spring-boot-starter-integration - - - org.springframework.integration - spring-integration-stream - - - org.springframework.integration - spring-integration-mqtt - - - - - - + + + + + + + + + + + + + + org.eclipse.paho + org.eclipse.paho.mqttv5.client + 1.2.5 + diff --git a/nxhs-service/src/main/java/cc/yunxi/config/MqttConfig.java b/nxhs-service/src/main/java/cc/yunxi/config/MqttConfig.java index 15cce3c..5fef676 100644 --- a/nxhs-service/src/main/java/cc/yunxi/config/MqttConfig.java +++ b/nxhs-service/src/main/java/cc/yunxi/config/MqttConfig.java @@ -3,17 +3,18 @@ package cc.yunxi.config; import cc.yunxi.config.props.MqttProperties; import cc.yunxi.utils.CustomerMqttClient; import lombok.extern.slf4j.Slf4j; -import org.eclipse.paho.client.mqttv3.MqttException; +import org.eclipse.paho.mqttv5.common.MqttException; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.annotation.Resource; +import java.io.UnsupportedEncodingException; @Slf4j -//@Configuration -//@EnableConfigurationProperties(MqttProperties.class) +@Configuration +@EnableConfigurationProperties(MqttProperties.class) public class MqttConfig { @Resource diff --git a/nxhs-service/src/main/java/cc/yunxi/config/WebMvcConfig.java b/nxhs-service/src/main/java/cc/yunxi/config/WebMvcConfig.java index c8d36b8..67bc4de 100644 --- a/nxhs-service/src/main/java/cc/yunxi/config/WebMvcConfig.java +++ b/nxhs-service/src/main/java/cc/yunxi/config/WebMvcConfig.java @@ -50,6 +50,7 @@ public class WebMvcConfig implements WebMvcConfigurer { "/upload/**", "/qrcode/**.txt", "/wx/**",//微信消息推送验证 + "/wx-message/**",//微信消息推送验证 "/webSocketServer/**",//socket通信 "/doc.html", "/api/delivery-order/**", diff --git a/nxhs-service/src/main/java/cc/yunxi/config/props/MqttProperties.java b/nxhs-service/src/main/java/cc/yunxi/config/props/MqttProperties.java index b7b4234..6dcb3af 100644 --- a/nxhs-service/src/main/java/cc/yunxi/config/props/MqttProperties.java +++ b/nxhs-service/src/main/java/cc/yunxi/config/props/MqttProperties.java @@ -6,12 +6,12 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import java.util.Map; @Data -//@ConfigurationProperties(prefix = "mqtt") +@ConfigurationProperties(prefix = "mqtt") public class MqttProperties { private String host; private String clientId; - private String userName; - private String passWord; + private String username; + private String password; private Map topics; private Boolean cleanSession; private Integer timeout; diff --git a/nxhs-service/src/main/java/cc/yunxi/controller/DeviceController.java b/nxhs-service/src/main/java/cc/yunxi/controller/DeviceController.java index 3b1a657..69e6d46 100644 --- a/nxhs-service/src/main/java/cc/yunxi/controller/DeviceController.java +++ b/nxhs-service/src/main/java/cc/yunxi/controller/DeviceController.java @@ -8,7 +8,7 @@ import cc.yunxi.domain.po.*; import cc.yunxi.domain.vo.device.*; import cc.yunxi.domain.vo.file.FileUploadRespVO; import cc.yunxi.service.*; -import cc.yunxi.utils.CommandUtil; +import cc.yunxi.utils.CustomerMqttClient; import cc.yunxi.utils.RedisTool; import cc.yunxi.utils.UserContext; import cn.hutool.core.util.StrUtil; @@ -67,11 +67,10 @@ public class DeviceController { private ICommonService commonService; @Resource private RedisTool redisTool; - @Resource - private CommandUtil commandUtil; - @Resource private IFileService fileService; + @Resource + private CustomerMqttClient mqttClient; @ApiOperation("小程序获取设备配置") @@ -219,7 +218,6 @@ public class DeviceController { } private void fillQrCode(String qrCode, DeviceRespVO respVO) { - ArrayList posters = new ArrayList<>(); List files = JSONUtil.toList(qrCode, FileUploadRespVO.class); if (files.size() > 0) { FileUploadRespVO file = files.get(0); @@ -501,64 +499,53 @@ public class DeviceController { @ApiOperation("设备命令下发") @PostMapping("/command") public CommonResult command(@RequestBody CommandVO cmd) { + UserDTO user = UserContext.getUser(); String deviceCode = cmd.getDeviceCode(); Object value = redisTool.getValue(deviceCode); - if (null == value) { - return CommonResult.error(400, "设备不在线"); - } + if (null == value) return CommonResult.error(400, "设备不在线"); DeviceStatus status = JSONUtil.toBean(value.toString(), DeviceStatus.class); // 判断设备是否在线 - Boolean online = status.getOnline(); + boolean online = status.isOnline(); if (!online) return CommonResult.error(400, "设备不在线"); + boolean connected = mqttClient.isConnected(); + if (!connected) throw new BizIllegalException("与mqtt服务器连接中断,请稍后重试!"); // 下发指令 - String ip = status.getIp(); - CommonResult _result = commandUtil.sendCommand(cmd, ip); + mqttClient.publish(deviceCode + "/command", JSONUtil.toJsonStr(cmd)); // 记录指令下发事件 RecycleDeviceEvent event = new RecycleDeviceEvent(); event.setDeviceCode(deviceCode); - event.setBucketCode("");// - event.setDoorNum(0);// + event.setBucketCode("");//桶编码 + if (StrUtil.isNotEmpty(cmd.getData())) { + event.setBucketCode(cmd.getData());//桶编码 + } + event.setEventType(deviceCode); event.setEventDesc("设备命令下发"); event.setEventTime(new Date()); event.setIsLocal("0");//远程调用 - - if (_result.getCode() != 200) { - event.setEventResult("1"); - } else { - event.setEventResult("0"); - } - UserDTO user = UserContext.getUser(); event.setCreateUserId(user.getId()); event.setCreateTime(new Date()); event.setCompanyId(user.getCompanyId()); - event.setOrganizeJsonId(""); eventService.save(event); - return _result; + return CommonResult.success("指令下发成功"); } @ApiOperation("获取设备状态") @PostMapping("/getStatus") public CommonResult getStatus(@RequestBody DeviceVO deviceVO) { Object value = redisTool.getValue(deviceVO.getDeviceCode()); - if (value == null) { - return CommonResult.error(400, "获取失败,设备不在线!"); - } + if (value == null) return CommonResult.error(400, "获取失败,设备不在线!"); DeviceStatus status = JSONUtil.toBean(value.toString(), DeviceStatus.class); + if (status.isOnline()) return CommonResult.error(400, "获取失败,设备不在线!"); CommandVO command = new CommandVO(); command.setCmd(CMDEnum.status); command.setDeviceCode(deviceVO.getDeviceCode()); command.setOptTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); command.setData(""); command.setRemark(""); - CommonResult commonResult = commandUtil.sendCommand(command, status.getIp()); - Object data = commonResult.getData(); - DeviceStatus status1 = JSONUtil.toBean(data.toString(), DeviceStatus.class); - deviceService.updateDevice(status1); - status1.getBucketList().forEach(bucket -> { - bucketService.updateStatus(bucket); - }); + if (!mqttClient.isConnected()) throw new BizIllegalException("与mqtt服务器连接中断,请稍后重试!"); + mqttClient.publish(deviceVO.getDeviceCode() + "/command", JSONUtil.toJsonStr(command)); return CommonResult.success("获取成功!"); } @@ -609,7 +596,7 @@ public class DeviceController { } } } - redisTool.setValue(deviceCode, JSONUtil.toJsonStr(des), 1000 * 60 * 60l); + redisTool.setValue(deviceCode, JSONUtil.toJsonStr(des), 1000 * 60 * 60L); CommonResult success = CommonResult.success(deviceCode); success.setMsg("success"); return success; @@ -632,7 +619,7 @@ public class DeviceController { } } } - redisTool.setValue(weight.getBucketCode(), JSONUtil.toJsonStr(weight), 1000 * 60l);//一分钟过期 + redisTool.setValue(weight.getBucketCode(), JSONUtil.toJsonStr(weight), 1000 * 60L);//一分钟过期 return CommonResult.success("success"); } diff --git a/nxhs-service/src/main/java/cc/yunxi/controller/WxMessageController.java b/nxhs-service/src/main/java/cc/yunxi/controller/WxMessageController.java index b1abeb6..26ac9b4 100644 --- a/nxhs-service/src/main/java/cc/yunxi/controller/WxMessageController.java +++ b/nxhs-service/src/main/java/cc/yunxi/controller/WxMessageController.java @@ -7,12 +7,14 @@ import cc.yunxi.domain.vo.socket.MessageTypeEnum; import cc.yunxi.domain.vo.socket.SocketMessage; import cc.yunxi.domain.vo.vxmessage.*; import cc.yunxi.service.IWsService; -import cc.yunxi.utils.*; +import cc.yunxi.utils.CustomerMqttClient; +import cc.yunxi.utils.UserContext; +import cc.yunxi.utils.VerifyUtil; +import cc.yunxi.utils.WeChatMessageUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; -import org.eclipse.paho.client.mqttv3.MqttMessage; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -30,8 +32,8 @@ public class WxMessageController { @Resource private VerifyUtil verifyUtil; -// @Resource -// private CustomerMqttClient client; + @Resource + private CustomerMqttClient client; /** * 预约端对接微信推送消息验证 @@ -162,6 +164,9 @@ public class WxMessageController { @PostMapping("/test") public CommonResult test() { + client.subscribe("testtopc/1",1); + client.publish("testtopc/1","{\"msg\": \"hello\"}"); + client.unsubscribe("testtopc/1"); return CommonResult.success("success"); } diff --git a/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/BucketStatus.java b/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/BucketStatus.java index 62e5914..b8bbc98 100644 --- a/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/BucketStatus.java +++ b/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/BucketStatus.java @@ -18,13 +18,13 @@ public class BucketStatus { @NotNull(message = "门号不能为空") private Integer doorNum; @ApiModelProperty(value = "投递门状态",required = true) - private Boolean deliveryDoor; + private boolean deliveryDoor; @ApiModelProperty(value = "清运门状态",required = true) - private Boolean cleanDoor; + private boolean cleanDoor; @ApiModelProperty(value = "烟雾报警", required = true, example = "true") - private Boolean smogAlarm; + private boolean smogAlarm; @ApiModelProperty(value = "是否满",required = true) - private Boolean isFull; + private boolean isFull; @ApiModelProperty(value = "重量",required = true) private BigDecimal weight; } diff --git a/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/DeviceStatus.java b/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/DeviceStatus.java index e6ceaa1..0fee19c 100644 --- a/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/DeviceStatus.java +++ b/nxhs-service/src/main/java/cc/yunxi/domain/vo/device/DeviceStatus.java @@ -5,7 +5,6 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; import java.util.List; @Data @@ -15,7 +14,7 @@ public class DeviceStatus { @NotBlank(message = "设备编码不能为空") private String deviceCode; @ApiModelProperty(value = "是否在线", hidden = true) - private Boolean online; + private boolean online; @ApiModelProperty(value = "设备ip地址", hidden = true) private String ip; @ApiModelProperty(value = "设备端口", hidden = true) diff --git a/nxhs-service/src/main/java/cc/yunxi/service/impl/CommonService.java b/nxhs-service/src/main/java/cc/yunxi/service/impl/CommonService.java index 613d685..29f7448 100644 --- a/nxhs-service/src/main/java/cc/yunxi/service/impl/CommonService.java +++ b/nxhs-service/src/main/java/cc/yunxi/service/impl/CommonService.java @@ -1,24 +1,18 @@ package cc.yunxi.service.impl; -import cc.yunxi.common.domain.CommonResult; import cc.yunxi.common.exception.BizIllegalException; import cc.yunxi.common.exception.BusinessLogicException; -import cc.yunxi.common.exception.ForbiddenException; import cc.yunxi.config.props.WxHsyProperties; import cc.yunxi.config.props.WxShProperties; import cc.yunxi.domain.dto.UserDTO; import cc.yunxi.domain.dto.WxLoginDTO; import cc.yunxi.domain.dto.ZSGLoginDTO; import cc.yunxi.domain.po.Client; -import cc.yunxi.domain.po.Manager; import cc.yunxi.domain.po.Recycler; -import cc.yunxi.domain.query.RecyclerQuery; import cc.yunxi.domain.vo.device.CMDEnum; import cc.yunxi.domain.vo.device.CommandVO; import cc.yunxi.domain.vo.device.LoginRespVO; import cc.yunxi.enums.UserTypeEnum; -import cc.yunxi.mapper.ManagerMapper; -import cc.yunxi.mapper.ProductMapper; import cc.yunxi.service.IClientService; import cc.yunxi.service.ICommonService; import cc.yunxi.service.IManagerService; @@ -30,18 +24,13 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import io.swagger.annotations.ApiModelProperty; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import java.time.LocalDateTime; import java.util.Date; -import java.util.List; /** * 统一服务类 @@ -71,7 +60,7 @@ public class CommonService implements ICommonService { private WxShProperties wxShProperties; @Resource - private CommandUtil commandUtil; + private CustomerMqttClient mqttClient; @Resource private JwtTool jwtTool; @@ -179,8 +168,13 @@ public class CommonService implements ICommonService { command.setData(data); command.setOptTime(DateUtil.now()); command.setRemark("登录成功"); - CommonResult commonResult = commandUtil.sendCommand(command); - log.info("设备登录结果 回收员 ===> code:{},msg:{}", commonResult.getCode(), commonResult.getMsg()); + boolean connected = mqttClient.isConnected(); + if (connected) { + mqttClient.publish(wxLoginDTO.getDevCode() + "command", JSONUtil.toJsonStr(command)); + log.info("扫描登录 回收员 ===> 通知设备 code:{}", wxLoginDTO.getDevCode()); + } else { + log.error("扫描登录失败 回收员 ===> mqtt未连接 code:{}", wxLoginDTO.getDevCode()); + } } return userDTO; } @@ -215,8 +209,13 @@ public class CommonService implements ICommonService { command.setData(data); command.setOptTime(DateUtil.now()); command.setRemark("登录成功"); - CommonResult commonResult = commandUtil.sendCommand(command); - log.info("设备登录结果 散户 ===> code:{},msg:{}", commonResult.getCode(), commonResult.getMsg()); + boolean connected = mqttClient.isConnected(); + if (connected) { + mqttClient.publish(wxLoginDTO.getDevCode() + "command", JSONUtil.toJsonStr(command)); + log.info("扫描登录 散户 ===> 通知设备 code:{}", wxLoginDTO.getDevCode()); + } else { + log.error("扫描登录失败 散户 ===> mqtt未连接 code:{}", wxLoginDTO.getDevCode()); + } } return userDTO; diff --git a/nxhs-service/src/main/java/cc/yunxi/service/impl/RecycleBucketServiceImpl.java b/nxhs-service/src/main/java/cc/yunxi/service/impl/RecycleBucketServiceImpl.java index f33057a..813f5a2 100644 --- a/nxhs-service/src/main/java/cc/yunxi/service/impl/RecycleBucketServiceImpl.java +++ b/nxhs-service/src/main/java/cc/yunxi/service/impl/RecycleBucketServiceImpl.java @@ -3,7 +3,6 @@ package cc.yunxi.service.impl; import cc.yunxi.domain.po.RecycleBucket; import cc.yunxi.domain.vo.device.BucketStatus; import cc.yunxi.mapper.RecycleBucketMapper; -import cc.yunxi.mapper.RecycleDeviceMapper; import cc.yunxi.service.IRecycleBucketService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; @@ -38,10 +37,10 @@ public class RecycleBucketServiceImpl extends ServiceImpl wrapper = new UpdateWrapper<>(); wrapper.lambda() .set(RecycleBucket::getCurrentWeight, status.getWeight()) - .set(RecycleBucket::getDeliveryDoorStatus, status.getDeliveryDoor() ? 1 : 0) - .set(RecycleBucket::getCleanDoorStatus, status.getCleanDoor() ? 1 : 0) - .set(RecycleBucket::getFullStatus, status.getIsFull() ? 1 : 0) - .set(RecycleBucket::getSmogStatus, status.getSmogAlarm() ? 1 : 0) + .set(RecycleBucket::getDeliveryDoorStatus, status.isDeliveryDoor() ? 1 : 0) + .set(RecycleBucket::getCleanDoorStatus, status.isCleanDoor() ? 1 : 0) + .set(RecycleBucket::getFullStatus, status.isFull() ? 1 : 0) + .set(RecycleBucket::getSmogStatus, status.isSmogAlarm() ? 1 : 0) .eq(RecycleBucket::getBucketCode, status.getBucketCode()); boolean update = this.update(wrapper); return update ? 1 : 0; @@ -52,19 +51,16 @@ public class RecycleBucketServiceImpl extends ServiceImpl wrapper = new UpdateWrapper<>(); wrapper.lambda() .set(RecycleDevice::getIpAddress, status.getIp()) - .set(RecycleDevice::getStatus, status.getOnline() ? 1 : 0) + .set(RecycleDevice::getStatus, status.isOnline() ? 1 : 0) .eq(RecycleDevice::getDeviceCode, status.getDeviceCode()); return update(wrapper) ? 1 : 0; } @@ -45,7 +45,6 @@ public class RecycleDeviceServiceImpl extends ServiceImpl