Эх сурвалжийг харах

!23 openapi模块接口更新推送
Merge pull request !23 from sawyer/dev-V0.4.5

花木水之间 1 жил өмнө
parent
commit
c55378b99e

+ 5 - 0
iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/impl/DeviceServiceImpl.java

@@ -415,6 +415,11 @@ public class DeviceServiceImpl implements IDeviceService {
         DeviceInfo di=data.to(DeviceInfo.class);
         di.setLocate(new DeviceInfo.Locate(data.getLongitude(),data.getLatitude()));
         di.setState(data.getState());
+        //同产品不可重复设备名
+        DeviceInfo deviceRepetition = deviceInfoData.findByProductKeyAndDeviceName(data.getProductKey(), data.getDeviceName());
+        if (deviceRepetition != null && !deviceRepetition.getDeviceId().equals(di.getDeviceId())) {
+            throw new BizException(ErrCode.MODEL_DEVICE_ALREADY);
+        }
         return deviceInfoData.save(di)!=null;
     }
 

+ 5 - 0
iot-module/iot-openapi/pom.xml

@@ -14,6 +14,7 @@
     <dependencies>
 
 
+
         <dependency>
             <groupId>joda-time</groupId>
             <artifactId>joda-time</artifactId>
@@ -96,6 +97,10 @@
             <groupId>cc.iotkit</groupId>
             <artifactId>iot-system</artifactId>
         </dependency>
+        <dependency>
+            <groupId>cc.iotkit</groupId>
+            <artifactId>iot-manager</artifactId>
+        </dependency>
     </dependencies>
 
     <properties>

+ 3 - 0
iot-module/iot-openapi/src/main/java/cc/iotkit/openapi/controller/OpenBaseController.java

@@ -4,6 +4,8 @@ import cc.iotkit.common.api.Request;
 import cc.iotkit.model.InvokeResult;
 import cc.iotkit.openapi.dto.bo.TokenVerifyBo;
 import cc.iotkit.openapi.service.OpenBaseService;
