2021与蓝度共同重构项目,服务端
liuhaonan
2022-11-21 2e25dbb794bde83ebca485178b3447e8be0271e4
Merge remote-tracking branch 'origin/xm-20221107' into xm-20221107
已修改5个文件
已添加3个文件
343 ■■■■■ 文件已修改
sandu-common/pom.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/java/com/sandu/common/file/config/minioConfig/MinIoPolicy.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/java/com/sandu/common/file/config/minioConfig/MinioPolicyStatement.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/java/com/sandu/common/file/config/minioConfig/MinioPolicyStatementPrincipal.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/java/com/sandu/common/file/impl/AliOssFileServiceImpl.java 184 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/localMQTT/controller/localMQTTTestController.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/BaseInvokeSyncService.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/pom.xml
@@ -179,5 +179,13 @@
            <artifactId>ffmpeg-platform</artifactId>
            <version>4.0.2-1.4.3</version>
        </dependency>
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>7.1.0</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>
sandu-common/src/main/java/com/sandu/common/file/config/minioConfig/MinIoPolicy.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.sandu.common.file.config.minioConfig;
import com.google.gson.Gson;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class MinIoPolicy {
    private String Version;
    private List<MinioPolicyStatement> Statement;
    /**
     * ç”Ÿæˆ * é€šè¡Œç­–ç•¥
     * @return
     */
    public static String generateMinioPolicy (String bucketName) {
        MinIoPolicy policy = new MinIoPolicy();
        policy.setVersion("2012-10-17");
        List<MinioPolicyStatement> minioPolicyStatements = new ArrayList<>();
        MinioPolicyStatement statement = new MinioPolicyStatement();
        statement.setEffect("Allow");
        MinioPolicyStatementPrincipal policyStatementPrincipal = new MinioPolicyStatementPrincipal();
        List<String> aws = new ArrayList<>();
        aws.add("*");
        policyStatementPrincipal.setAWS(aws);
        statement.setPrincipal(policyStatementPrincipal);
        List<String> action = new ArrayList<>();
        action.add("s3:GetBucketLocation");
        action.add("s3:ListBucket");
        statement.setAction(action);
        List<String> resources = new ArrayList<>();
        resources.add("arn:aws:s3:::"+bucketName);
        statement.setResource(resources);
        MinioPolicyStatement statement2 = new MinioPolicyStatement();
        statement2.setEffect("Allow");
        statement2.setPrincipal(policyStatementPrincipal);
        action = new ArrayList<>();
        action.add("s3:GetObject");
        statement2.setAction(action);
        resources = new ArrayList<>();
        resources.add("arn:aws:s3:::"+bucketName+"/*");
        statement2.setResource(resources);
        minioPolicyStatements.add(statement);
        minioPolicyStatements.add(statement2);
        policy.setStatement(minioPolicyStatements);
        return new Gson().toJson(policy);
    }
}
sandu-common/src/main/java/com/sandu/common/file/config/minioConfig/MinioPolicyStatement.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.sandu.common.file.config.minioConfig;
import lombok.Data;
import java.util.List;
@Data
public class MinioPolicyStatement {
    private String Effect;
    private MinioPolicyStatementPrincipal Principal;
    private List<String> Action;
    private List<String> Resource;
}
sandu-common/src/main/java/com/sandu/common/file/config/minioConfig/MinioPolicyStatementPrincipal.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.sandu.common.file.config.minioConfig;
import lombok.Data;
import java.util.List;
@Data
public class MinioPolicyStatementPrincipal {
    private List<String> AWS;
}
sandu-common/src/main/java/com/sandu/common/file/impl/AliOssFileServiceImpl.java
@@ -2,31 +2,28 @@
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.StrUtil;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.CreateBucketRequest;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.sandu.common.enums.FileStorageEnums;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.file.FileUploadDto;
import com.sandu.common.file.IFileUpload;
import com.sandu.common.file.config.minioConfig.MinIoPolicy;
import io.minio.*;
import io.minio.messages.Bucket;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
/**
 * @author chenjiantian
@@ -36,16 +33,12 @@
@Component
public class AliOssFileServiceImpl implements IFileUpload {
    @Value("${oss-conf.end-point}")
    private String endPoint;
    @Value("${oss-conf.key-id}")
    private String keyId;
    @Value("${oss-conf.key-secret}")
    private String keySecret;
    @Value("${oss-conf.bucket-name}")
    private String bucketName;
    @Autowired
    private MinioClient minioClient;
    private String host;
    private String bucketName = "remote-update";
    public  String MINIO_PREFIX = "vnnox.";
    @Override
    public FileUploadDto uploadFile(MultipartFile multipartFile) {
@@ -57,41 +50,29 @@
        String md5 = getMD5(multipartFile);
        FileUploadDto uploadDto = new FileUploadDto();
        OSS ossClient = new OSSClientBuilder().build(endPoint, keyId, keySecret);
        try {
            //容器不存在,就创建
            if (!ossClient.doesBucketExist(bucketName)) {
                ossClient.createBucket(bucketName);
                CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
                createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
                ossClient.createBucket(createBucketRequest);
            }
            //上传文件
            PutObjectResult result = ossClient.putObject(new PutObjectRequest(bucketName, fileName, new ByteArrayInputStream(multipartFile.getBytes())));
            //设置权限 è¿™é‡Œæ˜¯å…¬å¼€è¯»
//            ossClient.setBucketAcl(ossProperties.getBucketName(), CannedAccessControlList.PublicRead);
            if (result != null) {
                String url = "";
                // https://BucketName.Endpoint/ObjectName
                if (StrUtil.isBlank(host)) {
                    url = "https://" + bucketName + "." + endPoint + "/" + fileName;
                } else {
                    if (!host.endsWith("/")) {
                        url = host + "/" + fileName;
                    } else {
                        url = host + fileName;
            if (!bucketExists(bucketName)) {
                createBucket(bucketName);
                if (bucketName.contains(MINIO_PREFIX)) {
                    setBucketPolicy(bucketName);
                    }
                }
            final InputStream is = multipartFile.getInputStream();
            Long start = System.currentTimeMillis();
            minioClient.putObject(bucketName, fileName, is, new PutObjectOptions(is.available(), -1));
            is.close();
            System.out.println(("上传总时间:" + (System.currentTimeMillis() - start) + "ms"));
//            ä»Žminio获取 url
            String url = minioClient.presignedGetObject(bucketName, fileName);
            System.out.println("获取到的路径:"+url);
                uploadDto.setFileUrl(url);
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new BusinessException(e.getMessage());
        } finally {
            //关闭
            ossClient.shutdown();
        }
        uploadDto.setOriginName(originalFilename);
@@ -117,57 +98,6 @@
        return uploadDto;
    }
    public FileUploadDto uploadFile(File multipartFile) {
        String originalFilename = multipartFile.getName();
//        long size = multipartFile.get();
        String suffix = FileUtil.getSuffix(originalFilename);
        String dayStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm"));
        String fileName = dayStr + UUID.fastUUID() + "." + suffix;
        FileUploadDto uploadDto = new FileUploadDto();
        OSS ossClient = new OSSClientBuilder().build(endPoint, keyId, keySecret);
        try {
            //容器不存在,就创建
            if (!ossClient.doesBucketExist(bucketName)) {
                ossClient.createBucket(bucketName);
                CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
                createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
                ossClient.createBucket(createBucketRequest);
            }
            //上传文件
            PutObjectResult result = ossClient.putObject(new PutObjectRequest(bucketName, fileName, multipartFile));
            //设置权限 è¿™é‡Œæ˜¯å…¬å¼€è¯»
//            ossClient.setBucketAcl(ossProperties.getBucketName(), CannedAccessControlList.PublicRead);
            if (result != null) {
                String url = "";
                // https://BucketName.Endpoint/ObjectName
                if (StrUtil.isBlank(host)) {
                    url = "https://" + bucketName + "." + endPoint + "/" + fileName;
                } else {
                    if (!host.endsWith("/")) {
                        url = host + "/" + fileName;
                    } else {
                        url = host + fileName;
                    }
                }
                uploadDto.setFileUrl(url);
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new BusinessException(e.getMessage());
        } finally {
            //关闭
            ossClient.shutdown();
        }
        uploadDto.setOriginName(originalFilename);
        uploadDto.setFileName(fileName);
        uploadDto.setFileType(FileUtil.extName(originalFilename));
        uploadDto.setStorageType(FileStorageEnums.ALIBABA.getCode());
        return uploadDto;
    }
    /**
     * èŽ·å–ä¸Šä¼ æ–‡ä»¶çš„MD5值
@@ -191,4 +121,64 @@
        return null;
    }
    /**
     * è®¾ç½®å¼€æ”¾*的桶策略
     *
     * @param bucketName
     * @return
     */
    public void setBucketPolicy(String bucketName) throws Exception {
        minioClient.setBucketPolicy(
                SetBucketPolicyArgs.builder().bucket(bucketName).config(MinIoPolicy.generateMinioPolicy(bucketName)).build()
        );
    }
    /**
     * åˆ¤æ–­ bucket是否存在
     *
     * @param bucketName: æ¡¶å
     * @return: boolean
     */
    @SneakyThrows(Exception.class)
    public boolean bucketExists(String bucketName) {
        return minioClient.bucketExists(bucketName);
    }
    public boolean objectExists(String bucketName, String objectName) {
        try {
            getObjectInfo(bucketName, objectName);
        } catch (Exception e) {
            return false;
        }
        return true;
    }
    private void getObjectInfo(String bucketName, String objectName) {
    }
    /**
     * åˆ›å»º bucket
     *
     * @param bucketName: æ¡¶å
     * @return: void
     */
    @SneakyThrows(Exception.class)
    public void createBucket(String bucketName) {
        boolean isExist = minioClient.bucketExists((BucketExistsArgs) ((io.minio.BucketExistsArgs.Builder) BucketExistsArgs.builder().bucket(bucketName)).build());
        if (!isExist) {
            minioClient.makeBucket((MakeBucketArgs) ((io.minio.MakeBucketArgs.Builder) MakeBucketArgs.builder().bucket(bucketName)).build());
        }
    }
    /**
     * èŽ·å–å…¨éƒ¨bucket
     */
    @SneakyThrows(Exception.class)
    public List<Bucket> getAllBuckets() {
        return minioClient.listBuckets();
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/localMQTT/controller/localMQTTTestController.java
@@ -44,25 +44,25 @@
            String result1 = MqttClientUtil.sendMqttMsg("363832544e5008ff3a32ffff",
                            "FEA501000BFE010003FFFF0AA542FD69D4E6194E");
            log.info("开灯返回结果:"+result1);
            sleep(3000);
            sleep(5000);
//            å…³
            String result2 = MqttClientUtil.sendMqttMsg("363832544e5008ff3a32ffff",
                    "FEA501000BFE0100030001007130ECA9150640E6");
            log.info("关灯返回结果:"+result2);
            sleep(3000);
            sleep(5000);
////            å¿ƒè·³æŸ¥è¯¢
//            String result3 = MqttClientUtil.sendMqttMsg("363832544e5008ff3a32ffff",
//                    "FEA501000AFE110002FFFF26008FBE3DAC7C0D");
//            log.info("心跳查询返回结果:"+result3);
//            sleep(3000);
//            String result4 = MqttClientUtil.sendMqttMsg("363832544e5008ff3a32ffff",
//                    "FEA501001AFE230012FE23000A00017F1019647F111E005428F600EC64EC194EA28A7C");
//            log.info("定时任务返回结果:"+result4);
//            sleep(3000);
            String result3 = MqttClientUtil.sendMqttMsg("363832544e5008ff3a32ffff",
                    "FEA501000AFE110002FFFF26008FBE3DAC7C0D");
            log.info("心跳查询返回结果:"+result3);
            sleep(3000);
            String result4 = MqttClientUtil.sendMqttMsg("363832544e5008ff3a32ffff",
                    "FEA501001AFE230012FE23000A00017F1019647F111E005428F600EC64EC194EA28A7C");
            log.info("定时任务返回结果:"+result4);
            sleep(3000);
//            System.out.println("链接状态:---"+i+"---:");
//            System.out.println(localMqttConnectStatusMap.get("363832544e5008ff3a32ffff"));
//            sleep(10000);
            System.out.println("链接状态:---"+i+"---:");
            System.out.println(localMqttConnectStatusMap.get("363832544e5008ff3a32ffff"));
            sleep(3000);
        }
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/BaseInvokeSyncService.java
@@ -7,6 +7,7 @@
import com.aliyuncs.iot.model.v20180120.*;
import com.sandu.common.execption.BusinessException;
import com.sandu.ximon.admin.dto.DeviceStatus;
import com.sandu.ximon.admin.localMQTT.util.HexFrameUtils;
import com.sandu.ximon.admin.localMQTT.util.MqttClientUtil;
import com.sandu.ximon.admin.manager.iot.frame.IRequestFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame;
@@ -68,7 +69,7 @@
//        Map map = JSON.parseObject(result, Map.class);
//        result = (String) map.get("msg");
        String result = MqttClientUtil.sendMqttMsg(deviceName,invokeParam.getFrame());
        return FrameUtils.transformMessageToFrame(result);
        return HexFrameUtils.transformMessageToFrame(result);
    }
    @Override
