From 662d34da11882c3e313f9e33b55b0ab02ea334a8 Mon Sep 17 00:00:00 2001 From: zhuangtianxiang <2913129173@qq.com> Date: Mon, 3 Mar 2025 12:39:54 +0800 Subject: [PATCH] =?UTF-8?q?feat(device):=20=E6=96=B0=E5=A2=9E=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E4=B8=8B=E5=8F=91=E5=91=BD=E4=BB=A4=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 DeviceController 中添加 send 方法处理设备命令下发请求- 在 DeviceService 接口中定义 send 方法签名 - 实现 DeviceServiceImpl 中的 send 方法逻辑 - 更新 Param 类中的 Type 枚举,使用字符串值代替整数值- 修正 Serve 类中的 inputs 和 outputs 类型,从 ParamDto改为 Param - 更新 ServeMapper.xml 中的 SQL 查询,适应新的 Param 类型和枚举值 --- .../device/controller/DeviceController.java | 11 +++- .../iot/device/service/DeviceService.java | 4 ++ .../service/impl/DeviceServiceImpl.java | 57 ++++++++++++++++++- .../gateway/modules/iot/tsl/entity/Param.java | 17 +++--- .../gateway/modules/iot/tsl/entity/Serve.java | 4 +- .../resources/mappers/iot/ServeMapper.xml | 12 ++-- 6 files changed, 85 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/device/controller/DeviceController.java b/src/main/java/com/zsc/edu/gateway/modules/iot/device/controller/DeviceController.java index 5ccf2cf..07d16a6 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/device/controller/DeviceController.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/device/controller/DeviceController.java @@ -1,6 +1,5 @@ package com.zsc.edu.gateway.modules.iot.device.controller; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -18,6 +17,8 @@ import com.zsc.edu.gateway.modules.iot.record.entity.RecordData; import com.zsc.edu.gateway.modules.iot.record.entity.RecordDataStatusVo; import com.zsc.edu.gateway.modules.iot.record.service.RecordDataService; import lombok.AllArgsConstructor; +import org.springframework.boot.configurationprocessor.json.JSONException; +import org.springframework.boot.configurationprocessor.json.JSONObject; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -148,4 +149,12 @@ public class DeviceController { public DataWarningVo dataWarning() { return recordService.dataWarning(); } + + /** + * 下发命令 + */ + @PostMapping("/send") + public String send(Long deviceId, String topic, Integer qos) throws JSONException { + return service.send(deviceId, topic, qos); + } } diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/device/service/DeviceService.java b/src/main/java/com/zsc/edu/gateway/modules/iot/device/service/DeviceService.java index 466e534..a2fce35 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/device/service/DeviceService.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/device/service/DeviceService.java @@ -10,6 +10,8 @@ import com.zsc.edu.gateway.modules.iot.device.entity.Device; import com.zsc.edu.gateway.modules.iot.device.query.DeviceQuery; import com.zsc.edu.gateway.modules.iot.device.vo.DeviceStatusVo; import com.zsc.edu.gateway.modules.iot.device.vo.DeviceVo; +import org.springframework.boot.configurationprocessor.json.JSONException; +import org.springframework.boot.configurationprocessor.json.JSONObject; import java.util.List; @@ -30,4 +32,6 @@ public interface DeviceService extends IService { IPage query(Page page, DeviceQuery query); DeviceStatusVo status(); + + String send(Long deviceId, String topic, Integer qos) throws JSONException; } diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/device/service/impl/DeviceServiceImpl.java b/src/main/java/com/zsc/edu/gateway/modules/iot/device/service/impl/DeviceServiceImpl.java index 43dc42d..6ed1301 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/device/service/impl/DeviceServiceImpl.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/device/service/impl/DeviceServiceImpl.java @@ -1,5 +1,6 @@ package com.zsc.edu.gateway.modules.iot.device.service.impl; +import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -19,11 +20,19 @@ import com.zsc.edu.gateway.modules.iot.device.vo.DeviceStatusVo; import com.zsc.edu.gateway.modules.iot.device.vo.DeviceVo; import com.zsc.edu.gateway.modules.iot.product.entity.Product; import com.zsc.edu.gateway.modules.iot.product.repo.ProductRepository; +import com.zsc.edu.gateway.modules.iot.tsl.dto.ParamDto; +import com.zsc.edu.gateway.modules.iot.tsl.entity.Param; +import com.zsc.edu.gateway.modules.iot.tsl.entity.Serve; +import com.zsc.edu.gateway.modules.iot.tsl.mapper.ParamMapper; import com.zsc.edu.gateway.modules.iot.tsl.repo.EventRepository; import com.zsc.edu.gateway.modules.iot.tsl.repo.PropertyRepository; import com.zsc.edu.gateway.modules.iot.tsl.repo.ServeRepository; +import com.zsc.edu.gateway.modules.iot.tsl.service.ServeService; +import com.zsc.edu.gateway.modules.mqtt.config.MqttSender; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.configurationprocessor.json.JSONException; +import org.springframework.boot.configurationprocessor.json.JSONObject; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -49,8 +58,14 @@ public class DeviceServiceImpl extends ServiceImpl imp private EventRepository eventRepo; @Resource private ServeRepository serveRepo; - - + @Resource + private MqttSender mqttSender; + @Resource + private ServeService serveService; + @Resource + private DeviceRepository deviceRepo; + @Resource + private ParamMapper paramMapper; /** * 新建设备 */ @@ -208,4 +223,42 @@ public class DeviceServiceImpl extends ServiceImpl imp vo.gatewaySubCount = productRepo.selectCount(new LambdaQueryWrapper().eq(Product::getLink, Product.LinkType.MQTT)); return vo; } + + @Override + public String send(Long deviceId, String topic, Integer qos) throws JSONException { + Device device = deviceRepo.selectOne(new LambdaQueryWrapper().eq(Device::getId, deviceId)); + Serve serve1 = serveRepo.selectOne(new LambdaQueryWrapper().eq(Serve::getProductId, device.getProductId())); + Serve serve = serveService.detail(serve1.getId()); + List params = serve.getInputs(); + params.addAll(serve.getOutputs()); + JSONArray paramArray = new JSONArray(); + for (Param param : params) { + JSONObject paramJson = new JSONObject(); + paramJson.put("name", param.getName()); + paramArray.add(paramJson); + } + JSONObject payloadJson = new JSONObject(); + payloadJson.put("mid", 641); + payloadJson.put("serviceId", serve.getId()); + payloadJson.put("deviceId", deviceId); + payloadJson.put("cmd", "runParam"); + payloadJson.put("paras", paramArray); + payloadJson.put("msgType", "cloudReq"); + String payload = payloadJson.toString(); + boolean sendSuccess = true; + try { + mqttSender.sendMsg(topic, qos, payload); + } catch (Exception e) { + log.error("发送mqtt消息失败:topic={}, qos={}, payload={}", topic, qos, payload, e); + sendSuccess = false; + } + JSONObject responseJson = new JSONObject(); + responseJson.put("mid", 641); + responseJson.put("msgType", "deviceRsp"); + responseJson.put("errcode", sendSuccess ? 0 : 1); + mqttSender.sendMsg(topic, qos, responseJson.toString()); + log.info("发送mqtt消息成功:topic={}, qos={}, payload={}", topic, qos, payload); + return responseJson.toString(); + } + } diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/entity/Param.java b/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/entity/Param.java index 8fe07cf..2dd4ce7 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/entity/Param.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/entity/Param.java @@ -43,30 +43,31 @@ public class Param extends BaseParam { * 联表的id */ private Long foreignId; - public enum Type implements IEnum, IState { + + public enum Type implements IEnum, IState { /** * 物模型输入 */ - INPUT(1, "Input"), + INPUT("INPUT", "Input"), /** * 物模型输出 */ - OUTPUT(2, "Output"), + OUTPUT("OUTPUT", "Output"), /** * 读写属性 */ - RW(3, "Read Write"); + RW("RW", "Read Write"); - private final int value; + private final String value; private final String description; - Type(int value, String description) { + Type(String value, String description) { this.value = value; this.description = description; } @Override - public Integer getValue() { + public String getValue() { return value; } @@ -84,7 +85,7 @@ public class Param extends BaseParam { /** * 服务 */ - SERVE(2, "Service"), + SERVE(2, "Serve"), /** * 产品 */ diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/entity/Serve.java b/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/entity/Serve.java index 4b9309e..e7cb888 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/entity/Serve.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/entity/Serve.java @@ -30,9 +30,9 @@ public class Serve extends BaseParam { * 服务输入/输出参数,根据param中的type区分 */ @TableField(exist = false) - private List inputs; + private List inputs; @TableField(exist = false) - private List outputs; + private List outputs; } diff --git a/src/main/resources/mappers/iot/ServeMapper.xml b/src/main/resources/mappers/iot/ServeMapper.xml index e65affd..11646dd 100644 --- a/src/main/resources/mappers/iot/ServeMapper.xml +++ b/src/main/resources/mappers/iot/ServeMapper.xml @@ -1,7 +1,5 @@ - + @@ -62,8 +60,8 @@ ip.foreign_id, ip.foreign_type FROM iot_param ip - WHERE ip.foreign_type = 1 - and ip.type = 1) input_params ON s.id = input_params.foreign_id + WHERE ip.foreign_type = 2 + and ip.type = 'INPUT') input_params ON s.id = input_params.foreign_id LEFT JOIN (SELECT ip.id, ip.data_type, ip.uint, @@ -74,8 +72,8 @@ ip.foreign_id, ip.foreign_type FROM iot_param ip - WHERE ip.foreign_type = 1 - and ip.type = 2) output_params ON s.id = output_params.foreign_id + WHERE ip.foreign_type = 2 + and ip.type = 'OUTPUT') output_params ON s.id = output_params.foreign_id WHERE s.id = #{id}