2021与蓝度共同重构项目,服务端
liuhaonan
2022-11-09 061346cefe87c5612367a7910d165302e0330b02
changes
已添加14个文件
已修改6个文件
1490 ■■■■■ 文件已修改
dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaFile.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/enums/MenuEnum.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/NewNovaFileMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/NewNovaFileMapper.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/pom.xml 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/java/com/sandu/common/file/AudioUtil.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/java/com/sandu/common/file/FileToThumbnail.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/java/com/sandu/common/file/FileUploadDto.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/java/com/sandu/common/file/VideoUtil.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/java/com/sandu/common/file/config/FileProperties.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/java/com/sandu/common/file/impl/LocalFileUploadImpl.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/file/NewNovaFileController.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/file/NewNovaFileService.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/libs/jna-5.6.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/libs/jna-platform-5.6.0.jar 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/NewNovaFileParam.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/utils/APITest.java 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/utils/Test.java 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/utils/ViplexCore.java 251 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/resources/application-local.yml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/NewNovaFile.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,81 @@
package com.sandu.ximon.dao.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
 * æ–°è¯ºç“¦èŠ‚ç›®æ–‡ä»¶è¡¨
 * @TableName new_nova_file
 */
@TableName(value ="new_nova_file")
@Data
public class NewNovaFile implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     *
     */
    private Long userId;
    /**
     *
     */
    private String userName;
    /**
     * æ–‡ä»¶åç§°
     */
    private String name;
    /**
     * å¤§å°
     */
    private String size;
    /**
     * æ–‡ä»¶ç±»åž‹
     */
    private String fileType;
    /**
     * é“¾æŽ¥
     */
    private String fileUrl;
    /**
     * ç»å¯¹è·¯å¾„
     */
    private String realUrl;
    /**
     * ç¼©ç•¥å›¾
     */
    private String screenShot;
    /**
     * md5
     */
    private String md5;
    /**
     * ä¸Šä¼ æ—¶é—´
     */
    private Date createTime;
    /**
     * è§†é¢‘æ—¶é•¿
     */
    private Integer duration;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
dao/src/main/java/com/sandu/ximon/dao/enums/MenuEnum.java
@@ -234,7 +234,12 @@
    C3_REFUND("充电桩退款"),
    CHARGE_UPDATE("编辑费率"),
    ORDER_LIST("订单列表"),
    CHARGE_LIST("获取费率");
    CHARGE_LIST("获取费率"),
    LED_NEW_FILE_UPLOAD("新诺瓦文件上传"),
    LED_NEW_FILE_LIST("新诺瓦文件列表"),
    LED_NEW_FILE_ADD("新诺瓦文件新增"),
    LED_NEW_FILE_DEL("新诺瓦文件删除"),
    ;
    private final String code;
dao/src/main/java/com/sandu/ximon/dao/mapper/NewNovaFileMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.sandu.ximon.dao.mapper;
import com.sandu.ximon.dao.domain.NewNovaFile;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* @author Administrator
* @description é’ˆå¯¹è¡¨ã€new_nova_file(新诺瓦节目文件表)】的数据库操作Mapper
* @createDate 2022-11-08 17:12:07
* @Entity com.sandu.ximon.dao.domain.NewNovaFile
*/
@Mapper
public interface NewNovaFileMapper extends BaseMapper<NewNovaFile> {
}
dao/src/main/resources/mapper/NewNovaFileMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sandu.ximon.dao.mapper.NewNovaFileMapper">
    <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.NewNovaFile">
            <id property="id" column="id" jdbcType="BIGINT"/>
            <result property="userId" column="user_id" jdbcType="BIGINT"/>
            <result property="userName" column="user_name" jdbcType="VARCHAR"/>
            <result property="name" column="name" jdbcType="VARCHAR"/>
            <result property="size" column="size" jdbcType="VARCHAR"/>
            <result property="fileType" column="file_type" jdbcType="VARCHAR"/>
            <result property="fileUrl" column="file_url" jdbcType="VARCHAR"/>
            <result property="realUrl" column="real_url" jdbcType="VARCHAR"/>
            <result property="screenShot" column="screen_shot" jdbcType="VARCHAR"/>
            <result property="md5" column="md5" jdbcType="VARCHAR"/>
            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
            <result property="duration" column="duration" jdbcType="INTEGER"/>
    </resultMap>
    <sql id="Base_Column_List">
        id,user_id,user_name,
        name,size,file_type,
        file_url,real_url,screen_shot,
        md5,create_time,duration
    </sql>
</mapper>
sandu-common/pom.xml
@@ -130,5 +130,54 @@
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
        <!--获取视频时长-->
        <dependency>
            <groupId>ws.schild</groupId>
            <artifactId>jave-core</artifactId>
            <version>3.1.1</version>
        </dependency>
        <dependency>
            <groupId>ws.schild</groupId>
            <artifactId>jave-nativebin-linux64</artifactId>
            <version>3.1.1</version>
        </dependency>
        <!-- mp3文件支持(如语音时长)-->
        <dependency>
            <groupId>org</groupId>
            <artifactId>jaudiotagger</artifactId>
            <version>2.0.1</version>
        </dependency>
        <!-- mp4文件支持(如语音时长)-->
        <dependency>
            <groupId>com.googlecode.mp4parser</groupId>
            <artifactId>isoparser</artifactId>
            <version>1.1.22</version>
        </dependency>
        <!-- pdf生成缩率图依赖 -->
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.24</version>
        </dependency>
        <!--   æ“ä½œè§†é¢‘获取缩略图依赖     -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacpp</artifactId>
            <version>1.4.3</version>
        </dependency>
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv</artifactId>
            <version>1.4.3</version>
        </dependency>
        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>ffmpeg-platform</artifactId>
            <version>4.0.2-1.4.3</version>
        </dependency>
    </dependencies>