+import cc.iotkit.openapi.service.OpenDeviceService;
+import cn.dev33.satoken.annotation.SaIgnore;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -23,6 +25,7 @@ public class OpenBaseController {
     @Autowired
     private OpenBaseService openBaseService;
 
+    @SaIgnore
     @ApiOperation(value = "token获取", notes = "token获取", httpMethod = "POST")
     @PostMapping("/v1/getToken")
     public InvokeResult OpenApiGetToken(@RequestBody @Validated Request<TokenVerifyBo> request) {

+ 32 - 5
iot-module/iot-openapi/src/main/java/cc/iotkit/openapi/controller/OpenDeviceController.java

@@ -1,8 +1,10 @@
 package cc.iotkit.openapi.controller;
 
 import cc.iotkit.common.api.Request;
+import cc.iotkit.model.InvokeResult;
 import cc.iotkit.model.device.DeviceInfo;
 import cc.iotkit.openapi.dto.bo.device.OpenapiDeviceBo;
+import cc.iotkit.openapi.dto.bo.device.OpenapiSetDeviceServicePropertyBo;
 import cc.iotkit.openapi.service.OpenBaseService;
 import cc.iotkit.openapi.service.OpenDeviceService;
 import io.swagger.annotations.Api;
@@ -15,10 +17,12 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Map;
+
 @Api(tags = {"openapi-设备"})
 @Slf4j
 @RestController
-@RequestMapping("/openapi/v1/device")
+@RequestMapping("/openapi/device")
 public class OpenDeviceController {
 
     @Autowired
@@ -27,10 +31,33 @@ public class OpenDeviceController {
     @Autowired
     private OpenDeviceService openDeviceService;
 
-    @ApiOperation("获取设备详情")
-    @PostMapping("/detail")
-    public DeviceInfo getDetail(@RequestBody @Validated Request<OpenapiDeviceBo> request) {
-        return openDeviceService.getDetail(request.getData());
+    @ApiOperation("查询单个设备详情")
+    @PostMapping("/v1/detail")
+    public DeviceInfo getDetail(@RequestBody @Validated Request<OpenapiDeviceBo> bo) {
+        return openDeviceService.getDetail(bo.getData());
+    }
+
+    @ApiOperation(value = "单个设备注册")
+    @PostMapping("/v1/registerDevice")
+    public boolean createDevice(@RequestBody @Validated Request<OpenapiDeviceBo> bo) {
+        return openDeviceService.addDevice(bo.getData());
+    }
+
+    @ApiOperation("单个设备删除")
+    @PostMapping("/v1/deleteDevice")
+    public boolean deleteDevice(@Validated @RequestBody Request<OpenapiDeviceBo> bo) {
+        return openDeviceService.deleteDevice(bo.getData());
+    }
+
+    @ApiOperation(value = "设置设备的属性", notes = "设置设备的属性", httpMethod = "POST")
+    @PostMapping("/v1/setDeviceProperty")
+    public InvokeResult setProperty(@RequestBody @Validated Request<OpenapiSetDeviceServicePropertyBo> request) {
+        return new InvokeResult(openDeviceService.setProperty(request.getData().getProductKey(), request.getData().getDeviceName(), request.getData().getArgs()));
     }
 
+    @ApiOperation("查询指定设备的属性快照")
+    @PostMapping("/v1/queryDevicePropertyStatus")
+    public Map<String, Object> getDevicePropertyStatus(@RequestBody @Validated Request<OpenapiDeviceBo> bo) {
+        return openDeviceService.getDetail(bo.getData()).getProperty();
+    }
 }

+ 3 - 0
iot-module/iot-openapi/src/main/java/cc/iotkit/openapi/dto/bo/device/OpenapiDeviceBo.java

@@ -10,6 +10,9 @@ import lombok.Data;
 public class OpenapiDeviceBo {
     private static final long serialVersionUID = -1L;
 
+    @ApiModelProperty(value = "父级ID")
+    private String parentId;
+
     @NotBlank(message = "deviceName不能为空")
     @ApiModelProperty(value = "产品名称")
     private String deviceName;

+ 33 - 0
iot-module/iot-openapi/src/main/java/cc/iotkit/openapi/dto/bo/device/OpenapiSetDeviceServicePropertyBo.java

@@ -0,0 +1,33 @@
+package cc.iotkit.openapi.dto.bo.device;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.util.Map;
+/**
+ * @author: dsy
+ * @description:
+ * @date:created in 2023/7/25 14:17
+ * @modificed by:
+ */
+@ApiModel(value = "OpenapiSetDeviceServicePropertyBo")
+@Data
+public class OpenapiSetDeviceServicePropertyBo {
+
+    /*@ApiModelProperty(value="设备id",required = true)
+    @NotBlank
+    private String deviceId;*/
+
+    @NotBlank(message = "deviceName不能为空")
+    @ApiModelProperty(value = "产品名称")
+    private String deviceName;
+
+    @NotBlank(message = "productKey不能为空")
+    @ApiModelProperty(value = "产品key")
+    private String productKey;
+
+    @ApiModelProperty(value="参数")
+    private Map<String, Object> args;
+}

+ 11 - 0
iot-module/iot-openapi/src/main/java/cc/iotkit/openapi/service/OpenDeviceService.java

@@ -3,6 +3,8 @@ package cc.iotkit.openapi.service;
 import cc.iotkit.model.device.DeviceInfo;
 import cc.iotkit.openapi.dto.bo.device.OpenapiDeviceBo;
 
+import java.util.Map;
+
 /**
  * @Author: dsy
  * @Date: 2023/7/24 11:05
@@ -11,4 +13,13 @@ import cc.iotkit.openapi.dto.bo.device.OpenapiDeviceBo;
  */
 public interface OpenDeviceService {
     DeviceInfo getDetail(OpenapiDeviceBo bo);
+
+    boolean addDevice(OpenapiDeviceBo bo);
+
+    boolean deleteDevice(OpenapiDeviceBo bo);
+
+    /**
+     * 设备属性设置
+     */
+    String setProperty(String productKey, String deviceName, Map<String, Object> properties);
 }

+ 2 - 1
iot-module/iot-openapi/src/main/java/cc/iotkit/openapi/service/impl/OpenBaseServiceImpl.java

@@ -52,7 +52,8 @@ public class OpenBaseServiceImpl implements OpenBaseService {
 
         // 校验租户
         checkTenant(bo.getTenantId());
-
+        System.out.println("boAppid + password + boTimeStamp = " + boAppid + password + boTimeStamp);
+        System.out.println("boIdentifier = " + boIdentifier);
         if (!CodecUtil.md5Str(boAppid + password + boTimeStamp).equals(boIdentifier)){
             throw new BizException(ErrCode.IDENTIFIER_ERROR);
         }

+ 78 - 0
iot-module/iot-openapi/src/main/java/cc/iotkit/openapi/service/impl/OpenDeviceServiceImpl.java

@@ -1,13 +1,26 @@
 package cc.iotkit.openapi.service.impl;
 
+import cc.iotkit.common.enums.ErrCode;
+import cc.iotkit.common.exception.BizException;
+import cc.iotkit.common.utils.DeviceUtil;
 import cc.iotkit.data.manager.IDeviceInfoData;
+import cc.iotkit.data.manager.IProductData;
+import cc.iotkit.manager.service.DeviceService;
 import cc.iotkit.model.device.DeviceInfo;
+import cc.iotkit.model.device.message.ThingModelMessage;
+import cc.iotkit.model.product.Product;
 import cc.iotkit.openapi.dto.bo.device.OpenapiDeviceBo;
 import cc.iotkit.openapi.service.OpenDeviceService;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
+import java.util.Map;
+
+import static cc.iotkit.common.enums.ErrCode.DEVICE_NOT_FOUND;
+import static cc.iotkit.common.enums.ErrCode.DEVICE_OFFLINE;
+
 @Service
 public class OpenDeviceServiceImpl implements OpenDeviceService {
 
@@ -15,10 +28,75 @@ public class OpenDeviceServiceImpl implements OpenDeviceService {
     @Qualifier("deviceInfoDataCache")
     private IDeviceInfoData deviceInfoData;
 
+    @Autowired
+    @Qualifier("productDataCache")
+    private IProductData productData;
+
+    @Autowired
+    private DeviceService deviceService;
+
     @Override
     public DeviceInfo getDetail(OpenapiDeviceBo data) {
         DeviceInfo deviceInfo = deviceInfoData.findByProductKeyAndDeviceName(data.getProductKey(), data.getDeviceName());
         deviceInfo.setProperty(deviceInfoData.getProperties(deviceInfo.getDeviceId()));
         return deviceInfo;
     }
+
+    @Override
+    public boolean addDevice(OpenapiDeviceBo bo) {
+        String productKey = bo.getProductKey();
+        String deviceName = bo.getDeviceName();
+        String parentId = bo.getParentId();
+
+        Product product = productData.findByProductKey(productKey);
+        if (product == null) {
+            throw new BizException(ErrCode.PRODUCT_NOT_FOUND);
+        }
+        //同产品不可重复设备名
+        DeviceInfo deviceRepetition = deviceInfoData.findByProductKeyAndDeviceName(productKey, deviceName);
+        if (deviceRepetition != null) {
+            throw new BizException(ErrCode.MODEL_DEVICE_ALREADY);
+        }
+        //生成设备密钥
+        String chars = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678";
+        int maxPos = chars.length();
+        StringBuilder secret = new StringBuilder();
+        for (var i = 0; i < 16; i++) {
+            secret.append(chars.charAt((int) Math.floor(Math.random() * maxPos)));
+        }
+
+        DeviceInfo device = new DeviceInfo();
+        device.setId(DeviceUtil.newDeviceId(deviceName));
+        device.setUid(product.getUid());
+        device.setDeviceId(device.getId());
+        device.setProductKey(productKey);
+        device.setDeviceName(deviceName);
+        device.setSecret(secret.toString());
+        device.setState(new DeviceInfo.State(false, null, null));
+//        device.setLocate(new DeviceInfo.Locate(deviceInfo.getLongitude(),deviceInfo.getLatitude()));
+        device.setCreateAt(System.currentTimeMillis());
+        if (StringUtils.isNotBlank(parentId)) {
+            device.setParentId(parentId);
+        }
+        deviceInfoData.save(device);
+        return true;
+    }
+
+    @Override
+    public boolean deleteDevice(OpenapiDeviceBo bo) {
+        DeviceInfo deviceRepetition = deviceInfoData.findByProductKeyAndDeviceName(bo.getProductKey(), bo.getDeviceName());
+        if (deviceRepetition == null){
+            throw new BizException(ErrCode.DEVICE_NOT_FOUND);
+        }
+        deviceInfoData.deleteById(deviceRepetition.getDeviceId());
+        return true;
+    }
+
+    @Override
+    public String setProperty(String productKey, String deviceName, Map<String, Object> args) {
+        DeviceInfo deviceRepetition = deviceInfoData.findByProductKeyAndDeviceName(productKey, deviceName);
+        return deviceService.setProperty(deviceRepetition.getDeviceId(), args, true);
+    }
+
+
 }