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