</project>
sandu-common/src/main/java/com/sandu/common/file/AudioUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,103 @@
package com.sandu.common.file;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.audio.mp3.MP3AudioHeader;
import org.jaudiotagger.audio.mp3.MP3File;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import java.io.File;
public class AudioUtil {
    /**
     * èŽ·å–è¯­éŸ³æ–‡ä»¶æ’­æ”¾æ—¶é•¿(秒) æ”¯æŒwav æ ¼å¼
     *
     * @param filePath
     * @return
     */
    public static Float getDuration(String filePath) {
        try {
            File destFile = new File(filePath);
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(destFile);
            AudioFormat format = audioInputStream.getFormat();
            long audioFileLength = destFile.length();
            int frameSize = format.getFrameSize();
            float frameRate = format.getFrameRate();
            float durationInSeconds = (audioFileLength / (frameSize * frameRate));
            return durationInSeconds;
        } catch (Exception e) {
            e.printStackTrace();
            return 0f;
        }
    }
    /**
     * èŽ·å–mp3语音文件播放时长(秒) mp3
     *
     * @param filePath
     * @return
     */
    public static Float getMp3Duration(String filePath) {
        try {
            File mp3File = new File(filePath);
            MP3File f = (MP3File) AudioFileIO.read(mp3File);
            MP3AudioHeader audioHeader = (MP3AudioHeader) f.getAudioHeader();
            return Float.parseFloat(audioHeader.getTrackLength() + "");
        } catch (Exception e) {
            e.printStackTrace();
            return 0f;
        }
    }
    /**
     * èŽ·å–mp3语音文件播放时长(秒)
     *
     * @param mp3File
     * @return
     */
    public static Float getMp3Duration(File mp3File) {
        try {
            //File mp3File = new File(filePath);
            MP3File f = (MP3File) AudioFileIO.read(mp3File);
            MP3AudioHeader audioHeader = (MP3AudioHeader) f.getAudioHeader();
            return Float.parseFloat(audioHeader.getTrackLength() + "");
        } catch (Exception e) {
            e.printStackTrace();
            return 0f;
        }
    }
    /**
     * å¾—到pcm文件的毫秒数
     * <p>
     * pcm文件音频时长计算
     * åŒå›¾åƒbmp文件一样,pcm文件保存的是未压缩的音频信息。 16bits ç¼–码是指,每次采样的音频信息用2个字节保存。可以对比下bmp文件用分别用2个字节保存RGB颜色的信息。 16000采样率 æ˜¯æŒ‡ 1秒钟采样 16000次。常见的音频是44100HZ,即一秒采样44100次。 å•声道: åªæœ‰ä¸€ä¸ªå£°é“。
     * <p>
     * æ ¹æ®è¿™äº›ä¿¡æ¯ï¼Œæˆ‘们可以计算: 1秒的16000采样率音频文件大小是 2*16000 = 32000字节 ï¼Œçº¦ä¸º32K 1秒的8000采样率音频文件大小是 2*8000 = 16000字节 ï¼Œçº¦ä¸º 16K
     * <p>
     * å¦‚果已知录音时长,可以根据文件的大小计算采样率是否正常。
     *
     * @param filePath
     * @return
     */
    public static long getPCMDurationMilliSecond(String filePath) {
        File file = new File(filePath);
        //得到多少秒
        long second = file.length() / 32000;
        long milliSecond = Math.round((file.length() % 32000) / 32000.0 * 1000);
        return second * 1000 + milliSecond;
    }
}
sandu-common/src/main/java/com/sandu/common/file/FileToThumbnail.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,133 @@
package com.sandu.common.file;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.springframework.context.annotation.Configuration;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
@Configuration
public class FileToThumbnail {
    /**
     * <p>Title: thumbnailImage</p>
     * <p>Description: æ ¹æ®å›¾ç‰‡è·¯å¾„生成缩略图 </p>
     *
     * @param imagePath åŽŸå›¾ç‰‡è·¯å¾„
     * @param w         ç¼©ç•¥å›¾å®½
     * @param h         ç¼©ç•¥å›¾é«˜
     * @param prevfix   ç”Ÿæˆç¼©ç•¥å›¾çš„前缀
     * @param force     æ˜¯å¦å¼ºåˆ¶æŒ‰ç…§å®½é«˜ç”Ÿæˆç¼©ç•¥å›¾(如果为false,则生成最佳比例缩略图)
     */
    public void getThumbnailForPic(String imagePath, int w, int h, String prevfix, boolean force) throws IOException {
        File imgFile = new File(imagePath);
        if (imgFile.exists()) {
            // ImageIO æ”¯æŒçš„图片类型 : [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]
            String types = Arrays.toString(ImageIO.getReaderFormatNames());
            String suffix = null;
            // èŽ·å–å›¾ç‰‡åŽç¼€
            if (imgFile.getName().indexOf(".") > -1) {
                suffix = imgFile.getName().substring(imgFile.getName().lastIndexOf(".") + 1);
            }
            // ç±»åž‹å’Œå›¾ç‰‡åŽç¼€å…¨éƒ¨å°å†™ï¼Œç„¶åŽåˆ¤æ–­åŽç¼€æ˜¯å¦åˆæ³•
            if (suffix == null || types.toLowerCase().indexOf(suffix.toLowerCase()) < 0) {
                System.out.println("Sorry, the image suffix is illegal. the standard image suffix is {}." + types);
                return;
            }
            System.out.println("target image's size, width:{" + w + "}, height:{" + h + "}.");
            Image img = ImageIO.read(imgFile);
            if (!force) {
                // æ ¹æ®åŽŸå›¾ä¸Žè¦æ±‚çš„ç¼©ç•¥å›¾æ¯”ä¾‹ï¼Œæ‰¾åˆ°æœ€åˆé€‚çš„ç¼©ç•¥å›¾æ¯”ä¾‹
                int width = img.getWidth(null);
                int height = img.getHeight(null);
                if ((width * 1.0) / w < (height * 1.0) / h) {
                    if (width > w) {
                        h = Integer.parseInt(new java.text.DecimalFormat("0").format(height * w / (width * 1.0)));
                    }
                } else {
                    if (height > h) {
                        w = Integer.parseInt(new java.text.DecimalFormat("0").format(width * h / (height * 1.0)));
                    }
                }
            }
            BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
            Graphics g = bi.getGraphics();
            g.drawImage(img, 0, 0, w, h, Color.LIGHT_GRAY, null);
            g.dispose();
            String p = imgFile.getPath();
            // å°†å›¾ç‰‡ä¿å­˜åœ¨åŽŸç›®å½•å¹¶åŠ ä¸Šå‰ç¼€
            ImageIO.write(bi, suffix, new File(p.substring(0, p.lastIndexOf(File.separator)) + File.separator + prevfix + imgFile.getName()));
        }
    }
    /**
     * é€šè¿‡PDFbox生成文件的缩略图
     *
     * @param filePath:文件路径
     * @param outPath:输出图片路径
     * @throws IOException
     */
    public String getThumbnailForPdf(String filePath, String outPath) throws IOException {
        // åˆ©ç”¨PdfBox生成图像
        PDDocument pdDocument = PDDocument.load(new File(filePath));
        PDFRenderer renderer = new PDFRenderer(pdDocument);
        // æž„造图片
        BufferedImage img_temp = renderer.renderImageWithDPI(0, 30, ImageType.RGB);
        ImageIO.write(img_temp, "png", new File(outPath));
        pdDocument.close();
        return outPath;
    }
    /**
     * @param sourcePath ä¿å­˜è·¯å¾„
     * @return String ä¿å­˜è·¯å¾„
     * @description //生成视频缩略图的URL地址
     */
    public String getThumbnailForVideo(InputStream inputStream, String sourcePath) throws IOException {
        File targetFile = new File(sourcePath);
        FFmpegFrameGrabber ff = new FFmpegFrameGrabber(inputStream);
        ff.start();
        // è§†é¢‘总帧数
        int videoLength = ff.getLengthInFrames();
        Frame f = null;
        int i = 0;
        while (i < videoLength) {
            // è¿‡æ»¤å‰20帧,因为前20帧可能是全黑的
            // è¿™é‡Œçœ‹éœ€æ±‚,也可以直接根据帧数取图片
            f = ff.grabFrame();
            if (i > 20 && f.image != null) {
                break;
            }
            i++;
        }
        int owidth = f.imageWidth;
        int oheight = f.imageHeight;
        // å¯¹æˆªå–的帧进行等比例缩放
        int width = 300;
        int height = (int) (((double) width / owidth) * oheight);
        Java2DFrameConverter converter = new Java2DFrameConverter();
        BufferedImage fecthedImage = converter.getBufferedImage(f);
        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
        bi.getGraphics().drawImage(fecthedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH),
                0, 0, null);
        ImageIO.write(bi, "png", targetFile);
        // æŸ¥çœ‹stop源码会自动关流
        ff.stop();
        return sourcePath;
    }
}
sandu-common/src/main/java/com/sandu/common/file/FileUploadDto.java
@@ -25,6 +25,11 @@
     */
    private String fileUrl;
    /**
     * ç»å¯¹è·¯å¾„
     */
    private String realUrl;
    /**
     * ç¼©ç•¥å›¾
@@ -62,4 +67,10 @@
    @TableField(exist = false)
    private String md5;
    /**
     * è§†é¢‘æ—¶é•¿
     */
    @TableField(exist = false)
    private Integer duration;
}
sandu-common/src/main/java/com/sandu/common/file/VideoUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
package com.sandu.common.file;
import com.coremedia.iso.IsoFile;
import java.io.IOException;
public class VideoUtil {
    /**
     * èŽ·å–è§†é¢‘æ–‡ä»¶çš„æ’­æ”¾é•¿åº¦(mp4、mov格式)
     *
     * @param videoPath
     * @return å•位为毫秒
     */
    public static long getMp4Duration(String videoPath) throws IOException {
        IsoFile isoFile = new IsoFile(videoPath);
        long lengthInSeconds =
                isoFile.getMovieBox().getMovieHeaderBox().getDuration() /
                        isoFile.getMovieBox().getMovieHeaderBox().getTimescale();
        return lengthInSeconds;
    }
    /**
     * å¾—到语音或视频文件时长,单位秒
     *
     * @param filePath
     * @return
     * @throws IOException
     */
    public static long getDuration(String filePath) throws IOException {
        String format = getVideoFormat(filePath);
        long result = 0;
        if ("wav".equals(format)) {
            result = AudioUtil.getDuration(filePath).intValue();
        } else if ("mp3".equals(format)) {
            result = AudioUtil.getMp3Duration(filePath).intValue();
        } else if ("m4a".equals(format)) {
            result = VideoUtil.getMp4Duration(filePath);
        } else if ("mov".equals(format)) {
            result = VideoUtil.getMp4Duration(filePath);
        } else if ("mp4".equals(format)) {
            result = VideoUtil.getMp4Duration(filePath);
        }
        return result;
    }
    /**
     * å¾—到语音或视频文件时长,单位秒
     *
     * @param filePath
     * @return
     * @throws IOException
     */
    public static long getDuration(String filePath, String format) throws IOException {
        long result = 0;
        if ("wav".equals(format)) {
            result = AudioUtil.getDuration(filePath).intValue();
        } else if ("mp3".equals(format)) {
            result = AudioUtil.getMp3Duration(filePath).intValue();
        } else if ("m4a".equals(format)) {
            result = VideoUtil.getMp4Duration(filePath);
        } else if ("mov".equals(format)) {
            result = VideoUtil.getMp4Duration(filePath);
        } else if ("mp4".equals(format)) {
            result = VideoUtil.getMp4Duration(filePath);
        }
        return result;
    }
    /**
     * å¾—到文件格式
     *
     * @param path
     * @return
     */
    public static String getVideoFormat(String path) {
        return path.toLowerCase().substring(path.toLowerCase().lastIndexOf(".") + 1);
    }
}
sandu-common/src/main/java/com/sandu/common/file/config/FileProperties.java
@@ -17,5 +17,9 @@
     * æœåŠ¡å™¨å­˜å‚¨çš„æ ¹è·¯å¾„
     */
    private String uploadRootPath;
    /**
     * æœåС噍ip和端口
     */
    private String realUrl;
}
sandu-common/src/main/java/com/sandu/common/file/impl/LocalFileUploadImpl.java
@@ -7,8 +7,7 @@
import cn.hutool.core.lang.UUID;
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.*;
import com.sandu.common.file.config.FileProperties;
import com.sandu.common.util.SpringContextHolder;
import lombok.AllArgsConstructor;
@@ -20,6 +19,9 @@
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
@@ -35,6 +37,8 @@
    private static List<String> videoSuffixList = CollectionUtil.newArrayList("mp4", "mov", "avi", "mkv", "m4v", "wmv",
            "asf", "asx", "rm", "rmvb", "3gp", "dat", "flv", "vob");
    private final FileToThumbnail fileToThumbnail;
    @Override
    public FileUploadDto uploadFile(MultipartFile multipartFile) {
        FileProperties fileProperties = SpringContextHolder.getBean(FileProperties.class);
@@ -42,7 +46,8 @@
        long size = multipartFile.getSize();
        String suffix = FileUtil.getSuffix(originalFilename);
        String date = LocalDateTimeUtil.formatNormal(LocalDate.now());
        String fileName = UUID.fastUUID().toString() + "." + suffix;
        String uuidStr = UUID.fastUUID().toString();
        String fileName = uuidStr + "." + suffix;
        File dest;
        try {
            String type = Optional.ofNullable(FileTypeUtil.getType(multipartFile.getInputStream(), originalFilename)).orElse("");
@@ -61,10 +66,13 @@
        FileUploadDto uploadDto = new FileUploadDto();
        uploadDto.setOriginName(originalFilename);
        uploadDto.setFileName(fileName);
        uploadDto.setFileUrl(dest.getPath().replace(fileProperties.getUploadRootPath(), ""));
        uploadDto.setRealUrl(dest.getPath());
        uploadDto.setFileUrl(fileProperties.getRealUrl() + dest.getPath());
        uploadDto.setFileType(FileUtil.getType(dest));
        uploadDto.setStorageType(FileStorageEnums.LOCAL.getCode());
        uploadDto.setFileSize(size);
        uploadDto.setMd5(getMD5(multipartFile) + "." + uploadDto.getFileType());
        if (IMAGE_SUFFIX_LIST.contains(uploadDto.getFileType())) {
            BufferedImage img = null;
@@ -77,39 +85,48 @@
                uploadDto.setWidth(img.getWidth());
                uploadDto.setHeight(img.getHeight());
            }
        }
        return uploadDto;
    }
    public FileUploadDto uploadCert(MultipartFile multipartFile) {
        String originalFilename = multipartFile.getOriginalFilename();
        long size = multipartFile.getSize();
        String suffix = FileUtil.getSuffix(originalFilename);
        String date = LocalDateTimeUtil.formatNormal(LocalDate.now());
        String fileName = UUID.fastUUID().toString() + "." + suffix;
        File dest;
        } else if (FileService.videoSuffixList.contains(uploadDto.getFileType())) {
        try {
            String type = Optional.ofNullable(FileTypeUtil.getType(multipartFile.getInputStream(), originalFilename)).orElse("");
//            dest = new File(fileProperties.getUploadRootPath() + type + File.separator + date + File.separator + fileName).getCanonicalFile();
//            if (!dest.getParentFile().exists()) {
//                dest.getParentFile().mkdirs();
//            }
//            multipartFile.transferTo(dest);
        } catch (Exception e) {
            e.printStackTrace();
            throw new BusinessException(e.getMessage());
                long duration = VideoUtil.getDuration(uploadDto.getRealUrl());
                uploadDto.setDuration((int) (duration * 1000));
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            try {
                InputStream inputStream = multipartFile.getInputStream();
                String screenShot = fileProperties.getUploadRootPath() + uploadDto.getFileType()
                        + File.separator + date + File.separator + "screenShot" + uuidStr + ".jpg";
                String thumbnailForVideo = fileToThumbnail.getThumbnailForVideo(inputStream, screenShot);
                uploadDto.setScreenShot(fileProperties.getRealUrl() + thumbnailForVideo);
                inputStream.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        FileUploadDto uploadDto = new FileUploadDto();
        uploadDto.setOriginName(originalFilename);
        uploadDto.setFileName(fileName);
//        uploadDto.setFileUrl(dest.getPath());
//        uploadDto.setFileType(FileUtil.getType(dest));
        uploadDto.setStorageType(FileStorageEnums.LOCAL.getCode());
        uploadDto.setFileSize(size);
        return uploadDto;
    }
    /**
     * èŽ·å–ä¸Šä¼ æ–‡ä»¶çš„MD5值
     *
     * @param file
     * @return
     */
    public String getMD5(MultipartFile file) {
        try {
            byte[] uploadBytes = file.getBytes();
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            byte[] digest = md5.digest(uploadBytes);
            String hashString = new BigInteger(1, digest).toString(16);
            if (hashString.length() % 2 != 0) {
                hashString = "0" + hashString;
            }
            return hashString;
        } catch (Exception e) {
        }
        return null;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/file/NewNovaFileController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
package com.sandu.ximon.admin.newnova.file;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.pagehelper.PageHelper;
import com.sandu.common.domain.ResponseVO;
import com.sandu.common.file.FileToThumbnail;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.util.ResponseUtil;
import com.sandu.ximon.admin.newnova.param.NewNovaFileParam;
import com.sandu.ximon.admin.security.PermissionConfig;
import com.sandu.ximon.admin.utils.StoreOperationRecordsUtils;
import com.sandu.ximon.dao.domain.NewNovaFile;
import com.sandu.ximon.dao.enums.MenuEnum;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
 * @author LiuHaoNan
 * @date 2022/11/8
 */
@RestController
@AllArgsConstructor
@RequestMapping("/v1/nova/file")
public class NewNovaFileController {
    private FileToThumbnail fileToThumbnail;
    private PermissionConfig permissionConfig;
    private final NewNovaFileService newNovaFileService;
    @PostMapping("/add")
    public ResponseVO<Object> addLEDProgram(@RequestBody @Validated NewNovaFileParam param) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_FILE_ADD.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        return ResponseUtil.success(newNovaFileService.addProgramFile(param));
    }
    @PostMapping("/delete")
    public ResponseVO<Object> deleteLEDProgram(@RequestBody List<Long> fileIds) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_FILE_DEL.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        return ResponseUtil.success(newNovaFileService.deleteFile(fileIds));
    }
    @GetMapping("/list")
    public ResponseVO<Object> listfile(BaseConditionVO baseConditionVO, @RequestParam(value = "keyword", required = false) String keyword) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_FILE_LIST.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        LambdaQueryWrapper<NewNovaFile> wrapper = newNovaFileService.listFile();
        if (keyword != null && !keyword.isEmpty()) {
            wrapper.like(NewNovaFile::getName, keyword);
        }
        PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize());
        return ResponseUtil.successPage(newNovaFileService.list(wrapper));
    }
    @PostMapping("/uploading")
    public ResponseVO<Object> uploadingFile(@RequestParam("file") MultipartFile file) {
        if (!permissionConfig.check(MenuEnum.LED_NEW_FILE_UPLOAD.getCode())) {
            return ResponseUtil.fail("缺少对应用户权限");
        }
        NewNovaFile fileUploadDto = newNovaFileService.uploadFile(file);
        /**
         * æ–‡ä»¶ä¸Šä¼  æ—¥å¿—记录开始
         */
        String content = "文件内容:" + JSON.toJSONString(fileUploadDto);
        StoreOperationRecordsUtils.storeOperationData(null, null, "文件上传", content);
        /**
         * æ–‡ä»¶ä¸Šä¼  æ—¥å¿—记录结束
         */
        return ResponseUtil.success(fileUploadDto);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/file/NewNovaFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,122 @@
package com.sandu.ximon.admin.newnova.file;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.file.FileService;
import com.sandu.common.file.FileUploadDto;
import com.sandu.common.file.impl.LocalFileUploadImpl;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.admin.newnova.param.NewNovaFileParam;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.admin.utils.StoreOperationRecordsUtils;
import com.sandu.ximon.dao.domain.NewNovaFile;
import com.sandu.ximon.dao.mapper.NewNovaFileMapper;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
 * @author LiuHaoNan
 * @date 2022/11/8
 */
@Service
@AllArgsConstructor
public class NewNovaFileService extends BaseServiceImpl<NewNovaFileMapper, NewNovaFile> {
    //    private final LocalFileServiceImpl localFileService;
    private final LocalFileUploadImpl localFileUpload;
    /**
     * æ–‡ä»¶æ·»åŠ 
     *
     * @param param
     * @return
     */
    public boolean addProgramFile(NewNovaFileParam param) {
        NewNovaFile file = new NewNovaFile();
        BeanUtils.copyProperties(param, file);
        file.setUserId(SecurityUtils.getUserId());
        file.setUserName(SecurityUtils.getUsername());
        /**
         * è¯ºç“¦æ–‡ä»¶æ–°å¢ž æ—¥å¿—记录开始
         */
        String content = "文件内容:" + JSON.toJSONString(file);
        StoreOperationRecordsUtils.storeOperationData(null, null, "诺瓦文件新增", content);
        /**
         * è¯ºç“¦æ–‡ä»¶æ–°å¢ž æ—¥å¿—记录结束
         */
        return save(file);
    }
    /**
     * æ–‡ä»¶åˆ é™¤
     *
     * @param fileIds
     * @return
     */
    public boolean deleteFile(List<Long> fileIds) {
        List<NewNovaFile> NewNovaFiles = listByIds(fileIds);
        if (NewNovaFiles.isEmpty()) {
            throw new BusinessException("未找到该节目");
        }
        /**
         * è¯ºç“¦æ–‡ä»¶åˆ é™¤ æ—¥å¿—记录开始
         */
        String content = "文件id:" + fileIds + "文件内容:" + JSON.toJSONString(NewNovaFiles);
        StoreOperationRecordsUtils.storeOperationData(null, null, "诺瓦文件删除", content);
        /**
         * è¯ºç“¦æ–‡ä»¶åˆ é™¤ æ—¥å¿—记录结束
         */
        return removeByIds(fileIds);
    }
    /**
     * æ–‡ä»¶åˆ—表
     *
     * @return
     */
    public LambdaQueryWrapper<NewNovaFile> listFile() {
        LambdaQueryWrapper<NewNovaFile> NewNovaFileLambdaQueryWrapper = Wrappers.lambdaQuery(NewNovaFile.class);
        if (SecurityUtils.getClientId() != null) {
            return NewNovaFileLambdaQueryWrapper.eq(NewNovaFile::getUserId, SecurityUtils.getUserId());
        } else {
            return NewNovaFileLambdaQueryWrapper;
        }
    }
    /**
     * æ–‡ä»¶ä¸Šä¼ 
     *
     * @param multipartFile
     * @return
     */
    public NewNovaFile uploadFile(MultipartFile multipartFile) {
//        FileStorage fileStorage = localFileService.uploadFile(multipartFile);
        FileUploadDto fileUploadDto = localFileUpload.uploadFile(multipartFile);
        NewNovaFile novaFile = new NewNovaFile();
        novaFile.setName(fileUploadDto.getOriginName());
        novaFile.setFileType(fileUploadDto.getFileType());
        novaFile.setRealUrl(fileUploadDto.getRealUrl());
        novaFile.setFileUrl(fileUploadDto.getFileUrl());
        novaFile.setMd5(fileUploadDto.getMd5());
        novaFile.setSize(fileUploadDto.getFileSize().toString());
        if (FileService.videoSuffixList.contains(novaFile.getFileType())) {
            novaFile.setDuration(fileUploadDto.getDuration());
            novaFile.setScreenShot(fileUploadDto.getScreenShot());
        }
        return novaFile;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/libs/jna-5.6.0.jar
Binary files differ
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/libs/jna-platform-5.6.0.jar
Binary files differ
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/param/NewNovaFileParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.sandu.ximon.admin.newnova.param;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import java.util.Date;
/**
 * @author LiuHaoNan
 * @date 2022/11/8
 */
@Data
public class NewNovaFileParam {
    /**
     * æ–‡ä»¶åç§°
     */
    @NotBlank(message = "文件名不能为空")
    private String name;
    /**
     * å¤§å°
     */
    private String size;
    /**
     * æ–‡ä»¶ç±»åž‹
     */
    private String fileType;
    /**
     * é“¾æŽ¥
     */
    private String fileUrl;
    /**
     * ç»å¯¹è·¯å¾„
     */
    private String realUrl;
    /**
     * ç¼©ç•¥å›¾
     */
    private String screenShot;
    /**
     * md5
     */
    private String md5;
    /**
     * ä¸Šä¼ æ—¶é—´
     */
    private Date createTime;
    /**
     * è§†é¢‘æ—¶é•¿
     */
    private Integer duration;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/utils/APITest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,166 @@
package com.sandu.ximon.admin.newnova.utils;
import com.sun.jna.Native;
/*
* ä½¿ç”¨å‰é˜…读:
* 1 å…³äºŽå¯èƒ½å‘生的搜索不到T卡的原因:
*   1.1. æ‰“开了express,导致udp端口被占用,请关闭express软件后重试
*   1.2. SDK和T卡不在同一个局域网,可以尝试指定ip搜索,使用方法见:https://docapi.vnnox.com/web/#/7?page_id=609
* 2 å…³äºŽä½¿ç”¨sdk动态库可能出现的问题及解决方法:
*
*     2.1. åœ¨linux下如果出现lib***.so  file too short ,这种错误,有可能是软连接失效,可以尝试删除原有文件,尝试 ln -s é‡æ–°ç”Ÿæˆè½¯è¿žæŽ¥ã€‚比如: ./libcurl.so: file too short,首先 rm libcurl.so,然后ln -s  libcurl.so.4.3.0 libcurl.so即可。
*     2.2. é’ˆå¯¹java项目,使用JNA加载so库时,请使用绝对路径。比如:
*     //winodws
*     ViplexCore instance = (ViplexCore) Native.loadLibrary("D:\\ViplexCore3.3.0.01_x64\\bin\\viplexcore.dll",ViplexCore.class);
*     //或者 linux
*     ViplexCore instance = (ViplexCore) Native.loadLibrary("home/user/desktop/ViplexCore_3.3.0.01_CentOS/bin/libviplexcore.so",ViplexCore.class);
*
*     2.3. é’ˆå¯¹java项目,如果要使用相对路径,请将sdk动态库路径添加到classpath环境变量,有下面几种方法(也可以搜索相关教程添加),例如:
*       2.3.1. å‘½ä»¤è¡Œä½¿ç”¨ï¼š         javac -cp "C:\Users\HiWin10\Downloads\ViplexCore3.3.0.01_x64\bin"   (详见SDK demo/java/下runDemo.sh或者runDemo.bat文件)
*       2.3.2. å¯¼å…¥çŽ¯å¢ƒå˜é‡ï¼Œå¦‚ï¼š   export CLASSPATH=$CLASSPATH:home/user/ViplexCore3.3.0.01_x64/
*       2.3.3. é’ˆå¯¹springboot项目: java -Xbootclasspath/a:/home/nova/novasdk/
* */
public class APITest {
    static Boolean g_bAPIReturn = false;
    static int g_code = 0;
    static String g_sn = "BZSA79353N1310006847"; //BZSA07313J0350000997
    static void waitAPIReturn() throws InterruptedException
    {
        while (!g_bAPIReturn)
        {
            Thread.sleep(1000);
        }
        g_bAPIReturn = false;
    }
    static void testApi() throws InterruptedException
        {
            System.setProperty("jna.encoding", "UTF-8");
            ViplexCore instance = (ViplexCore) Native.loadLibrary("viplexcore",ViplexCore.class);
            //当需要集成到项目中时,请修改上面加载库的位置为你下载的sdk库的绝对路径,windows下如:
            //ViplexCore instance = (ViplexCore) Native.loadLibrary("D:\\ViplexCore3.3.0.01_x64\\bin\\viplexcore.dll",ViplexCore.class);
            //当需要集成到项目中时,请修改此处加载库的位置为你下载的sdk库的绝对路径,linux下如:
            //ViplexCore instance = (ViplexCore) Native.loadLibrary("home/user/desktop/ViplexCore_3.3.0.01_CentOS/bin/libviplexcore.so",ViplexCore.class);
            ViplexCore.CallBack callBack = new ViplexCore.CallBack() {
                @Override
                public void dataCallBack(int code, String data) {
                    // TODO Auto-generated method stub
                    g_code = code;
                    String strCode = "\nViplexCore Demo code:" + code;
                    String strData = "\nViplexCore Demo data:" + data;
                    System.out.println(strCode);
                    System.out.println(strData);
                    g_bAPIReturn=true;
                }
            };
            String rootDir = System.getProperty("user.dir") + "/temp";
            rootDir = rootDir.replaceAll( "\\\\","/");
            String createProgram = "{\"name\":\"Demo\",\"width\":500,\"height\":500,\"tplID\":1,\"winInfo\":{\"height\":100,\"width\":100,\"left\":0,\"top\":0,\"zindex\":0,\"index\":0}}";
            String editProgram = "{\"programID\":1,\"pageID\":1,\"pageInfo\":{\"name\":\"节目\",\"widgetContainers\":[{\"audioGroup\":\"\",\"backgroundColor\":\"#00000000\",\"backgroundDrawable\":\"\",\"contents\":{\"widgetGroups\":[],\"widgets\":[{\"id\":1,\"enable\":true,\"repeatCount\":1,\"layout\":{\"y\":\"0\",\"height\":\"100%\",\"x\":\"0\",\"width\":\"100%\"},\"backgroundColor\":\"#00000000\",\"backgroundDrawable\":\"\",\"backgroundMusic\":\"\",\"zOrder\":0,\"displayRatio\":\"FULL\",\"outAnimation\":{\"type\":0,\"duration\":0},\"dataSource\":\"62ea7e60c493c1f860ae256eef8ec89c.png\",\"type\":\"PICTURE\",\"constraints\":[{\"cron\":[],\"endTime\":\"4017-12-30T23:59:59Z+8:00\",\"startTime\":\"1970-01-01T00:00:00Z+8:00\"}],\"border\":{\"borderThickness\":\"2px,3px,5%,6\",\"style\":0,\"backgroundColor\":\"#ff000000\",\"name\":\"border\",\"cornerRadius\":\"2%\",\"effects\":{\"headTailSpacing\":\"\",\"isHeadTail\":false,\"speedByPixelEnable\":true,\"speed\":0,\"animation\":\"CLOCK_WISE\"}},\"inAnimation\":{\"type\":0,\"duration\":1000},\"duration\":3605000,\"name\":\"test.png\",\"originalDataSource\":\"./test.png\",\"functionStorage\":\"\",\"isSupportSpecialEffects\":false}]},\"enable\":true,\"id\":1,\"itemsSource\":\"\",\"layout\":{\"height\":\"1.0\",\"width\":\"1.0\",\"x\":\"0.0\",\"y\":\"0.0\"},\"name\":\"widgetContainers1\",\"pickCount\":0,\"pickPolicy\":\"ORDER\",\"zOrder\":0}]}}";
            String genrateProgram = String.format(
                "{\"programID\":1,\"outPutPath\":\"%s/\",\"mediasPath\":[{\"oldPath\":\"test\",\"newPath\":\"test\"}]}",
                rootDir);
            String trasfromProgram = String.format(
                "{\"sn\": \"%s\",\"iconPath\": \"\",\"iconName\": \"\",\"sendProgramFilePaths\": {\"programPath\": \"%s/program1\",\"mediasPath\": {\"./test.png\": \"test.png\"}},\"programName\": \"program1\",\"deviceIdentifier\": \"Demo\",\"startPlayAfterTransferred\": true,\"insertPlay\": true}",
                g_sn,
                rootDir);
        Boolean bTestVideo = false;
        if (bTestVideo)
        {
            editProgram = "{\"programID\":1,\"pageID\":1,\"pageInfo\":{\"name\":\"Demo\",\"widgetContainers\":[{\"contents\":{\"widgets\":[{\"constraints\":[{\"cron\":[\"0 0 0 ? * 1,2,3,4,5,6,7\"],\"endTime\":\"4017-12-30T23:59:59Z 8:00\",\"startTime\":\"1970-01-01T00:00:00Z 8:00\"}],\"duration\":5000,\"dataSource\":\"219c7dd3260d6bf98ebf61b6da440ffd.avi\",\"type\":\"VIDEO\",\"name\":\"test.vai\",\"originalDataSource\":\"./test.avi\"}]},\"id\":1,\"name\":\"widgetContainers1\"}]}}";
            trasfromProgram = String.format(
            "{\"sn\":\"%s\",\"iconPath\": \"\",\"iconName\": \"\",\"sendProgramFilePaths\": {\"programPath\": \"%s/program1\",\"mediasPath\": {\"./test.avi\": \"test.avi\"}},\"programName\": \"program1\",\"deviceIdentifier\": \"Demo\",\"startPlayAfterTransferred\": true,\"insertPlay\": true}",
            g_sn,
            rootDir);
        }
            Boolean testText = false;
            if (testText) {
                editProgram = "{\"programID\":1,\"pageID\":1,\"pageInfo\":{\"name\":\"jiemu\",\"widgetContainers\":[{\"contents\":{\"widgets\":[{\"constraints\":[{\"cron\":[\"0 0 0 ? * 1,2,3,4,5,6,7\"],\"endTime\":\"4017-12-30T23:59:59Z+8:00\",\"startTime\":\"1970-01-01T00:00:00Z+8:00\"}],\"duration\":5000,\"metadata\":{\"content\":{\"autoPaging\":true,\"backgroundMusic\":{\"duration\":0,\"isTextSync\":false},\"displayStyle\":{\"scrollAttributes\":{\"effects\":{\"animation\":\"MARQUEE_LEFT\",\"speed\":3}},\"type\":\"SCROLL\"},\"paragraphs\":[{\"backgroundColor\":\"#00000000\",\"horizontalAlignment\":\"CENTER\",\"letterSpacing\":0,\"lineSpacing\":0,\"lines\":[{\"segs\":[{\"content\":\"简体繁體日本語한국어.English123\"}]}],\"verticalAlignment\":\"CENTER\"}],\"textAttributes\":[{\"backgroundColor\":\"#ff000000\",\"attributes\":{\"font\":{\"family\":[\"Arial\"],\"isUnderline\":false,\"size\":20,\"style\":\"NORMAL\"},\"letterSpacing\":0,\"textColor\":\"#ffff0000\"}}]}},\"name\":\"text\",\"type\":\"ARCH_TEXT\"}]},\"id\":1,\"name\":\"widgetContainers1\"}]}}";
                trasfromProgram = String.format(
                    "{\"sn\": \"%s\",\"iconPath\": \"\",\"iconName\": \"\",\"sendProgramFilePaths\": {\"programPath\": \"%s/program1\",\"mediasPath\": {}},\"programName\": \"program1\",\"deviceIdentifier\": \"Demo\",\"startPlayAfterTransferred\": true,\"insertPlay\": true}",
                    g_sn,
                    rootDir);
            }
            String companyInfo = "{\"company\":\"NovaStar\",\"phone\":\"029-68216000\",\"email\":\"hr@novastar.tech\"}";
            instance.nvSetDevLang("Java");
            System.out.println("nvInit(sdk åˆå§‹åŒ–):");
            System.out.println(instance.nvInit(rootDir,companyInfo));
            System.out.println("ViplexCore Demo nvSearchTerminalAsync(搜索) begin... ");
            instance.nvSearchTerminalAsync(callBack);
            Thread.sleep(3000);
            g_bAPIReturn = false;
            // System.out.println("ViplexCore Demo nvSearchAppointIpAsync(指定IP搜索) begin... ");
            // String requestData = "{\"ip\":\"172.18.179.106\"}";
            // instance.nvSearchAppointIpAsync(requestData, callBack);
            // Thread.sleep(2000);
            System.out.println("ViplexCore Demo nvLoginAsync(登录) begin... ");
            String loginParam = String.format("{\"sn\":\"%s\",\"username\":\"admin\",\"rememberPwd\":1,\"password\":\"1234567890\",\"loginType\":0}"
            , g_sn);
            instance.nvLoginAsync(loginParam, callBack);
            waitAPIReturn();
            if (g_code != 0) {
                System.out.println("ViplexCore Demo nvLoginAsync(登录) å¤±è´¥ï¼");
                return;
            }
            System.out.println("ViplexCore Demo nvCreateProgramAsync(创建节目) begin... ");
            instance.nvCreateProgramAsync(createProgram, callBack);
            waitAPIReturn();
            String requestDatapath = "{\"filePath\":\"./test.png\"}";
            System.out.println("ViplexCore Demo nvGetFileMD5Async(获取MD5) begin... ");
            instance.nvGetFileMD5Async(requestDatapath, callBack);
            waitAPIReturn();
            System.out.println("ViplexCore Demo nvSetPageProgramAsync(编辑节目) begin... ");
            instance.nvSetPageProgramAsync(editProgram, callBack);
            waitAPIReturn();
            System.out.println("ViplexCore Demo nvMakeProgramAsync(生成节目) begin... ");
            instance.nvMakeProgramAsync(genrateProgram, callBack);
            waitAPIReturn();
            System.out.println("ViplexCore Demo nvStartTransferProgramAsync(发送节目) begin... ");
            instance.nvStartTransferProgramAsync(trasfromProgram, callBack);
            Thread.sleep(10000);
            g_bAPIReturn = false;
            System.out.println("ViplexCore Demo nvGetProgramInfoAsync(获取节目信息) begin... ");
            String requestDatasn = String.format("{\"sn\":\"%s\"}", g_sn);
            instance.nvGetProgramInfoAsync(requestDatasn, callBack);
            waitAPIReturn();
            System.out.println("ViplexCore Demo nvSetVolumeAsync(设置音量) begin... ");
            String setVolumeParam = String.format("{\"sn\":\"%s\",\"volumeInfo\":{\"ratio\":60.0}}", g_sn);
            instance.nvSetVolumeAsync(setVolumeParam, callBack);
            waitAPIReturn();
            System.out.println("ViplexCore Demo nvGetVolumeAsync(获取音量) begin... ");
            String getVolumeParam = String.format("{\"sn\":\"%s\"}", g_sn);
            instance.nvGetVolumeAsync(getVolumeParam, callBack);
            waitAPIReturn();
        }
    public static void main(String[] args) throws InterruptedException{
        testApi();
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/utils/Test.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,188 @@
package com.sandu.ximon.admin.newnova.utils;
import com.sun.jna.Native;
/*
* ä½¿ç”¨å‰é˜…读:
* 1 å…³äºŽå¯èƒ½å‘生的搜索不到T卡的原因:
*   1.1. æ‰“开了express,导致udp端口被占用,请关闭express软件后重试
*   1.2. SDK和T卡不在同一个局域网,可以尝试指定ip搜索,使用方法见:https://docapi.vnnox.com/web/#/7?page_id=609
* 2 å…³äºŽä½¿ç”¨sdk动态库可能出现的问题及解决方法:
*
*     2.1. åœ¨linux下如果出现lib***.so  file too short ,这种错误,有可能是软连接失效,可以尝试删除原有文件,尝试 ln -s é‡æ–°ç”Ÿæˆè½¯è¿žæŽ¥ã€‚比如: ./libcurl.so: file too short,首先 rm libcurl.so,然后ln -s  libcurl.so.4.3.0 libcurl.so即可。
*     2.2. é’ˆå¯¹java项目,使用JNA加载so库时,请使用绝对路径。比如:
*     //winodws
*     ViplexCore instance = (ViplexCore) Native.loadLibrary("D:\\ViplexCore3.3.0.01_x64\\bin\\viplexcore.dll",ViplexCore.class);
*     //或者 linux
*     ViplexCore instance = (ViplexCore) Native.loadLibrary("home/user/desktop/ViplexCore_3.3.0.01_CentOS/bin/libviplexcore.so",ViplexCore.class);
*
*     2.3. é’ˆå¯¹java项目,如果要使用相对路径,请将sdk动态库路径添加到classpath环境变量,有下面几种方法(也可以搜索相关教程添加),例如:
*       2.3.1. å‘½ä»¤è¡Œä½¿ç”¨ï¼š         javac -cp "C:\Users\HiWin10\Downloads\ViplexCore3.3.0.01_x64\bin"   (详见SDK demo/java/下runDemo.sh或者runDemo.bat文件)
*       2.3.2. å¯¼å…¥çŽ¯å¢ƒå˜é‡ï¼Œå¦‚ï¼š   export CLASSPATH=$CLASSPATH:home/user/ViplexCore3.3.0.01_x64/
*       2.3.3. é’ˆå¯¹springboot项目: java -Xbootclasspath/a:/home/nova/novasdk/
* */
public class Test {
    static Boolean g_bAPIReturn = false;
    static Boolean g_snConnectFlag = false;
    static int g_code = 0;
    static String g_sn = "BZSA07194A0049999597"; //BZSA07313J0350000997
    static void waitAPIReturn() throws InterruptedException
    {
        while (!g_bAPIReturn)
        {
            Thread.sleep(1000);
        }
        g_bAPIReturn = false;
    }
    static void testApi() throws InterruptedException
        {
            System.setProperty("jna.encoding", "UTF-8");
            ViplexCore instance = (ViplexCore) Native.loadLibrary("viplexcore",ViplexCore.class);
            //当需要集成到项目中时,请修改上面加载库的位置为你下载的sdk库的绝对路径,windows下如:
            //ViplexCore instance = (ViplexCore) Native.loadLibrary("D:\\ViplexCore3.3.0.01_x64\\bin\\viplexcore.dll",ViplexCore.class);
            //当需要集成到项目中时,请修改此处加载库的位置为你下载的sdk库的绝对路径,linux下如:
            //ViplexCore instance = (ViplexCore) Native.loadLibrary("home/user/desktop/ViplexCore_3.3.0.01_CentOS/bin/libviplexcore.so",ViplexCore.class);
            ViplexCore.CallBack callBack = new ViplexCore.CallBack() {
                @Override
                public void dataCallBack(int code, String data) {
                    // TODO Auto-generated method stub
                    g_code = code;
                    String strCode = "\nViplexCore Demo code:" + code;
                    String strData = "\nViplexCore Demo data:" + data;
                    System.out.println(strCode);
                    System.out.println(strData);
                    g_bAPIReturn=true;
                }
            };
            ViplexCore.CallBack callBack2 = new ViplexCore.CallBack() {
                @Override
                public void dataCallBack(int code, String data) {
                    // TODO Auto-generated method stub
                    g_code = code;
                    String strCode = "\nViplexCore Demo code:" + code;
                    String strData = "\nViplexCore Demo data:" + data;
                    System.out.println(strCode);
                    System.out.println(strData);
                    if(data.contains(g_sn))
                    {
                        g_snConnectFlag=true;
                    }
                }
            };
            String rootDir = System.getProperty("user.dir") + "/temp";
            rootDir = rootDir.replaceAll( "\\\\","/");
            String createProgram = "{\"name\":\"Demo\",\"width\":500,\"height\":500,\"tplID\":1,\"winInfo\":{\"height\":100,\"width\":100,\"left\":0,\"top\":0,\"zindex\":0,\"index\":0}}";
            String editProgram = "{\"programID\":1,\"pageID\":1,\"pageInfo\":{\"name\":\"节目\",\"widgetContainers\":[{\"audioGroup\":\"\",\"backgroundColor\":\"#00000000\",\"backgroundDrawable\":\"\",\"contents\":{\"widgetGroups\":[],\"widgets\":[{\"id\":1,\"enable\":true,\"repeatCount\":1,\"layout\":{\"y\":\"0\",\"height\":\"100%\",\"x\":\"0\",\"width\":\"100%\"},\"backgroundColor\":\"#00000000\",\"backgroundDrawable\":\"\",\"backgroundMusic\":\"\",\"zOrder\":0,\"displayRatio\":\"FULL\",\"outAnimation\":{\"type\":0,\"duration\":0},\"dataSource\":\"62ea7e60c493c1f860ae256eef8ec89c.png\",\"type\":\"PICTURE\",\"constraints\":[{\"cron\":[],\"endTime\":\"4017-12-30T23:59:59Z+8:00\",\"startTime\":\"1970-01-01T00:00:00Z+8:00\"}],\"border\":{\"borderThickness\":\"2px,3px,5%,6\",\"style\":0,\"backgroundColor\":\"#ff000000\",\"name\":\"border\",\"cornerRadius\":\"2%\",\"effects\":{\"headTailSpacing\":\"\",\"isHeadTail\":false,\"speedByPixelEnable\":true,\"speed\":0,\"animation\":\"CLOCK_WISE\"}},\"inAnimation\":{\"type\":0,\"duration\":1000},\"duration\":3605000,\"name\":\"test.png\",\"originalDataSource\":\"./test.png\",\"functionStorage\":\"\",\"isSupportSpecialEffects\":false}]},\"enable\":true,\"id\":1,\"itemsSource\":\"\",\"layout\":{\"height\":\"1.0\",\"width\":\"1.0\",\"x\":\"0.0\",\"y\":\"0.0\"},\"name\":\"widgetContainers1\",\"pickCount\":0,\"pickPolicy\":\"ORDER\",\"zOrder\":0}]}}";
            String genrateProgram = String.format(
                "{\"programID\":1,\"outPutPath\":\"%s/\",\"mediasPath\":[{\"oldPath\":\"test\",\"newPath\":\"test\"}]}",
                rootDir);
            String trasfromProgram = String.format(
                "{\"sn\": \"%s\",\"iconPath\": \"\",\"iconName\": \"\",\"sendProgramFilePaths\": {\"programPath\": \"%s/program1\",\"mediasPath\": {\"./test.png\": \"test.png\"}},\"programName\": \"program1\",\"deviceIdentifier\": \"Demo\",\"startPlayAfterTransferred\": true,\"insertPlay\": true}",
                g_sn,
                rootDir);
        Boolean bTestVideo = false;
        if (bTestVideo)
        {
            editProgram = "{\"programID\":1,\"pageID\":1,\"pageInfo\":{\"name\":\"Demo\",\"widgetContainers\":[{\"contents\":{\"widgets\":[{\"constraints\":[{\"cron\":[\"0 0 0 ? * 1,2,3,4,5,6,7\"],\"endTime\":\"4017-12-30T23:59:59Z 8:00\",\"startTime\":\"1970-01-01T00:00:00Z 8:00\"}],\"duration\":5000,\"dataSource\":\"219c7dd3260d6bf98ebf61b6da440ffd.avi\",\"type\":\"VIDEO\",\"name\":\"test.vai\",\"originalDataSource\":\"./test.avi\"}]},\"id\":1,\"name\":\"widgetContainers1\"}]}}";
            trasfromProgram = String.format(
            "{\"sn\":\"%s\",\"iconPath\": \"\",\"iconName\": \"\",\"sendProgramFilePaths\": {\"programPath\": \"%s/program1\",\"mediasPath\": {\"./test.avi\": \"test.avi\"}},\"programName\": \"program1\",\"deviceIdentifier\": \"Demo\",\"startPlayAfterTransferred\": true,\"insertPlay\": true}",
            g_sn,
            rootDir);
        }
            Boolean testText = false;
            if (testText) {
                editProgram = "{\"programID\":1,\"pageID\":1,\"pageInfo\":{\"name\":\"jiemu\",\"widgetContainers\":[{\"contents\":{\"widgets\":[{\"constraints\":[{\"cron\":[\"0 0 0 ? * 1,2,3,4,5,6,7\"],\"endTime\":\"4017-12-30T23:59:59Z+8:00\",\"startTime\":\"1970-01-01T00:00:00Z+8:00\"}],\"duration\":5000,\"metadata\":{\"content\":{\"autoPaging\":true,\"backgroundMusic\":{\"duration\":0,\"isTextSync\":false},\"displayStyle\":{\"scrollAttributes\":{\"effects\":{\"animation\":\"MARQUEE_LEFT\",\"speed\":3}},\"type\":\"SCROLL\"},\"paragraphs\":[{\"backgroundColor\":\"#00000000\",\"horizontalAlignment\":\"CENTER\",\"letterSpacing\":0,\"lineSpacing\":0,\"lines\":[{\"segs\":[{\"content\":\"简体繁體日本語한국어.English123\"}]}],\"verticalAlignment\":\"CENTER\"}],\"textAttributes\":[{\"backgroundColor\":\"#ff000000\",\"attributes\":{\"font\":{\"family\":[\"Arial\"],\"isUnderline\":false,\"size\":20,\"style\":\"NORMAL\"},\"letterSpacing\":0,\"textColor\":\"#ffff0000\"}}]}},\"name\":\"text\",\"type\":\"ARCH_TEXT\"}]},\"id\":1,\"name\":\"widgetContainers1\"}]}}";
                trasfromProgram = String.format(
                    "{\"sn\": \"%s\",\"iconPath\": \"\",\"iconName\": \"\",\"sendProgramFilePaths\": {\"programPath\": \"%s/program1\",\"mediasPath\": {}},\"programName\": \"program1\",\"deviceIdentifier\": \"Demo\",\"startPlayAfterTransferred\": true,\"insertPlay\": true}",
                    g_sn,
                    rootDir);
            }
            String companyInfo = "{\"company\":\"NovaStar\",\"phone\":\"029-68216000\",\"email\":\"hr@novastar.tech\"}";
            instance.nvSetDevLang("Java");
            System.out.println("nvInit(sdk åˆå§‹åŒ–):");
            System.out.println(instance.nvInit(rootDir,companyInfo));
            g_bAPIReturn = false;
            String publicNetInfo = "{\"publicModule\":true,\"encrypt\":true,\"certificatePath\":\"E:/cert\",\"port\":12345,\"httpserverUrl\":\"http://10.10.10.114:18081/file/\",\"httpserverLocalPath\":\"F:/file\"}";
            System.out.println("ViplexCore Demo nvInitPublicNetAsync(公网初始化) begin... ");
            instance.nvInitPublicNetAsync(publicNetInfo,callBack,callBack);
            waitAPIReturn();
            while (!g_snConnectFlag)
            {
                instance.nvGetOnlineDevicesAsync(callBack2);
                Thread.sleep(2000);
            }
            System.out.println("ViplexCore Demo nvLoginAsync(登录) begin... ");
            String loginParam = String.format("{\"sn\":\"%s\",\"username\":\"admin\",\"rememberPwd\":1,\"password\":\"123456\",\"loginType\":5}"
            , g_sn);
            instance.nvLoginAsync(loginParam, callBack);
            waitAPIReturn();
            if (g_code != 0) {
                System.out.println("ViplexCore Demo nvLoginAsync(登录) å¤±è´¥ï¼");
                return;
            }
            System.out.println("ViplexCore Demo nvCreateProgramAsync(创建节目) begin... ");
            instance.nvCreateProgramAsync(createProgram, callBack);
            waitAPIReturn();
            String requestDatapath = "{\"filePath\":\"./test.png\"}";
            System.out.println("ViplexCore Demo nvGetFileMD5Async(获取MD5) begin... ");
            instance.nvGetFileMD5Async(requestDatapath, callBack);
            waitAPIReturn();
            System.out.println("ViplexCore Demo nvSetPageProgramAsync(编辑节目) begin... ");
            instance.nvSetPageProgramAsync(editProgram, callBack);
            waitAPIReturn();
            System.out.println("ViplexCore Demo nvMakeProgramAsync(生成节目) begin... ");
            instance.nvMakeProgramAsync(genrateProgram, callBack);
            waitAPIReturn();
            System.out.println("ViplexCore Demo nvStartTransferProgramAsync(发送节目) begin... ");
            instance.nvStartTransferProgramAsync(trasfromProgram, callBack);
            Thread.sleep(10000);
            g_bAPIReturn = false;
            System.out.println("ViplexCore Demo nvGetProgramInfoAsync(获取节目信息) begin... ");
            String requestDatasn = String.format("{\"sn\":\"%s\"}", g_sn);
            instance.nvGetProgramInfoAsync(requestDatasn, callBack);
            waitAPIReturn();
            System.out.println("ViplexCore Demo nvSetVolumeAsync(设置音量) begin... ");
            String setVolumeParam = String.format("{\"sn\":\"%s\",\"volumeInfo\":{\"ratio\":60.0}}", g_sn);
            instance.nvSetVolumeAsync(setVolumeParam, callBack);
            waitAPIReturn();
            System.out.println("ViplexCore Demo nvGetVolumeAsync(获取音量) begin... ");
            String getVolumeParam = String.format("{\"sn\":\"%s\"}", g_sn);
            instance.nvGetVolumeAsync(getVolumeParam, callBack);
            waitAPIReturn();
        }
    public static void main(String[] args) throws InterruptedException{
        testApi();
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/newnova/utils/ViplexCore.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,251 @@
package com.sandu.ximon.admin.newnova.utils;
import com.sun.jna.Callback;
import com.sun.jna.Library;
public interface ViplexCore extends Library {
    public interface CallBack extends Callback {
        void  dataCallBack(int code, String data);
    }
    void nvSetDevLang(String devLang);
    int nvInit(String sdkRootDir, String data);
    void nvSearchTerminalAsync(CallBack callBack);
    void nvSetPlatform(String platform);
    void nvPingAsync(CallBack callBack);
    void nvStopPublicNetAsync(CallBack callBack);
    void nvFindAllTerminalsAsync(CallBack callBack);
    void nvInitPublicNetAsync(String data, CallBack connectCallback, CallBack disconnectCallback);
    void nvGetOnlineDevicesAsync(CallBack callback);
    void nvRsaDecodeAsync(String data, CallBack callBack);
    void nvRsaEncodeAsync(String data, CallBack callBack);
    void nvNewSetBindPlayerAsync(String data, CallBack callBack);
    void nvSetScreenShotAsync(String data, CallBack callBack);
    void nvGetWifiCurrentStatusAsync(String data, CallBack callBack);
    void nvStartUploadApkAsync(String data, CallBack callBack);
    void nvRebootAsync(String data, CallBack callBack);
    void nvGetManualBrightnessFor0x99Async(String data, CallBack callBack);
    void nvGetEnvironmentBrightnessParameterAsync(String data, CallBack callBack);
    void nvSetEnvironmentBrightnessParameterAsync(String data, CallBack callBack);
    void nvRegisterVnnox(String data, CallBack callBack);
    void nvGetVerifyCode(String data, CallBack callBack);
    void nvLoginVnnox(String data, CallBack callBack);
    void nvGetScreenDeviceInfoAsync(String data, CallBack callBack);
    void nvCancelFunctionAsync(String data, CallBack callBack);
    void nvDownloadTerminalPlayLogAsync(String data, CallBack callBack);
    void nvDownloadTerminalPlayLogNetAsync(String data, CallBack callBack);
    void nvDownloadTerminalLogNetAsync(String data, CallBack callBack);
    void nvDownloadTerminalAllLogAsync(String data, CallBack callBack);
    void nvCheckNetworkAsync(String data, CallBack callBack);
    void nvUploadTerminalLogAsync(String data, CallBack callBack);
    void nvDownloadTerminalLogAsync(String data, CallBack callBack);
    void nvGetTimeZoneAsync(String data, CallBack callBack);
    void nvGetTokenAsync(String data, CallBack callBack);
    void nvIsExistPlayerNameAsync(String data, CallBack callBack);
    void nvGetPlayerIdentiferAsync(String data, CallBack callBack);
    void nvIsCommonCloudAsync(String data, CallBack callBack);
    void nvFinishDataAsync(String data, CallBack callBack);
    void nvStartGetAvailableMemoryDataAsync(String data, CallBack callBack);
    void nvUploadFeedBackFileStateAsync(String data, CallBack callBack);
    void nvUploadFeedbackInfoAsync(String data, CallBack callBack);
    void nvAddNodeServerInfoListAsync(String data, CallBack callBack);
    void nvChangeNodeServerListAsync(String data, CallBack callBack);
    void nvDeleteNodeServerListAsync(String data, CallBack callBack);
    void nvAddNodeServerListAsync(String data, CallBack callBack);
    void nvGetNodeServerListAsync(String data, CallBack callBack);
    void nvSetAudioMedioProgramAsync(String data, CallBack callBack);
    void nvGetFileMD5Async(String data, CallBack callBack);
    void nvGetCustomerTplAsync(String data, CallBack callBack);
    void nvStopProgramTransferAsync(String data, CallBack callBack);
    void nvStartTransferProgramAsync(String data, CallBack callBack);
    void nvDeleteProgramAsync(String data, CallBack callBack);
    void nvGetProgramAsync(String data, CallBack callBack);
    void nvDeleteTplAsync(String data, CallBack callBack);
    void nvEditTplAsync(String data, CallBack callBack);
    void nvAddTplAsync(String data, CallBack callBack);
    void nvSetSystemTplInfoAsync(String data, CallBack callBack);
    void nvMakeProgramAsync(String data, CallBack callBack);
    void nvSetPageProgramsAsync(String data, CallBack callBack);
    void nvSetPageProgramAsync(String data, CallBack callBack);
    void nvCreateProgramAsync(String data, CallBack callBack);
    void nvQueryFileByTypeAsync(String data, CallBack callBack);
    void nvDownLoadFilesAsync(String data, CallBack callBack);
    void nvDataBaseMigrationAsync(String data, CallBack callBack);
    void nvGetScreenUnitTempAsync(String data, CallBack callBack);
    void nvSetTimeAndZoneAsync(String data, CallBack callBack);
    void nvGetDisplayInfoAsync(String data, CallBack callBack);
    void nvGetRotationAsync(String data, CallBack callBack);
    void nvSetRotationAsync(String data, CallBack callBack);
    void nvDownLoadScreenshotNetAsync(String data, CallBack callBack);
    void nvDownLoadScreenshotAsync(String data, CallBack callBack);
    void nvGetIsUseDayLightTimeAsync(String data, CallBack callBack);
    void nvAddNetTimingInfoListAsync(String data, CallBack callBack);
    void nvUpdateNetTimingInfoAsync(String data, CallBack callBack);
    void nvDeleteNetTimingInfoAsync(String data, CallBack callBack);
    void nvAddNetTimingInfoAsync(String data, CallBack callBack);
    void nvGetNetTimingListInfoAsync(String data, CallBack callBack);
    void nvSetNetTimingInfoAsync(String data, CallBack callBack);
    void nvGetNetTimingInfoAsync(String data, CallBack callBack);
    void nvCalibrateTimeAsync(String data, CallBack callBack);
    void nvGetCurrentTimeAndZoneAsync(String data, CallBack callBack);
    void nvGetMonitorInfoByReceiverIndexAsync(String data, CallBack callBack);
    void nvGetReceiverCountAndInfoAsync(String data, CallBack callBack);
    void nvGetSendCardMonitorInfoAsync(String data, CallBack callBack);
    void nvGetAvailableMemoryAsync(String data, CallBack callBack);
    void nvGetCPUTempAsync(String data, CallBack callBack);
    void nvGetCPUUsageAsync(String data, CallBack callBack);
    void nvGetAvailableStorageDataAsync(String data, CallBack callBack);
    void nvGetBindPlayerAsync(String data, CallBack callBack);
    void nvGetCloudPlayerListAsync(String data, CallBack callBack);
    void nvSetBindPlayerAsync(String data, CallBack callBack);
    void nvSetIcareConfigInfoAsync(String data, CallBack callBack);
    void nvGetIcareConfigInfoAsync(String data, CallBack callBack);
    void nvSetRecvCardFileAsync(String data, CallBack callBack);
    void nvSetScreenAttributeAsync(String data, CallBack callBack);
    void nvGetScreenAttributeAsync(String data, CallBack callBack);
    void nvGetModuleInfoAsync(String data, CallBack callBack);
    void nvSetWifiApStationSwitchAsync(String data, CallBack callBack);
    void nvSetAPNetworkOpenStatusAsync(String data, CallBack callBack);
    void nvGetAPNetworkOpenStatusAsync(String data, CallBack callBack);
    void nvGet4GNetworkStatusAsync(String data, CallBack callBack);
    void nvGetFlightModeAsync(String data, CallBack callBack);
    void nvSetFlightModeAsync(String data, CallBack callBack);
    void nvSetAPNInfoAsync(String data, CallBack callBack);
    void nvGetAPNInfoAsync(String data, CallBack callBack);
    void nvSetAPNetworkAsync(String data, CallBack callBack);
    void nvGetAPNetworkAsync(String data, CallBack callBack);
    void nvSetEthernetInfoAsync(String data, CallBack callBack);
    void nvGetEthernetInfoAsync(String data, CallBack callBack);
    void nvIsMobileModuleExistedAsync(String data, CallBack callBack);
    void nvSetMobileNetworkAsync(String data, CallBack callBack);
    void nvGetMobileNetworkAsync(String data, CallBack callBack);
    void nvSendForgetWifiCommandAsync(String data, CallBack callBack);
    void nvSetWifiEnabledAsync(String data, CallBack callBack);
    void nvGetWifiEnabledAsync(String data, CallBack callBack);
    void nvDisconnectWifiNetworkAsync(String data, CallBack callBack);
    void nvConnectWifiNetworkAsync(String data, CallBack callBack);
    void nvGetWifiListAsync(String data, CallBack callBack);
    void nvUpdateVerifyAsync(String data, CallBack callBack);
    void nvStopCurrentUpdateTaskAsync(String data, CallBack callBack);
    void nvUpdateOSAsync(String data, CallBack callBack);
    void nvUpdateAppAsync(String data, CallBack callBack);
    void nvReadFileContentFromZipFileAsync(String data, CallBack callBack);
    void nvStopDownloadUpgradeFileAsync(String data, CallBack callBack);
    void nvDownloadUpgradeFileAsync(String data, CallBack callBack);
    void nvGetOnlineUpgradeFileAsync(String data, CallBack callBack);
    void nvQueryUpdateFileByTypeAsync(String data, CallBack callBack);
    void nvDeleteCollectorAsync(String data, CallBack callBack);
    void nvAddCollectorAsync(String data, CallBack callBack);
    void nvGetPickerReceiverAsync(String data, CallBack callBack);
    void nvSetCustomResolutionAsync(String data, CallBack callBack);
    void nvSetHdmiOutputStatusAsync(String data, CallBack callBack);
    void nvGetHdmiOutputStatusAsync(String data, CallBack callBack);
    void nvSetReBootTaskAsync(String data, CallBack callBack);
    void nvGetReBootTaskAsync(String data, CallBack callBack);
    void nvGetSupportedResolutionAsync(String data, CallBack callBack);
    void nvGetCurrentResolutionAsync(String data, CallBack callBack);
    void nvSetCurrentResolutioAsync(String data, CallBack callBack);
    void nvSetOTGUSBModeAsync(String data, CallBack callBack);
    void nvGetOTGUSBModeAsync(String data, CallBack callBack);
    void nvClearAllMediasAsync(String data, CallBack callBack);
    void nvSetReBootWipeUserDataAsync(String data, CallBack callBack);
    void nvGetSyncPlayAsync(String data, CallBack callBack);
    void nvSetSyncPlayAsync(String data, CallBack callBack);
    void nvStopPlayAsync(String data, CallBack callBack);
    void nvResumePlayAsync(String data, CallBack callBack);
    void nvPausePlayAsync(String data, CallBack callBack);
    void nvStartPlayAsync(String data, CallBack callBack);
    void nvDeletePlayListAsync(String data, CallBack callBack);
    void nvGetProgramInfoAsync(String data, CallBack callBack);
    void nvGetScreenPowerPolicyFor0x99Async(String data, CallBack callBack);
    void nvGetScreenPowerManual0x99Async(String data, CallBack callBack);
    void nvsetScreenPowerPolicy0x99Async(String data, CallBack callBack);
    void nvsetScreenPowerManual0x99Async(String data, CallBack callBack);
    void nvSetScreenPowerPolicyAsync(String data, CallBack callBack);
    void nvGetScreenPowerPolicyAsync(String data, CallBack callBack);
    void nvGetScreenPowerStateAsync(String data, CallBack callBack);
    void nvSetScreenPowerStateAsync(String data, CallBack callBack);
    void nvGetScreenPowerModeAsync(String data, CallBack callBack);
    void nvSetScreenPowerModeAsync(String data, CallBack callBack);
    void nvSetColorTemperatureAsync(String data, CallBack callBack);
    void nvGetColorTemperatureAsync(String data, CallBack callBack);
    void nvgetPolicyBrightnessFor0x99Async(String data, CallBack callBack);
    void nvsetPolicyBrightnessFor0x99Async(String data, CallBack callBack);
    void nvsetManualBrightnessFor0x99Async(String data, CallBack callBack);
    void nvGetEnvironmentBrightnessAsync(String data, CallBack callBack);
    void nvSetBrightnessPolicyAsync(String data, CallBack callBack);
    void nvGetBrightnessPolicyAsync(String data, CallBack callBack);
    void nvGetScreenBrightnessAsync(String data, CallBack callBack);
    void nvSetScreenBrightnessAsync(String data, CallBack callBack);
    void nvGetBrightnessAdjustModeAsync(String data, CallBack callBack);
    void nvSetBrightnessAdjustModeAsync(String data, CallBack callBack);
    void nvGetconfigurationAsync(String data, CallBack callBack);
    void nvGetProductInfoAsync(String data, CallBack callBack);
    void nvGetInstalledPackageVersionsAsync(String data, CallBack callBack);
    void nvGetFirmwareInfosAsync(String data, CallBack callBack);
    void nvLogoutAsync(String data, CallBack callBack);
    void nvSetSystemInfoAsync(String data, CallBack callBack);
    void nvSetTerminalInfoAsync(String data, CallBack callBack);
    void nvGetTerminalInfoAsync(String data, CallBack callBack);
    void nvSetScreenInfoAsync(String data, CallBack callBack);
    void nvDelTerminalInfoAsync(String data, CallBack callBack);
    void nvChangePassWordAsync(String data, CallBack callBack);
    void nvLoginAsync(String data, CallBack callBack);
    void nvSearchRangeIpAsync(String data, CallBack callBack);
    void nvSearchAppointIpAsync(String data, CallBack callBack);
    void nvGetUserInfoAsync(String data, CallBack callBack);
    void nvSetUserInfoAsync(String data, CallBack callBack);
    void nvSetVideoSourcePolicyFor0x99Async(String data, CallBack callBack);
    void nvGetVideoSourcePolicyFor0x99Async(String data, CallBack callBack);
    void nvSetVideoSourceManualFor0x99Async(String data, CallBack callBack);
    void nvGetVideoSourceManualFor0x99Async(String data, CallBack callBack);
    void nvGetVideoEDIDAsync(String data, CallBack callBack);
    void nvSetVideoEDIDAsync(String data, CallBack callBack);
    void nvSetVideoControlInfoAsync(String data, CallBack callBack);
    void nvGetVideoControlInfoAsync(String data, CallBack callBack);
    void nvSetRelayPowerStatusAsync(String data, CallBack callBack);
    void nvGetRelayPowerStatusAsync(String data, CallBack callBack);
    void nvGetRelayPowerPolicyAsync(String data, CallBack callBack);
    void nvSetRelayPowerPolicyAsync(String data, CallBack callBack);
    void nvSetRelayPowerManualAsync(String data, CallBack callBack);
    void nvGetPowerModeAsync(String data, CallBack callBack);
    void nvSetPowerModeAsync(String data, CallBack callBack);
    void nvGetPowerInfoStatusAsync(String data, CallBack callBack);
    void nvGetPowerInfoPolicyAsync(String data, CallBack callBack);
    void nvSetPowerInfoPolicyAsync(String data, CallBack callBack);
    void nvSetPowerInfoManualAsync(String data, CallBack callBack);
    void nvGetLoraInfoAsync(String data, CallBack callBack);
    void nvSetSupportSensorInfoAsync(String data, CallBack callBack);
    void nvGetSupportSensorInfoAsync(String data, CallBack callBack);
    void nvSetSpliceInfoAsync(String data, CallBack callBack);
    void nvGetSpliceInfoAsync(String data, CallBack callBack);
    void nvUpdateFontAsync(String data, CallBack callBack);
    void nvDeleteFontAsync(String data, CallBack callBack);
    void nvGetTerminalFontAsync(String data, CallBack callBack);
    void nvGetPlaylogPathAsync(String data, CallBack callBack);
    void nvStartUploadApkCoreAsync(String data, CallBack callBack);
    void nvUninstallPackageAsync(String data, CallBack callBack);
    void nvForceStopAppAsync(String data, CallBack callBack);
    void nvGetRunningPackageInfoAsync(String data, CallBack callBack);
    void nvGetInstalledPackageInfoAsync(String data, CallBack callBack);
    void nvSetVPNConnectInfoAsync(String data, CallBack callBack);
    void nvGetVPNConnectInfoAsync(String data, CallBack callBack);
    void nvGetTimingVolumeFor0x99Async(String data, CallBack callBack);
    void nvSetTimingVolumeFor0x99Async(String data, CallBack callBack);
    void nvSetVolumeFor0x99Async(String data, CallBack callBack);
    void nvGetVolumeFor0x99Async(String data, CallBack callBack);
    void nvGetTimingVolumeAsync(String data, CallBack callBack);
    void nvSetTimingVolumeAsync(String data, CallBack callBack);
    void nvSetVolumeAsync(String data, CallBack callBack);
    void nvGetVolumeAsync(String data, CallBack callBack);
    void nvGetManualPowerSwitchStatusAsync(String data, CallBack callBack);
    void nvSetManualPowerSwitchStatusAsync(String data, CallBack callBack);
    void nvGetRealtimePowerSwitchStatusAsync(String data, CallBack callBack);
    void nvGetTimingPowerSwitchStatusAsync(String data, CallBack callBack);
    void nvSetTimingPowerSwitchStatusAsync(String data, CallBack callBack);
    void nvGetPublicNetParamAsync(String data, CallBack callBack);
    void nvDisconnectPublicNetAsync(String data, CallBack callBack);
    void nvSetPublicNetConfigParamAsync(String data, CallBack callBack);
}
ximon-admin/src/main/resources/application-local.yml
@@ -4,7 +4,7 @@
    username: sandu
    # æ•°æ®åº“密码
    password: dygOHN4&mZC9X+99
    url: jdbc:mysql://112.74.63.130:3306/ximon_light?useUnicode=true&autoReconnect=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    url: jdbc:mysql://112.74.63.130:3306/ximon_light_n1?useUnicode=true&autoReconnect=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      connection-init-sqls: set names utf8mb4
@@ -29,11 +29,15 @@
    online-key: online-token
    # æ˜¯å¦å¯åЍredis缓存用户信息
    cache-online: false
    #************************本地上传文件配置************************
  upload:
    upload-root-path: /usr/local/project/ximon-light-20017/file/
    #文件服务器路径
    upload-root-path: E:\file\novafile
    storage: local
    #服务器文件前缀
    real-url: http://localhost/
  common:
    urlPrefix: http://112.74.63.130/file/
    urlPrefix: http://localhost/
  quartz:
    enable: true