@@ -87,7 +88,7 @@
        String frame = FrameUtils.transformMessageToFrame(iRequestFrame.getEncodeFrame()).toString();
        String result = MqttClientUtil.sendMqttMsg(deviceName,frame);
        log.info("自定义sendRRPC:请求帧:{},\n,响应帧:{}",iRequestFrame.toString(),result);
        return FrameUtils.transformMessageToFrame(result);
        return HexFrameUtils.transformMessageToFrame(result);
    }
    @Override
@@ -105,7 +106,7 @@
//        result = (String) map.get("msg");
        String frame = FrameUtils.transformMessageToFrame(iRequestFrame.getEncodeFrame()).toString();
        String result = MqttClientUtil.sendMqttMsg(deviceName,frame);
        return FrameUtils.transformMessageToFrame(result);
        return HexFrameUtils.transformMessageToFrame(result);
    }
@@ -195,10 +196,10 @@
                    deviceStatus.setDeviceName(l);
            if (localMqttConnectStatusMap.get(l)!=null &&
                    localMqttConnectStatusMap.get(l)== 1){
                deviceStatus.setStatus("ONLINE");
            }else {
                    localMqttConnectStatusMap.get(l)== 0){
                deviceStatus.setStatus("OFFLINE");
            }else {
                deviceStatus.setStatus("ONLINE");
            }
            statusList.add(deviceStatus);
        });
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java
@@ -1013,9 +1013,7 @@
        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_LIGHT_DATA.getCode(), setCalendarReqInnerFrame);
        System.out.println(a5Frame + "            -----a5Frame");
        CommonFrame commonFrame;
        commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(one.getDeviceCode(), a5Frame);
        CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(one.getDeviceCode(), a5Frame);
        StoreOperationRecordsUtils.storeInnerFrameData(one.getDeviceCode(), "单灯帧-设置日历", a5Frame, commonFrame);
        System.out.println(commonFrame + "            -----commonFrame");
@@ -1096,14 +1094,15 @@
                        count++;
                    }
                    if (haveTime) {
                        try {
                            long longTime = cal.getTimeInMillis() - System.currentTimeMillis();
                            log.error("睡眠时间(毫秒):" + longTime);
                            Thread.sleep(longTime);
                            SetCalendar(light.getLightId(), lightAddress);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        log.error("存在定时任务:" + light.getLightId()+","+light.getDeviceCode());
//                        try {
//                            long longTime = cal.getTimeInMillis() - System.currentTimeMillis();
//                            log.error("睡眠时间(毫秒):" + longTime);
//                            Thread.sleep(longTime);
//                            SetCalendar(light.getLightId(), lightAddress);
//                        } catch (InterruptedException e) {
//                            e.printStackTrace();
//                        }
                    } else {
                        log.error("灯杆ID为:" + light.getLightId() + ",灯头地址为:" + lightAddress + "没有找到可同步的时间,请检查任务!");
                    }