增加大华sdk初始化环境
增加大华设备登录
增加大华ptz获取和云台控制接口
增加相机通用SDK接口
已添加33个文件
已重命名41个文件
已修改11个文件
8234 ■■■■■ 文件已修改
ard-work/pom.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/controller/ArdCamerasController.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/controller/CameraSdkController.java 361 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/domain/ArdCameras.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/Base64.java 553 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/BorderEx.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/CaseMenu.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/DateChooserJButton.java 606 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/DateChooserJButtonEx.java 568 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/DeviceManagerListener.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/ErrorCode.java 871 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/EventTaskCommonQueue.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/EventTaskHandler.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/ListPictureShowDialog.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/PaintPanel.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/Res.java 2883 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/SavePath.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/WindowCloseListener.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/controller/DhSdkController.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/module/ConfigModule.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/module/LoginModule.java 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/module/PtzControlModule.java 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/service/IDhClientService.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/dhsdk/service/impl/DhClientServiceImpl.java 255 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/common/GlobalVariable.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/sdk/LoginResultCallBack.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/IHikClientService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/resources/dynamic-lib-load.xml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/resources/mapper/device/ArdCamerasMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/resources/resources_en_US.properties 1071 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/resources/resources_zh_CN.properties 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/dhDll/ImageAlg.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/dhDll/Infra.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/dhDll/IvsDrawer.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/dhDll/RenderEngine.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/dhDll/StreamConvertor.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/dhDll/avnetsdk.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/dhDll/dhconfigsdk.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/dhDll/dhnetsdk.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/dhDll/dhplay.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/AudioRender.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/ClientDemoDll/calib.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/ClientDemoDll/iconv.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/ClientDemoDll/libcrypto-1_1-x64.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/ClientDemoDll/libssl-1_1-x64.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/ClientDemoDll/libxml2.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/ClientDemoDll/zlib1.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/GdiPlus.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCCore.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCNetSDK.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCNetSDKCom/AudioIntercom.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCNetSDKCom/AudioRender.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCNetSDKCom/HCAlarm.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCNetSDKCom/HCAlarm.lib 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCNetSDKCom/HCCoreDevCfg.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCNetSDKCom/HCDisplay.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCNetSDKCom/HCGeneralCfgMgr.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCNetSDKCom/HCGeneralCfgMgr.lib 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCNetSDKCom/HCIndustry.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCNetSDKCom/HCPlayBack.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCNetSDKCom/HCPreview.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCNetSDKCom/HCPreview.lib 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCNetSDKCom/HCVoiceTalk.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCNetSDKCom/OpenAL32.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCNetSDKCom/StreamTransClient.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCNetSDKCom/SystemTransform.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HCNetSDKCom/libiconv2.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HXVA.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/HmMerge.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/MP_Render.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/NPQos.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/OpenAL32.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/PlayCtrl.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/SuperRender.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/YUVProcess.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/hlog.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/hpr.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/libcrypto-1_1-x64.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/libmmd.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/libssl-1_1-x64.dll 补丁 | 查看 | 原始文档 | blame | 历史
lib/hikDll/zlib1.dll 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/logback.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/pom.xml
@@ -31,7 +31,12 @@
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common</artifactId>
        </dependency>
        <!--大华二次开发依赖jar包-->
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>5.4.0</version>
        </dependency>
        <!--海康录像机二次开发依赖jar包-->
        <dependency>
            <groupId>net.java.jna</groupId>
ard-work/src/main/java/com/ruoyi/device/camera/controller/ArdCamerasController.java
@@ -7,6 +7,7 @@
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.IArdCamerasService;
import com.ruoyi.device.dhsdk.service.IDhClientService;
import com.ruoyi.device.hiksdk.service.IHikClientService;
import com.ruoyi.device.hiksdk.service.impl.HikClientServiceImpl;
import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -30,6 +31,7 @@
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.core.page.TableDataInfo;
import java.util.*;
/**
@@ -44,7 +46,9 @@
@Api(tags = "相机管理接口")
public class ArdCamerasController extends BaseController {
    @Resource
    private IHikClientService sdk;
    private IHikClientService hikSdk;
    @Resource
    private IDhClientService dhSdk;
    @Resource
    private IArdCamerasService ardCamerasService;
    @Resource
@@ -94,11 +98,18 @@
    @PostMapping
    public AjaxResult add(@RequestBody ArdCameras camera) {
        int i = ardCamerasService.insertArdCameras(camera);
        if(i>0) {
            //注销
            sdk.loginOut(camera.getId());
            //异步登录
            sdk.asyncLogin(camera);
        if (i > 0) {
            if (camera.getFactory().equals("1")) {
                //注销
                hikSdk.logout(camera.getId());
                //异步登录
                hikSdk.asyncLogin(camera);
            }
            else if(camera.getFactory().equals("2"))
            {
                dhSdk.logout(camera.getId());
                dhSdk.login(camera);
            }
        }
        return toAjax(i);
    }
@@ -112,11 +123,16 @@
    @PutMapping
    public AjaxResult edit(@RequestBody ArdCameras camera) {
        int i = ardCamerasService.updateArdCameras(camera);
        if(i>0)
        {
            ArdCameras cameras = ardCamerasService.selectArdCamerasById(camera.getId());
            sdk.loginOut(cameras.getId());
            sdk.asyncLogin(cameras);
        if (i > 0) {
            camera= ardCamerasService.selectArdCamerasById(camera.getId());
            if(camera.getFactory().equals("1")) {
                hikSdk.logout(camera.getId());
                hikSdk.asyncLogin(camera);
            }
            else if(camera.getFactory().equals("2")) {
                dhSdk.logout(camera.getId());
                dhSdk.login(camera);
            }
        }
        return toAjax(i);
    }
@@ -129,9 +145,9 @@
    @Log(title = "相机设备", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public AjaxResult remove(@PathVariable String[] ids) {
        for(String id :ids)
        {
            sdk.loginOut(id);
        for (String id : ids) {
            hikSdk.logout(id);
            dhSdk.logout(id);
        }
        return toAjax(ardCamerasService.deleteArdCamerasByIds(ids));
    }
@@ -152,25 +168,25 @@
        }
        return options;
    }
    @GetMapping("/getDeptAndCamera")
    @ApiOperation("获取部门和相机")
    public AjaxResult getDeptAndCamera()
    {
    public AjaxResult getDeptAndCamera() {
        Map deptAndCamera = ardCamerasService.getChildDeptAndCamera(true);
        return AjaxResult.success(deptAndCamera);
    }
    @GetMapping("/getDeptAndCameraWithCheckBox")
    @ApiOperation("获取部门和相机(开启复选框)")
    public AjaxResult getDeptAndCameraWithCheckBox()
    {
    public AjaxResult getDeptAndCameraWithCheckBox() {
        Map deptAndCamera = ardCamerasService.getChildDeptAndCamera(false);
        return AjaxResult.success(deptAndCamera);
    }
    @PostMapping("/getNearCamerasBycoordinate")
    @ApiOperation("获取附近的相机")
    @ApiOperationSupport(includeParameters = {"targetPosition"})
    public AjaxResult getNearCamerasBycoordinate(@RequestBody CameraCmd cmd)
    {
    public AjaxResult getNearCamerasBycoordinate(@RequestBody CameraCmd cmd) {
        TreeMap nearCamerasBycoordinate = ardCamerasService.getNearCamerasBycoordinate(cmd);
        return AjaxResult.success(nearCamerasBycoordinate);
    }
ard-work/src/main/java/com/ruoyi/device/camera/controller/CameraSdkController.java
对比新文件
@@ -0,0 +1,361 @@
package com.ruoyi.device.camera.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.IArdCamerasService;
import com.ruoyi.device.dhsdk.service.IDhClientService;
import com.ruoyi.device.hiksdk.service.IHikClientService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.IArdCamerasService;
import com.ruoyi.device.dhsdk.service.IDhClientService;
import com.ruoyi.device.hiksdk.service.IHikClientService;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
 * @Description:
 * @ClassName: CameraSdkController
 * @Author: 刘苏义
 * @Date: 2023年10月14日17:02:56
 **/
@Api(tags = "相机通用SDK接口")
@Controller
@RequestMapping("/cameraSdk")
@Anonymous
public class CameraSdkController extends BaseController {
    @Resource
    private IHikClientService hikClientService;
    @Resource
    private IDhClientService dhClientService;
    @Resource
    private IArdCamerasService ardCamerasService;
    /**
     * @描述 初始加载海康库文件
     * @参数 []
     * @返回值 void
     * @创建人 刘苏义
     * @创建时间 2023/1/17 16:13
     * @修改人和其它信息 if (Platform.isLinux())
     */
    @PostConstruct
    public void initHCNetSDK() {
        //初始化加载sdk库文件
        hikClientService.loadHCNetSDKLib();
        //登录所有相机
        hikClientService.loginAll();
    }
    @RequestMapping("/preview")
    private String preview() {
        return "preview";
    }
    @RequestMapping("/index")
    private String index() {
        return "test";
    }
    @GetMapping("/list")
    public @ResponseBody
    AjaxResult list(ArdCameras ardCamera) {
        List<ArdCameras> list = ardCamerasService.selectArdCamerasListNoDataScope(ardCamera);
        return AjaxResult.success("相机列表:", list);
    }
    @ApiOperation("获取码流压缩参数")
    @PostMapping("/getVideoCompressionCfg")
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"})
    @Log(title = "获取码流压缩参数", businessType = BusinessType.CONTROL)
    public @ResponseBody
    AjaxResult getVideoCompressionCfg(@RequestBody CameraCmd cmd) {
        return AjaxResult.success(hikClientService.getVideoCompressionCfg(cmd));
    }
    @ApiOperation("在线状态")
    @PostMapping("/state")
    @ApiOperationSupport(includeParameters = {"cmd.cameraId"})
    @Log(title = "在线状态", businessType = BusinessType.CONTROL)
    public @ResponseBody
    AjaxResult getOnlineState(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        boolean onLine = hikClientService.isOnLine(cmd);
        return AjaxResult.success(onLine);
    }
    @ApiOperation(value = "云台控制", notes = "Code:1-左上 2-上 3-右上 4-左 5-巡航 6-右 7-左下 8-下 9-右下 10-焦距变大 11-焦距变小\n" +
            "12-焦点前调 13-焦点后调 14-光圈扩大 15-光圈缩小 16-雨刷开启")
    @PostMapping("/PTZControlWithSpeed")
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.speed", "cmd.enable", "cmd.code"})
    @Log(title = "云台控制", businessType = BusinessType.CONTROL)
    public @ResponseBody
    AjaxResult PTZControlWithSpeed(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return toAjax(hikClientService.pTZControlWithSpeed(cmd));
    }
    @ApiOperation("调用预置点")
    @PostMapping("/gotoPreset")
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.presetIndex"})
    @Log(title = "调用预置点", businessType = BusinessType.CONTROL)
    public @ResponseBody
    AjaxResult gotoPreset(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return toAjax(hikClientService.gotoPreset(cmd));
    }
    @ApiOperation("设置预置点")
    @PostMapping("/setPreset")
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.presetIndex"})
    @Log(title = "设置预置点", businessType = BusinessType.CONTROL)
    public @ResponseBody
    AjaxResult setPreset(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return toAjax(hikClientService.setPreset(cmd));
    }
    @ApiOperation("获取聚焦值")
    @PostMapping("/getFocusPos")
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"})
    @Log(title = "获取聚焦值", businessType = BusinessType.CONTROL)
    public @ResponseBody
    AjaxResult getFocusPos(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        Map<String, Object> Map = hikClientService.getFocusPos(cmd);
        return AjaxResult.success("获取聚焦值", Map);
    }
    @ApiOperation("设置聚焦值")
    @PostMapping("/setFocusPos")
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.dwFocusPos"})
    @Log(title = "设置聚焦值", businessType = BusinessType.CONTROL)
    public @ResponseBody
    AjaxResult setFocusPos(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return toAjax(hikClientService.setFocusPos(cmd));
    }
    @ApiOperation("获取PTZ")
    @PostMapping("/getPTZ")
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"})
    @Log(title = "获取PTZ", businessType = BusinessType.CONTROL)
    public @ResponseBody
    AjaxResult getPTZ(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        Map<String, Object> ptzMap = hikClientService.getPtz(cmd);
        return AjaxResult.success("获取ptz", ptzMap);
    }
    @ApiOperation("获取PTZ范围")
    @PostMapping("/getPTZScope")
    @Log(title = "获取PTZ范围", businessType = BusinessType.CONTROL)
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"})
    public @ResponseBody
    AjaxResult getPTZScope(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        Map<String, Object> ptzMap = hikClientService.getPtzScope(cmd);
        return AjaxResult.success("获取ptz范围", ptzMap);
    }
    @ApiOperation("设置PTZ")
    @PostMapping("/setPTZ")
    @Log(title = "设置PTZ", businessType = BusinessType.CONTROL)
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.ptzMap"})
    public @ResponseBody
    AjaxResult setPTZ(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return toAjax(hikClientService.setPtz(cmd));
    }
    @ApiOperation("指向目标")
    @PostMapping("/setTargetPosition")
    @Log(title = "指向目标", businessType = BusinessType.CONTROL)
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.targetPosition"})
    public @ResponseBody
    AjaxResult setTargetPosition(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return toAjax(hikClientService.guideTargetPosition(cmd));
    }
    @ApiOperation("设置零方位角")
    @PostMapping("/setZeroPTZ")
    @Log(title = "设置零方位角", businessType = BusinessType.CONTROL)
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.cmd.chanNo"})
    public @ResponseBody
    AjaxResult setZeroPTZ(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return toAjax(hikClientService.setZeroPtz(cmd));
    }
    @ApiOperation("设置锁定")
    @PostMapping("/setPTZLock")
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.expired"})
    @Log(title = "设置锁定", businessType = BusinessType.CONTROL)
    public @ResponseBody
    AjaxResult setPTZLock(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return AjaxResult.success(hikClientService.controlLock(cmd));
    }
    @ApiOperation("设置解锁")
    @PostMapping("/setPTZUnLock")
    @ApiOperationSupport(includeParameters = {"cmd.cameraId"})
    @Log(title = "设置解锁", businessType = BusinessType.CONTROL)
    public @ResponseBody
    AjaxResult setPTZUnLock(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return AjaxResult.success(hikClientService.controlUnLock(cmd));
    }
    @ApiOperation("获取云台锁定信息")
    @PostMapping("/getPTZLockInfo")
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"})
    @Log(title = "获取云台锁定信息", businessType = BusinessType.CONTROL)
    public @ResponseBody
    AjaxResult getPTZLockInfo(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        int byWorkMode = hikClientService.getPTZLockInfo(cmd);
        if (byWorkMode == 0) {
            return AjaxResult.success("云台锁定状态:解锁");
        } else if (byWorkMode == 1) {
            return AjaxResult.success("云台锁定状态:锁定");
        } else {
            return AjaxResult.error("云台锁定状态:失败");
        }
    }
    @ApiOperation("透雾开关")
    @PostMapping("/defogcfg")
    @Log(title = "透雾开关", businessType = BusinessType.CONTROL)
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.enable"})
    public @ResponseBody
    AjaxResult defogcfg(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return toAjax(hikClientService.controlDefogcfg(cmd));
    }
    @ApiOperation("红外开关")
    @PostMapping("/infrarecfg")
    @Log(title = "红外开关", businessType = BusinessType.CONTROL)
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.enable"})
    public @ResponseBody
    AjaxResult infrarecfg(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return toAjax(hikClientService.controlInfrarecfg(cmd));
    }
    @ApiOperation(value = "手动/自动聚焦", notes = "true手动flase自动")
    @PostMapping("/focusMode")
    @Log(title = "手动/自动聚焦", businessType = BusinessType.CONTROL)
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.enable"})
    public @ResponseBody
    AjaxResult enableFocusMode(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return toAjax(hikClientService.controlFocusMode(cmd));
    }
    @ApiOperation(value = "获取聚焦模式", notes = "1手动2自动")
    @PostMapping("/getFocusMode")
    public @ResponseBody
    AjaxResult getFocusMode(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        String focusMode = hikClientService.getFocusMode(cmd);
        return AjaxResult.success(focusMode);
    }
    @ApiOperation("云台加热")
    @PostMapping("/heateRpwron")
    @Log(title = "云台加热", businessType = BusinessType.CONTROL)
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.enable"})
    public @ResponseBody
    AjaxResult heateRpwron(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return toAjax(hikClientService.controlPTHeateRpwron(cmd));
    }
    @ApiOperation("镜头加热")
    @PostMapping("/cameraDeicing")
    @Log(title = "镜头加热", businessType = BusinessType.CONTROL)
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.enable"})
    public @ResponseBody
    AjaxResult cameraDeicing(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return toAjax(hikClientService.controlCameraDeicing(cmd));
    }
    @PostMapping("/captureJPEGPicture")
    public @ResponseBody
    AjaxResult captureJPEGPicture(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        String base64Str = hikClientService.captureJPEGPicture(cmd);
        return toAjaxString(base64Str, "相机抓图");
    }
    @ApiOperation("相机抓图")
    @PostMapping("/picCutCate")
    @Log(title = "相机抓图", businessType = BusinessType.CONTROL)
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"})
    public @ResponseBody
    AjaxResult picCutCate(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        String path = hikClientService.picCutCate(cmd);
        return toAjaxString(path, "相机抓图");
    }
    @ApiOperation("手动录像")
    @PostMapping("/record")
    @Log(title = "手动录像", businessType = BusinessType.CONTROL)
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.enable"})
    public @ResponseBody
    AjaxResult record(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        String path = hikClientService.record(cmd);
        return toAjaxString(path, "手动录像");
    }
    @ApiOperation("获取相机架设参数")
    @PostMapping("/getCameraSetupCFG")
    @Log(title = "获取相机架设参数", businessType = BusinessType.CONTROL)
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.enable"})
    public @ResponseBody
    AjaxResult getCameraSetupCFG(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return AjaxResult.success(hikClientService.getGisInfo(cmd));
    }
}
ard-work/src/main/java/com/ruoyi/device/camera/domain/ArdCameras.java
@@ -74,7 +74,11 @@
    @Excel(name = "光电类型")
    private String gdtype;
    /**
     * 厂商
     */
    @Excel(name = "厂商")
    private String factory;
    /**
     * 经度
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/Base64.java
对比新文件
@@ -0,0 +1,553 @@
/*
 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */
// Base64解码 使用1.8版本源码  鉴于1.8部分特性1.6版本使用不到 故只保留能使用到的代码 其余删除
package com.ruoyi.device.dhsdk.common;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.Arrays;
/**
 * This class consists exclusively of static methods for obtaining
 * encoders and decoders for the Base64 encoding scheme. The
 * implementation of this class supports the following types of Base64
 * as specified in
 * <a href="http://www.ietf.org/rfc/rfc4648.txt">RFC 4648</a> and
 *
 * <ul>
 * <li><a name="basic"><b>Basic</b></a>
 * <p> Uses "The Base64 Alphabet" as specified in Table 1 of
 *     RFC 4648 and RFC 2045 for encoding and decoding operation.
 *     The encoder does not add any line feed (line separator)
 *     character. The decoder rejects data that contains characters
 *     outside the base64 alphabet.</p></li>
 *
 * <p> Unless otherwise noted, passing a {@code null} argument to a
 * method of this class will cause a {@link NullPointerException
 * NullPointerException} to be thrown.
 *
 * @author  Xueming Shen
 * @since   1.8
 */
public class Base64 {
    private Base64() {}
    /**
     * Returns a {@link Encoder} that encodes using the
     * <a href="#basic">Basic</a> type base64 encoding scheme.
     *
     * @return  A Base64 encoder.
     */
    public static Encoder getEncoder() {
         return Encoder.RFC4648;
    }
    /**
     * This class implements an encoder for encoding byte data using
     * the Base64 encoding scheme as specified in RFC 4648 and RFC 2045.
     *
     * <p> Instances of {@link Encoder} class are safe for use by
     * multiple concurrent threads.
     *
     * <p> Unless otherwise noted, passing a {@code null} argument to
     * a method of this class will cause a
     * {@link NullPointerException NullPointerException} to
     * be thrown.
     *
     * @see     Decoder
     * @since   1.8
     */
    public static class Encoder {
        private final byte[] newline;
        private final int linemax;
        private final boolean isURL;
        private final boolean doPadding;
        private Encoder(boolean isURL, byte[] newline, int linemax, boolean doPadding) {
            this.isURL = isURL;
            this.newline = newline;
            this.linemax = linemax;
            this.doPadding = doPadding;
        }
        /**
         * This array is a lookup table that translates 6-bit positive integer
         * index values into their "Base64 Alphabet" equivalents as specified
         * in "Table 1: The Base64 Alphabet" of RFC 2045 (and RFC 4648).
         */
        private static final char[] toBase64 = {
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
            'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
            'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
        };
        /**
         * It's the lookup table for "URL and Filename safe Base64" as specified
         * in Table 2 of the RFC 4648, with the '+' and '/' changed to '-' and
         * '_'. This table is used when BASE64_URL is specified.
         */
        private static final char[] toBase64URL = {
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
            'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
            'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_'
        };
        static final Encoder RFC4648 = new Encoder(false, null, -1, true);
        private final int outLength(int srclen) {
            int len = 0;
            if (doPadding) {
                len = 4 * ((srclen + 2) / 3);
            } else {
                int n = srclen % 3;
                len = 4 * (srclen / 3) + (n == 0 ? 0 : n + 1);
            }
            if (linemax > 0)                                  // line separators
                len += (len - 1) / linemax * newline.length;
            return len;
        }
        /**
         * Encodes all bytes from the specified byte array into a newly-allocated
         * byte array using the {@link Base64} encoding scheme. The returned byte
         * array is of the length of the resulting bytes.
         *
         * @param   src
         *          the byte array to encode
         * @return  A newly-allocated byte array containing the resulting
         *          encoded bytes.
         */
        public byte[] encode(byte[] src) {
            int len = outLength(src.length);          // dst array size
            byte[] dst = new byte[len];
            int ret = encode0(src, 0, src.length, dst);
            if (ret != dst.length)
                 return Arrays.copyOf(dst, ret);
            return dst;
        }
        /**
         * Encodes all bytes from the specified byte array using the
         * {@link Base64} encoding scheme, writing the resulting bytes to the
         * given output byte array, starting at offset 0.
         *
         * <p> It is the responsibility of the invoker of this method to make
         * sure the output byte array {@code dst} has enough space for encoding
         * all bytes from the input byte array. No bytes will be written to the
         * output byte array if the output byte array is not big enough.
         *
         * @param   src
         *          the byte array to encode
         * @param   dst
         *          the output byte array
         * @return  The number of bytes written to the output byte array
         *
         * @throws  IllegalArgumentException if {@code dst} does not have enough
         *          space for encoding all input bytes.
         */
        public int encode(byte[] src, byte[] dst) {
            int len = outLength(src.length);         // dst array size
            if (dst.length < len)
                throw new IllegalArgumentException(
                    "Output byte array is too small for encoding all input bytes");
            return encode0(src, 0, src.length, dst);
        }
        /**
         * Encodes the specified byte array into a String using the {@link Base64}
         * encoding scheme.
         *
         * <p> In other words, an invocation of this method has exactly the same
         * effect as invoking
         * {@code new String(encode(src), StandardCharsets.ISO_8859_1)}.
         *
         * @param   src
         *          the byte array to encode
         * @return  A String containing the resulting Base64 encoded characters
         */
        @SuppressWarnings("deprecation")
        public String encodeToString(byte[] src) {
            byte[] encoded = encode(src);
            return new String(encoded, 0, 0, encoded.length);
        }
        /**
         * Returns an encoder instance that encodes equivalently to this one,
         * but without adding any padding character at the end of the encoded
         * byte data.
         *
         * <p> The encoding scheme of this encoder instance is unaffected by
         * this invocation. The returned encoder instance should be used for
         * non-padding encoding operation.
         *
         * @return an equivalent encoder that encodes without adding any
         *         padding character at the end
         */
        public Encoder withoutPadding() {
            if (!doPadding)
                return this;
            return new Encoder(isURL, newline, linemax, false);
        }
        private int encode0(byte[] src, int off, int end, byte[] dst) {
            char[] base64 = isURL ? toBase64URL : toBase64;
            int sp = off;
            int slen = (end - off) / 3 * 3;
            int sl = off + slen;
            if (linemax > 0 && slen  > linemax / 4 * 3)
                slen = linemax / 4 * 3;
            int dp = 0;
            while (sp < sl) {
                int sl0 = Math.min(sp + slen, sl);
                for (int sp0 = sp, dp0 = dp ; sp0 < sl0; ) {
                    int bits = (src[sp0++] & 0xff) << 16 |
                               (src[sp0++] & 0xff) <<  8 |
                               (src[sp0++] & 0xff);
                    dst[dp0++] = (byte)base64[(bits >>> 18) & 0x3f];
                    dst[dp0++] = (byte)base64[(bits >>> 12) & 0x3f];
                    dst[dp0++] = (byte)base64[(bits >>> 6)  & 0x3f];
                    dst[dp0++] = (byte)base64[bits & 0x3f];
                }
                int dlen = (sl0 - sp) / 3 * 4;
                dp += dlen;
                sp = sl0;
                if (dlen == linemax && sp < end) {
                    for (byte b : newline){
                        dst[dp++] = b;
                    }
                }
            }
            if (sp < end) {               // 1 or 2 leftover bytes
                int b0 = src[sp++] & 0xff;
                dst[dp++] = (byte)base64[b0 >> 2];
                if (sp == end) {
                    dst[dp++] = (byte)base64[(b0 << 4) & 0x3f];
                    if (doPadding) {
                        dst[dp++] = '=';
                        dst[dp++] = '=';
                    }
                } else {
                    int b1 = src[sp++] & 0xff;
                    dst[dp++] = (byte)base64[(b0 << 4) & 0x3f | (b1 >> 4)];
                    dst[dp++] = (byte)base64[(b1 << 2) & 0x3f];
                    if (doPadding) {
                        dst[dp++] = '=';
                    }
                }
            }
            return dp;
        }
    }
    /**
     * Returns a {@link Decoder} that decodes using the
     * <a href="#basic">Basic</a> type base64 encoding scheme.
     *
     * @return  A Base64 decoder.
     */
    public static Decoder getDecoder() {
        return Decoder.RFC4648;
    }
    /**
     * This class implements a decoder for decoding byte data using the
     * Base64 encoding scheme as specified in RFC 4648 and RFC 2045.
     *
     * <p> The Base64 padding character {@code '='} is accepted and
     * interpreted as the end of the encoded byte data, but is not
     * required. So if the final unit of the encoded byte data only has
     * two or three Base64 characters (without the corresponding padding
     * character(s) padded), they are decoded as if followed by padding
     * character(s). If there is a padding character present in the
     * final unit, the correct number of padding character(s) must be
     * present, otherwise {@code IllegalArgumentException} (
     * {@code IOException} when reading from a Base64 stream) is thrown
     * during decoding.
     *
     * <p> Instances of {@link Decoder} class are safe for use by
     * multiple concurrent threads.
     *
     * <p> Unless otherwise noted, passing a {@code null} argument to
     * a method of this class will cause a
     * {@link NullPointerException NullPointerException} to
     * be thrown.
     *
     * @see     Encoder
     * @since   1.8
     */
    public static class Decoder {
        private final boolean isURL;
        private final boolean isMIME;
        private Decoder(boolean isURL, boolean isMIME) {
            this.isURL = isURL;
            this.isMIME = isMIME;
        }
        /**
         * Lookup table for decoding unicode characters drawn from the
         * "Base64 Alphabet" (as specified in Table 1 of RFC 2045) into
         * their 6-bit positive integer equivalents.  Characters that
         * are not in the Base64 alphabet but fall within the bounds of
         * the array are encoded to -1.
         *
         */
        private static final int[] fromBase64 = new int[256];
        static {
            Arrays.fill(fromBase64, -1);
            for (int i = 0; i < Encoder.toBase64.length; i++)
                fromBase64[Encoder.toBase64[i]] = i;
            fromBase64['='] = -2;
        }
        /**
         * Lookup table for decoding "URL and Filename safe Base64 Alphabet"
         * as specified in Table2 of the RFC 4648.
         */
        private static final int[] fromBase64URL = new int[256];
        static {
            Arrays.fill(fromBase64URL, -1);
            for (int i = 0; i < Encoder.toBase64URL.length; i++)
                fromBase64URL[Encoder.toBase64URL[i]] = i;
            fromBase64URL['='] = -2;
        }
        static final Decoder RFC4648         = new Decoder(false, false);
        static final Decoder RFC4648_URLSAFE = new Decoder(true, false);
        static final Decoder RFC2045         = new Decoder(false, true);
        /**
         * Decodes all bytes from the input byte array using the {@link Base64}
         * encoding scheme, writing the results into a newly-allocated output
         * byte array. The returned byte array is of the length of the resulting
         * bytes.
         *
         * @param   src
         *          the byte array to decode
         *
         * @return  A newly-allocated byte array containing the decoded bytes.
         *
         * @throws  IllegalArgumentException
         *          if {@code src} is not in valid Base64 scheme
         */
        public byte[] decode(byte[] src) {
            byte[] dst = new byte[outLength(src, 0, src.length)];
            int ret = decode0(src, 0, src.length, dst);
            if (ret != dst.length) {
                dst = Arrays.copyOf(dst, ret);
            }
            return dst;
        }
        public byte[] decode(String src) {
            return decode(src.getBytes(Charset.forName("ISO-8859-1")));
        }
        /**
         * Decodes all bytes from the input byte array using the {@link Base64}
         * encoding scheme, writing the results into the given output byte array,
         * starting at offset 0.
         *
         * <p> It is the responsibility of the invoker of this method to make
         * sure the output byte array {@code dst} has enough space for decoding
         * all bytes from the input byte array. No bytes will be be written to
         * the output byte array if the output byte array is not big enough.
         *
         * <p> If the input byte array is not in valid Base64 encoding scheme
         * then some bytes may have been written to the output byte array before
         * IllegalargumentException is thrown.
         *
         * @param   src
         *          the byte array to decode
         * @param   dst
         *          the output byte array
         *
         * @return  The number of bytes written to the output byte array
         *
         * @throws  IllegalArgumentException
         *          if {@code src} is not in valid Base64 scheme, or {@code dst}
         *          does not have enough space for decoding all input bytes.
         */
        public int decode(byte[] src, byte[] dst) {
            int len = outLength(src, 0, src.length);
            if (dst.length < len)
                throw new IllegalArgumentException(
                        "Output byte array is too small for decoding all input bytes");
            return decode0(src, 0, src.length, dst);
        }
        /**
         * Decodes all bytes from the input byte buffer using the {@link Base64}
         * encoding scheme, writing the results into a newly-allocated ByteBuffer.
         *
         * <p> Upon return, the source buffer's position will be updated to
         * its limit; its limit will not have been changed. The returned
         * output buffer's position will be zero and its limit will be the
         * number of resulting decoded bytes
         *
         * <p> {@code IllegalArgumentException} is thrown if the input buffer
         * is not in valid Base64 encoding scheme. The position of the input
         * buffer will not be advanced in this case.
         *
         * @param   buffer
         *          the ByteBuffer to decode
         *
         * @return  A newly-allocated byte buffer containing the decoded bytes
         *
         * @throws  IllegalArgumentException
         *          if {@code src} is not in valid Base64 scheme.
         */
        public ByteBuffer decode(ByteBuffer buffer) {
            int pos0 = buffer.position();
            try {
                byte[] src;
                int sp, sl;
                if (buffer.hasArray()) {
                    src = buffer.array();
                    sp = buffer.arrayOffset() + buffer.position();
                    sl = buffer.arrayOffset() + buffer.limit();
                    buffer.position(buffer.limit());
                } else {
                    src = new byte[buffer.remaining()];
                    buffer.get(src);
                    sp = 0;
                    sl = src.length;
                }
                byte[] dst = new byte[outLength(src, sp, sl)];
                return ByteBuffer.wrap(dst, 0, decode0(src, sp, sl, dst));
            } catch (IllegalArgumentException iae) {
                buffer.position(pos0);
                throw iae;
            }
        }
        private int outLength(byte[] src, int sp, int sl) {
            int[] base64 = isURL ? fromBase64URL : fromBase64;
            int paddings = 0;
            int len = sl - sp;
            if (len == 0)
                return 0;
            if (len < 2) {
                if (isMIME && base64[0] == -1)
                    return 0;
                throw new IllegalArgumentException(
                        "Input byte[] should at least have 2 bytes for base64 bytes");
            }
            if (isMIME) {
                // scan all bytes to fill out all non-alphabet. a performance
                // trade-off of pre-scan or Arrays.copyOf
                int n = 0;
                while (sp < sl) {
                    int b = src[sp++] & 0xff;
                    if (b == '=') {
                        len -= (sl - sp + 1);
                        break;
                    }
                    if ((b = base64[b]) == -1)
                        n++;
                }
                len -= n;
            } else {
                if (src[sl - 1] == '=') {
                    paddings++;
                    if (src[sl - 2] == '=')
                        paddings++;
                }
            }
            if (paddings == 0 && (len & 0x3) !=  0)
                paddings = 4 - (len & 0x3);
            return 3 * ((len + 3) / 4) - paddings;
        }
        private int decode0(byte[] src, int sp, int sl, byte[] dst) {
            int[] base64 = isURL ? fromBase64URL : fromBase64;
            int dp = 0;
            int bits = 0;
            int shiftto = 18;       // pos of first byte of 4-byte atom
            while (sp < sl) {
                int b = src[sp++] & 0xff;
                if ((b = base64[b]) < 0) {
                    if (b == -2) {         // padding byte '='
                        // =     shiftto==18 unnecessary padding
                        // x=    shiftto==12 a dangling single x
                        // x     to be handled together with non-padding case
                        // xx=   shiftto==6&&sp==sl missing last =
                        // xx=y  shiftto==6 last is not =
                        if (shiftto == 6 && (sp == sl || src[sp++] != '=') ||
                                shiftto == 18) {
                            throw new IllegalArgumentException(
                                    "Input byte array has wrong 4-byte ending unit");
                        }
                        break;
                    }
                    if (isMIME)    // skip if for rfc2045
                        continue;
                    else
                        throw new IllegalArgumentException(
                                "Illegal base64 character " +
                                        Integer.toString(src[sp - 1], 16));
                }
                bits |= (b << shiftto);
                shiftto -= 6;
                if (shiftto < 0) {
                    dst[dp++] = (byte)(bits >> 16);
                    dst[dp++] = (byte)(bits >>  8);
                    dst[dp++] = (byte)(bits);
                    shiftto = 18;
                    bits = 0;
                }
            }
            // reached end of byte array or hit padding '=' characters.
            if (shiftto == 6) {
                dst[dp++] = (byte)(bits >> 16);
            } else if (shiftto == 0) {
                dst[dp++] = (byte)(bits >> 16);
                dst[dp++] = (byte)(bits >>  8);
            } else if (shiftto == 12) {
                // dangling single "x", incorrectly encoded.
                throw new IllegalArgumentException(
                        "Last unit does not have enough valid bits");
            }
            // anything left is invalid, if is not MIME.
            // if MIME, ignore all non-base64 character
            while (sp < sl) {
                if (isMIME && base64[src[sp++]] < 0)
                    continue;
                throw new IllegalArgumentException(
                        "Input byte array has incorrect ending byte at " + sp);
            }
            return dp;
        }
    }
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/BorderEx.java
对比新文件
@@ -0,0 +1,16 @@
package com.ruoyi.device.dhsdk.common;
import javax.swing.*;
import javax.swing.border.Border;
/*
 * 边框设置
 */
public class BorderEx {
    public static void set(JComponent object, String title, int width) {
        Border innerBorder = BorderFactory.createTitledBorder(title);
        Border outerBorder = BorderFactory.createEmptyBorder(width, width, width, width);
        object.setBorder(BorderFactory.createCompoundBorder(outerBorder, innerBorder));
    }
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/CaseMenu.java
对比新文件
@@ -0,0 +1,93 @@
package com.ruoyi.device.dhsdk.common;
import java.lang.reflect.Method;
import java.util.NoSuchElementException;
import java.util.Scanner;
import java.util.Vector;
public class CaseMenu {
    public static class Item {
        private Object object;
        private String itemName;
        private String methodName;
        public Item(Object object, String itemName, String methodName) {
            super();
            this.object = object;
            this.itemName = itemName;
            this.methodName = methodName;
        }
        public Object getObject() {
            return object;
        }
        public String getItemName() {
            return itemName;
        }
        public String getMethodName() {
            return methodName;
        }
    }
    private Vector<Item> items;
    public CaseMenu() {
        super();
        items = new Vector<Item>();
    }
    public void addItem(Item item) {
        items.add(item);
    }
    private void showItem() {
        final String format = "%2d\t%-20s\n";
        int index = 0;
        System.out.printf(format, index++, "exit App");
        for (Item item : items) {
            System.out.printf(format, index++, item.getItemName());
        }
        System.out.println("Please input a item index to invoke the method:");
    }
    public void run() {
        Scanner scanner = new Scanner(System.in);
        while(true) {
            showItem();
            try {
                int input = Integer.parseInt(scanner.nextLine());
                if (input <= 0 ) {
                    System.err.println("input <= 0 || scanner.nextLine() == null");
//                    scanner.close();
//                    System.exit(0);
                    break;
                }
                if (input < 0 || input > items.size()) {
                    System.err.println("Input Error Item Index.");
                    continue;
                }
                Item item = items.get(input - 1);
                Class<?> itemClass = item.getObject().getClass();
                Method method = itemClass.getMethod(item.getMethodName());
                method.invoke(item.getObject());
            } catch (NoSuchElementException e) {
//                scanner.close();
//                System.exit(0);
                break;
            } catch (NumberFormatException e) {
                System.err.println("Input Error NumberFormat.");
                continue;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        scanner.close();
    }
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/DateChooserJButton.java
对比新文件
@@ -0,0 +1,606 @@
package com.ruoyi.device.dhsdk.common;
import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
 * 时间选择器, 年月日-时分秒
 */
public class DateChooserJButton extends JButton {
    private static final long serialVersionUID = 1L;
    int startYear = 1980; // 默认【最小】显示年份
    int lastYear = 2050; // 默认【最大】显示年份
    private DateChooser dateChooser = null;
    private String preLabel = "";
    private String originalText = null;
    private SimpleDateFormat sdf = null;
    private JSpinner yearSpin;
    private JSpinner monthSpin;
    private JSpinner daySpin;
    private JSpinner hourSpin;
    private JSpinner minuteSpin;
    private JSpinner secondSpin;
    public DateChooserJButton() {
        this(getNowDate());
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public DateChooserJButton(String dateString) {
        this();
        setText(getDefaultDateFormat(), dateString);
        //保存原始是日期时间
        initOriginalText(dateString);
    }
    public DateChooserJButton(SimpleDateFormat df, String dateString) {
        this();
        setText(df, dateString);
        //记忆当前的日期格式化器
        this.sdf = df;
        //记忆原始日期时间
        Date originalDate = null;
        try {
            originalDate = df.parse(dateString);
        } catch (ParseException ex) {
            originalDate = getNowDate();
        }
        initOriginalText(originalDate);
    }
    public DateChooserJButton(Date date) {
        this("", date);
        //记忆原始日期时间
        initOriginalText(date);
    }
    public DateChooserJButton(String preLabel, Date date) {
        if (preLabel != null) {
            this.preLabel = preLabel;
        }
        setDate(date);
        //记忆原始是日期时间
        initOriginalText(date);
        setBorder(null);
        setCursor(new Cursor(Cursor.HAND_CURSOR));
        super.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (dateChooser == null) {
                    dateChooser = new DateChooser();
                }
                dateChooser.showDateChooser();
            }
        });
    }
    public DateChooserJButton(int startYear, int lastYear) {
        this();
        this.startYear = startYear;
        this.lastYear = lastYear;
    }
    private static Date getNowDate() {
        return Calendar.getInstance().getTime();
    }
    private static SimpleDateFormat getDefaultDateFormat() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    }
    /**
     * 得到当前使用的日期格式化器
     * @return 日期格式化器
     */
    public SimpleDateFormat getCurrentSimpleDateFormat(){
        if(this.sdf != null){
            return sdf;
        }else{
            return getDefaultDateFormat();
        }
    }
    //保存原始是日期时间
    private void initOriginalText(String dateString) {
        this.originalText = dateString;
    }
    //保存原始是日期时间
    private void initOriginalText(Date date) {
        this.originalText = preLabel + getDefaultDateFormat().format(date);
    }
    /**
     * 得到当前记忆的原始日期时间
     * @return 当前记忆的原始日期时间(未修改前的日期时间)
     */
    public String getOriginalText() {
        return originalText;
    }
    // 覆盖父类的方法
    @Override
    public void setText(String s) {
        Date date;
        try {
            date = getDefaultDateFormat().parse(s);
        } catch (ParseException e) {
            date = getNowDate();
        }
        setDate(date);
        initOriginalText(date);
    }
    public void setText(SimpleDateFormat df, String s) {
        Date date;
        try {
            date = df.parse(s);
        } catch (ParseException e) {
            date = getNowDate();
        }
        setDate(date);
        initOriginalText(date);
    }
    public void setDate(Date date) {
        super.setText(preLabel + getDefaultDateFormat().format(date));
    }
    public Date getDate() {
        String dateString = getText().substring(preLabel.length());
        try {
            SimpleDateFormat currentSdf = getCurrentSimpleDateFormat();
            return currentSdf.parse(dateString);
        } catch (ParseException e) {
            return getNowDate();
        }
    }
    /**
     * 覆盖父类的方法使之无效
     * @param listener 响应监听器
     */
    @Override
    public void addActionListener(ActionListener listener) {
    }
    /**
     * 内部类,主要是定义一个JPanel,然后把日历相关的所有内容填入本JPanel,
     * 然后再创建一个JDialog,把本内部类定义的JPanel放入JDialog的内容区
     */
    private class DateChooser extends JPanel implements MouseListener, ChangeListener {
        private static final long serialVersionUID = 1L;
        JLabel yearLabel;
        JLabel monthLabel;
        JLabel dayLabel;
        JLabel hourLabel;
        JLabel minuteLabel;
        JLabel secondLabel;
        int width = 485; // 界面宽度
        int height = 230; // 界面高度
        Color backGroundColor = Color.gray; // 底色
        // 月历表格配色----------------//
        Color palletTableColor = Color.white; // 日历表底色
        Color todayBackColor = Color.orange; // 今天背景色
        Color weekFontColor = Color.blue; // 星期文字色
        Color dateFontColor = Color.black; // 日期文字色
        Color weekendFontColor = Color.red; // 周末文字色
        // 控制条配色------------------//
        Color controlLineColor = Color.pink; // 控制条底色
        Color controlTextColor = Color.white; // 控制条标签文字色
        /** 点击DateChooserButton时弹出的对话框,日历内容在这个对话框内 */
        JDialog dialog;
        JLabel[][] daysLabels = new JLabel[6][7];
        DateChooser() {
            setLayout(new BorderLayout());
            setBorder(new LineBorder(backGroundColor, 2));
            setBackground(backGroundColor);
            JPanel topYearAndMonth = createYearAndMonthPanal();
            add(topYearAndMonth, BorderLayout.NORTH);
            JPanel centerWeekAndDay = createWeekAndDayPanal();
            add(centerWeekAndDay, BorderLayout.CENTER);
            JPanel buttonBarPanel = createButtonBarPanel();
            this.add(buttonBarPanel, BorderLayout.SOUTH);
        }
        private JPanel createYearAndMonthPanal() {
            Calendar c = getCalendar();
            int currentYear = c.get(Calendar.YEAR);
            int currentMonth = c.get(Calendar.MONTH) + 1;
            int currentDay = c.get(Calendar.DAY_OF_MONTH);
            int currentHour = c.get(Calendar.HOUR_OF_DAY);
            int currentMinute = c.get(Calendar.MINUTE);
            int currentSecond = c.get(Calendar.SECOND);
            JPanel result = new JPanel();
            result.setLayout(new FlowLayout());
            result.setBackground(controlLineColor);
            yearSpin = new JSpinner(new SpinnerNumberModel(currentYear, startYear, lastYear, 1));
            yearSpin.setPreferredSize(new Dimension(48, 20));
            yearSpin.setName("Year");
            yearSpin.setEditor(new JSpinner.NumberEditor(yearSpin, "####"));
            yearSpin.addChangeListener(this);
            result.add(yearSpin);
            yearLabel = new JLabel(Res.string().getYear());
            yearLabel.setForeground(controlTextColor);
            result.add(yearLabel);
            monthSpin = new JSpinner(new SpinnerNumberModel(currentMonth, 1, 12, 1));
            monthSpin.setPreferredSize(new Dimension(35, 20));
            monthSpin.setName("Month");
            monthSpin.addChangeListener(this);
            result.add(monthSpin);
            monthLabel = new JLabel(Res.string().getMonth());
            monthLabel.setForeground(controlTextColor);
            result.add(monthLabel);
            //如果这里要能够选择,会要判断很多东西,比如每个月分别由多少日,以及闰年问题.所以,就干脆把Enable设为false
            daySpin = new JSpinner(new SpinnerNumberModel(currentDay, 1, 31, 1));
            daySpin.setPreferredSize(new Dimension(35, 20));
            daySpin.setName("Day");
            daySpin.addChangeListener(this);
            daySpin.setEnabled(false);
            result.add(daySpin);
            dayLabel = new JLabel(Res.string().getDay());
            dayLabel.setForeground(controlTextColor);
            result.add(dayLabel);
            hourSpin = new JSpinner(new SpinnerNumberModel(currentHour, 0, 23, 1));
            hourSpin.setPreferredSize(new Dimension(35, 20));
            hourSpin.setName("Hour");
            hourSpin.addChangeListener(this);
            result.add(hourSpin);
            hourLabel = new JLabel(Res.string().getHour());
            hourLabel.setForeground(controlTextColor);
            result.add(hourLabel);
            minuteSpin = new JSpinner(new SpinnerNumberModel(currentMinute, 0, 59, 1));
            minuteSpin.setPreferredSize(new Dimension(35, 20));
            minuteSpin.setName("Minute");
            minuteSpin.addChangeListener(this);
            result.add(minuteSpin);
            minuteLabel = new JLabel(Res.string().getMinute());
            minuteLabel.setForeground(controlTextColor);
            result.add(minuteLabel);
            secondSpin = new JSpinner(new SpinnerNumberModel(currentSecond, 0, 59, 1));
            secondSpin.setPreferredSize(new Dimension(35, 20));
            secondSpin.setName("Second");
            secondSpin.addChangeListener(this);
            result.add(secondSpin);
            secondLabel = new JLabel(Res.string().getSecond());
            secondLabel.setForeground(controlTextColor);
            result.add(secondLabel);
            return result;
        }
        private JPanel createWeekAndDayPanal() {
            Res.string().getWeek();
            JPanel result = new JPanel();
            // 设置固定字体,以免调用环境改变影响界面美观
            result.setFont(new Font("宋体", Font.PLAIN, 12));
            result.setLayout(new GridLayout(7, 7));
            result.setBackground(Color.white);
            JLabel cell;
            for (int i = 0; i < 7; i++) {
                cell = new JLabel(Res.string().getWeek()[i]);
                cell.setHorizontalAlignment(JLabel.RIGHT);
                if (i == 0 || i == 6) {
                    cell.setForeground(weekendFontColor);
                } else {
                    cell.setForeground(weekFontColor);
                }
                result.add(cell);
            }
//            int actionCommandId = 0;
            for (int i = 0; i < 6; i++) {
                for (int j = 0; j < 7; j++) {
                    JLabel numberLabel = new JLabel();
                    numberLabel.setBorder(null);
                    numberLabel.setHorizontalAlignment(SwingConstants.RIGHT);
//                    numberLabel.setActionCommand(String.valueOf(actionCommandId));
                    numberLabel.addMouseListener(this);
                    numberLabel.setBackground(palletTableColor);
                    numberLabel.setForeground(dateFontColor);
                    if (j == 0 || j == 6) {
                        numberLabel.setForeground(weekendFontColor);
                    } else {
                        numberLabel.setForeground(dateFontColor);
                    }
                    daysLabels[i][j] = numberLabel;
                    result.add(numberLabel);
//                    actionCommandId++;
                }
            }
            return result;
        }
        /** 得到DateChooserButton的当前text,本方法是为按钮事件匿名类准备的。 */
        public String getTextOfDateChooserButton() {
            return getText();
        }
        /** 恢复DateChooserButton的原始日期时间text,本方法是为按钮事件匿名类准备的。 */
        public void restoreTheOriginalDate() {
            String originalText = getOriginalText();
            setText(originalText);
        }
        private JPanel createButtonBarPanel() {
            JPanel panel = new JPanel();
            panel.setLayout(new GridLayout(1, 2));
            JButton ok = new JButton(Res.string().getConfirm());
            ok.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    //记忆原始日期时间
                    initOriginalText(getTextOfDateChooserButton());
                    //隐藏日历对话框
                    dialog.setVisible(false);
                }
            });
            panel.add(ok);
            JButton cancel = new JButton(Res.string().getCancel());
            cancel.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    //恢复原始的日期时间
                    restoreTheOriginalDate();
                    //隐藏日历对话框
                    dialog.setVisible(false);
                }
            });
            panel.add(cancel);
            return panel;
        }
        private JDialog createDialog() {
            JDialog result = new JDialog();
            result.setTitle(Res.string().getDateChooser());
            result.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            result.getContentPane().add(this, BorderLayout.CENTER);
            result.pack();
            result.setSize(width, height);
            result.setModal(true);
            result.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                     //恢复原始的日期时间
                    restoreTheOriginalDate();
                    //隐藏日历对话框
                    dialog.setVisible(false);
                }
            });
            return result;
        }
        void showDateChooser() {
            if (dialog == null) {
                dialog = createDialog();
            }
            dialog.setLocationRelativeTo(null);
            flushWeekAndDay();
            dialog.setVisible(true);
        }
        private Calendar getCalendar() {
            Calendar result = Calendar.getInstance();
            result.setTime(getDate());
            return result;
        }
        private int getSelectedYear() {
            return ((Integer) yearSpin.getValue()).intValue();
        }
        private int getSelectedMonth() {
            return ((Integer) monthSpin.getValue()).intValue();
        }
        private int getSelectedHour() {
            return ((Integer) hourSpin.getValue()).intValue();
        }
        private int getSelectedMinite() {
            return ((Integer) minuteSpin.getValue()).intValue();
        }
        private int getSelectedSecond() {
            return ((Integer) secondSpin.getValue()).intValue();
        }
        private void dayColorUpdate(boolean isOldDay) {
            Calendar c = getCalendar();
            int day = c.get(Calendar.DAY_OF_MONTH);
            c.set(Calendar.DAY_OF_MONTH, 1);
            int actionCommandId = day - 2 + c.get(Calendar.DAY_OF_WEEK);
            int i = actionCommandId / 7;
            int j = actionCommandId % 7;
            if (isOldDay) {
                daysLabels[i][j].setForeground(dateFontColor);
            } else {
                daysLabels[i][j].setForeground(todayBackColor);
            }
        }
        private void flushWeekAndDay() {
            Calendar c = getCalendar();
            c.set(Calendar.DAY_OF_MONTH, 1);
            int maxDayNo = c.getActualMaximum(Calendar.DAY_OF_MONTH);
            int dayNo = 2 - c.get(Calendar.DAY_OF_WEEK);
            for (int i = 0; i < 6; i++) {
                for (int j = 0; j < 7; j++) {
                    String s = "";
                    if (dayNo >= 1 && dayNo <= maxDayNo) {
                        s = String.valueOf(dayNo);
                    }
                    daysLabels[i][j].setText(s);
                    dayNo++;
                }
            }
            // 打开日历时,根据按钮的时间,设置日历的时间
            String[] date1 = getText().split(" ")[0].split("-");
            String[] date2 = getText().split(" ")[1].split(":");
            yearSpin.setValue(new Integer(date1[0]));
            monthSpin.setValue(new Integer(date1[1]));
            daySpin.setValue(new Integer(date1[2]));
            hourSpin.setValue(new Integer(date2[0]));
            minuteSpin.setValue(new Integer(date2[1]));
            secondSpin.setValue(new Integer(date2[2]));
            // 重置日历天的数字颜色
            for(int i = 0; i < 6; i++) {
                for(int j = 0; j < 7; j++) {
                    if(!daysLabels[i][j].getText().equals("")) {
                        daysLabels[i][j].setForeground(Color.BLACK);
                    }
                }
            }
            // 重置日历星期六、星期日的数字颜色
            for(int i = 0; i < 6; i++) {
                if(!daysLabels[i][0].getText().equals("")) {
                    daysLabels[i][0].setForeground(weekendFontColor);
                }
                if(!daysLabels[i][6].getText().equals("")) {
                    daysLabels[i][6].setForeground(weekendFontColor);
                }
            }
            // 设置当天的数字颜色
            for(int i = 0; i < 6; i++) {
                for(int j = 0; j < 7; j++) {
                    if(daysLabels[i][j].getText().equals(date1[2])) {
                        daysLabels[i][j].setForeground(todayBackColor);
                    }
                }
            }
            dayColorUpdate(false);
        }
        /**
         * 选择日期时的响应事件
         */
        @Override
        public void stateChanged(ChangeEvent e) {
            JSpinner source = (JSpinner) e.getSource();
            Calendar c = getCalendar();
            if (source.getName().equals("Hour")) {
                c.set(Calendar.HOUR_OF_DAY, getSelectedHour());
                setDate(c.getTime());
                return;
            }
            if (source.getName().equals("Minute")) {
                c.set(Calendar.MINUTE, getSelectedMinite());
                setDate(c.getTime());
                return;
            }
            if (source.getName().equals("Second")) {
                c.set(Calendar.SECOND, getSelectedSecond());
                setDate(c.getTime());
                return;
            }
            dayColorUpdate(true);
            if (source.getName().equals("Year")) {
                c.set(Calendar.YEAR, getSelectedYear());
            } else if (source.getName().equals("Month")) {
                c.set(Calendar.MONTH, getSelectedMonth() - 1);
            }
            setDate(c.getTime());
            flushWeekAndDay();
        }
        /**
         * 选择日期时的响应事件
         */
        @Override
        public void mouseClicked(MouseEvent e) {
            JLabel source = (JLabel) e.getSource();
            if (source.getText().length() == 0) {
                return;
            }
            dayColorUpdate(true);
            source.setForeground(todayBackColor);
            int newDay = Integer.parseInt(source.getText());
            Calendar c = getCalendar();
            c.set(Calendar.DAY_OF_MONTH, newDay);
            setDate(c.getTime());
            //把daySpin中的值也变了
            daySpin.setValue(Integer.valueOf(newDay));
        }
        @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub
        }
        @Override
        public void mouseExited(MouseEvent arg0) {
            // TODO Auto-generated method stub
        }
        @Override
        public void mousePressed(MouseEvent arg0) {
            // TODO Auto-generated method stub
        }
        @Override
        public void mouseReleased(MouseEvent arg0) {
            // TODO Auto-generated method stub
        }
    }
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/DateChooserJButtonEx.java
对比新文件
@@ -0,0 +1,568 @@
package com.ruoyi.device.dhsdk.common;
import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
 * 时间选择器, 年月日
 */
public class DateChooserJButtonEx extends JButton {
    private static final long serialVersionUID = 1L;
    int startYear = 1980; // 默认【最小】显示年份
    int lastYear = 2050; // 默认【最大】显示年份
    private DateChooser dateChooser = null;
    private String preLabel = "";
    private String originalText = null;
    private SimpleDateFormat sdf = null;
    private JSpinner yearSpin;
    private JSpinner monthSpin;
    private JSpinner daySpin;
    private JSpinner hourSpin;
    private JSpinner minuteSpin;
    private JSpinner secondSpin;
    public DateChooserJButtonEx() {
        this(getNowDate());
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public DateChooserJButtonEx(String dateString) {
        this();
        setText(getDefaultDateFormat(), dateString);
        //保存原始是日期时间
        initOriginalText(dateString);
    }
    public DateChooserJButtonEx(SimpleDateFormat df, String dateString) {
        this();
        setText(df, dateString);
        //记忆当前的日期格式化器
        this.sdf = df;
        //记忆原始日期时间
        Date originalDate = null;
        try {
            originalDate = df.parse(dateString);
        } catch (ParseException ex) {
            originalDate = getNowDate();
        }
        initOriginalText(originalDate);
    }
    public DateChooserJButtonEx(Date date) {
        this("", date);
        //记忆原始日期时间
        initOriginalText(date);
    }
    public DateChooserJButtonEx(String preLabel, Date date) {
        if (preLabel != null) {
            this.preLabel = preLabel;
        }
        setDate(date);
        //记忆原始是日期时间
        initOriginalText(date);
        setBorder(null);
        setCursor(new Cursor(Cursor.HAND_CURSOR));
        super.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (dateChooser == null) {
                    dateChooser = new DateChooser();
                }
                dateChooser.showDateChooser();
            }
        });
    }
    public void setStartYear(int startYear) {
        this.startYear = startYear;
    }
    public void setLastYear(int lastYear) {
        this.lastYear = lastYear;
    }
    private static Date getNowDate() {
        return Calendar.getInstance().getTime();
    }
    private static SimpleDateFormat getDefaultDateFormat() {
        return new SimpleDateFormat("yyyy-MM-dd");
    }
    /**
     * 得到当前使用的日期格式化器
     * @return 日期格式化器
     */
    public SimpleDateFormat getCurrentSimpleDateFormat(){
        if(this.sdf != null){
            return sdf;
        }else{
            return getDefaultDateFormat();
        }
    }
    //保存原始是日期时间
    private void initOriginalText(String dateString) {
        this.originalText = dateString;
    }
    //保存原始是日期时间
    private void initOriginalText(Date date) {
        this.originalText = preLabel + getDefaultDateFormat().format(date);
    }
    /**
     * 得到当前记忆的原始日期时间
     * @return 当前记忆的原始日期时间(未修改前的日期时间)
     */
    public String getOriginalText() {
        return originalText;
    }
    // 覆盖父类的方法
    @Override
    public void setText(String s) {
        Date date;
        try {
            date = getDefaultDateFormat().parse(s);
        } catch (ParseException e) {
            date = getNowDate();
        }
        setDate(date);
        initOriginalText(date);
    }
    public void setText(SimpleDateFormat df, String s) {
        Date date;
        try {
            date = df.parse(s);
        } catch (ParseException e) {
            date = getNowDate();
        }
        setDate(date);
        initOriginalText(date);
    }
    public void setDate(Date date) {
        super.setText(preLabel + getDefaultDateFormat().format(date));
    }
    public Date getDate() {
        String dateString = getText().substring(preLabel.length());
        try {
            SimpleDateFormat currentSdf = getCurrentSimpleDateFormat();
            return currentSdf.parse(dateString);
        } catch (ParseException e) {
            return getNowDate();
        }
    }
    /**
     * 覆盖父类的方法使之无效
     * @param listener 响应监听器
     */
    @Override
    public void addActionListener(ActionListener listener) {
    }
    /**
     * 内部类,主要是定义一个JPanel,然后把日历相关的所有内容填入本JPanel,
     * 然后再创建一个JDialog,把本内部类定义的JPanel放入JDialog的内容区
     */
    private class DateChooser extends JPanel implements MouseListener, ChangeListener {
        private static final long serialVersionUID = 1L;
        JLabel yearLabel;
        JLabel monthLabel;
        JLabel dayLabel;
        int width = 485; // 界面宽度
        int height = 230; // 界面高度
        Color backGroundColor = Color.gray; // 底色
        // 月历表格配色----------------//
        Color palletTableColor = Color.white; // 日历表底色
        Color todayBackColor = Color.orange; // 今天背景色
        Color weekFontColor = Color.blue; // 星期文字色
        Color dateFontColor = Color.black; // 日期文字色
        Color weekendFontColor = Color.red; // 周末文字色
        // 控制条配色------------------//
        Color controlLineColor = Color.pink; // 控制条底色
        Color controlTextColor = Color.white; // 控制条标签文字色
        /** 点击DateChooserButton时弹出的对话框,日历内容在这个对话框内 */
        JDialog dialog;
        JLabel[][] daysLabels = new JLabel[6][7];
        DateChooser() {
            setLayout(new BorderLayout());
            setBorder(new LineBorder(backGroundColor, 2));
            setBackground(backGroundColor);
            JPanel topYearAndMonth = createYearAndMonthPanal();
            add(topYearAndMonth, BorderLayout.NORTH);
            JPanel centerWeekAndDay = createWeekAndDayPanal();
            add(centerWeekAndDay, BorderLayout.CENTER);
            JPanel buttonBarPanel = createButtonBarPanel();
            this.add(buttonBarPanel, BorderLayout.SOUTH);
        }
        private JPanel createYearAndMonthPanal() {
            Calendar c = getCalendar();
            int currentYear = c.get(Calendar.YEAR);
            int currentMonth = c.get(Calendar.MONTH) + 1;
            int currentDay = c.get(Calendar.DAY_OF_MONTH);
            JPanel result = new JPanel();
            result.setLayout(new FlowLayout());
            result.setBackground(controlLineColor);
            yearSpin = new JSpinner(new SpinnerNumberModel(currentYear, startYear, lastYear, 1));
            yearSpin.setPreferredSize(new Dimension(48, 20));
            yearSpin.setName("Year");
            yearSpin.setEditor(new JSpinner.NumberEditor(yearSpin, "####"));
            yearSpin.addChangeListener(this);
            result.add(yearSpin);
            yearLabel = new JLabel(Res.string().getYear());
            yearLabel.setForeground(controlTextColor);
            result.add(yearLabel);
            monthSpin = new JSpinner(new SpinnerNumberModel(currentMonth, 1, 12, 1));
            monthSpin.setPreferredSize(new Dimension(35, 20));
            monthSpin.setName("Month");
            monthSpin.addChangeListener(this);
            result.add(monthSpin);
            monthLabel = new JLabel(Res.string().getMonth());
            monthLabel.setForeground(controlTextColor);
            result.add(monthLabel);
            //如果这里要能够选择,会要判断很多东西,比如每个月分别由多少日,以及闰年问题.所以,就干脆把Enable设为false
            daySpin = new JSpinner(new SpinnerNumberModel(currentDay, 1, 31, 1));
            daySpin.setPreferredSize(new Dimension(35, 20));
            daySpin.setName("Day");
            daySpin.addChangeListener(this);
            daySpin.setEnabled(false);
            result.add(daySpin);
            dayLabel = new JLabel(Res.string().getDay());
            dayLabel.setForeground(controlTextColor);
            result.add(dayLabel);
            return result;
        }
        private JPanel createWeekAndDayPanal() {
            Res.string().getWeek();
            JPanel result = new JPanel();
            // 设置固定字体,以免调用环境改变影响界面美观
            result.setFont(new Font("宋体", Font.PLAIN, 12));
            result.setLayout(new GridLayout(7, 7));
            result.setBackground(Color.white);
            JLabel cell;
            for (int i = 0; i < 7; i++) {
                cell = new JLabel(Res.string().getWeek()[i]);
                cell.setHorizontalAlignment(JLabel.RIGHT);
                if (i == 0 || i == 6) {
                    cell.setForeground(weekendFontColor);
                } else {
                    cell.setForeground(weekFontColor);
                }
                result.add(cell);
            }
//            int actionCommandId = 0;
            for (int i = 0; i < 6; i++) {
                for (int j = 0; j < 7; j++) {
                    JLabel numberLabel = new JLabel();
                    numberLabel.setBorder(null);
                    numberLabel.setHorizontalAlignment(SwingConstants.RIGHT);
//                    numberLabel.setActionCommand(String.valueOf(actionCommandId));
                    numberLabel.addMouseListener(this);
                    numberLabel.setBackground(palletTableColor);
                    numberLabel.setForeground(dateFontColor);
                    if (j == 0 || j == 6) {
                        numberLabel.setForeground(weekendFontColor);
                    } else {
                        numberLabel.setForeground(dateFontColor);
                    }
                    daysLabels[i][j] = numberLabel;
                    result.add(numberLabel);
//                    actionCommandId++;
                }
            }
            return result;
        }
        /** 得到DateChooserButton的当前text,本方法是为按钮事件匿名类准备的。 */
        public String getTextOfDateChooserButton() {
            return getText();
        }
        /** 恢复DateChooserButton的原始日期时间text,本方法是为按钮事件匿名类准备的。 */
        public void restoreTheOriginalDate() {
            String originalText = getOriginalText();
            setText(originalText);
        }
        private JPanel createButtonBarPanel() {
            JPanel panel = new JPanel();
            panel.setLayout(new GridLayout(1, 2));
            JButton ok = new JButton(Res.string().getConfirm());
            ok.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    //记忆原始日期时间
                    initOriginalText(getTextOfDateChooserButton());
                    //隐藏日历对话框
                    dialog.setVisible(false);
                }
            });
            panel.add(ok);
            JButton cancel = new JButton(Res.string().getCancel());
            cancel.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    //恢复原始的日期时间
                    restoreTheOriginalDate();
                    //隐藏日历对话框
                    dialog.setVisible(false);
                }
            });
            panel.add(cancel);
            return panel;
        }
        private JDialog createDialog() {
            JDialog result = new JDialog();
            result.setTitle(Res.string().getDateChooser());
            result.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            result.getContentPane().add(this, BorderLayout.CENTER);
            result.pack();
            result.setSize(width, height);
            result.setModal(true);
            result.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                     //恢复原始的日期时间
                    restoreTheOriginalDate();
                    //隐藏日历对话框
                    dialog.setVisible(false);
                }
            });
            return result;
        }
        void showDateChooser() {
            if (dialog == null) {
                dialog = createDialog();
            }
            dialog.setLocationRelativeTo(null);
            flushWeekAndDay();
            dialog.setVisible(true);
        }
        private Calendar getCalendar() {
            Calendar result = Calendar.getInstance();
            result.setTime(getDate());
            return result;
        }
        private int getSelectedYear() {
            return ((Integer) yearSpin.getValue()).intValue();
        }
        private int getSelectedMonth() {
            return ((Integer) monthSpin.getValue()).intValue();
        }
        private int getSelectedHour() {
            return ((Integer) hourSpin.getValue()).intValue();
        }
        private int getSelectedMinite() {
            return ((Integer) minuteSpin.getValue()).intValue();
        }
        private int getSelectedSecond() {
            return ((Integer) secondSpin.getValue()).intValue();
        }
        private void dayColorUpdate(boolean isOldDay) {
            Calendar c = getCalendar();
            int day = c.get(Calendar.DAY_OF_MONTH);
            c.set(Calendar.DAY_OF_MONTH, 1);
            int actionCommandId = day - 2 + c.get(Calendar.DAY_OF_WEEK);
            int i = actionCommandId / 7;
            int j = actionCommandId % 7;
            if (isOldDay) {
                daysLabels[i][j].setForeground(dateFontColor);
            } else {
                daysLabels[i][j].setForeground(todayBackColor);
            }
        }
        private void flushWeekAndDay() {
            Calendar c = getCalendar();
            c.set(Calendar.DAY_OF_MONTH, 1);
            int maxDayNo = c.getActualMaximum(Calendar.DAY_OF_MONTH);
            int dayNo = 2 - c.get(Calendar.DAY_OF_WEEK);
            for (int i = 0; i < 6; i++) {
                for (int j = 0; j < 7; j++) {
                    String s = "";
                    if (dayNo >= 1 && dayNo <= maxDayNo) {
                        s = String.valueOf(dayNo);
                    }
                    daysLabels[i][j].setText(s);
                    dayNo++;
                }
            }
            // 打开日历时,根据按钮的时间,设置日历的时间
            String[] date1 = getText().split(" ")[0].split("-");
            yearSpin.setValue(new Integer(date1[0]));
            monthSpin.setValue(new Integer(date1[1]));
            daySpin.setValue(new Integer(date1[2]));
            // 重置日历天的数字颜色
            for(int i = 0; i < 6; i++) {
                for(int j = 0; j < 7; j++) {
                    if(!daysLabels[i][j].getText().equals("")) {
                        daysLabels[i][j].setForeground(Color.BLACK);
                    }
                }
            }
            // 重置日历星期六、星期日的数字颜色
            for(int i = 0; i < 6; i++) {
                if(!daysLabels[i][0].getText().equals("")) {
                    daysLabels[i][0].setForeground(weekendFontColor);
                }
                if(!daysLabels[i][6].getText().equals("")) {
                    daysLabels[i][6].setForeground(weekendFontColor);
                }
            }
            // 设置当天的数字颜色
            for(int i = 0; i < 6; i++) {
                for(int j = 0; j < 7; j++) {
                    if(daysLabels[i][j].getText().equals(date1[2])) {
                        daysLabels[i][j].setForeground(todayBackColor);
                    }
                }
            }
            dayColorUpdate(false);
        }
        /**
         * 选择日期时的响应事件
         */
        @Override
        public void stateChanged(ChangeEvent e) {
            JSpinner source = (JSpinner) e.getSource();
            Calendar c = getCalendar();
            if (source.getName().equals("Hour")) {
                c.set(Calendar.HOUR_OF_DAY, getSelectedHour());
                setDate(c.getTime());
                return;
            }
            if (source.getName().equals("Minute")) {
                c.set(Calendar.MINUTE, getSelectedMinite());
                setDate(c.getTime());
                return;
            }
            if (source.getName().equals("Second")) {
                c.set(Calendar.SECOND, getSelectedSecond());
                setDate(c.getTime());
                return;
            }
            dayColorUpdate(true);
            if (source.getName().equals("Year")) {
                c.set(Calendar.YEAR, getSelectedYear());
            } else if (source.getName().equals("Month")) {
                c.set(Calendar.MONTH, getSelectedMonth() - 1);
            }
            setDate(c.getTime());
            flushWeekAndDay();
        }
        /**
         * 选择日期时的响应事件
         */
        @Override
        public void mouseClicked(MouseEvent e) {
            JLabel source = (JLabel) e.getSource();
            if (source.getText().length() == 0) {
                return;
            }
            dayColorUpdate(true);
            source.setForeground(todayBackColor);
            int newDay = Integer.parseInt(source.getText());
            Calendar c = getCalendar();
            c.set(Calendar.DAY_OF_MONTH, newDay);
            setDate(c.getTime());
            //把daySpin中的值也变了
            daySpin.setValue(Integer.valueOf(newDay));
        }
        @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub
        }
        @Override
        public void mouseExited(MouseEvent arg0) {
            // TODO Auto-generated method stub
        }
        @Override
        public void mousePressed(MouseEvent arg0) {
            // TODO Auto-generated method stub
        }
        @Override
        public void mouseReleased(MouseEvent arg0) {
            // TODO Auto-generated method stub
        }
    }
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/DeviceManagerListener.java
对比新文件
@@ -0,0 +1,5 @@
package com.ruoyi.device.dhsdk.common;
public interface DeviceManagerListener {
    void onDeviceManager(String deviceId, String username, String password);
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/ErrorCode.java
对比新文件
@@ -0,0 +1,871 @@
package com.ruoyi.device.dhsdk.common;
import com.ruoyi.device.dhsdk.lib.LastError;
/**
 * 登录设备设备错误状态
 */
public class ErrorCode {
    /**
     * 登录设备设备错误状态中英文
     * @param err 接口CLIENT_GetLastError返回, error code: (0x80000000|" + (LoginModule.netsdk.CLIENT_GetLastError() & 0x7fffffff) +")
     * @return
     */
    public static String getErrorCode(int err) {
        String msg = "";
        switch(err) {
        case LastError.NET_NOERROR:  // 0  没有错误
            msg = Res.string().getBundle().getString("NET_ERROR");
            break;
        case LastError.NET_ERROR:  // -1  未知错误
            msg = Res.string().getBundle().getString("NET_ERROR");
            break;
        case LastError.NET_SYSTEM_ERROR: // (0x80000000|1) Windows系统出错
            msg = Res.string().getBundle().getString("NET_SYSTEM_ERROR");
            break;
        case LastError.NET_NETWORK_ERROR: // (0x80000000|2) 网络错误,可能是因为网络超时
            msg = Res.string().getBundle().getString("NET_NETWORK_ERROR");
            break;
        case LastError.NET_DEV_VER_NOMATCH: // (0x80000000|3) 设备协议不匹配
            msg = Res.string().getBundle().getString("NET_DEV_VER_NOMATCH");
            break;
        case LastError.NET_INVALID_HANDLE: // (0x80000000|4) 句柄无效
            msg = Res.string().getBundle().getString("NET_INVALID_HANDLE");
            break;
        case LastError.NET_OPEN_CHANNEL_ERROR: // (0x80000000|5) 打开通道失败
            msg = Res.string().getBundle().getString("NET_OPEN_CHANNEL_ERROR");
            break;
        case LastError.NET_CLOSE_CHANNEL_ERROR: // (0x80000000|6) 关闭通道失败
            msg = Res.string().getBundle().getString("NET_CLOSE_CHANNEL_ERROR");
            break;
        case LastError.NET_ILLEGAL_PARAM: // (0x80000000|7) 用户参数不合法
            msg = Res.string().getBundle().getString("NET_ILLEGAL_PARAM");
            break;
        case LastError.NET_SDK_INIT_ERROR: // (0x80000000|8) SDK初始化出错
            msg = Res.string().getBundle().getString("NET_SDK_INIT_ERROR");
            break;
        case LastError.NET_SDK_UNINIT_ERROR: // (0x80000000|9) SDK清理出错
            msg = Res.string().getBundle().getString("NET_SDK_UNINIT_ERROR");
            break;
        case LastError.NET_RENDER_OPEN_ERROR: // (0x80000000|10) 申请render资源出错
            msg = Res.string().getBundle().getString("NET_RENDER_OPEN_ERROR");
            break;
        case LastError.NET_DEC_OPEN_ERROR: // (0x80000000|11) 打开解码库出错
            msg = Res.string().getBundle().getString("NET_DEC_OPEN_ERROR");
            break;
        case LastError.NET_DEC_CLOSE_ERROR: // (0x80000000|12) 关闭解码库出错
            msg = Res.string().getBundle().getString("NET_DEC_CLOSE_ERROR");
            break;
        case LastError.NET_MULTIPLAY_NOCHANNEL: // (0x80000000|13) 多画面预览中检测到通道数为0
            msg = Res.string().getBundle().getString("NET_MULTIPLAY_NOCHANNEL");
            break;
        case LastError.NET_TALK_INIT_ERROR: // (0x80000000|14) 录音库初始化失败
            msg = Res.string().getBundle().getString("NET_TALK_INIT_ERROR");
            break;
        case LastError.NET_TALK_NOT_INIT:  // (0x80000000|15) 录音库未经初始化
            msg = Res.string().getBundle().getString("NET_TALK_NOT_INIT");
            break;
        case LastError.NET_TALK_SENDDATA_ERROR: // (0x80000000|16) 发送音频数据出错
            msg = Res.string().getBundle().getString("NET_TALK_SENDDATA_ERROR");
            break;
        case LastError.NET_REAL_ALREADY_SAVING: // (0x80000000|17) 实时数据已经处于保存状态
            msg = Res.string().getBundle().getString("NET_REAL_ALREADY_SAVING");
            break;
        case LastError.NET_NOT_SAVING: // (0x80000000|18) 未保存实时数据
            msg = Res.string().getBundle().getString("NET_NOT_SAVING");
            break;
        case LastError.NET_OPEN_FILE_ERROR: // (0x80000000|19) 打开文件出错
            msg = Res.string().getBundle().getString("NET_OPEN_FILE_ERROR");
            break;
        case LastError.NET_PTZ_SET_TIMER_ERROR: // (0x80000000|20) 启动云台控制定时器失败
            msg = Res.string().getBundle().getString("NET_PTZ_SET_TIMER_ERROR");
            break;
        case LastError.NET_RETURN_DATA_ERROR: // (0x80000000|21) 对返回数据的校验出错
            msg = Res.string().getBundle().getString("NET_RETURN_DATA_ERROR");
            break;
        case LastError.NET_INSUFFICIENT_BUFFER: // (0x80000000|22) 没有足够的缓存
            msg = Res.string().getBundle().getString("NET_INSUFFICIENT_BUFFER");
            break;
        case LastError.NET_NOT_SUPPORTED: // (0x80000000|23) 当前SDK未支持该功能
            msg = Res.string().getBundle().getString("NET_NOT_SUPPORTED");
            break;
        case LastError.NET_NO_RECORD_FOUND: // (0x80000000|24) 查询不到录像
            msg = Res.string().getBundle().getString("NET_NO_RECORD_FOUND");
            break;
        case LastError.NET_NOT_AUTHORIZED: // (0x80000000|25) 无操作权限
            msg = Res.string().getBundle().getString("NET_NOT_AUTHORIZED");
            break;
        case LastError.NET_NOT_NOW: // (0x80000000|26) 暂时无法执行
            msg = Res.string().getBundle().getString("NET_NOT_NOW");
            break;
        case LastError.NET_NO_TALK_CHANNEL: // (0x80000000|27) 未发现对讲通道
            msg = Res.string().getBundle().getString("NET_NO_TALK_CHANNEL");
            break;
        case LastError.NET_NO_AUDIO: // (0x80000000|28) 未发现音频
            msg = Res.string().getBundle().getString("NET_NO_AUDIO");
            break;
        case LastError.NET_NO_INIT: // (0x80000000|29) 网络SDK未经初始化
            msg = Res.string().getBundle().getString("NET_NO_INIT");
            break;
        case LastError.NET_DOWNLOAD_END: // (0x80000000|30) 下载已结束
            msg = Res.string().getBundle().getString("NET_DOWNLOAD_END");
            break;
        case LastError.NET_EMPTY_LIST: // (0x80000000|31) 查询结果为空
            msg = Res.string().getBundle().getString("NET_EMPTY_LIST");
            break;
        case LastError.NET_ERROR_GETCFG_SYSATTR: // (0x80000000|32) 获取系统属性配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_SYSATTR");
            break;
        case LastError.NET_ERROR_GETCFG_SERIAL: // (0x80000000|33) 获取序列号失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_SERIAL");
            break;
        case LastError.NET_ERROR_GETCFG_GENERAL: // (0x80000000|34) 获取常规属性失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_GENERAL");
            break;
        case LastError.NET_ERROR_GETCFG_DSPCAP: // (0x80000000|35) 获取DSP能力描述失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_DSPCAP");
            break;
        case LastError.NET_ERROR_GETCFG_NETCFG: // (0x80000000|36) 获取网络配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_NETCFG");
            break;
        case LastError.NET_ERROR_GETCFG_CHANNAME: // (0x80000000|37) 获取通道名称失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_CHANNAME");
            break;
        case LastError.NET_ERROR_GETCFG_VIDEO: // (0x80000000|38) 获取视频属性失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_VIDEO");
            break;
        case LastError.NET_ERROR_GETCFG_RECORD: // (0x80000000|39) 获取录象配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_RECORD");
            break;
        case LastError.NET_ERROR_GETCFG_PRONAME: // (0x80000000|40) 获取解码器协议名称失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_PRONAME");
            break;
        case LastError.NET_ERROR_GETCFG_FUNCNAME: // (0x80000000|41)  获取232串口功能名称失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_FUNCNAME");
            break;
        case LastError.NET_ERROR_GETCFG_485DECODER: // (0x80000000|42) 获取解码器属性失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_485DECODER");
            break;
        case LastError.NET_ERROR_GETCFG_232COM:   // (0x80000000|43) 获取232串口配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_232COM");
            break;
        case LastError.NET_ERROR_GETCFG_ALARMIN:  // (0x80000000|44) 获取外部报警输入配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_ALARMIN");
            break;
        case LastError.NET_ERROR_GETCFG_ALARMDET: // (0x80000000|45) 获取动态检测报警失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_ALARMDET");
            break;
        case LastError.NET_ERROR_GETCFG_SYSTIME: // (0x80000000|46) 获取设备时间失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_SYSTIME");
            break;
        case LastError.NET_ERROR_GETCFG_PREVIEW: // (0x80000000|47) 获取预览参数失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_PREVIEW");
            break;
        case LastError.NET_ERROR_GETCFG_AUTOMT: // (0x80000000|48) 获取自动维护配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_AUTOMT");
            break;
        case LastError.NET_ERROR_GETCFG_VIDEOMTRX: // (0x80000000|49) 获取视频矩阵配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_VIDEOMTRX");
            break;
        case LastError.NET_ERROR_GETCFG_COVER:  // (0x80000000|50) 获取区域遮挡配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_COVER");
            break;
        case LastError.NET_ERROR_GETCFG_WATERMAKE: // (0x80000000|51) 获取图象水印配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_WATERMAKE");
            break;
        case LastError.NET_ERROR_GETCFG_MULTICAST: // (0x80000000|52) 获取配置失败位置:组播端口按通道配置
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_MULTICAST");
            break;
        case LastError.NET_ERROR_SETCFG_GENERAL:  // (0x80000000|55) 修改常规属性失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_GENERAL");
            break;
        case LastError.NET_ERROR_SETCFG_NETCFG:  // (0x80000000|56) 改网络配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_NETCFG");
            break;
        case LastError.NET_ERROR_SETCFG_CHANNAME: // (0x80000000|57) 修改通道名称失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_CHANNAME");
            break;
        case LastError.NET_ERROR_SETCFG_VIDEO:  // (0x80000000|58) 修改视频属性失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_VIDEO");
            break;
        case LastError.NET_ERROR_SETCFG_RECORD: // (0x80000000|59) 修改录象配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_RECORD");
            break;
        case LastError.NET_ERROR_SETCFG_485DECODER: // (0x80000000|60) 修改解码器属性失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_485DECODER");
            break;
        case LastError.NET_ERROR_SETCFG_232COM:  // (0x80000000|61) 修改232串口配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_232COM");
            break;
        case LastError.NET_ERROR_SETCFG_ALARMIN: // (0x80000000|62) 修改外部输入报警配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_ALARMIN");
            break;
        case LastError.NET_ERROR_SETCFG_ALARMDET: // (0x80000000|63)  修改动态检测报警配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_ALARMDET");
            break;
        case LastError.NET_ERROR_SETCFG_SYSTIME: // (0x80000000|64) 修改设备时间失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_SYSTIME");
            break;
        case LastError.NET_ERROR_SETCFG_PREVIEW: // (0x80000000|65) 修改预览参数失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_PREVIEW");
            break;
        case LastError.NET_ERROR_SETCFG_AUTOMT: // (0x80000000|66) 修改自动维护配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_AUTOMT");
            break;
        case LastError.NET_ERROR_SETCFG_VIDEOMTRX: // (0x80000000|67) 修改视频矩阵配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_VIDEOMTRX");
            break;
        case LastError.NET_ERROR_SETCFG_COVER:  // (0x80000000|68) 修改区域遮挡配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_COVER");
            break;
        case LastError.NET_ERROR_SETCFG_WATERMAKE: // (0x80000000|69) 修改图象水印配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_WATERMAKE");
            break;
        case LastError.NET_ERROR_SETCFG_WLAN:  // (0x80000000|70) 修改无线网络信息失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_WLAN");
            break;
        case LastError.NET_ERROR_SETCFG_WLANDEV: // (0x80000000|71) 选择无线网络设备失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_WLANDEV");
            break;
        case LastError.NET_ERROR_SETCFG_REGISTER: // (0x80000000|72) 修改主动注册参数配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_REGISTER");
            break;
        case LastError.NET_ERROR_SETCFG_CAMERA:  // (0x80000000|73) 修改摄像头属性配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_CAMERA");
            break;
        case LastError.NET_ERROR_SETCFG_INFRARED: // (0x80000000|74)  修改红外报警配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_INFRARED");
            break;
        case LastError.NET_ERROR_SETCFG_SOUNDALARM: // (0x80000000|75) 修改音频报警配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_SOUNDALARM");
            break;
        case LastError.NET_ERROR_SETCFG_STORAGE:  // (0x80000000|76) 修改存储位置配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_STORAGE");
            break;
        case LastError.NET_AUDIOENCODE_NOTINIT:  // (0x80000000|77) 音频编码接口没有成功初始化
            msg = Res.string().getBundle().getString("NET_AUDIOENCODE_NOTINIT");
            break;
        case LastError.NET_DATA_TOOLONGH:  // (0x80000000|78) 数据过长
            msg = Res.string().getBundle().getString("NET_DATA_TOOLONGH");
            break;
        case LastError.NET_UNSUPPORTED:  // (0x80000000|79) 备不支持该操作
            msg = Res.string().getBundle().getString("NET_UNSUPPORTED");
            break;
        case LastError.NET_DEVICE_BUSY:  // (0x80000000|80) 设备资源不足
            msg = Res.string().getBundle().getString("NET_DEVICE_BUSY");
            break;
        case LastError.NET_SERVER_STARTED: // (0x80000000|81) 服务器已经启动
            msg = Res.string().getBundle().getString("NET_SERVER_STARTED");
            break;
        case LastError.NET_SERVER_STOPPED: // (0x80000000|82) 服务器尚未成功启动
            msg = Res.string().getBundle().getString("NET_SERVER_STOPPED");
            break;
        case LastError.NET_LISTER_INCORRECT_SERIAL: // (0x80000000|83) 输入序列号有误
            msg = Res.string().getBundle().getString("NET_LISTER_INCORRECT_SERIAL");
            break;
        case LastError.NET_QUERY_DISKINFO_FAILED:  // (0x80000000|84) 获取硬盘信息失败
            msg = Res.string().getBundle().getString("NET_QUERY_DISKINFO_FAILED");
            break;
        case LastError.NET_ERROR_GETCFG_SESSION:  // (0x80000000|85) 获取连接Session信息
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_SESSION");
            break;
        case LastError.NET_USER_FLASEPWD_TRYTIME: // (0x80000000|86) 输入密码错误超过限制次数
            msg = Res.string().getBundle().getString("NET_USER_FLASEPWD_TRYTIME");
            break;
        case LastError.NET_LOGIN_ERROR_PASSWORD:  // (0x80000000|100) 密码不正确
            msg = Res.string().getBundle().getString("NET_LOGIN_ERROR_PASSWORD");
            break;
        case LastError.NET_LOGIN_ERROR_USER:  // (0x80000000|101) 帐户不存在
            msg = Res.string().getBundle().getString("NET_LOGIN_ERROR_USER");
            break;
        case LastError.NET_LOGIN_ERROR_TIMEOUT:  // (0x80000000|102) 等待登录返回超时
            msg = Res.string().getBundle().getString("NET_LOGIN_ERROR_TIMEOUT");
            break;
        case LastError.NET_LOGIN_ERROR_RELOGGIN: // (0x80000000|103) 帐号已登录
            msg = Res.string().getBundle().getString("NET_LOGIN_ERROR_RELOGGIN");
            break;
        case LastError.NET_LOGIN_ERROR_LOCKED:  // (0x80000000|104) 帐号已被锁定
            msg = Res.string().getBundle().getString("NET_LOGIN_ERROR_LOCKED");
            break;
        case LastError.NET_LOGIN_ERROR_BLACKLIST: // (0x80000000|105) 帐号已被列为禁止名单
            msg = Res.string().getBundle().getString("NET_LOGIN_ERROR_BLACKLIST");
            break;
        case LastError.NET_LOGIN_ERROR_BUSY:  // (0x80000000|106) 资源不足,系统忙
            msg = Res.string().getBundle().getString("NET_LOGIN_ERROR_BUSY");
            break;
        case LastError.NET_LOGIN_ERROR_CONNECT:  // (0x80000000|107) 登录设备超时,请检查网络并重试
            msg = Res.string().getBundle().getString("NET_LOGIN_ERROR_CONNECT");
            break;
        case LastError.NET_LOGIN_ERROR_NETWORK: // (0x80000000|108)  网络连接失败
            msg = Res.string().getBundle().getString("NET_LOGIN_ERROR_NETWORK");
            break;
        case LastError.NET_LOGIN_ERROR_SUBCONNECT: // (0x80000000|109) 登录设备成功,但无法创建视频通道,请检查网
            msg = Res.string().getBundle().getString("NET_LOGIN_ERROR_SUBCONNECT");
            break;
        case LastError.NET_LOGIN_ERROR_MAXCONNECT:  // (0x80000000|110) 超过最大连接数
            msg = Res.string().getBundle().getString("NET_LOGIN_ERROR_MAXCONNECT");
            break;
        case LastError.NET_LOGIN_ERROR_PROTOCOL3_ONLY: // (0x80000000|111) 只支持3代协议
            msg = Res.string().getBundle().getString("NET_LOGIN_ERROR_PROTOCOL3_ONLY");
            break;
        case LastError.NET_LOGIN_ERROR_UKEY_LOST:  // (0x80000000|112) 插入U盾或U盾信息错误
            msg = Res.string().getBundle().getString("NET_LOGIN_ERROR_UKEY_LOST");
            break;
        case LastError.NET_LOGIN_ERROR_NO_AUTHORIZED: // (0x80000000|113) 客户端IP地址没有登录权限
            msg = Res.string().getBundle().getString("NET_LOGIN_ERROR_NO_AUTHORIZED");
            break;
        case LastError.NET_LOGIN_ERROR_USER_OR_PASSOWRD:  // (0x80000000|117) 账号或密码错误
            msg = Res.string().getBundle().getString("NET_LOGIN_ERROR_USER_OR_PASSOWRD");
            break;
        case LastError.NET_LOGIN_ERROR_DEVICE_NOT_INIT:  // (0x80000000|118) 设备尚未初始化,不能登录,请先初始化设备
            msg = Res.string().getBundle().getString("NET_LOGIN_ERROR_DEVICE_NOT_INIT");
            break;
        case LastError.NET_RENDER_SOUND_ON_ERROR:  // (0x80000000|120) Render库打开音频出错
            msg = Res.string().getBundle().getString("NET_RENDER_SOUND_ON_ERROR");
            break;
        case LastError.NET_RENDER_SOUND_OFF_ERROR: // (0x80000000|121) Render库关闭音频出错
            msg = Res.string().getBundle().getString("NET_RENDER_SOUND_OFF_ERROR");
            break;
        case LastError.NET_RENDER_SET_VOLUME_ERROR: // (0x80000000|122) Render库控制音量出错
            msg = Res.string().getBundle().getString("NET_RENDER_SET_VOLUME_ERROR");
            break;
        case LastError.NET_RENDER_ADJUST_ERROR:  // (0x80000000|123) Render库设置画面参数出错
            msg = Res.string().getBundle().getString("NET_RENDER_ADJUST_ERROR");
            break;
        case LastError.NET_RENDER_PAUSE_ERROR: // (0x80000000|124) Render库暂停播放出错
            msg = Res.string().getBundle().getString("NET_RENDER_PAUSE_ERROR");
            break;
        case LastError.NET_RENDER_SNAP_ERROR:  // (0x80000000|125) Render库抓图出错
            msg = Res.string().getBundle().getString("NET_RENDER_SNAP_ERROR");
            break;
        case LastError.NET_RENDER_STEP_ERROR:  // (0x80000000|126) Render库步进出错
            msg = Res.string().getBundle().getString("NET_RENDER_STEP_ERROR");
            break;
        case LastError.NET_RENDER_FRAMERATE_ERROR:  // (0x80000000|127) Render库设置帧率出错
            msg = Res.string().getBundle().getString("NET_RENDER_FRAMERATE_ERROR");
            break;
        case LastError.NET_RENDER_DISPLAYREGION_ERROR: // (0x80000000|128) Render库设置显示区域出错
            msg = Res.string().getBundle().getString("NET_RENDER_DISPLAYREGION_ERROR");
            break;
        case LastError.NET_RENDER_GETOSDTIME_ERROR: // (0x80000000|129) Render库获取当前播放时间出错
            msg = Res.string().getBundle().getString("NET_RENDER_GETOSDTIME_ERROR");
            break;
        case LastError.NET_GROUP_EXIST: // (0x80000000|140) 组名已存在
            msg = Res.string().getBundle().getString("NET_GROUP_EXIST");
            break;
        case LastError.NET_GROUP_NOEXIST: // (0x80000000|141) 组名不存在
            msg = Res.string().getBundle().getString("NET_GROUP_NOEXIST");
            break;
        case LastError.NET_GROUP_RIGHTOVER: // (0x80000000|142) 组的权限超出权限列表范围
            msg = Res.string().getBundle().getString("NET_GROUP_RIGHTOVER");
            break;
        case LastError.NET_GROUP_HAVEUSER: // (0x80000000|143) 组下有用户,不能删除
            msg = Res.string().getBundle().getString("NET_GROUP_HAVEUSER");
            break;
        case LastError.NET_GROUP_RIGHTUSE: // (0x80000000|144) 组的某个权限被用户使用,不能出除
            msg = Res.string().getBundle().getString("NET_GROUP_RIGHTUSE");
            break;
        case LastError.NET_GROUP_SAMENAME: // (0x80000000|145) 新组名同已有组名重复
            msg = Res.string().getBundle().getString("NET_GROUP_SAMENAME");
            break;
        case LastError.NET_USER_EXIST:  // (0x80000000|146) 用户已存在
            msg = Res.string().getBundle().getString("NET_USER_EXIST");
            break;
        case LastError.NET_USER_NOEXIST: // (0x80000000|147) 用户不存在
            msg = Res.string().getBundle().getString("NET_USER_NOEXIST");
            break;
        case LastError.NET_USER_RIGHTOVER: // (0x80000000|148) 用户权限超出组权限
            msg = Res.string().getBundle().getString("NET_USER_RIGHTOVER");
            break;
        case LastError.NET_USER_PWD: // (0x80000000|149) 保留帐号,不容许修改密码
            msg = Res.string().getBundle().getString("NET_USER_PWD");
            break;
        case LastError.NET_USER_FLASEPWD: // (0x80000000|150) 密码不正确
            msg = Res.string().getBundle().getString("NET_USER_FLASEPWD");
            break;
        case LastError.NET_USER_NOMATCHING: // (0x80000000|151)  密码不匹配
            msg = Res.string().getBundle().getString("NET_USER_NOMATCHING");
            break;
        case LastError.NET_USER_INUSE: // (0x80000000|152)  账号正在使用中
            msg = Res.string().getBundle().getString("NET_USER_INUSE");
            break;
        case LastError.NET_ERROR_GETCFG_ETHERNET: // (0x80000000|300) 获取网卡配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_ETHERNET");
            break;
        case LastError.NET_ERROR_GETCFG_WLAN: // (0x80000000|301) 获取无线网络信息失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_WLAN");
            break;
        case LastError.NET_ERROR_GETCFG_WLANDEV:  // (0x80000000|302) 获取无线网络设备失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_WLANDEV");
            break;
        case LastError.NET_ERROR_GETCFG_REGISTER: // (0x80000000|303) 获取主动注册参数失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_REGISTER");
            break;
        case LastError.NET_ERROR_GETCFG_CAMERA: // (0x80000000|304) 获取摄像头属性失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_CAMERA");
            break;
        case LastError.NET_ERROR_GETCFG_INFRARED: // (0x80000000|305) 获取红外报警配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_INFRARED");
            break;
        case LastError.NET_ERROR_GETCFG_SOUNDALARM: // (0x80000000|306)  获取音频报警配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_SOUNDALARM");
            break;
        case LastError.NET_ERROR_GETCFG_STORAGE:  // (0x80000000|307)  获取存储位置配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_STORAGE");
            break;
        case LastError.NET_ERROR_GETCFG_MAIL:  // (0x80000000|308) 获取邮件配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_MAIL");
            break;
        case LastError.NET_CONFIG_DEVBUSY: // (0x80000000|309) 暂时无法设置
            msg = Res.string().getBundle().getString("NET_CONFIG_DEVBUSY");
            break;
        case LastError.NET_CONFIG_DATAILLEGAL: // (0x80000000|310) 配置数据不合法
            msg = Res.string().getBundle().getString("NET_CONFIG_DATAILLEGAL");
            break;
        case LastError.NET_ERROR_GETCFG_DST: // (0x80000000|311) 获取夏令时配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_DST");
            break;
        case LastError.NET_ERROR_SETCFG_DST: // (0x80000000|312) 设置夏令时配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_DST");
            break;
        case LastError.NET_ERROR_GETCFG_VIDEO_OSD: // (0x80000000|313) 获取视频OSD叠加配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_VIDEO_OSD");
            break;
        case LastError.NET_ERROR_SETCFG_VIDEO_OSD:  // (0x80000000|314) 设置视频OSD叠加配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_VIDEO_OSD");
            break;
        case LastError.NET_ERROR_GETCFG_GPRSCDMA:  // (0x80000000|315) 获取CDMA\GPRS网络配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_GPRSCDMA");
            break;
        case LastError.NET_ERROR_SETCFG_GPRSCDMA: // (0x80000000|316) 设置CDMA\GPRS网络配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_GPRSCDMA");
            break;
        case LastError.NET_ERROR_GETCFG_IPFILTER: // (0x80000000|317) 获取IP过滤配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_IPFILTER");
            break;
        case LastError.NET_ERROR_SETCFG_IPFILTER: // (0x80000000|318) 设置IP过滤配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_IPFILTER");
            break;
        case LastError.NET_ERROR_GETCFG_TALKENCODE: // (0x80000000|319) 获取语音对讲编码配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_TALKENCODE");
            break;
        case LastError.NET_ERROR_SETCFG_TALKENCODE: // (0x80000000|320) 设置语音对讲编码配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_TALKENCODE");
            break;
        case LastError.NET_ERROR_GETCFG_RECORDLEN: // (0x80000000|321) 获取录像打包长度配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_RECORDLEN");
            break;
        case LastError.NET_ERROR_SETCFG_RECORDLEN: // (0x80000000|322) 设置录像打包长度配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_RECORDLEN");
            break;
        case LastError.NET_DONT_SUPPORT_SUBAREA: // (0x80000000|323) 不支持网络硬盘分区
            msg = Res.string().getBundle().getString("NET_DONT_SUPPORT_SUBAREA");
            break;
        case LastError.NET_ERROR_GET_AUTOREGSERVER: // (0x80000000|324) 获取设备上主动注册服务器信息失败
            msg = Res.string().getBundle().getString("NET_ERROR_GET_AUTOREGSERVER");
            break;
        case LastError.NET_ERROR_CONTROL_AUTOREGISTER: // (0x80000000|325) 主动注册重定向注册错误
            msg = Res.string().getBundle().getString("NET_ERROR_CONTROL_AUTOREGISTER");
            break;
        case LastError.NET_ERROR_DISCONNECT_AUTOREGISTER: // (0x80000000|326) 断开主动注册服务器错误
            msg = Res.string().getBundle().getString("NET_ERROR_DISCONNECT_AUTOREGISTER");
            break;
        case LastError.NET_ERROR_GETCFG_MMS: // (0x80000000|327) 获取mms配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_MMS");
            break;
        case LastError.NET_ERROR_SETCFG_MMS: // (0x80000000|328) 设置mms配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_MMS");
            break;
        case LastError.NET_ERROR_GETCFG_SMSACTIVATION: // (0x80000000|329) 获取短信激活无线连接配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_SMSACTIVATION");
            break;
        case LastError.NET_ERROR_SETCFG_SMSACTIVATION: // (0x80000000|330) 设置短信激活无线连接配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_SMSACTIVATION");
            break;
        case LastError.NET_ERROR_GETCFG_DIALINACTIVATION: // (0x80000000|331) 获取拨号激活无线连接配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_DIALINACTIVATION");
            break;
        case LastError.NET_ERROR_SETCFG_DIALINACTIVATION: // (0x80000000|332) 设置拨号激活无线连接配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_DIALINACTIVATION");
            break;
        case LastError.NET_ERROR_GETCFG_VIDEOOUT: // (0x80000000|333) 查询视频输出参数配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_VIDEOOUT");
            break;
        case LastError.NET_ERROR_SETCFG_VIDEOOUT: // (0x80000000|334) 设置视频输出参数配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_VIDEOOUT");
            break;
        case LastError.NET_ERROR_GETCFG_OSDENABLE: // (0x80000000|335) 获取osd叠加使能配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_OSDENABLE");
            break;
        case LastError.NET_ERROR_SETCFG_OSDENABLE: // (0x80000000|336) 设置osd叠加使能配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_OSDENABLE");
            break;
        case LastError.NET_ERROR_SETCFG_ENCODERINFO: // (0x80000000|337) 设置数字通道前端编码接入配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_ENCODERINFO");
            break;
        case LastError.NET_ERROR_GETCFG_TVADJUST: // (0x80000000|338) 获取TV调节配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_TVADJUST");
            break;
        case LastError.NET_ERROR_SETCFG_TVADJUST: // (0x80000000|339) 设置TV调节配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_TVADJUST");
            break;
        case LastError.NET_ERROR_CONNECT_FAILED: // (0x80000000|340) 请求建立连接失败
            msg = Res.string().getBundle().getString("NET_ERROR_CONNECT_FAILED");
            break;
        case LastError.NET_ERROR_SETCFG_BURNFILE: // (0x80000000|341) 请求刻录文件上传失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_BURNFILE");
            break;
        case LastError.NET_ERROR_SNIFFER_GETCFG: // (0x80000000|342) 获取抓包配置信息失败
            msg = Res.string().getBundle().getString("NET_ERROR_SNIFFER_GETCFG");
            break;
        case LastError.NET_ERROR_SNIFFER_SETCFG: // (0x80000000|343) 设置抓包配置信息失败
            msg = Res.string().getBundle().getString("NET_ERROR_SNIFFER_SETCFG");
            break;
        case LastError.NET_ERROR_DOWNLOADRATE_GETCFG: // (0x80000000|344) 查询下载限制信息失败
            msg = Res.string().getBundle().getString("NET_ERROR_DOWNLOADRATE_GETCFG");
            break;
        case LastError.NET_ERROR_DOWNLOADRATE_SETCFG: // (0x80000000|345) 设置下载限制信息失败
            msg = Res.string().getBundle().getString("NET_ERROR_DOWNLOADRATE_SETCFG");
            break;
        case LastError.NET_ERROR_SEARCH_TRANSCOM:  // (0x80000000|346) 查询串口参数失败
            msg = Res.string().getBundle().getString("NET_ERROR_SEARCH_TRANSCOM");
            break;
        case LastError.NET_ERROR_GETCFG_POINT: // (0x80000000|347) 获取预制点信息错误
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_POINT");
            break;
        case LastError.NET_ERROR_SETCFG_POINT: // (0x80000000|348) 设置预制点信息错误
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_POINT");
            break;
        case LastError.NET_SDK_LOGOUT_ERROR:  // (0x80000000|349) SDK没有正常登出设备
            msg = Res.string().getBundle().getString("NET_SDK_LOGOUT_ERROR");
            break;
        case LastError.NET_ERROR_GET_VEHICLE_CFG: // (0x80000000|350) 获取车载配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GET_VEHICLE_CFG");
            break;
        case LastError.NET_ERROR_SET_VEHICLE_CFG: // (0x80000000|351) 设置车载配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SET_VEHICLE_CFG");
            break;
        case LastError.NET_ERROR_GET_ATM_OVERLAY_CFG: // (0x80000000|352) 获取atm叠加配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GET_ATM_OVERLAY_CFG");
            break;
        case LastError.NET_ERROR_SET_ATM_OVERLAY_CFG: // (0x80000000|353) 设置atm叠加配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SET_ATM_OVERLAY_CFG");
            break;
        case LastError.NET_ERROR_GET_ATM_OVERLAY_ABILITY: // (0x80000000|354) 获取atm叠加能力失败
            msg = Res.string().getBundle().getString("NET_ERROR_GET_ATM_OVERLAY_ABILITY");
            break;
        case LastError.NET_ERROR_GET_DECODER_TOUR_CFG: // (0x80000000|355) 获取解码器解码轮巡配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GET_DECODER_TOUR_CFG");
            break;
        case LastError.NET_ERROR_SET_DECODER_TOUR_CFG: // (0x80000000|356) 设置解码器解码轮巡配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SET_DECODER_TOUR_CFG");
            break;
        case LastError.NET_ERROR_CTRL_DECODER_TOUR: // (0x80000000|357) 控制解码器解码轮巡失败
            msg = Res.string().getBundle().getString("NET_ERROR_CTRL_DECODER_TOUR");
            break;
        case LastError.NET_GROUP_OVERSUPPORTNUM:  // (0x80000000|358) 超出设备支持最大用户组数目
            msg = Res.string().getBundle().getString("NET_GROUP_OVERSUPPORTNUM");
            break;
        case LastError.NET_USER_OVERSUPPORTNUM: // (0x80000000|359) 超出设备支持最大用户数目
            msg = Res.string().getBundle().getString("NET_USER_OVERSUPPORTNUM");
            break;
        case LastError.NET_ERROR_GET_SIP_CFG:  // (0x80000000|368) 获取SIP配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GET_SIP_CFG");
            break;
        case LastError.NET_ERROR_SET_SIP_CFG:  // (0x80000000|369) 设置SIP配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SET_SIP_CFG");
            break;
        case LastError.NET_ERROR_GET_SIP_ABILITY: // (0x80000000|370) 获取SIP能力失败
            msg = Res.string().getBundle().getString("NET_ERROR_GET_SIP_ABILITY");
            break;
        case LastError.NET_ERROR_GET_WIFI_AP_CFG: // (0x80000000|371) 获取WIFI ap配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GET_WIFI_AP_CFG");
            break;
        case LastError.NET_ERROR_SET_WIFI_AP_CFG: // (0x80000000|372) 设置WIFI ap配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SET_WIFI_AP_CFG");
            break;
        case LastError.NET_ERROR_GET_DECODE_POLICY: // (0x80000000|373) 获取解码策略配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GET_DECODE_POLICY");
            break;
        case LastError.NET_ERROR_SET_DECODE_POLICY: // (0x80000000|374) 设置解码策略配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SET_DECODE_POLICY");
            break;
        case LastError.NET_ERROR_TALK_REJECT: // (0x80000000|375) 拒绝对讲
            msg = Res.string().getBundle().getString("NET_ERROR_TALK_REJECT");
            break;
        case LastError.NET_ERROR_TALK_OPENED: // (0x80000000|376) 对讲被其他客户端打开
            msg = Res.string().getBundle().getString("NET_ERROR_TALK_OPENED");
            break;
        case LastError.NET_ERROR_TALK_RESOURCE_CONFLICIT: // (0x80000000|377) 资源冲突
            msg = Res.string().getBundle().getString("NET_ERROR_TALK_RESOURCE_CONFLICIT");
            break;
        case LastError.NET_ERROR_TALK_UNSUPPORTED_ENCODE: // (0x80000000|378) 不支持的语音编码格式
            msg = Res.string().getBundle().getString("NET_ERROR_TALK_UNSUPPORTED_ENCODE");
            break;
        case LastError.NET_ERROR_TALK_RIGHTLESS:  // (0x80000000|379) 无权限
            msg = Res.string().getBundle().getString("NET_ERROR_TALK_RIGHTLESS");
            break;
        case LastError.NET_ERROR_TALK_FAILED:  // (0x80000000|380) 请求对讲失败
            msg = Res.string().getBundle().getString("NET_ERROR_TALK_FAILED");
            break;
        case LastError.NET_ERROR_GET_MACHINE_CFG: // (0x80000000|381) 获取机器相关配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GET_MACHINE_CFG");
            break;
        case LastError.NET_ERROR_SET_MACHINE_CFG: // (0x80000000|382) 设置机器相关配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SET_MACHINE_CFG");
            break;
        case LastError.NET_ERROR_GET_DATA_FAILED: // (0x80000000|383) 设备无法获取当前请求数据
            msg = Res.string().getBundle().getString("NET_ERROR_GET_DATA_FAILED");
            break;
        case LastError.NET_ERROR_MAC_VALIDATE_FAILED: // (0x80000000|384) MAC地址验证失败
            msg = Res.string().getBundle().getString("NET_ERROR_MAC_VALIDATE_FAILED");
            break;
        case LastError.NET_ERROR_GET_INSTANCE:  // (0x80000000|385) 获取服务器实例失败
            msg = Res.string().getBundle().getString("NET_ERROR_GET_INSTANCE");
            break;
        case LastError.NET_ERROR_JSON_REQUEST: // (0x80000000|386) 生成的json字符串错误
            msg = Res.string().getBundle().getString("NET_ERROR_JSON_REQUEST");
            break;
        case LastError.NET_ERROR_JSON_RESPONSE: // (0x80000000|387) 响应的json字符串错误
            msg = Res.string().getBundle().getString("NET_ERROR_JSON_RESPONSE");
            break;
        case LastError.NET_ERROR_VERSION_HIGHER: // (0x80000000|388) 协议版本低于当前使用的版本
            msg = Res.string().getBundle().getString("NET_ERROR_VERSION_HIGHER");
            break;
        case LastError.NET_SPARE_NO_CAPACITY: // (0x80000000|389) 热备操作失败, 容量不足
            msg = Res.string().getBundle().getString("NET_SPARE_NO_CAPACITY");
            break;
        case LastError.NET_ERROR_SOURCE_IN_USE: // (0x80000000|390) 显示源被其他输出占用
            msg = Res.string().getBundle().getString("NET_ERROR_SOURCE_IN_USE");
            break;
        case LastError.NET_ERROR_REAVE: // (0x80000000|391) 高级用户抢占低级用户资源
            msg = Res.string().getBundle().getString("NET_ERROR_REAVE");
            break;
        case LastError.NET_ERROR_NETFORBID: // (0x80000000|392) 禁止入网
            msg = Res.string().getBundle().getString("NET_ERROR_NETFORBID");
            break;
        case LastError.NET_ERROR_GETCFG_MACFILTER: // (0x80000000|393) 获取MAC过滤配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_MACFILTER");
            break;
        case LastError.NET_ERROR_SETCFG_MACFILTER: // (0x80000000|394) 设置MAC过滤配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_MACFILTER");
            break;
        case LastError.NET_ERROR_GETCFG_IPMACFILTER: // (0x80000000|395) 获取IP/MAC过滤配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_GETCFG_IPMACFILTER");
            break;
        case LastError.NET_ERROR_SETCFG_IPMACFILTER: // (0x80000000|396) 设置IP/MAC过滤配置失败
            msg = Res.string().getBundle().getString("NET_ERROR_SETCFG_IPMACFILTER");
            break;
        case LastError.NET_ERROR_OPERATION_OVERTIME: // (0x80000000|397) 当前操作超时
            msg = Res.string().getBundle().getString("NET_ERROR_OPERATION_OVERTIME");
            break;
        case LastError.NET_ERROR_SENIOR_VALIDATE_FAILED: // (0x80000000|398) 高级校验失败
            msg = Res.string().getBundle().getString("NET_ERROR_SENIOR_VALIDATE_FAILED");
            break;
        case LastError.NET_ERROR_DEVICE_ID_NOT_EXIST: // (0x80000000|399) 设备ID不存在
            msg = Res.string().getBundle().getString("NET_ERROR_DEVICE_ID_NOT_EXIST");
            break;
        case LastError.NET_ERROR_UNSUPPORTED:  // (0x80000000|400) 不支持当前操作
            msg = Res.string().getBundle().getString("NET_ERROR_UNSUPPORTED");
            break;
        case LastError.NET_ERROR_PROXY_DLLLOAD: // (0x80000000|401) 代理库加载失败
            msg = Res.string().getBundle().getString("NET_ERROR_PROXY_DLLLOAD");
            break;
        case LastError.NET_ERROR_PROXY_ILLEGAL_PARAM: // (0x80000000|402) 代理用户参数不合法
            msg = Res.string().getBundle().getString("NET_ERROR_PROXY_ILLEGAL_PARAM");
            break;
        case LastError.NET_ERROR_PROXY_INVALID_HANDLE: // (0x80000000|403) 代理句柄无效
            msg = Res.string().getBundle().getString("NET_ERROR_PROXY_INVALID_HANDLE");
            break;
        case LastError.NET_ERROR_PROXY_LOGIN_DEVICE_ERROR: // (0x80000000|404) 代理登入前端设备失败
            msg = Res.string().getBundle().getString("NET_ERROR_PROXY_LOGIN_DEVICE_ERROR");
            break;
        case LastError.NET_ERROR_PROXY_START_SERVER_ERROR: // (0x80000000|405) 启动代理服务失败
            msg = Res.string().getBundle().getString("NET_ERROR_PROXY_START_SERVER_ERROR");
            break;
        case LastError.NET_ERROR_SPEAK_FAILED: // (0x80000000|406) 请求喊话失败
            msg = Res.string().getBundle().getString("NET_ERROR_SPEAK_FAILED");
            break;
        case LastError.NET_ERROR_NOT_SUPPORT_F6: // (0x80000000|407) 设备不支持此F6接口调用
            msg = Res.string().getBundle().getString("NET_ERROR_NOT_SUPPORT_F6");
            break;
        case LastError.NET_ERROR_CD_UNREADY: // (0x80000000|408) 光盘未就绪
            msg = Res.string().getBundle().getString("NET_ERROR_CD_UNREADY");
            break;
        case LastError.NET_ERROR_DIR_NOT_EXIST: // (0x80000000|409) 目录不存在
            msg = Res.string().getBundle().getString("NET_ERROR_DIR_NOT_EXIST");
            break;
        case LastError.NET_ERROR_UNSUPPORTED_SPLIT_MODE: // (0x80000000|410) 设备不支持的分割模式
            msg = Res.string().getBundle().getString("NET_ERROR_UNSUPPORTED_SPLIT_MODE");
            break;
        case LastError.NET_ERROR_OPEN_WND_PARAM: // (0x80000000|411) 开窗参数不合法
            msg = Res.string().getBundle().getString("NET_ERROR_OPEN_WND_PARAM");
            break;
        case LastError.NET_ERROR_LIMITED_WND_COUNT: // (0x80000000|412) 开窗数量超过限制
            msg = Res.string().getBundle().getString("NET_ERROR_LIMITED_WND_COUNT");
            break;
        case LastError.NET_ERROR_UNMATCHED_REQUEST: // (0x80000000|413) 请求命令与当前模式不匹配
            msg = Res.string().getBundle().getString("NET_ERROR_UNMATCHED_REQUEST");
            break;
        case LastError.NET_RENDER_ENABLELARGEPICADJUSTMENT_ERROR: // (0x80000000|414) Render库启用高清图像内部调整策略出错
            msg = Res.string().getBundle().getString("NET_RENDER_ENABLELARGEPICADJUSTMENT_ERROR");
            break;
        case LastError.NET_ERROR_UPGRADE_FAILED: // (0x80000000|415) 设备升级失败
            msg = Res.string().getBundle().getString("NET_ERROR_UPGRADE_FAILED");
            break;
        case LastError.NET_ERROR_NO_TARGET_DEVICE: // (0x80000000|416) 找不到目标设备
            msg = Res.string().getBundle().getString("NET_ERROR_NO_TARGET_DEVICE");
            break;
        case LastError.NET_ERROR_NO_VERIFY_DEVICE: // (0x80000000|417) 找不到验证设备
            msg = Res.string().getBundle().getString("NET_ERROR_NO_VERIFY_DEVICE");
            break;
        case LastError.NET_ERROR_CASCADE_RIGHTLESS: // (0x80000000|418) 无级联权限
            msg = Res.string().getBundle().getString("NET_ERROR_CASCADE_RIGHTLESS");
            break;
        case LastError.NET_ERROR_LOW_PRIORITY: // (0x80000000|419) 低优先级
            msg = Res.string().getBundle().getString("NET_ERROR_LOW_PRIORITY");
            break;
        case LastError.NET_ERROR_REMOTE_REQUEST_TIMEOUT: // (0x80000000|420) 远程设备请求超时
            msg = Res.string().getBundle().getString("NET_ERROR_REMOTE_REQUEST_TIMEOUT");
            break;
        case LastError.NET_ERROR_LIMITED_INPUT_SOURCE: // (0x80000000|421) 输入源超出最大路数限制
            msg = Res.string().getBundle().getString("NET_ERROR_LIMITED_INPUT_SOURCE");
            break;
        case LastError.NET_ERROR_SET_LOG_PRINT_INFO: // (0x80000000|422) 设置日志打印失败
            msg = Res.string().getBundle().getString("NET_ERROR_SET_LOG_PRINT_INFO");
            break;
        case LastError.NET_ERROR_PARAM_DWSIZE_ERROR: // (0x80000000|423) 入参的dwsize字段出错
            msg = Res.string().getBundle().getString("NET_ERROR_PARAM_DWSIZE_ERROR");
            break;
        case LastError.NET_ERROR_LIMITED_MONITORWALL_COUNT: // (0x80000000|424) 电视墙数量超过上限
            msg = Res.string().getBundle().getString("NET_ERROR_LIMITED_MONITORWALL_COUNT");
            break;
        case LastError.NET_ERROR_PART_PROCESS_FAILED: // (0x80000000|425) 部分过程执行失败
            msg = Res.string().getBundle().getString("NET_ERROR_PART_PROCESS_FAILED");
            break;
        case LastError.NET_ERROR_TARGET_NOT_SUPPORT: // (0x80000000|426) 该功能不支持转发
            msg = Res.string().getBundle().getString("NET_ERROR_TARGET_NOT_SUPPORT");
            break;
        case LastError.NET_ERROR_VISITE_FILE: // (0x80000000|510) 访问文件失败
            msg = Res.string().getBundle().getString("NET_ERROR_VISITE_FILE");
            break;
        case LastError.NET_ERROR_DEVICE_STATUS_BUSY: // (0x80000000|511) 设备忙
            msg = Res.string().getBundle().getString("NET_ERROR_DEVICE_STATUS_BUSY");
            break;
        case LastError.NET_USER_PWD_NOT_AUTHORIZED: // (0x80000000|512)修改密码无权限
            msg = Res.string().getBundle().getString("NET_USER_PWD_NOT_AUTHORIZED");
            break;
        case LastError.NET_USER_PWD_NOT_STRONG: // (0x80000000|513) 密码强度不够
            msg = Res.string().getBundle().getString("NET_USER_PWD_NOT_STRONG");
            break;
        case LastError.NET_ERROR_NO_SUCH_CONFIG: // (0x80000000|514) 没有对应的配置
            msg = Res.string().getBundle().getString("NET_ERROR_NO_SUCH_CONFIG");
            break;
        case LastError.NET_ERROR_AUDIO_RECORD_FAILED: // (0x80000000|515) 录音失败
            msg = Res.string().getBundle().getString("NET_ERROR_AUDIO_RECORD_FAILED");
            break;
        case LastError.NET_ERROR_SEND_DATA_FAILED: // (0x80000000|516) 数据发送失败
            msg = Res.string().getBundle().getString("NET_ERROR_SEND_DATA_FAILED");
            break;
        case LastError.NET_ERROR_OBSOLESCENT_INTERFACE: // (0x80000000|517) 废弃接口
            msg = Res.string().getBundle().getString("NET_ERROR_OBSOLESCENT_INTERFACE");
            break;
        case LastError.NET_ERROR_INSUFFICIENT_INTERAL_BUF: // (0x80000000|518) 内部缓冲不足
            msg = Res.string().getBundle().getString("NET_ERROR_INSUFFICIENT_INTERAL_BUF");
            break;
        case LastError.NET_ERROR_NEED_ENCRYPTION_PASSWORD: // (0x80000000|519) 修改设备ip时,需要校验密码
            msg = Res.string().getBundle().getString("NET_ERROR_NEED_ENCRYPTION_PASSWORD");
            break;
        case LastError.NET_ERROR_NOSUPPORT_RECORD: // (0x80000000|520) 设备不支持此记录集
            msg = Res.string().getBundle().getString("NET_ERROR_NOSUPPORT_RECORD");
            break;
        case LastError.NET_ERROR_SERIALIZE_ERROR: // (0x80000000|1010) 数据序列化错误
            msg = Res.string().getBundle().getString("NET_ERROR_SERIALIZE_ERROR");
            break;
        case LastError.NET_ERROR_DESERIALIZE_ERROR: // (0x80000000|1011) 数据反序列化错误
            msg = Res.string().getBundle().getString("NET_ERROR_DESERIALIZE_ERROR");
            break;
        case LastError.NET_ERROR_LOWRATEWPAN_ID_EXISTED: // (0x80000000|1012) 该无线ID已存在
            msg = Res.string().getBundle().getString("NET_ERROR_LOWRATEWPAN_ID_EXISTED");
            break;
        case LastError.NET_ERROR_LOWRATEWPAN_ID_LIMIT: // (0x80000000|1013) 无线ID数量已超限
            msg = Res.string().getBundle().getString("NET_ERROR_LOWRATEWPAN_ID_LIMIT");
            break;
        case LastError.NET_ERROR_LOWRATEWPAN_ID_ABNORMAL: // (0x80000000|1014) 无线异常添加
            msg = Res.string().getBundle().getString("NET_ERROR_LOWRATEWPAN_ID_ABNORMAL");
            break;
        case LastError.NET_ERROR_ENCRYPT: // (0x80000000|1015) 加密数据失败
            msg = Res.string().getBundle().getString("NET_ERROR_ENCRYPT");
            break;
        case LastError.NET_ERROR_PWD_ILLEGAL: // (0x80000000|1016) 新密码不合规范
            msg = Res.string().getBundle().getString("NET_ERROR_PWD_ILLEGAL");
            break;
        case LastError.NET_ERROR_DEVICE_ALREADY_INIT: // (0x80000000|1017) 设备已经初始化
            msg = Res.string().getBundle().getString("NET_ERROR_DEVICE_ALREADY_INIT");
            break;
        case LastError.NET_ERROR_SECURITY_CODE: // (0x80000000|1018) 安全码错误
            msg = Res.string().getBundle().getString("NET_ERROR_SECURITY_CODE");
            break;
        case LastError.NET_ERROR_SECURITY_CODE_TIMEOUT: // (0x80000000|1019) 安全码超出有效期
            msg = Res.string().getBundle().getString("NET_ERROR_SECURITY_CODE_TIMEOUT");
            break;
        case LastError.NET_ERROR_GET_PWD_SPECI: // (0x80000000|1020) 获取密码规范失败
            msg = Res.string().getBundle().getString("NET_ERROR_GET_PWD_SPECI");
            break;
        case LastError.NET_ERROR_NO_AUTHORITY_OF_OPERATION: // (0x80000000|1021) 无权限进行该操作
            msg = Res.string().getBundle().getString("NET_ERROR_NO_AUTHORITY_OF_OPERATION");
            break;
        case LastError.NET_ERROR_DECRYPT: // (0x80000000|1022) 解密数据失败
            msg = Res.string().getBundle().getString("NET_ERROR_DECRYPT");
            break;
        case LastError.NET_ERROR_2D_CODE: // (0x80000000|1023) 2D code校验失败
            msg = Res.string().getBundle().getString("NET_ERROR_2D_CODE");
            break;
        case LastError.NET_ERROR_INVALID_REQUEST: // (0x80000000|1024) 非法的RPC请求
            msg = Res.string().getBundle().getString("NET_ERROR_INVALID_REQUEST");
            break;
        case LastError.NET_ERROR_PWD_RESET_DISABLE: // (0x80000000|1025) 密码重置功能已关闭
            msg = Res.string().getBundle().getString("NET_ERROR_PWD_RESET_DISABLE");
            break;
        case LastError.NET_ERROR_PLAY_PRIVATE_DATA: // (0x80000000|1026) 显示私有数据,比如规则框等失败
            msg = Res.string().getBundle().getString("NET_ERROR_PLAY_PRIVATE_DATA");
            break;
        case LastError.NET_ERROR_ROBOT_OPERATE_FAILED: // (0x80000000|1027) 机器人操作失败
            msg = Res.string().getBundle().getString("NET_ERROR_ROBOT_OPERATE_FAILED");
            break;
        case LastError.NET_ERROR_PHOTOSIZE_EXCEEDSLIMIT: // (0x80000000|1028) 图片大小超限
            msg = Res.string().getBundle().getString("NET_ERROR_PHOTOSIZE_EXCEEDSLIMIT");
            break;
        case LastError.NET_ERROR_USERID_INVALID: // (0x80000000|1029) 用户ID不存在
            msg = Res.string().getBundle().getString("NET_ERROR_USERID_INVALID");
            break;
        case LastError.NET_ERROR_EXTRACTFEATURE_FAILED: // (0x80000000|1030) 照片特征值提取失败
            msg = Res.string().getBundle().getString("NET_ERROR_EXTRACTFEATURE_FAILED");
            break;
        case LastError.NET_ERROR_PHOTO_EXIST: // (0x80000000|1031) 照片已存在
            msg = Res.string().getBundle().getString("NET_ERROR_PHOTO_EXIST");
            break;
        case LastError.NET_ERROR_PHOTO_OVERFLOW: // (0x80000000|1032) 照片数量超过上限
            msg = Res.string().getBundle().getString("NET_ERROR_PHOTO_OVERFLOW");
            break;
        case LastError.NET_ERROR_CHANNEL_ALREADY_OPENED: // (0x80000000|1033) 通道已经打开
            msg = Res.string().getBundle().getString("NET_ERROR_CHANNEL_ALREADY_OPENED");
            break;
        case LastError.NET_ERROR_CREATE_SOCKET: // (0x80000000|1034) 创建套接字失败
            msg = Res.string().getBundle().getString("NET_ERROR_CREATE_SOCKET");
            break;
        case LastError.NET_ERROR_CHANNEL_NUM: // (0x80000000|1035) 通道号错误
            msg = Res.string().getBundle().getString("NET_ERROR_CHANNEL_NUM");
            break;
        case LastError.NET_ERROR_FACE_RECOGNITION_SERVER_GROUP_ID_EXCEED: // (0x80000000|1051) 组ID超过最大值
            msg = Res.string().getBundle().getString("NET_ERROR_FACE_RECOGNITION_SERVER_GROUP_ID_EXCEED");
            break;
        default:
            msg = Res.string().getBundle().getString("NET_ERROR");
            break;
        }
        return msg;
    }
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/EventTaskCommonQueue.java
对比新文件
@@ -0,0 +1,79 @@
package com.ruoyi.device.dhsdk.common;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingDeque;
public class EventTaskCommonQueue {
    // 设置一个队列,容量看情况改
    private final int MAX_TASK_COUNT = 10000;   // 队列容量
    private final LinkedBlockingDeque<EventTaskHandler> eventTasks = new LinkedBlockingDeque<EventTaskHandler>(MAX_TASK_COUNT);
    // 起一个线程池
    private final int MAX_THREAD_COUNT = 10;    // 线程池容量
    private ExecutorService eventQueueService = Executors.newFixedThreadPool(MAX_THREAD_COUNT);
    // 用于检验服务运行状态
    private volatile boolean running = true;
    // 用于查看当前线程状态
    private Future<?> eventQueueThreadStatus;
    // 初始化
    public void init() {
        eventQueueThreadStatus = eventQueueService.submit(new Thread(new Runnable() {
            @Override
            public void run() {
                while (running) {
                    try {
                        EventTaskHandler task = eventTasks.take();      //开始一个任务
                        try {
                            task.eventTaskProcess();    // 主要的运行函数
                        } catch (Exception e) {
                            System.err.println("任务处理发生错误");   // error
                        }
                    } catch (InterruptedException e) {
                        System.err.println("任务已意外停止");   // error
                        running = false;
                    }
                }
            }
        }, "Event call back thread init"));
    }
    // 向队列添加新的任务
    public boolean addEvent(EventTaskHandler eventHandler) {
        if (!running) {
            System.out.println("任务已停止");   // warning
            return false;
        }
        boolean success = eventTasks.offer(eventHandler);
        if (!success) {
            // 队列已满,无法再添加
            System.out.println("添加到事件队列失败");
        }
        return success;
    }
    // 手动启动服务
    public void activeService() {
        running = true;
        if (eventQueueService.isShutdown()) {
            eventQueueService = Executors.newFixedThreadPool(MAX_THREAD_COUNT);;
            init();
            System.out.println("线程池已关闭,重新初始化线程池及任务");
        }
        if (eventQueueThreadStatus.isDone()) {
            init();
            System.out.println("线程池任务结束,重新初始化任务");
        }
    }
    // 手动关闭服务
    public void destroy() {
        running = false;
        eventQueueService.shutdownNow();
    }
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/EventTaskHandler.java
对比新文件
@@ -0,0 +1,6 @@
package com.ruoyi.device.dhsdk.common;
public interface EventTaskHandler {
    void eventTaskProcess();
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/ListPictureShowDialog.java
对比新文件
@@ -0,0 +1,34 @@
package com.ruoyi.device.dhsdk.common;
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/*
 * 智能交通列表双击展示图片框架
 */
public class ListPictureShowDialog extends JDialog {
    private static final long serialVersionUID = 1L;
    public ListPictureShowDialog() {
        setLayout(new BorderLayout());
        setModal(true);
        pack();
        setSize(800, 600);
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);   // 释放窗体
        listPanel = new PaintPanel();
        add(listPanel, BorderLayout.CENTER);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                dispose();
            }
        });
    }
    public PaintPanel listPanel;
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/PaintPanel.java
对比新文件
@@ -0,0 +1,32 @@
package com.ruoyi.device.dhsdk.common;
import javax.swing.*;
import java.awt.*;
/*
 * 带背景的绘图面板
 */
public class PaintPanel extends JPanel {
    private static final long serialVersionUID = 1L;
    private Image image; //背景图片
    public PaintPanel() {
        super();
        setOpaque(true); //非透明
        setLayout(null);
        setBackground(Color.GRAY);
        setForeground(new Color(0, 0, 0));
    }
    //设置图片的方法
    public void setImage(Image image) {
        this.image = image;
    }
    protected void paintComponent(Graphics g) {    //重写绘制组件外观
        if(image != null) {
            g.drawImage(image, 0, 0, getWidth(), getHeight(), this);//绘制图片与组件大小相同
        }
        super.paintComponent(g); // 执行超类方法
    }
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/Res.java
对比新文件
@@ -0,0 +1,2883 @@
package com.ruoyi.device.dhsdk.common;
import com.ruoyi.device.dhsdk.lib.NetSDKLib;
import com.ruoyi.device.dhsdk.lib.NetSDKLib.SdkStructure;
import com.ruoyi.device.dhsdk.lib.NetSDKLib.*;
import java.util.Locale;
import java.util.ResourceBundle;
public final class Res {
    private static ResourceBundle bundle;
    private Res() {
        switchLanguage(LanguageType.Chinese);
    }
    private static class StringBundleHolder {
        private static Res instance = new Res();
    }
    public static Res string() {
        return StringBundleHolder.instance;
    }
    public static enum LanguageType {
        English,
        Chinese
    }
    public ResourceBundle getBundle() {
        return bundle;
    }
    /**
     * \if ENGLISH_LANG
     * Switch between Chinese and English
     * \else
     * 中英文切换
     * \endif
     */
    public void switchLanguage(LanguageType type) {
        switch(type) {
            case Chinese:
                bundle = ResourceBundle.getBundle("resources", new Locale("zh", "CN"));
                break;
            case English:
                bundle = ResourceBundle.getBundle("resources", new Locale("en", "US"));
                break;
            default:
                break;
        }
    }
    public String getSwitchLanguage() {
        return bundle.getString("SWITCH_LANGUAGE");
    }
    public String getRealplay() {
        return bundle.getString("REALPLAY");
    }
    public String getMultiRealplay() {
        return bundle.getString("MULTIREALPLAY");
    }
    public String getDownloadRecord() {
        return bundle.getString("DOWNLOAD_RECORD");
    }
    public String getITSEvent() {
        return bundle.getString("ITS_EVENT");
    }
    public String getOnline() {
        return bundle.getString("ONLINE");
    }
    public String getDisConnectReconnecting() {
        return bundle.getString("DISCONNECT_RECONNECTING");
    }
    public String getDisConnect() {
        return bundle.getString("DISCONNECT");
    }
    public String getPromptMessage() {
        return bundle.getString("PROMPT_MESSAGE");
    }
    public String getErrorMessage() {
        return bundle.getString("ERROR_MESSAGE");
    }
    public String getReconnectSucceed() {
        return bundle.getString("RECONNECT_SUCCEED");
    }
    public String getSucceed() {
        return bundle.getString("SUCCEED");
    }
    public String getFailed() {
        return bundle.getString("FAILED");
    }
    public String getYear() {
        return bundle.getString("YEAR");
    }
    public String getMonth() {
        return bundle.getString("MONTH");
    }
    public String getDay() {
        return bundle.getString("DAY");
    }
    public String getHour() {
        return bundle.getString("HOUR");
    }
    public String getMinute() {
        return bundle.getString("MINUTE");
    }
    public String getSecond() {
        return bundle.getString("SECOND");
    }
    public String getSunday() {
        return bundle.getString("SUNDAY");
    }
    public String getMonday() {
        return bundle.getString("MONDAY");
    }
    public String getTuesday() {
        return bundle.getString("TUESDAY");
    }
    public String getWednesday() {
        return bundle.getString("WEDNESDAY");
    }
    public String getThursday() {
        return bundle.getString("THURSDAY");
    }
    public String getFriday() {
        return bundle.getString("FRIDAY");
    }
    public String getSaturday() {
        return bundle.getString("SATURDAY");
    }
    public String[] getWeek() {
        String[] weekdays = {getSunday(),
                             getMonday(),
                             getTuesday(),
                             getWednesday(),
                             getThursday(),
                             getFriday(),
                             getSaturday()
        };
        return weekdays;
    }
    public String getConfirm() {
        return bundle.getString("CONFIRM");
    }
    public String getCancel() {
        return bundle.getString("CANCEL");
    }
    public String getDateChooser() {
        return bundle.getString("DATE_CHOOSER");
    }
    public String getFunctionList() {
        return bundle.getString("FUNCTIONLIST");
    }
    public String getLogin() {
        return bundle.getString("LOGIN");
    }
    public String getLoginSuccess() {
        return bundle.getString("LOGIN_SUCCEED");
    }
    public String getFillingRules() {
        return bundle.getString("FILLING_RULES");
    }
    public String getLogout() {
        return bundle.getString("LOGOUT");
    }
    public String getDeviceIp() {
        return bundle.getString("DEVICE_IP");
    }
    public String getIp() {
        return bundle.getString("IP");
    }
    public String getPort() {
        return bundle.getString("DEVICE_PORT");
    }
    public String getUserId() {
        return bundle.getString("USER_ID");
    }
    public String getTemp() {
        return bundle.getString("TEMPERATURE");
    }
    public String getMaskstutas() {
        return bundle.getString("MASK_STATUS");
    }
    public String getUserName(boolean space) {
        return bundle.getString("USER_NAME");
    }
    public String getCardNo() {
        return bundle.getString("CARD_NO");
    }
    public String getUserName() {
        return bundle.getString("USERNAME");
    }
    public String getPassword() {
        return bundle.getString("PASSWORD");
    }
    public String getLoginFailed() {
        return bundle.getString("LOGIN_FAILED");
    }
    public String getInputDeviceIP() {
        return bundle.getString("PLEASE_INPUT_DEVICE_IP");
    }
    public String getInputDevicePort() {
        return bundle.getString("PLEASE_INPUT_DEVICE_PORT");
    }
    public String getInputUsername() {
        return bundle.getString("PLEASE_INPUT_DEVICE_USERNAME");
    }
    public String getInputPassword() {
        return bundle.getString("PLEASE_INPUT_DEVICE_PASSWORD");
    }
    public String getInputConfirmPassword() {
        return bundle.getString("PLEASE_INPUT_CONFIRM_PASSWORD");
    }
    public String getStartRealPlay() {
        return bundle.getString("START_REALPLAY");
    }
    public String getStopRealPlay() {
        return bundle.getString("STOP_REALPLAY");
    }
    public String getChn() {
        return bundle.getString("CHN");
    }
    public String getChannel() {
        return bundle.getString("CHANNEL");
    }
    public String getStreamType() {
        return bundle.getString("STREAM_TYPE");
    }
    public String getMasterAndSub() {
        return bundle.getString("MASTER_AND_SUB_STREAM");
    }
    public String getMasterStream() {
        return bundle.getString("MASTER_STREAM");
    }
    public String getSubStream() {
        return bundle.getString("SUB_STREAM");
    }
    public String getPTZ() {
        return bundle.getString("PTZ");
    }
    public String getPtzControlAndCapture() {
        return bundle.getString("PTZCONTROL_CAPTURE");
    }
    public String getCapturePicture() {
        return bundle.getString("CAPTURE_PICTURE");
    }
    public String getLocalCapture() {
        return bundle.getString("LOCAL_CAPTURE");
    }
    public String getRemoteCapture() {
        return bundle.getString("REMOTE_CAPTURE");
    }
    public String getTimerCapture() {
        return bundle.getString("TIMER_CAPTURE");
    }
    public String getStopCapture() {
        return bundle.getString("STOP_CAPTURE");
    }
    public String getInterval() {
        return bundle.getString("INTERVAL");
    }
    public String getTimeIntervalIllegal() {
        return bundle.getString("TIME_INTERVAL_ILLEGAL");
    }
    public String getNeedStartRealPlay() {
        return bundle.getString("PLEASE_START_REALPLAY");
    }
    public String getPTZControl() {
        return bundle.getString("PTZ_CONTROL");
    }
    public String getLeftUp() {
        return bundle.getString("LEFT_UP");
    }
    public String getUp() {
        return bundle.getString("UP");
    }
    public String getRightUp() {
        return bundle.getString("RIGHT_UP");
    }
    public String getLeft() {
        return bundle.getString("LEFT");
    }
    public String getRight() {
        return bundle.getString("RIGHT");
    }
    public String getLeftDown() {
        return bundle.getString("LEFT_DOWN");
    }
    public String getDown() {
        return bundle.getString("DOWN");
    }
    public String getRightDown() {
        return bundle.getString("RIGHT_DOWN");
    }
    public String getSpeed() {
        return bundle.getString("SPEED");
    }
    public String getZoomAdd() {
        return bundle.getString("ZOOM_ADD");
    }
    public String getZoomDec() {
        return bundle.getString("ZOOM_DEC");
    }
    public String getFocusAdd() {
        return bundle.getString("FOCUS_ADD");
    }
    public String getFocusDec() {
        return bundle.getString("FOCUS_DEC");
    }
    public String getIrisAdd() {
        return bundle.getString("IRIS_ADD");
    }
    public String getIrisDec() {
        return bundle.getString("IRIS_DEC");
    }
    public String getIndex() {
        return bundle.getString("INDEX");
    }
    public String getEventPicture() {
        return bundle.getString("EVENT_PICTURE");
    }
    public String getPlatePicture() {
        return bundle.getString("PLATE_PICTURE");
    }
    public String getEventName() {
        return bundle.getString("EVENT_NAME");
    }
    public String getLicensePlate() {
        return bundle.getString("LICENSE_PLATE");
    }
    public String getEventTime() {
        return bundle.getString("EVENT_TIME");
    }
    public String getPlateType() {
        return bundle.getString("PLATE_TYPE");
    }
    public String getPlateColor() {
        return bundle.getString("PLATE_COLOR");
    }
    public String getVehicleColor() {
        return bundle.getString("VEHICLE_COLOR");
    }
    public String getVehicleType() {
        return bundle.getString("VEHICLE_TYPE");
    }
    public String getVehicleSize() {
        return bundle.getString("VEHICLE_SIZE");
    }
    public String getFileCount() {
        return bundle.getString("FILE_COUNT");
    }
    public String getFileIndex() {
        return bundle.getString("FILE_INDEX");
    }
    public String getGroupId() {
        return bundle.getString("GROUP_ID");
    }
    public String getIllegalPlace() {
        return bundle.getString("ILLEGAL_PLACE");
    }
    public String getLaneNumber() {
        return bundle.getString("LANE_NUMBER");
    }
    public String getEventInfo() {
        return bundle.getString("EVENT_INFO");
    }
    public String getNoPlate() {
        return bundle.getString("NO_PLATENUMBER");
    }
    public String[] getTrafficTableName() {
        String[] name = {getIndex(),
                         getEventName(),
                         getLicensePlate(),
                         getEventTime(),
                         getPlateType(),
                         getPlateColor(),
                         getVehicleColor(),
                         getVehicleType(),
                         getVehicleSize(),
                         getFileCount(),
                         getFileIndex(),
                         getGroupId(),
                         getIllegalPlace(),
                         getLaneNumber()};
        return name;
    }
    public String getOperate() {
        return bundle.getString("OPERATE");
    }
    public String getAttach() {
        return bundle.getString("ATTACH");
    }
    public String getDetach() {
        return bundle.getString("DETACH");
    }
    public String getOpenStrobe() {
        return bundle.getString("OPEN_STROBE");
    }
    public String getCloseStrobe() {
        return bundle.getString("CLOSE_STROBE");
    }
    public String getOpenStrobeFailed() {
        return bundle.getString("OPEN_STROBE_FAILED");
    }
    public String getManualCapture() {
        return bundle.getString("MANUAL_CAPTURE");
    }
    public String getManualCaptureSucceed() {
        return  bundle.getString("MANUALSNAP_SUCCEED");
    }
    public String getManualCaptureFailed() {
        return  bundle.getString("MANUALSNAP_FAILED");
    }
    /*
     * 车辆大小对照表
     */
    public String getTrafficSize(int nVehicleSize) {
        String vehicleClass = "";
        for(int i = 0; i < 5; i++) {
              if( ((byte)nVehicleSize & (1 << i)) > 0 ) {
                  switch (i) {
                case 0:
                    vehicleClass = bundle.getString("LIGHT_DUTY");
                    break;
                case 1:
                    vehicleClass = bundle.getString("MEDIUM");
                    break;
                case 2:
                    vehicleClass = bundle.getString("OVER_SIZE");
                    break;
                case 3:
                    vehicleClass = bundle.getString("MINI_SIZE");
                    break;
                case 4:
                    vehicleClass = bundle.getString("LARGE_SIZE");
                    break;
                }
              }
          }
        return vehicleClass;
    }
    /*
     * 获取事件名称
     */
    public String getEventName(int type) {
        String name = "";
        switch (type) {
            case NetSDKLib.EVENT_IVS_TRAFFICJUNCTION:  ///< 交通路口事件
                name = bundle.getString("EVENT_IVS_TRAFFICJUNCTION");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_RUNREDLIGHT: ///< 闯红灯事件
                name = bundle.getString("EVENT_IVS_TRAFFIC_RUNREDLIGHT");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_OVERLINE: ///< 压车道线事件
                name = bundle.getString("EVENT_IVS_TRAFFIC_OVERLINE");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_RETROGRADE: ///< 逆行事件
                name = bundle.getString("EVENT_IVS_TRAFFIC_RETROGRADE");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_TURNLEFT: ///< 违章左转
                name = bundle.getString("EVENT_IVS_TRAFFIC_TURNLEFT");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_TURNRIGHT: ///< 违章右转
                name = bundle.getString("EVENT_IVS_TRAFFIC_TURNRIGHT");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_UTURN: ///< 违章掉头
                name = bundle.getString("EVENT_IVS_TRAFFIC_UTURN");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_OVERSPEED: ///< 超速
                name = bundle.getString("EVENT_IVS_TRAFFIC_OVERSPEED");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_UNDERSPEED: ///< 低速
                name = bundle.getString("EVENT_IVS_TRAFFIC_UNDERSPEED");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_PARKING: ///< 违章停车
                name = bundle.getString("EVENT_IVS_TRAFFIC_PARKING");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_WRONGROUTE: ///< 不按车道行驶
                name = bundle.getString("EVENT_IVS_TRAFFIC_WRONGROUTE");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_CROSSLANE: ///< 违章变道
                name = bundle.getString("EVENT_IVS_TRAFFIC_CROSSLANE");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_OVERYELLOWLINE: ///< 压黄线
                name = bundle.getString("EVENT_IVS_TRAFFIC_OVERYELLOWLINE");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_YELLOWPLATEINLANE: ///< 黄牌车占道事件
                name = bundle.getString("EVENT_IVS_TRAFFIC_YELLOWPLATEINLANE");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_PEDESTRAINPRIORITY: ///< 斑马线行人优先事件
                name = bundle.getString("EVENT_IVS_TRAFFIC_PEDESTRAINPRIORITY");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_MANUALSNAP: ///< 交通手动抓拍事件
                name = bundle.getString("EVENT_IVS_TRAFFIC_MANUALSNAP");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_VEHICLEINROUTE: ///< 有车占道事件
                name = bundle.getString("EVENT_IVS_TRAFFIC_VEHICLEINROUTE");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_VEHICLEINBUSROUTE: ///< 占用公交车道事件
                name = bundle.getString("EVENT_IVS_TRAFFIC_VEHICLEINBUSROUTE");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_BACKING: ///< 违章倒车事件
                name = bundle.getString("EVENT_IVS_TRAFFIC_BACKING");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_PARKINGSPACEPARKING: ///< 车位有车事件
                name = bundle.getString("EVENT_IVS_TRAFFIC_PARKINGSPACEPARKING");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_PARKINGSPACENOPARKING: ///< 车位无车事件
                name = bundle.getString("EVENT_IVS_TRAFFIC_PARKINGSPACENOPARKING");
                break;
            case NetSDKLib.EVENT_IVS_TRAFFIC_WITHOUT_SAFEBELT: ///< 交通未系安全带事件
                name = bundle.getString("EVENT_IVS_TRAFFIC_WITHOUT_SAFEBELT");
                break;
            default:
                break;
        }
        return name;
    }
    public String getRecordType() {
        return bundle.getString("RECORD_TYPE");
    }
    public String getStartTime() {
        return bundle.getString("START_TIME");
    }
    public String getEndTime() {
        return bundle.getString("END_TIME");
    }
    public String[] getDownloadTableName() {
        String[] name = {getIndex(),
                         getChannel(),
                         getRecordType(),
                         getStartTime(),
                         getEndTime()};
        return name;
    }
    public String getDownloadByFile() {
        return bundle.getString("DOWNLOAD_RECORD_BYFILE");
    }
    public String getQuery() {
        return bundle.getString("QUERY");
    }
    public String getDownload() {
        return bundle.getString("DOWNLOAD");
    }
    public String getStopDownload() {
        return bundle.getString("STOP_DOWNLOAD");
    }
    public String getDownloadByTime() {
        return bundle.getString("DOWNLOAD_RECORD_BYTIME");
    }
    public String getSelectTimeAgain() {
        return bundle.getString("PLEASE_SELECT_TIME_AGAIN");
    }
    public String getSelectRowWithData() {
        return bundle.getString("PLEASE_FIRST_SELECT_ROW_WITH_DATA");
    }
    public String getQueryRecord() {
        return bundle.getString("PLEASE_FIRST_QUERY_RECORD");
    }
    public String getDownloadCompleted() {
        return bundle.getString("DOWNLOAD_COMPLETED");
    }
    /**
     * 获取录像类型
     */
    public String getRecordTypeStr(int nRecordFileType) {
        String recordTypeStr = "";
        switch(nRecordFileType) {
            case 0:
                recordTypeStr = bundle.getString("GENERAL_RECORD");
                break;
            case 1:
                recordTypeStr = bundle.getString("ALARM_RECORD");
                break;
            case 2:
                recordTypeStr = bundle.getString("MOTION_DETECTION");
                break;
            case 3:
                recordTypeStr = bundle.getString("CARD_NUMBER_RECORD");
                break;
            case 5:
                recordTypeStr = bundle.getString("INTELLIGENT_DETECTION");
                break;
            case 19:
                recordTypeStr = bundle.getString("POS_RECORD");
                break;
            default:
                break;
        }
        return recordTypeStr;
    }
    public int getRecordTypeInt(String recordFileStr) {
        int recordType = -1;
        if(recordFileStr.equals(bundle.getString("GENERAL_RECORD"))) {
            recordType = 0;
        } else if(recordFileStr.equals(bundle.getString("ALARM_RECORD"))) {
            recordType = 1;
        } else if(recordFileStr.equals(bundle.getString("MOTION_DETECTION"))) {
            recordType = 2;
        } else if(recordFileStr.equals(bundle.getString("CARD_NUMBER_RECORD"))) {
            recordType = 3;
        }else if(recordFileStr.equals(bundle.getString("INTELLIGENT_DETECTION"))){
            recordType=11;
        }else if(recordFileStr.equals(bundle.getString("POS_RECORD"))){
            recordType=19;
        }
        return recordType;
    }
    /**
     * 语音对讲
     */
    public String getTalk() {
        return bundle.getString("TALK");
    }
    public String getTransmitType() {
        return bundle.getString("TRANSMIT_TYPE");
    }
    public String getLocalTransmitType() {
        return bundle.getString("LOCAL_TRANSMIT_TYPE");
    }
    public String getRemoteTransmitType() {
        return bundle.getString("REMOTE_TRANSMIT_TYPE");
    }
    public String getTransmitChannel() {
        return bundle.getString("TRANSMIT_CHANNEL");
    }
    public String getStartTalk() {
        return bundle.getString("START_TALK");
    }
    public String getStopTalk() {
        return bundle.getString("STOP_TALK");
    }
    public String getTalkFailed() {
        return bundle.getString("TALK_FAILED");
    }
    public String getDeviceSearchAndInit() {
        return bundle.getString("DEVICESEARCH_DEVICEINIT");
    }
    public String getDeviceSearchOperate() {
        return bundle.getString("DEVICESEARCH_OPERATE");
    }
    public String getDeviceSearchResult() {
        return bundle.getString("DEVICESEARCH_RESULT");
    }
    public String getDeviceInit() {
        return bundle.getString("DEVICEINIT");
    }
    public String getStartSearch() {
        return bundle.getString("START_SEARCH");
    }
    public String getStopSearch() {
        return bundle.getString("STOP_SEARCH");
    }
    public String getPleaseSelectInitializedDevice() {
        return bundle.getString("PLEASE_FIRST_SELECT_INITIALIZED_DEVICE");
    }
    public String getDeviceSearch() {
        return bundle.getString("DEVICESEARCH");
    }
    public String getDevicePointToPointSearch() {
        return bundle.getString("DEVICE_POINT_TO_POINT_SEARCH");
    }
    public String getStartIp() {
        return bundle.getString("START_IP");
    }
    public String getEndIp() {
        return bundle.getString("END_IP");
    }
    public String getControlScope() {
        return bundle.getString("THE_IP_CONTROL_SCOPE");
    }
    public String getDeviceType() {
        return bundle.getString("DEVICE_TYPE");
    }
    public String getDeviceMac() {
        return bundle.getString("MAC");
    }
    public String getDeviceSn() {
        return bundle.getString("SN");
    }
    public String getDeviceInitState() {
        return bundle.getString("DEVICE_INIT_STATE");
    }
    public String getInitPasswd() {
        return bundle.getString("INIT_PASSWD");
    }
    public String[] getDeviceTableName() {
        String[] name = {getIndex(),
                         getDeviceInitState(),
                         getIpVersion(),
                         getDeviceIp(),
                         getPort(),
                         getSubMask(),
                         getGetway(),
                         getDeviceMac(),
                         getDeviceType(),
                         getDetailType(),
                         getHttpPort()};
        return name;
    }
    public String getIpVersion() {
        return bundle.getString("IP_VERSION");
    }
    public String getSubMask() {
        return bundle.getString("SUB_MASK");
    }
    public String getGetway() {
        return bundle.getString("GETWAY");
    }
    public String getDetailType() {
        return bundle.getString("DETAIL_TYPE");
    }
    public String getHttpPort() {
        return bundle.getString("HTTP_PORT");
    }
    public String getLocalIp() {
        return bundle.getString("LOCAL_IP");
    }
    public String getInitialized() {
        return bundle.getString("INITIALIZED");
    }
    public String getNotInitialized() {
        return bundle.getString("NOT_INITIALIZED");
    }
    public String getOldDevice() {
        return bundle.getString("OLD_DEVICE");
    }
    public String getNotSupportInitialization() {
        return bundle.getString("DONOT_SUPPORT_INITIALIZATION");
    }
    public String getPhone() {
        return bundle.getString("PHONE");
    }
    public String getMail() {
        return bundle.getString("MAIL");
    }
    public String getInputPhone() {
        return bundle.getString("PLEASE_INPUT_PHONE");
    }
    public String getInputMail() {
        return bundle.getString("PLEASE_INPUT_MAIL");
    }
    public String getConfirmPassword() {
        return bundle.getString("CONFIRM_PASSWORD");
    }
    public String getInconsistent() {
        return bundle.getString("INCONSISTENT");
    }
    public String getCheckIp() {
        return bundle.getString("PLEASE_CHECK_IP");
    }
    // 0-老设备,没有初始化功能 1-未初始化账号 2-已初始化账户
    public String getInitStateInfo(int initStatus) {
        String initStateInfo = "";
        switch(initStatus) {
            case 0:
                initStateInfo = getInitialized();
                break;
            case 1:
                initStateInfo = getNotInitialized();
                break;
            case 2:
                initStateInfo = getInitialized();
                break;
        }
        return initStateInfo;
    }
    public String  getAlarmListen() {
        return bundle.getString("ALARM_LISTEN");
    }
    public String  getStartListen() {
        return bundle.getString("START_LISTEN");
    }
    public String  getStopListen() {
        return bundle.getString("STOP_LISTEN");
    }
    public String getStopListenFailed(){
        return bundle.getString("STOP_LISTEN_FAILED");
    }
    public String  getShowAlarmEvent() {
        return bundle.getString("SHOW_ALARM_EVENT");
    }
    public String  getAlarmMessage() {
        return bundle.getString("ALARM_MESSAGE");
    }
    public String getExternalAlarm() {
        return bundle.getString("EXTERNAL_ALARM");
    }
    public String getMotionAlarm() {
        return bundle.getString("MOTION_ALARM");
    }
    public String getVideoLostAlarm() {
        return bundle.getString("VIDEOLOST_ALARM");
    }
    public String getShelterAlarm() {
        return bundle.getString("SHELTER_ALARM");
    }
    public String getDiskFullAlarm() {
        return bundle.getString("DISKFULL_ALARM");
    }
    public String getDiskErrorAlarm() {
        return bundle.getString("DISKERROR_ALARM");
    }
    public String getAlarmListenFailed() {
        return bundle.getString("ALARM_LISTEN_FAILED");
    }
    public String getStart() {
        return bundle.getString("START");
    }
    public String getStop() {
        return bundle.getString("STOP");
    }
    public String getDeviceControl() {
        return bundle.getString("DEVICE_CONTROL");
    }
    public String getDeviceReboot() {
        return bundle.getString("DEVICE_REBOOT");
    }
    public String getSyncTime() {
        return bundle.getString("SYNCHRONIZE_TIME");
    }
    public String getCurrentTime() {
        return bundle.getString("CURRENT_TIME");
    }
    public String getReboot() {
        return bundle.getString("REBOOT");
    }
    public String getRebootTips() {
        return bundle.getString("REBOOT_TIPS");
    }
    public String getGetTime() {
        return bundle.getString("GET_TIME");
    }
    public String getSetTime() {
        return bundle.getString("SET_TIME");
    }
    public String getOperateSuccess() {
        return bundle.getString("OPERATE_SUCCESS");
    }
    public String getFaceRecognition() {
        return bundle.getString("FACERECOGNITION");
    }
    public String[] getGroupTable() {
        String[] faceTable = {getFaceGroupId(),
                              getFaceGroupName(),
                              bundle.getString("PERSON_COUNT")};
        return faceTable;
    }
    public String getFaceGroupId() {
        return bundle.getString("FACE_GROUP_ID");
    }
    public String getFaceGroupName() {
        return bundle.getString("FACE_GROUP_NAME");
    }
    public String getGroupOperate() {
        return bundle.getString("GROUP_OPERATE");
    }
    public String getPersonOperate() {
        return bundle.getString("PERSON_OPERATE");
    }
    public String getGlobalPicture() {
        return bundle.getString("GLOBAL_PICTURE");
    }
    public String getPersonPicture() {
        return bundle.getString("PERSON_PICTURE");
    }
    public String getCandidatePicture() {
        return bundle.getString("CANDIDATE_PICTURE");
    }
    public String getTime() {
        return bundle.getString("TIME");
    }
    public String getSex() {
        return bundle.getString("SEX");
    }
    public String getAge() {
        return bundle.getString("AGE");
    }
    public String getColor() {
        return bundle.getString("COLOR");
    }
    public String getEye() {
        return bundle.getString("EYE");
    }
    public String getMouth() {
        return bundle.getString("MOUTH");
    }
    public String getMask() {
        return bundle.getString("MASK");
    }
    public String getBeard() {
        return bundle.getString("BEARD");
    }
    public String getName() {
        return bundle.getString("NAME");
    }
    public String getBirthday() {
        return bundle.getString("BIRTHDAY");
    }
    public String getIdNo() {
        return bundle.getString("ID_NO");
    }
    public String getIdType() {
        return bundle.getString("ID_TYPE");
    }
    public String getSimilarity() {
        return bundle.getString("SIMILARITY");
    }
    public String getFaceDetectEvent() {
        return bundle.getString("FACE_DETECT_EVENT");
    }
    public String getFaceRecognitionEvent() {
        return bundle.getString("FACE_RECOGNITION_EVENT");
    }
    public String getUid() {
        return bundle.getString("UID");
    }
    public String getGlasses() {
        return bundle.getString("GLASSES");
    }
    public String getPicturePath() {
        return bundle.getString("PICTURE_PATH");
    }
    public String getFaceLibraryID() {
        return bundle.getString("FACE_LIBRARY_ID");
    }
    public String getFaceLibraryName() {
        return bundle.getString("FACE_LIBRARY_NAME");
    }
    public String[] getPersonTable() {
        String[] personTable = {getUid(), getName(), getSex(), getBirthday(), getIdType(), getIdNo()};
        return personTable;
    }
    public String[] getDispositionTable() {
        String[] dispositionTable = {getChannel(), getSimilarity()};
        return dispositionTable;
    }
    public String getUnKnow() {
        return bundle.getString("UNKNOW");
    }
    public String getMale() {
        return bundle.getString("MALE");
    }
    public String getFemale() {
        return bundle.getString("FEMALE");
    }
    public String[] getSexStringsFind() {
        String[] faceSexStr = {getUnLimited(), getMale(), getFemale()};
        return faceSexStr;
    }
    public String[] getIdStringsFind() {
        String[] idStr = {getUnLimited(), getIdCard(), getPassport(),};
        return idStr;
    }
    public String[] getSexStrings() {
        String[] faceSexStr = {getUnKnow(), getMale(), getFemale()};
        return faceSexStr;
    }
    public String[] getIdStrings() {
        String[] idStr = {getUnKnow(), getIdCard(), getPassport(),};
        return idStr;
    }
    public String getIdCard() {
        return bundle.getString("ID_CARD");
    }
    public String getPassport() {
        return bundle.getString("PASSPORT");
    }
    public String getOfficeCard() {
        return bundle.getString("OFFICE_CARD");
    }
    public String getIdType(int idType) {
        String str = "";
        switch(idType) {
            case 0:
                str = getUnKnow();
                break;
            case 1:
                str = getIdCard();
                break;
            case 2:
                str =  getPassport();
                break;
            case 3:
                str =  getOfficeCard();
                break;
            default :
                str = getUnKnow();
                break;
        }
        return str;
    }
    public String getSex(int sex) {
        String str = "";
        switch(sex) {
            case 0:
                str = getUnKnow();
                break;
            case 1:
                str = getMale();
                break;
            case 2:
                str = getFemale();
                break;
            default :
                str = getUnKnow();
                break;
        }
        return str;
    }
    public String getUnLimited() {
        return bundle.getString("UNLIMITED");
    }
    public String getUnidentified() {
        return bundle.getString("UNIDENTIFIED");
    }
    public String getHaveBeard() {
        return bundle.getString("HAVE_BEARD");
    }
    public String getNoBeard() {
        return bundle.getString("NO_BEARD");
    }
    public String getBeardState(int beard) {
        String str = "";
        switch (beard) {
            case 0:
                str = getUnKnow();
                break;
            case 1:
                str = getUnidentified();
                    break;
            case 2:
                str = getNoBeard();
                break;
            case 3:
                str = getHaveBeard();
                break;
            default:
                str = getUnKnow();
                break;
        }
        return str;
    }
    public String getOpenMouth() {
        return bundle.getString("OPEN_MOUTH");
    }
    public String getCloseMouth() {
        return bundle.getString("CLOSE_MOUTH");
    }
    public String getMouthState(int mouth) {
        String str = "";
        switch (mouth) {
            case 0:
                str = getUnKnow();
                break;
            case 1:
                str = getUnidentified();
                    break;
            case 2:
                str = getCloseMouth();
                break;
            case 3:
                str = getOpenMouth();
                break;
            default:
                str = getUnKnow();
                break;
        }
        return str;
    }
    public String getYellowColor() {
        return bundle.getString("YELLOW_COLOR");
    }
    public String getBlackColor() {
        return bundle.getString("BLACK_COLOR");
    }
    public String getWhiteColor() {
        return bundle.getString("WHITE_COLOR");
    }
    public String getColor(int color) {
        String str = "";
        switch (color) {
            case 0:
                str = getUnKnow();
                break;
            case 1:
                str = getUnidentified();
                    break;
            case 2:
                str = getYellowColor();
                break;
            case 3:
                str = getBlackColor();
                break;
            case 4:
                str = getWhiteColor();
                break;
            default:
                str = getUnKnow();
                break;
        }
        return str;
    }
    public String getOpenEye() {
        return bundle.getString("OPEN_EYE");
    }
    public String getCloseEye() {
        return bundle.getString("CLOSE_EYE");
    }
    public String getEyeState(int eye) {
        String str = getUnidentified();
        switch (eye) {
            case 0:
                str = getUnKnow();
                break;
            case 1:
                str = getUnidentified();
                    break;
            case 2:
                str = getCloseEye();
                break;
            case 3:
                str = getOpenEye();
                break;
            default:
                str = getUnKnow();
                break;
        }
        return str;
    }
    public String getSmile() {
        return bundle.getString("SMILE");
    }
    public String getAnger() {
        return bundle.getString("ANGER");
    }
    public String getSadness() {
        return bundle.getString("SADNESS");
    }
    public String getDisgust() {
        return bundle.getString("DISGUST");
    }
    public String getFear() {
        return bundle.getString("FEAR");
    }
    public String getSurprise() {
        return bundle.getString("SURPRISE");
    }
    public String getNeutral() {
        return bundle.getString("NEUTRAL");
    }
    public String getLaugh() {
        return bundle.getString("LAUGH");
    }
    public String getFaceFeature(int type) {
        String str = "";
        switch (type) {
            case 0:
                str = getUnKnow();
                break;
            case 1:
                str = getWearGlasses();
                break;
            case 2:
                str = getSmile();
                break;
            case 3:
                str = getAnger();
                break;
            case 4:
                str = getSadness();
                break;
            case 5:
                str = getDisgust();
                break;
            case 6:
                str = getFear();
                break;
            case 7:
                str = getSurprise();
                break;
            case 8:
                str = getNeutral();
                break;
            case 9:
                str = getLaugh();
                break;
            default:
                str = getUnKnow();
                break;
        }
        return str;
    }
    public String getWearMask() {
        return bundle.getString("WEAR_MASK");
    }
    public String geNoMask() {
        return bundle.getString("NO_MASK");
    }
    public String getMaskState(int type) {
        String maskStateStr = "";
        switch (type) {
            case 0:
                maskStateStr = getUnKnow();
                break;
            case 1:
                maskStateStr = getUnidentified();
                break;
            case 2:
                maskStateStr = geNoMask();
                break;
            case 3:
                maskStateStr = getWearMask();
                break;
            default:
                maskStateStr = getUnKnow();
                break;
        }
        return maskStateStr;
    }
    public String getWearGlasses() {
        return bundle.getString("WEAR_GLASSES");
    }
    public String getNoGlasses() {
        return bundle.getString("NO_GLASSES");
    }
    public String getGlasses(int byGlasses) {
        String glassesStr = "";
        switch (byGlasses) {
            case 0:
                glassesStr = getUnKnow();
                break;
            case 1:
                glassesStr = getNoGlasses();
                break;
            case 2:
                glassesStr = getWearGlasses();
                break;
            default:
                break;
        }
        return glassesStr;
    }
    public String getAdd() {
        return bundle.getString("ADD");
    }
    public String getModify() {
        return bundle.getString("MODIFY");
    }
    public String getSelectData() {
        return bundle.getString("SELECT_DATA");
    }
    public String getDelete() {
        return bundle.getString("DELETE");
    }
    public String getFresh() {
        return bundle.getString("FRESH");
    }
    public String getAddGroup() {
        return bundle.getString("ADD_GROUP");
    }
    public String getModifyGroup() {
        return bundle.getString("MODIFY_GROUP");
    }
    public String getDelGroup() {
        return bundle.getString("DEL_GROUP");
    }
    public String getDisposition() {
        return bundle.getString("DISPOSITION");
    }
    public String getDelDisposition() {
        return bundle.getString("DEL_DISPOSITION");
    }
    public String getSimilarityRange() {
        return bundle.getString("SIMILARITY_RANGE");
    }
    public String getFindCondition() {
        return bundle.getString("FIND_CONDITION");
    }
    public String getFindPerson() {
        return bundle.getString("FIND_PERSON");
    }
    public String getAddPerson() {
        return bundle.getString("ADD_PERSON");
    }
    public String getModifyPerson() {
        return bundle.getString("MODIFY_PERSON");
    }
    public String getDelPerson() {
        return bundle.getString("DEL_PERSON");
    }
    public String getPreviousPage() {
        return bundle.getString("PREVIOUSPAGE");
    }
    public String getLastPage() {
        return bundle.getString("LASTPAGE");
    }
    public String getSelectPicture() {
        return bundle.getString("SELECT_PICTURE");
    }
    public String getSearchByPic() {
        return bundle.getString("SEARCH_BY_PIC");
    }
    public String getDownloadQueryPicture() {
        return bundle.getString("DOWNLOAD_QUERY_PICTURE");
    }
    public String getFaceLibrary() {
        return bundle.getString("FACE_LIBRARY");
    }
    public String getChooseFacePic() {
        return bundle.getString("CHOOSE_FACE_PIC");
    }
    public String getHistoryLibrary() {
        return bundle.getString("HISTORY_LIBRARY");
    }
    public String getEventType() {
        return bundle.getString("EVENT_TYPE");
    }
    public String getStranger() {
        return bundle.getString("STRANGER");
    }
    public String getInputGroupName() {
        return bundle.getString("PLEASE_INPUT_GROUPNAME");
    }
    public String getSelectGroup() {
        return bundle.getString("PLEASE_SELECT_GROUP");
    }
    public String getSelectPerson() {
        return bundle.getString("PLEASE_SELECT_PERSON");
    }
    public String getAddDispositionInfo() {
        return bundle.getString("PLEASE_ADD_DISPOSITION_INFO");
    }
    public String getSelectDelDispositionInfo() {
        return bundle.getString("PLEASE_SELECT_DEL_DISPOSITION_INFO");
    }
    public String getPagesNumber() {
        return bundle.getString("PAGES_NUMBER");
    }
    public String getAutoRegister() {
        return bundle.getString("AUTOREGISTER");
    }
    public String getAutoRegisterListen() {
        return bundle.getString("AUTOREGISTER_LISTEN");
    }
    public String getDeviceConfig() {
        return bundle.getString("DEVICE_CONFIG");
    }
    public String getDeviceList() {
        return bundle.getString("DEVICE_LIST");
    }
    public String getDeviceManager() {
        return bundle.getString("DEVICE_MANAGER");
    }
    public String getAddDevice() {
        return bundle.getString("ADD_DEVICE");
    }
    public String getModifyDevice() {
        return bundle.getString("MODIFY_DEVICE");
    }
    public String getDeleteDevice() {
        return bundle.getString("DELETE_DEVICE");
    }
    public String getClearDevice() {
        return bundle.getString("CLEAR_DEVICE");
    }
    public String getImportDevice() {
        return bundle.getString("IMPORT_DEVICE");
    }
    public String getExportDevice() {
        return bundle.getString("EXPORT_DEVICE");
    }
    public String getFunctionOperate() {
        return bundle.getString("FUNCTION") + bundle.getString("OPERATE");
    }
    public String getDeviceID() {
        return bundle.getString("DEVICE_ID");
    }
    public String getEnable() {
        return bundle.getString("ENABLE");
    }
    public String getRegisterAddress() {
        return bundle.getString("REGISTER_ADDRESS");
    }
    public String getRegisterPort() {
        return bundle.getString("REGISTER_PORT");
    }
    public String getGet() {
        return bundle.getString("GET");
    }
    public String getSet() {
        return bundle.getString("SET");
    }
    public String getAlreadyExisted() {
        return bundle.getString("ALREADY_EXISTED");
    }
    public String getWhetherNoToCover() {
        return bundle.getString("ALREADY_EXISTED_WHETHER_OR_NOT_TO_COVER");
    }
    public String getFileOpened(){
        return bundle.getString("FILE_OPEN_PLEASE_CLOSE_FILE");
    }
    public String getImportCompletion() {
        return bundle.getString("IMPORT_COMPLETION");
    }
    public String getExportCompletion() {
        return bundle.getString("EXPORT_COMPLETION");
    }
    public String getFileNotExist() {
        return bundle.getString("FILE_NOT_EXIST");
    }
    public String getRecord() {
        return bundle.getString("RECORD");
    }
    public String getInput() {
        return bundle.getString("PLEASE_INPUT");
    }
    public String getMaximumSupport() {
        return bundle.getString("MAX_SUPPORT_100");
    }
    public String getDeviceLogined() {
        return bundle.getString("DEVICE_LOGIN");
    }
    public String getAttendance() {
        return bundle.getString("ATTENDANCE");
    }
    public String getFingerPrintOperate() {
        return bundle.getString("FINGERPRINT_OPERATE");
    }
    public String getUserOperate() {
        return bundle.getString("USER_OPERATE");
    }
    public String getOperateByUserId() {
        return bundle.getString("OPERATE_BY_USER_ID");
    }
    public String getOperateByFingerPrintId() {
        return bundle.getString("OPERATE_BY_FINGERPRINT_ID");
    }
    public String getSearch() {
        return bundle.getString("SEARCH");
    }
    public String getQueryCondition() {
        return bundle.getString("QUERY_CONDITION");
    }
    public String getFingerPrintId() {
        return bundle.getString("FINGERPRINT_ID");
    }
    public String getSearchFingerPrint() {
        return bundle.getString("SEARCH_FINGERPRINT");
    }
    public String getAddFingerPrint() {
        return bundle.getString("ADD_FINGERPRINT");
    }
    public String getDeleteFingerPrint() {
        return bundle.getString("DELETE_FINGERPRINT");
    }
    public String getSubscribe() {
        return bundle.getString("SUBSCRIBE");
    }
    public String getUnSubscribe() {
        return bundle.getString("UNSUBSCRIBE");
    }
    public String getUserList() {
        return bundle.getString("USER_LIST");
    }
    public String getNextPage() {
        return bundle.getString("NEXT_PAGE");
    }
    public String getUserInfo() {
        return bundle.getString("USER_INFO");
    }
    public String getDoorOpenMethod() {
        return bundle.getString("DOOROPEN_METHOD");
    }
    public String getFingerPrint() {
        return bundle.getString("FINGERPRINT");
    }
    public String getFingerPrintInfo() {
        return bundle.getString("FINGERPRINT_INFO");
    }
    public String getFingerPrintData() {
        return bundle.getString("FINGERPRINT_DATA");
    }
    public String getCard() {
        return bundle.getString("CARD");
    }
    public String getDeleteFingerPrintPrompt() {
        return bundle.getString("DELETE_FINGERPRINT_PROMPT");
    }
    public String getSubscribeFailed() {
        return bundle.getString("SUBSCRIBE_FAILED");
    }
    public String getFingerPrintIdIllegal() {
        return bundle.getString("FINGERPRINT_ID_ILLEGAL");
    }
    public String getcFingerPrintCollection() {
        return bundle.getString("FINGERPRINT_COLLECTION");
    }
    public String getStartCollection() {
        return bundle.getString("START_COLLECTION");
    }
    public String getStopCollection() {
        return bundle.getString("STOP_COLLECTION");
    }
    public String getInCollection() {
        return bundle.getString("IN_THE_COLLECTION");
    }
    public String getcCompleteCollection() {
        return bundle.getString("COLLECTION_COMPLETED");
    }
    public String getCollectionFailed() {
        return bundle.getString("COLLECTION_FAILED");
    }
    public String getFingerPrintIdNotExist() {
        return bundle.getString("FINGERPRINT_ID_NOT_EXIST");
    }
    public String getUserIdExceedLength() {
        return bundle.getString("USER_ID_EXCEED_LENGTH");
    }
    public String getUserNameExceedLength() {
        return bundle.getString("USER_NAME_EXCEED_LENGTH");
    }
    public String getCardNoExceedLength() {
        return bundle.getString("CARD_NO_EXCEED_LENGTH");
    }
    public String getCardNameExceedLength() {
        return bundle.getString("CARD_NAME_EXCEED_LENGTH");
    }
    public String getCardPasswdExceedLength() {
        return bundle.getString("CARD_PASSWD_EXCEED_LENGTH");
    }
    public String getGate() {
        return bundle.getString("GATE");
    }
    public String getCardOperate() {
        return bundle.getString("CARD_OPERATE");
    }
    public String getCardInfo() {
        return bundle.getString("CARD_INFO");
    }
    public String getCardManager() {
        return bundle.getString("CARD_MANAGER");
    }
    public String getClear() {
        return bundle.getString("CLEAR");
    }
    public String getOpenStatus() {
        return bundle.getString("OPEN_STATUS");
    }
    public String getOpenMethod() {
        return bundle.getString("OPEN_METHOD");
    }
    public String getCardName() {
        return bundle.getString("CARD_NAME");
    }
    public String getCardStatus() {
        return bundle.getString("CARD_STATUS");
    }
    public String getCardPassword() {
        return bundle.getString("CARD_PASSWORD");
    }
    public String getCardType() {
        return bundle.getString("CARD_TYPE");
    }
    public String getCardNum() {
        return bundle.getString("CARD_NUM");
    }
    public String getUseTimes() {
        return bundle.getString("USE_TIMES");
    }
    public String getIsFirstEnter() {
        return bundle.getString("IS_FIRST_ENTER");
    }
    public String getIsValid() {
        return bundle.getString("IS_VALID");
    }
    public String getValidPeriod() {
        return bundle.getString("VALID_PERIOD");
    }
    public String getValidStartTime() {
        return bundle.getString("VALID_START_TIME");
    }
    public String getValidEndTime() {
        return bundle.getString("VALID_END_TIME");
    }
    public String getRecordNo() {
        return bundle.getString("RECORD_NO");
    }
    public String getFirstEnter() {
        return bundle.getString("FIRST_ENTER");
    }
    public String getNoFirstEnter() {
        return bundle.getString("NO_FIRST_ENTER");
    }
    public String getValid() {
        return bundle.getString("VALID");
    }
    public String getInValid() {
        return bundle.getString("INVALID");
    }
    public String getSelectCard() {
        return bundle.getString("PLEASE_SELECT_CARD");
    }
    public String getInputCardNo() {
        return bundle.getString("PLEASE_INPUT_CARDNO");
    }
    public String getInputUserId() {
        return bundle.getString("PLEASE_INPUT_USERID");
    }
    public String getWantClearAllInfo() {
        return bundle.getString("WANT_CLEAR_ALL_INFO");
    }
    public String getFailedAddCard() {
        return bundle.getString("ADD_CARD_INDO_FAILED");
    }
    public String getSucceedAddCardAndPerson() {
        return bundle.getString("ADD_CARD_INFO_AND_PERSON_PICTURE_SUCCEED");
    }
    public String getSucceedAddCardButFailedAddPerson() {
        return bundle.getString("ADD_CARD_INFO_SUCCEED_BUT_ADD_PERSON_PICTURE_FAILED");
    }
    public String getCardExistedSucceedAddPerson() {
        return bundle.getString("CARD_EXISTED_ADD_PERSON_PICTURE_SUCCEED");
    }
    public String getSucceedModifyCard() {
        return bundle.getString("MODIFY_CARD_INFO_SUCCEED");
    }
    public String getFailedModifyCard() {
        return bundle.getString("MODIFY_CARD_INFO_FAILED");
    }
    public String getSucceedModifyCardAndPerson() {
        return bundle.getString("MODIFY_CARD_INFO_AND_PERSON_PICTURE_SUCCEED");
    }
    public String getSucceedModifyCardButFailedModifyPerson() {
        return bundle.getString("MODIFY_CARD_INFO_SUCCEED_BUT_MODIFY_PERSON_PICTURE_FAILED");
    }
    public String[] getCardTable() {
        return new String[] {getIndex(),
                             getCardNo(),
                             getCardName(),
                             getRecordNo(),
                             getUserId(),
                             getCardPassword(),
                             getCardStatus(),
                             getCardType(),
                             getUseTimes(),
                             getIsFirstEnter(),
                             getIsValid(),
                             getValidStartTime(),
                             getValidEndTime()};
    }
    /*
     * 用于列表显示
     */
    public String getCardStatus(int status) {
        String statusString = "";
        switch(status) {
            case NET_ACCESSCTLCARD_STATE.NET_ACCESSCTLCARD_STATE_UNKNOWN:   // 未知
                statusString = bundle.getString("STATE_UNKNOWN");
                break;
            case NET_ACCESSCTLCARD_STATE.NET_ACCESSCTLCARD_STATE_NORMAL:   // 正常
                statusString = bundle.getString("STATE_NORMAL");
                break;
            case NET_ACCESSCTLCARD_STATE.NET_ACCESSCTLCARD_STATE_LOSE:   // 挂失
                statusString = bundle.getString("STATE_LOSE");
                break;
            case NET_ACCESSCTLCARD_STATE.NET_ACCESSCTLCARD_STATE_LOGOFF:   // 注销
                statusString = bundle.getString("STATE_LOGOFF");
                break;
            case NET_ACCESSCTLCARD_STATE.NET_ACCESSCTLCARD_STATE_FREEZE:   // 冻结
                statusString = bundle.getString("STATE_FREEZE");
                break;
            case NET_ACCESSCTLCARD_STATE.NET_ACCESSCTLCARD_STATE_ARREARAGE:   // 欠费
                statusString = bundle.getString("STATE_ARREARS");
                break;
            case NET_ACCESSCTLCARD_STATE.NET_ACCESSCTLCARD_STATE_OVERDUE:  // 逾期
                statusString = bundle.getString("STATE_OVERDUE");
                break;
            case NET_ACCESSCTLCARD_STATE.NET_ACCESSCTLCARD_STATE_PREARREARAGE:  // 预欠费
                statusString = bundle.getString("STATE_PREARREARS");
                break;
            default:
                statusString = bundle.getString("STATE_UNKNOWN");
                break;
        }
        return statusString;
    }
    /*
     * 根据控件的索引,获取对应的卡状态的Int值, 用于添加 和 修改卡信息
     */
    public int getCardStatusInt(int index) {
        int status = 0;
        switch(index) {
            case 1:   // 未知
                status = NET_ACCESSCTLCARD_STATE.NET_ACCESSCTLCARD_STATE_UNKNOWN;
                break;
            case 0:   // 正常
                status = NET_ACCESSCTLCARD_STATE.NET_ACCESSCTLCARD_STATE_NORMAL;
                break;
            case 2:   // 挂失
                status = NET_ACCESSCTLCARD_STATE.NET_ACCESSCTLCARD_STATE_LOSE;
                break;
            case 3:   // 注销
                status = NET_ACCESSCTLCARD_STATE.NET_ACCESSCTLCARD_STATE_LOGOFF;
                break;
            case 4:   // 冻结
                status = NET_ACCESSCTLCARD_STATE.NET_ACCESSCTLCARD_STATE_FREEZE;
                break;
            case 5:   // 欠费
                status = NET_ACCESSCTLCARD_STATE.NET_ACCESSCTLCARD_STATE_ARREARAGE;
                break;
            case 6:  // 逾期
                status = NET_ACCESSCTLCARD_STATE.NET_ACCESSCTLCARD_STATE_OVERDUE;
                break;
            case 7:  // 预欠费
                status = NET_ACCESSCTLCARD_STATE.NET_ACCESSCTLCARD_STATE_PREARREARAGE;
                break;
            default:
                status = NET_ACCESSCTLCARD_STATE.NET_ACCESSCTLCARD_STATE_UNKNOWN;
                break;
        }
        return status;
    }
    /*
     * 根据字符串,获取控件对应的索引
     */
    public int getCardStatusChomBoxIndex(String status) {
        int index = 0;
        if(status.equals(bundle.getString("STATE_UNKNOWN"))) {
            index = 1;
        } else if(status.equals(bundle.getString("STATE_NORMAL"))){
            index = 0;
        } else if(status.equals(bundle.getString("STATE_LOSE"))) {
            index = 2;
        } else if(status.equals(bundle.getString("STATE_LOGOFF"))) {
            index = 3;
        } else if(status.equals(bundle.getString("STATE_FREEZE"))) {
            index = 4;
        } else if(status.equals(bundle.getString("STATE_ARREARS"))) {
            index = 5;
        } else if(status.equals(bundle.getString("STATE_OVERDUE"))) {
            index = 6;
        } else if(status.equals(bundle.getString("STATE_PREARREARS"))) {
            index = 7;
        }
        return index;
    }
    public String[] getCardStatusList() {
        return new String[]{
                            bundle.getString("STATE_NORMAL"),
                            bundle.getString("STATE_UNKNOWN"),
                            bundle.getString("STATE_LOSE"),
                            bundle.getString("STATE_LOGOFF"),
                            bundle.getString("STATE_FREEZE"),
                            bundle.getString("STATE_ARREARS"),
                            bundle.getString("STATE_OVERDUE"),
                            bundle.getString("STATE_PREARREARS")};
    }
    /*
     * 用于列表显示
     */
    public String getCardType(int type) {
        String cardTypeString = "";
        switch(type) {
            case NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_UNKNOWN:  // 未知
                cardTypeString = bundle.getString("CARD_UNKNOW");
                break;
            case NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_GENERAL:  // 一般卡
                cardTypeString = bundle.getString("CARD_GENERAL");
                break;
            case NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_VIP:      //
                cardTypeString = bundle.getString("CARD_VIP");
                break;
            case NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_GUEST:    // 来宾卡
                cardTypeString = bundle.getString("CARD_GUEST");
                break;
            case NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_PATROL:   // 巡逻卡
                cardTypeString = bundle.getString("CARD_PATROL");
                break;
            case NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_BLACKLIST: // 禁止名单卡
                cardTypeString = bundle.getString("CARD_BACKLIST");
                break;
            case NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_CORCE:     // 胁迫卡
                cardTypeString = bundle.getString("CARD_COERCE");
                break;
            case NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_POLLING:   // 巡检卡
                cardTypeString = bundle.getString("CARD_POLLING");
                break;
            case NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_MOTHERCARD: // 母卡
                cardTypeString = bundle.getString("CARD_MOTHERCARD");
                break;
            default:
                cardTypeString = bundle.getString("CARD_UNKNOW");
                break;
        }
        return cardTypeString;
    }
    /*
     * 根据控件索引,获取对应的卡类型Int值
     */
    public int getCardTypeInt(int index) {
        int type = 0;
        switch(index) {
            case 1:
                type = NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_UNKNOWN;
                break;
            case 0:
                type = NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_GENERAL;
                break;
            case 2:
                type = NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_VIP;
                break;
            case 3:
                type = NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_GUEST;
                break;
            case 4:
                type = NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_PATROL;
                break;
            case 5:
                type = NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_BLACKLIST;
                break;
            case 6:
                type = NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_CORCE;
                break;
            case 7:
                type = NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_POLLING;
                break;
            case 8:
                type = NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_MOTHERCARD;
                break;
            default:
                type = NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_UNKNOWN;
                break;
        }
        return type;
    }
    /*
     * 根据字符串,获取控件的索引
     */
    public int getCardTypeChomBoxIndex(String type) {
        int index = 0;
        if(type.equals(bundle.getString("CARD_UNKNOW"))) {
            index = 1;
        } else if(type.equals(bundle.getString("CARD_GENERAL"))){
            index = 0;
        } else if(type.equals(bundle.getString("CARD_VIP"))) {
            index = 2;
        } else if(type.equals(bundle.getString("CARD_GUEST"))) {
            index = 3;
        } else if(type.equals(bundle.getString("CARD_PATROL"))) {
            index = 4;
        } else if(type.equals(bundle.getString("CARD_BACKLIST"))) {
            index = 5;
        } else if(type.equals(bundle.getString("CARD_COERCE"))) {
            index = 6;
        } else if(type.equals(bundle.getString("CARD_POLLING"))) {
            index = 7;
        } else if(type.equals(bundle.getString("CARD_MOTHERCARD"))) {
            index = 8;
        }
        return index;
    }
    public String[] getCardTypeList() {
        return new String[]{
                            bundle.getString("CARD_GENERAL"),
                            bundle.getString("CARD_UNKNOW"),
                            bundle.getString("CARD_VIP"),
                            bundle.getString("CARD_GUEST"),
                            bundle.getString("CARD_PATROL"),
                            bundle.getString("CARD_BACKLIST"),
                            bundle.getString("CARD_COERCE"),
                            bundle.getString("CARD_POLLING"),
                            bundle.getString("CARD_MOTHERCARD")};
    }
    public String getMaskStatus(int emMaskStatus) {
        String MaskStatus = "";
        switch(emMaskStatus) {
        case EM_MASK_STATE_TYPE.EM_MASK_STATE_UNKNOWN:
            MaskStatus = bundle.getString("EM_MASK_STATE_UNKNOWN");
            break;
        case EM_MASK_STATE_TYPE.EM_MASK_STATE_NODISTI:
            MaskStatus = bundle.getString("EM_MASK_STATE_NODISTI");
            break;
        case EM_MASK_STATE_TYPE.EM_MASK_STATE_NOMASK:
            MaskStatus = bundle.getString("EM_MASK_STATE_NOMASK");
            break;
        case EM_MASK_STATE_TYPE.EM_MASK_STATE_WEAR:
            MaskStatus = bundle.getString("EM_MASK_STATE_WEAR");
            break;
        }
        return MaskStatus;
    }
    public String getOpenMethods(int emOpenMethod) {
        String openMethods = "";
        switch(emOpenMethod) {
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_UNKNOWN:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_UNKNOWN");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_PWD_ONLY:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_PWD_ONLY");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_CARD:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_CARD");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_CARD_FIRST:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_CARD_FIRST");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_PWD_FIRST:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_PWD_FIRST");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_REMOTE:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_REMOTE");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_BUTTON:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_BUTTON");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_PWD_CARD_FINGERPRINT:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_PWD_CARD_FINGERPRINT");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_PWD_FINGERPRINT:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_PWD_FINGERPRINT");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_CARD_FINGERPRINT:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_CARD_FINGERPRINT");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_PERSONS:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_PERSONS");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_KEY:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_KEY");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_COERCE_PWD:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_COERCE_PWD");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_QRCODE:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_QRCODE");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_FACE_RECOGNITION:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_FACE_RECOGNITION");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_FACEIDCARD:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_FACEIDCARD");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_FACEIDCARD_AND_IDCARD:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_FACEIDCARD_AND_IDCARD");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_BLUETOOTH:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_BLUETOOTH");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_CUSTOM_PASSWORD:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_CUSTOM_PASSWORD");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_USERID_AND_PWD:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_USERID_AND_PWD");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_FACE_AND_PWD:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_FACE_AND_PWD");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_AND_PWD:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_AND_PWD");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_AND_FACE:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_AND_FACE");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FACE:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FACE");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_FACE_OR_PWD:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_FACE_OR_PWD");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_OR_PWD:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_OR_PWD");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_OR_FACE:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_OR_FACE");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FACE:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FACE");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FINGERPRINT:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FINGERPRINT");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_AND_FACE_AND_PWD:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_AND_FACE_AND_PWD");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FACE_AND_PWD:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FACE_AND_PWD");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FINGERPRINT_AND_PWD:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FINGERPRINT_AND_PWD");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_CARD_AND_PWD_AND_FACE:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_CARD_AND_PWD_AND_FACE");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_OR_FACE_OR_PWD:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_OR_FACE_OR_PWD");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FACE_OR_PWD:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FACE_OR_PWD");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FINGERPRINT_OR_FACE:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FINGERPRINT_OR_FACE");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FINGERPRINT_AND_FACE_AND_PWD:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FINGERPRINT_AND_FACE_AND_PWD");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FINGERPRINT_OR_FACE_OR_PWD:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FINGERPRINT_OR_FACE_OR_PWD");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_FACEIPCARDANDIDCARD_OR_CARD_OR_FACE:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_FACEIPCARDANDIDCARD_OR_CARD_OR_FACE");
                break;
            case NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_FACEIDCARD_OR_CARD_OR_FACE:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_FACEIDCARD_OR_CARD_OR_FACE");
                break;
            default:
                openMethods = bundle.getString("NET_ACCESS_DOOROPEN_METHOD_UNKNOWN");
                break;
        }
        return openMethods;
    }
    public String getShowInfo(String tag) {
        try {
            return bundle.getString(tag);
        }catch(Exception e) {
            return tag;
        }
    }
    public String getThermalCamera() {
        return getShowInfo("THERMAL_CAMERA");
    }
    public String[] getMeterTypeList() {
        String[] meterTypes = {getShowInfo("SPOT"), getShowInfo("LINE"), getShowInfo("AREA")};
        return meterTypes;
    }
    public String[] getTemperUnitList() {
        return new String[]{getShowInfo("CENTIGRADE"), getShowInfo("FAHRENHEIT")};
    }
    public String[] getPeriodList() {
        return new String[] {getShowInfo("FIVE_MINUTES"), getShowInfo("TEN_MINUTES"),
                getShowInfo("FIFTEEN_MINUTES"), getShowInfo("THIRTY_MINUTES")};
    }
    public String[] getTemperStatusList() {
        return new String[]{getShowInfo("IDLE"), getShowInfo("ACQUIRING")};
    }
    public String getSearchingWait() {
        return bundle.getString("SEARCHING_WAITING");
    }
    ///////////// Human Number Statistic ///////////////
    public String getHumanNumberStatistic() {
        return bundle.getString("HUMAN_NUMBER_STATISTIC_TITLE");
    }
    public String getHumanNumberStatisticAttach() {
        return bundle.getString("HUMAN_NUMBER_STATISTIC_CONTROL");
    }
    public String getHumanNumberStatisticEventTitle() {
        return bundle.getString("HUMAN_NUMBER_STATISTIC_EVENT_TITLE");
    }
    public String getHumanNumberStatisticEventChannel() {
        return bundle.getString("HUMAN_NUMBER_STATISTIC_EVENT_CHANNEL");
    }
    public String getHumanNumberStatisticEventTime() {
        return bundle.getString("HUMAN_NUMBER_STATISTIC_EVENT_TIME");
    }
    public String getHumanNumberStatisticEventHourIn() {
        return bundle.getString("HUMAN_NUMBER_STATISTIC_EVENT_HOUR_IN");
    }
    public String getHumanNumberStatisticEventHourOut() {
        return bundle.getString("HUMAN_NUMBER_STATISTIC_EVENT_HOUR_OUT");
    }
    public String getHumanNumberStatisticEventTodayIn() {
        return bundle.getString("HUMAN_NUMBER_STATISTIC_EVENT_TODAY_IN");
    }
    public String getHumanNumberStatisticEventTodayOut() {
        return bundle.getString("HUMAN_NUMBER_STATISTIC_EVENT_TODAY_OUT");
    }
    public String getHumanNumberStatisticEventTotalIn() {
        return bundle.getString("HUMAN_NUMBER_STATISTIC_EVENT_TOTAL_IN");
    }
    public String getHumanNumberStatisticEventTotalOut() {
        return bundle.getString("HUMAN_NUMBER_STATISTIC_EVENT_TOTAL_OUT");
    }
    public String getHumanNumberStatisticEventClearOSD() {
        return bundle.getString("HUMAN_NUMBER_STATIC_EVENT_OSD_CLEAR");
    }
    public String getVTOAlarmEventRoomNo(){
        return bundle.getString("VTO_ALARM_EVENT_ROOM_NO");
    }
    public String getVTOAlarmEventCardNo(){
        return bundle.getString("VTO_ALARM_EVENT_CARD_NO");
    }
    public String getVTOAlarmEventTime(){
        return bundle.getString("VTO_ALARM_EVENT_TIME");
    }
    public String getVTOAlarmEventOpenMethod(){
        return bundle.getString("VTO_ALARM_EVENT_OPEN_METHOD");
    }
    public String getVTOAlarmEventStatus(){
        return bundle.getString("VTO_ALARM_EVENT_STATUS");
    }
    public String getVTORealLoadRoomNO(){
        return bundle.getString("VTO_REAL_LOAD_ROOM_NO");
    }
    public String getVTORealLoadCardNo(){
        return bundle.getString("VTO_REAL_LOAD_CARD_NO");
    }
    public String getVTORealLoadTime(){
        return bundle.getString("VTO_REAL_LOAD_TIME");
    }
    public String getVTORealLoadEventInfo(){
        return bundle.getString("VTO_REAL_LOAD_EVENT_INFO");
    }
    public String getVTOOperateManagerTitle(){
        return bundle.getString("VTO_OPERATE_MANAGER_TITLE");
    }
    public String getInputRoomNo(){
        return bundle.getString("INPUT_ROOM_NO");
    }
    public String getRoomNoExceedLength(){
        return bundle.getString("ROOM_NO_EXCEED_LENGTH");
    }
    public String getVTOOperateManagerRecNo(){
        return bundle.getString("VTO_OPERATE_MANAGER_REC_NO");
    }
    public String getVTOOperateManagerRoomNo(){
        return bundle.getString("VTO_OPERATE_MANAGER_ROOM_NO");
    }
    public String getVTOOperateManagerCardNo(){
        return bundle.getString("VTO_OPERATE_MANAGER_CARD_NO");
    }
    public String getVTOOperateManagerFingerPrintData(){
        return bundle.getString("VTO_OPERATE_MANAGER_FINGER_PRINT_DATA");
    }
    public String getVTOOperateInfoTitle(){
        return bundle.getString("VTO_OPERATE_INFO_TITLE");
    }
    public String getVTOOperateCollectionFingerPrintTitle(){
        return bundle.getString("VTO_OPERATE_COLLECTION_FINGER_PRINT_TITLE");
    }
    public String getDoorOpen(){
        return bundle.getString("DOOR_OPEN");
    }
    public String getDoorClose(){
        return bundle.getString("DOOR_CLOSE");
    }
    public String getEventOperate(){
        return bundle.getString("EVENT_OPERATE");
    }
    public String getStartRealLoad(){
        return bundle.getString("START_REAL_LOAD_PIC");
    }
    public String getStopRealLoad(){
        return bundle.getString("STOP_REAL_LOAD_PIC");
    }
    public String getAlarmEvent(){
        return bundle.getString("ALARM_EVENT");
    }
    public String getRealLoadEvent(){
        return bundle.getString("REAL_LOAD_EVENT");
    }
    public String getCollectionResult(){
        return bundle.getString("COLLECTION_RESULT");
    }
    public String getNeedFingerPrint(){
        return bundle.getString("NEED_FINGER_PRINT");
    }
    public String getFaceInfo(){
        return bundle.getString("FACE_INFO");
    }
    public String getOpen(){
        return bundle.getString("OPEN");
    }
///////////////////////////////////点阵屏设置/////////////////////////////////////、
    public static String getmatrixScreen() {
        // TODO Auto-generated method stub
        return bundle.getString("MATRIX_SCREEN");
    }
    public String getPassingState(){
        return bundle.getString("PASSING_STATE");
    }
    public String getPassingCar(){
        return bundle.getString("PASSING_CAR");
    }
    public String getNoCar(){
        return bundle.getString("NO_CAR");
    }
    public String getInTime(){
        return bundle.getString("IN_TIME");
    }
    public String getOutTime(){
        return bundle.getString("OUT_TIME");
    }
    public String getPlateNumber(){
        return bundle.getString("PLATE_NUMBER");
    }
    public String getCarOwner(){
        return bundle.getString("CAR_OWNER");
    }
    public String getParkingTime(){
        return bundle.getString("PARKING_TIME");
    }
    public String getUserType(){
        return bundle.getString("USER_TYPE");
    }
    public String getMonthlyCardUser(){
        return bundle.getString("MONTHLY_CARD_USER");
    }
    public String getAnnualCardUser(){
        return bundle.getString("ANNUAL_CARD_USER");
    }
    public String getLongTermUser(){
        return bundle.getString("LONG_TERM_USER");
    }
    public String getTemporaryUser(){
        return bundle.getString("TEMPORARY_USER");
    }
    public String getParkingCharge(){
        return bundle.getString("PARKING_CHARGE");
    }
    public String getDaysDue(){
        return bundle.getString("DAYS_DUE");
    }
    public String getRemainingParkingSpaces(){
        return bundle.getString("REMAINING_PARKING_SPACES");
    }
    public String getVehiclesNotAllowedToPass(){
        return bundle.getString("VEHICLES_NOT_ALLOWED_TO_PASS");
    }
    public String getAllowedVehiclesToPass(){
        return bundle.getString("ALLOWED_VEHICLES_TO_PASS");
    }
    public String getSetUp(){
        return bundle.getString("SET_UP");
    }
    public String getSetUpSuccess(){
        return bundle.getString("SUCCESSFULLY_ISSUED");
    }
    public String getSetUpFailed(){
        return bundle.getString("DELIVERY_FAILED");
    }
    public String getCostomUserInfo(){
        return bundle.getString("CUSTOM_USER_CLASS");
    }
    public String getRemarksInfo(){
        return bundle.getString("REMARKS_INFORMATION");
    }
    public String getCostomInfo(){
        return bundle.getString("CUSTOM_INFORMATION");
    }
    public String getVTO() {return bundle.getString("VTO");}
    public String getSCADA() {return bundle.getString("SCADA");}
    public String getTrafficAllowList(){return bundle.getString("TRAFFIC_ALLOW_LIST");}
    public String getModifyCardFaceFailed(){
        return bundle.getString("MODIFY_CARD_FACE_FAILED");
    }
    public String getRemoveCardFaceFailed(){
        return bundle.getString("REMOVE_CARD_FACE_FAILED");
    }
    public String getDownLoadPicture(){
        return bundle.getString("DOWNLOAD_PICTURE");
    }
    public String getEnterPicturePath(){
        return bundle.getString("ENTER_PICTURE_PATH");
    }
    public String getLoading(){
        return bundle.getString("LOADING");
    }
    public String getEndSearch(){
        return bundle.getString("END_SEARCH");
    }
    public String getRemoteOpenDoor(){return bundle.getString("REMOTE_OPEN_DOOR");}
    public String getQueryCardExistFailed(){return bundle.getString("QUERY_CARD_EXIST_FAILED");}
    public String getFindCardExist(){return bundle.getString("CARD_EXIST");}
    public String getSCADADeviceList(){
        return bundle.getString("SCADA_DEVICE_LIST");
    }
    public String getSCADAPointList(){
        return bundle.getString("SCADA_POINT_LIST");
    }
    public String getSCADAAlarmAttachInfo(){
        return bundle.getString("SCADA_ATTACH_ALARM");
    }
    public String getSCADAAttachInfo(){
        return bundle.getString("SCADA_ATTACH_INFO");
    }
    public String getSCADAAttach(){
        return bundle.getString("SCADA_ATTACH");
    }
    public String getListBtn(){
        return bundle.getString("BTN_LIST");
    }
    public String getAllowlistOperation(){
        return bundle.getString("ALLOWLIST_OPERATION");
    }
    public String getSingleUpload(){
        return bundle.getString("SINGLE_UPLOAD");
    }
    public String getLicensePlateRun(){return bundle.getString("LICENSE_PLATE_RUN");  }
    public String getFuzzyQuery(){return bundle.getString("FUZZY_QUERY");  }
    public String getDeleteAll(){return bundle.getString("DELETE_ALL");  }
    public String getAuthorization(){return bundle.getString("AUTHORIZATION");  }
    public String getBatchUpload(){return bundle.getString("BATCH_UPLOAD");  }
    public String getBrowse(){return bundle.getString("BROWSE");  }
    public String getUpload(){return bundle.getString("UPLOAD");  }
    public String getQueryInformation(){return bundle.getString("QUERY_INFORMATION");  }
    public String getDialog(){return bundle.getString("DIALOG");  }
    public String getLicensePlateNumber(){return bundle.getString("LICENSE_PLATE_NUMBER");  }
    public String getModifyPanel(){return bundle.getString("MODIFY_PANEL");  }
    public String getSerialNumber(){return bundle.getString("SERIAL_NUMBER");  }
    public String getOpenModel(){return bundle.getString("OPEN_MODEL");  }
    public String getLicensePlateLengthTooLong(){return bundle.getString("LICENSE_PLATE_LENGTH_TOO_LONG");  }
    public String getNameTooLong(){return bundle.getString("NAME_TOO_LONG");  }
    public String getDataNumber(){return bundle.getString("DATA_NUMBER");  }
    public String getUnauthorization(){return bundle.getString("UNAUTHORIZATION");  }
    public String getAddSuccess(){return bundle.getString("ADD_SUCCESS"); }
    public String getAddFail(){return bundle.getString("ADD_FAIL"); }
    public String getDeleteSuccess(){return bundle.getString("DELETE_SUCCESS"); }
    public String getDeleteFail(){return bundle.getString("DELETE_FAIL"); }
    public String getModifySuccess(){return bundle.getString("MODIFY_SUCCESS"); }
    public String getModifyFail(){return bundle.getString("MODIFY_FAIL"); }
    public String getUploadSuccess(){return bundle.getString("UPLOAD_SUCCESS"); }
    public String getUploadFail(){return bundle.getString("UPLOAD_FAIL"); }
    public String getUploading(){return bundle.getString("UPLOADING"); }
    public String getSureUpload(){return bundle.getString("SURE_UPLOAD"); }
    public String getEnterQueryData(){return bundle.getString("ENTER_QUERY_DATA"); }
    public String getScreenNumber(){return bundle.getString("SCREEN_NUMBER");}
    public String getContain(){return bundle.getString("TEXT_CONTENT");}
    public String getContainType(){return bundle.getString("TEXT_CONTENT_TYPE");}
    public String getContainColor(){return bundle.getString("TEXT_CONTENT_COLOR");}
    public String getScrollType(){return bundle.getString("SCROLL_TYPE");}
    public String getScrollSpeed(){return bundle.getString("SCROLL_SPEED");}
    public String getGreen(){return bundle.getString("GREEN");}
    public String getRed(){return bundle.getString("RED");}
    public String getYellow(){return bundle.getString("YELLOW");}
    public String getWhite(){return bundle.getString("WHITE");}
    public String getOrdinary(){return bundle.getString("ORDINARY");}
    public String getQRCode(){return bundle.getString("QR_CODE");}
    public String getLocalTime(){return bundle.getString("LOCAL_TIME");}
    public String getResource(){return bundle.getString("RESOURCE");}
    public String getNoRolling(){return bundle.getString("NOT_ROLLING");}
    public String getScrollLeftAndRight(){return bundle.getString("SCROLL_LEFT_AND_RIGHT");}
    public String getScrollTopAndDown(){return bundle.getString("SCROLL_UP_AND_DOWN");}
    public String getNumericString(){return bundle.getString("NUMBER_STRING");}
    public String getVoiceText(){return bundle.getString("VOICE_TEXT");}
    public String getIssued(){return bundle.getString("ISSUED");}
    public String getPrompt(){return bundle.getString("PROMPT");}
    public String getDeviceName(){return bundle.getString("DEVICE_NAME");}
    public String getPointID(){return bundle.getString("POINT_ID");}
    public String getPointName(){return bundle.getString("POINT_NAME");}
    public String getIfValidSignalPoint(){return bundle.getString("IF_VALID_SIGNAL_POINT");}
    public String getAlarmDescribe(){return bundle.getString("ALARM_DESCRIBE");}
    public String getAlarmDelay(){return bundle.getString("ALARM_DELAY");}
    public String getAlarmLevel(){return bundle.getString("ALARM_LEVEL");}
    public String getAlarmTime(){return bundle.getString("ALARM_TIME");}
    public String getAlarmType(){return bundle.getString("ALARM_TYPE");}
    public String getCollectTime(){return bundle.getString("COLLECT_TIME");}
    public String getJing(){return bundle.getString("JING");}
    public String getJin(){return bundle.getString("JIN");}
    public String getJi(){return bundle.getString("JI");}
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/SavePath.java
对比新文件
@@ -0,0 +1,76 @@
package com.ruoyi.device.dhsdk.common;
import com.ruoyi.device.dhsdk.lib.ToolKits;
import java.io.File;
public class SavePath {
    private SavePath() {}
    private static class SavePathHolder {
        private static SavePath instance = new SavePath();
    }
    public static SavePath getSavePath() {
        return SavePathHolder.instance;
    }
    String s_captureSavePath = "./Capture/" + ToolKits.getDay() + "/";         // 抓拍图片保存路径
    String s_imageSavePath = "./Image/" + ToolKits.getDay() + "/";                // 图片保存路径
    String s_recordFileSavePath = "./RecordFile/" + ToolKits.getDay() + "/";   // 录像保存路径
    /*
     * 设置抓图保存路径
     */
    public String getSaveCapturePath() {
        File path1 = new File("./Capture/");
        if (!path1.exists()) {
            path1.mkdir();
        }
        File path2 = new File(s_captureSavePath);
        if (!path2.exists()) {
            path2.mkdir();
        }
        String strFileName = path2.getAbsolutePath() + "/" + ToolKits.getDate() + ".jpg";
        return strFileName;
    }
    /*
     * 设置智能交通图片保存路径
     */
    public String getSaveTrafficImagePath() {
        File path1 = new File("./Image/");
        if (!path1.exists()) {
            path1.mkdir();
        }
        File path = new File(s_imageSavePath);
        if (!path.exists()) {
            path.mkdir();
        }
        return s_imageSavePath;
    }
    /*
     * 设置录像保存路径
     */
    public String getSaveRecordFilePath() {
        File path1 = new File("./RecordFile/");
        if (!path1.exists()) {
            path1.mkdir();
        }
        File path2 = new File(s_recordFileSavePath);
        if (!path2.exists()) {
            path2.mkdir();
        }
        String SavedFileName = s_recordFileSavePath + ToolKits.getDate() + ".dav"; // 默认保存路径
        return SavedFileName;
    }
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/common/WindowCloseListener.java
对比新文件
@@ -0,0 +1,5 @@
package com.ruoyi.device.dhsdk.common;
public interface WindowCloseListener {
    void windowClosing();
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/controller/DhSdkController.java
对比新文件
@@ -0,0 +1,78 @@
package com.ruoyi.device.dhsdk.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.dhsdk.service.IDhClientService;
import com.ruoyi.device.hiksdk.service.IHikClientService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Map;
/**
 * @Description: 大华sdk接口
 * @ClassName: DhSdkController
 * @Author: 刘苏义
 * @Date: 2023年10月14日10:34:58
 **/
@Api(tags = "大华SDK接口")
@Controller
@RequestMapping("/dh")
@Anonymous
public class DhSdkController {
    @Resource
    private IDhClientService sdk;
    /**
     * @描述 初始加载大华库文件
     * @参数 []
     * @返回值 void
     * @创建人 刘苏义
     * @创建时间 2023/1/17 16:13
     * @修改人和其它信息 if (Platform.isLinux())
     */
    @PostConstruct
    public void initDHSDK() {
        //初始化加载sdk库文件
        if (sdk.init())
        {
            //登录所有相机
            sdk.loginAll();
        }
    }
    @ApiOperation(value = "云台控制", notes = "Code:1-左上 2-上 3-右上 4-左 5-巡航 6-右 7-左下 8-下 9-右下 10-焦距变大 11-焦距变小\n" +
            "12-焦点前调 13-焦点后调 14-光圈扩大 15-光圈缩小 ")
    @PostMapping("/pTZControl")
    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.speed", "cmd.enable", "cmd.code"})
    @Log(title = "云台控制", businessType = BusinessType.CONTROL)
    public @ResponseBody
    AjaxResult pTZControl(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        return AjaxResult.success(sdk.pTZControl(cmd));
    }
    @ApiOperation("获取PTZ")
    @PostMapping("/getPTZ")
    @ApiOperationSupport(includeParameters = {"cmd.cameraId"})
    @Log(title = "获取PTZ", businessType = BusinessType.CONTROL)
    public @ResponseBody
    AjaxResult getPTZ(@RequestBody CameraCmd cmd) {
        cmd.setOperator(SecurityUtils.getUserId());
        Map<String, Object> ptzMap = sdk.getPtz(cmd);
        return AjaxResult.success("获取ptz", ptzMap);
    }
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/module/ConfigModule.java
对比新文件
@@ -0,0 +1,36 @@
package com.ruoyi.device.dhsdk.module;
import com.ruoyi.device.dhsdk.lib.NetSDKLib;
import com.sun.jna.Structure;
import com.sun.jna.ptr.IntByReference;
/**
 * @Description:
 * @ClassName: ConfigModule
 * @Author: 刘苏义
 * @Date: 2023年10月14日14:57:01
 **/
public class ConfigModule {
    public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
    public static boolean GetDevConfig(NetSDKLib.LLong hLoginHandle, int nType, Structure cmdObject) {
        boolean result = false;
        IntByReference error = new IntByReference(0);
        int nBufferLen = 2 * 1024 * 1024;
        netsdk.CLIENT_QueryDevState(hLoginHandle, nType, cmdObject.getPointer(), nBufferLen, error, 3000);
        return result;
    }
    /**
     * 查询设备状态
     */
    public static boolean queryDevState(NetSDKLib.LLong hLoginHandle, int nType, NetSDKLib.SdkStructure stuInfo) {
        IntByReference intRetLen = new IntByReference();
        stuInfo.write();
        if (!LoginModule.netsdk.CLIENT_QueryDevState(hLoginHandle, nType, stuInfo.getPointer(), stuInfo.size(), intRetLen, 3000)) {
            return false;
        }
        stuInfo.read();
        return true;
    }
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/module/LoginModule.java
对比新文件
@@ -0,0 +1,152 @@
package com.ruoyi.device.dhsdk.module;
import com.ruoyi.device.dhsdk.lib.NetSDKLib;
import com.ruoyi.device.dhsdk.lib.NetSDKLib.LLong;
import com.ruoyi.device.dhsdk.lib.NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY;
import com.ruoyi.device.dhsdk.lib.NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY;
import com.ruoyi.device.dhsdk.lib.ToolKits;
import com.sun.jna.Structure;
import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import static com.ruoyi.device.dhsdk.lib.ToolKits.getErrorCodePrint;
/**
 * 登陆接口实现
 * 主要有 :初始化、登陆、登出功能
 */
@Slf4j(topic = "dhSdk")
public class LoginModule {
    public static NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
    public static NetSDKLib configsdk = NetSDKLib.CONFIG_INSTANCE;
    // 设备信息
    public static NetSDKLib.NET_DEVICEINFO_Ex m_stDeviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();
    // 登陆句柄
    public static LLong m_hLoginHandle = new LLong(0);//
    private static boolean bInit = false;
    private static boolean bLogopen = false;
    /**
     * \if ENGLISH_LANG
     * Init
     * \else
     * 初始化
     * \endif
     */
    public static boolean init(NetSDKLib.fDisConnect disConnect, NetSDKLib.fHaveReConnect haveReConnect) {
        bInit = netsdk.CLIENT_Init(disConnect, null);
        if (!bInit) {
            log.debug("Initialize SDK failed");
            return false;
        }
        //打开日志,可选
        //NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO();
        //File path = new File("./sdklog/");
        //if (!path.exists()) {
        //    path.mkdir();
        //}
        //String logPath = path.getAbsoluteFile().getParent() + "\\sdklog\\" + ToolKits.getDate() + ".log";
        //setLog.nPrintStrategy = 0;
        //setLog.bSetFilePath = 1;
        //System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length);
        //System.out.println(logPath);
        //setLog.bSetPrintStrategy = 1;
        //bLogopen = netsdk.CLIENT_LogOpen(setLog);
      //  if (!bLogopen) {
           // System.err.println("Failed to open NetSDK log");
       // }
        // 设置断线重连回调接口,设置过断线重连成功回调函数后,当设备出现断线情况,SDK内部会自动进行重连操作
        // 此操作为可选操作,但建议用户进行设置
        netsdk.CLIENT_SetAutoReconnect(haveReConnect, null);
        //设置登录超时时间和尝试次数,可选
        int waitTime = 5000; //登录请求响应超时时间设置为5S
        int tryTimes = 1;    //登录时尝试建立链接1次
        netsdk.CLIENT_SetConnectTime(waitTime, tryTimes);
        // 设置更多网络参数,NET_PARAM的nWaittime,nConnectTryNum成员与CLIENT_SetConnectTime
        // 接口设置的登录设备超时时间和尝试次数意义相同,可选
        NetSDKLib.NET_PARAM netParam = new NetSDKLib.NET_PARAM();
        netParam.nConnectTime = 10000;      // 登录时尝试建立链接的超时时间
        netParam.nGetConnInfoTime = 3000;   // 设置子连接的超时时间
        netParam.nGetDevInfoTime = 3000;//获取设备信息超时时间,为0默认1000ms
        netsdk.CLIENT_SetNetworkParam(netParam);
        return true;
    }
    /**
     * \if ENGLISH_LANG
     * CleanUp
     * \else
     * 清除环境
     * \endif
     */
    public static void cleanup() {
        if (bLogopen) {
            netsdk.CLIENT_LogClose();
        }
        if (bInit) {
            netsdk.CLIENT_Cleanup();
        }
    }
    /**
     * \if ENGLISH_LANG
     * Login Device
     * \else
     * 登录设备
     * \endif
     */
    public static LLong login(String m_strIp, int m_nPort, String m_strUser, String m_strPassword) {
        IntByReference nError = new IntByReference(0);
        //入参
        NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstInParam = new NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY();
        pstInParam.nPort = m_nPort;
        pstInParam.szIP = m_strIp.getBytes();
        pstInParam.szPassword = m_strPassword.getBytes();
        pstInParam.szUserName = m_strUser.getBytes();
        //出参
        NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY pstOutParam = new NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY();
        pstOutParam.stuDeviceInfo = m_stDeviceInfo;
        LLong m_hLoginHandle = netsdk.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser, m_strPassword, 0, null, m_stDeviceInfo, nError);
        //m_hLoginHandle=netsdk.CLIENT_LoginWithHighLevelSecurity(pstInParam, pstOutParam);
        if (m_hLoginHandle.longValue() == 0) {
            log.debug("Login Device[%s] Port[%d]Failed. %s\n", m_strIp, m_nPort, getErrorCodePrint());
        } else {
            log.debug("Login Success [ " + m_strIp + " ]");
        }
        return m_hLoginHandle;
        //return m_hLoginHandle.longValue() == 0? false:true;
    }
    /**
     * \if ENGLISH_LANG
     * Logout Device
     * \else
     * 登出设备
     * \endif
     */
    public static boolean logout(LLong loginId) {
        if (loginId.longValue() == 0) {
            return false;
        }
        boolean bRet = netsdk.CLIENT_Logout(loginId);
        if (bRet) {
            loginId.setValue(0);
        }
        return bRet;
    }
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/module/PtzControlModule.java
对比新文件
@@ -0,0 +1,206 @@
package com.ruoyi.device.dhsdk.module;
import com.ruoyi.device.dhsdk.lib.NetSDKLib;
/**
 * 云台控制接口实现
 * 主要有 :八个方向控制、变倍、变焦、光圈功能
 */
public class PtzControlModule {
    /**
     * 向上
     */
    public static boolean ptzControlUpStart(NetSDKLib.LLong lLoginID,int nChannelID, int lParam1, int lParam2) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                    NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL,
                                    lParam1, lParam2, 0, 0);
    }
    public static boolean ptzControlUpEnd(int nChannelID) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                     NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL,
                                     0, 0, 0, 1);
    }
    /**
     * 向下
     */
    public static boolean ptzControlDownStart(int nChannelID, int lParam1, int lParam2) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                            NetSDKLib.NET_PTZ_ControlType.NET_PTZ_DOWN_CONTROL,
                                            lParam1, lParam2, 0, 0);
    }
    public static boolean ptzControlDownEnd(int nChannelID) {
        return     LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                             NetSDKLib.NET_PTZ_ControlType.NET_PTZ_DOWN_CONTROL,
                                             0, 0, 0, 1);
    }
    /**
     * 向左
     */
    public static boolean ptzControlLeftStart(int nChannelID, int lParam1, int lParam2) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                            NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL,
                                            lParam1, lParam2, 0, 0);
    }
    public static boolean ptzControlLeftEnd(int nChannelID) {
        return    LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                             NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL,
                                             0, 0, 0, 1);
    }
    /**
     * 向右
     */
    public static boolean ptzControlRightStart(int nChannelID, int lParam1,int lParam2) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                            NetSDKLib.NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL,
                                            lParam1, lParam2, 0, 0);
    }
    public static boolean ptzControlRightEnd(int nChannelID) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                             NetSDKLib.NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL,
                                             0, 0, 0, 1);
    }
    /**
     * 向左上
     */
    public static boolean ptzControlLeftUpStart(int nChannelID, int lParam1, int lParam2) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                            NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTTOP,
                                            lParam1, lParam2, 0, 0);
    }
    public static boolean ptzControlLeftUpEnd(int nChannelID) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                             NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTTOP,
                                             0, 0, 0, 1);
    }
    /**
     * 向右上
     */
    public static boolean ptzControlRightUpStart(int nChannelID, int lParam1, int lParam2) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                            NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTTOP,
                                            lParam1, lParam2, 0, 0);
    }
    public static boolean ptzControlRightUpEnd(int nChannelID) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                             NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTTOP,
                                             0, 0, 0, 1);
    }
    /**
     * 向左下
     */
    public static boolean ptzControlLeftDownStart(int nChannelID, int lParam1, int lParam2) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                                    NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTDOWN,
                                                    lParam1, lParam2, 0, 0);
    }
    public static boolean ptzControlLeftDownEnd(int nChannelID) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                         NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTDOWN,
                                         0, 0, 0, 1);
    }
    /**
     * 向右下
     */
    public static boolean ptzControlRightDownStart(int nChannelID, int lParam1, int lParam2) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                                    NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTDOWN,
                                                    lParam1, lParam2, 0, 0);
    }
    public static boolean ptzControlRightDownEnd(int nChannelID) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                         NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTDOWN,
                                         0, 0, 0, 1);
    }
    /**
     * 变倍+
     */
    public static boolean ptzControlZoomAddStart(int nChannelID, int lParam2) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                           NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_ADD_CONTROL,
                                           0, lParam2, 0, 0);
    }
    public static boolean ptzControlZoomAddEnd(int nChannelID) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                            NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_ADD_CONTROL,
                                            0, 0, 0, 1);
    }
    /**
     * 变倍-
     */
    public static boolean ptzControlZoomDecStart(int nChannelID, int lParam2) {
       return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                            NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_DEC_CONTROL,
                                            0, lParam2, 0, 0);
    }
    public static boolean ptzControlZoomDecEnd(int nChannelID) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                             NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_DEC_CONTROL,
                                             0, 0, 0, 1);
    }
    /**
     * 变焦+
     */
    public static boolean ptzControlFocusAddStart(int nChannelID, int lParam2) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                                    NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_ADD_CONTROL,
                                                    0, lParam2, 0, 0);
    }
    public static boolean ptzControlFocusAddEnd(int nChannelID) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                         NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_ADD_CONTROL,
                                         0, 0, 0, 1);
    }
    /**
     * 变焦-
     */
    public static boolean ptzControlFocusDecStart(int nChannelID, int lParam2) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                            NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_DEC_CONTROL,
                                            0, lParam2, 0, 0);
    }
    public static boolean ptzControlFocusDecEnd(int nChannelID) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                             NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_DEC_CONTROL,
                                             0, 0, 0, 1);
    }
    /**
     * 光圈+
     */
    public static boolean ptzControlIrisAddStart(int nChannelID, int lParam2) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                            NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_ADD_CONTROL,
                                            0, lParam2, 0, 0);
    }
    public static boolean ptzControlIrisAddEnd(int nChannelID) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                             NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_ADD_CONTROL,
                                             0, 0, 0, 1);
    }
    /**
     * 光圈-
     */
    public static boolean ptzControlIrisDecStart(int nChannelID, int lParam2) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                                    NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_DEC_CONTROL,
                                                    0, lParam2, 0, 0);
    }
    public static boolean ptzControlIrisDecEnd(int nChannelID) {
        return LoginModule.netsdk.CLIENT_DHPTZControlEx(LoginModule.m_hLoginHandle, nChannelID,
                                             NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_DEC_CONTROL,
                                             0, 0, 0, 1);
    }
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/service/IDhClientService.java
对比新文件
@@ -0,0 +1,35 @@
package com.ruoyi.device.dhsdk.service;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.channel.domain.ArdChannel;
import java.util.List;
import java.util.Map;
/**
 * @ClassName IDhSdkServer
 * @Description:
 * @Author 刘苏义
 * @Date 2023/10/13 21:18
 * @Version 1.0
 */
public interface IDhClientService {
    //sdk初始化
    Boolean init();
    //登录
    Boolean login(ArdCameras ardCamera);
    //登录所有相机
    void loginAll();
    //注销
    Boolean logout(String cameraId);
    //在线状态
    boolean isOnLine(CameraCmd cmd);
    //云台控制
    boolean pTZControl(CameraCmd cmd);
    //ptz 三坐标
    Map<String, Object> getPtz(CameraCmd cmd);
}
ard-work/src/main/java/com/ruoyi/device/dhsdk/service/impl/DhClientServiceImpl.java
对比新文件
@@ -0,0 +1,255 @@
package com.ruoyi.device.dhsdk.service.impl;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.IArdCamerasService;
import com.ruoyi.device.channel.domain.ArdChannel;
import com.ruoyi.device.channel.service.IArdChannelService;
import com.ruoyi.device.dhsdk.common.Res;
import com.ruoyi.device.dhsdk.lib.NetSDKLib;
import com.ruoyi.device.dhsdk.lib.NetSDKLib.LLong;
import com.ruoyi.device.dhsdk.lib.ToolKits;
import com.ruoyi.device.dhsdk.lib.enumeration.EM_NEW_QUERY_SYSTEM_INFO;
import com.ruoyi.device.dhsdk.module.ConfigModule;
import com.ruoyi.device.dhsdk.module.LoginModule;
import com.ruoyi.device.dhsdk.module.PtzControlModule;
import com.ruoyi.device.dhsdk.service.IDhClientService;
import com.ruoyi.device.hiksdk.common.GlobalVariable;
import com.ruoyi.device.hiksdk.sdk.HCNetSDK;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.text.DecimalFormat;
import java.util.*;
import static com.ruoyi.device.dhsdk.lib.NetSDKLib.NET_DEVSTATE_PTZ_LOCATION;
import static com.ruoyi.device.dhsdk.lib.ToolKits.getErrorCodePrint;
import static com.ruoyi.device.hiksdk.sdk.HCNetSDK.NET_DVR_CHECK_USER_STATUS;
/**
 * @ClassName DhSdkServiceImpl
 * @Description:
 * @Author 刘苏义
 * @Date 2023/10/13 21:19
 * @Version 1.0
 */
@Service
@Slf4j(topic = "dhSdk")
public class DhClientServiceImpl implements IDhClientService {
    @Resource
    private IArdCamerasService ardCamerasService;
    @Resource
    private IArdChannelService ardChannelService;
    private Vector<String> chnlist = new Vector<String>();
    // 设备断线通知回调
    private static DisConnect disConnect = new DisConnect();
    // 网络连接恢复
    private static HaveReConnect haveReConnect = new HaveReConnect();
    @Override
    public void loginAll() {
        try {
            ArdCameras ardCamera = new ArdCameras();
            ardCamera.setFactory("2");//获取大华相机
            List<ArdCameras> ardCameras = ardCamerasService.selectArdCamerasListNoDataScope(ardCamera);
            for (ArdCameras camera : ardCameras) {
                Thread.sleep(500);
                //异步登录
                login(camera);
            }
        } catch (Exception ex) {
            log.error("初始化登录相机异常:" + ex.getMessage());
        }
    }
    @Override
    public Boolean init() {
        return LoginModule.init(disConnect, haveReConnect);   // 打开工程,初始化
    }
    @Override
    @Async
    public Boolean login(ArdCameras camera) {
        LLong loginId = LoginModule.login(camera.getIp(), camera.getPort(), camera.getUsername(), camera.getPassword());
        if (loginId.longValue() > 0) {
            //log.debug(camera.getIp() + ":" + camera.getPort() + "登录成功");
            if (GlobalVariable.loginMap.containsKey(camera.getId())) {
                GlobalVariable.loginMap.remove(camera.getId());
            }
            //删除管理通道
            ardChannelService.deleteArdChannelByDeviceId(camera.getId());
            camera.setState("1");
            camera.setChanNum(LoginModule.m_stDeviceInfo.byChanNum);
            camera.setStartDChan(1);
            camera.setLoginId((int) loginId.longValue());
            ardCamerasService.updateArdCameras(camera);
            GlobalVariable.loginMap.put(camera.getId(), loginId);
            //获取最新通道
            for (int i = 1; i < LoginModule.m_stDeviceInfo.byChanNum + 1; i++) {
                chnlist.add(Res.string().getChannel() + " " + String.valueOf(i));
                ArdChannel channel = new ArdChannel();
                channel.setDeviceId(camera.getId());
                channel.setName("通道" + i);
                channel.setId(IdUtils.simpleUUID());
                channel.setChanNo(i);
                ardChannelService.insertArdChannel(channel);
            }
        } else {
            //log.debug(camera.getIp() + ":" + camera.getPort() + "登录失败");
            camera.setChanNum(0);
            camera.setLoginId(-1);
            camera.setState("0");
            ardCamerasService.updateArdCameras(camera);
            return false;
        }
        return true;
    }
    @Override
    public Boolean logout(String cameraId) {
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        return LoginModule.logout(loginId);
    }
    @Override
    public boolean isOnLine(CameraCmd cmd) {
        try {
            String cameraId = cmd.getCameraId();
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return false;
            }
            LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        } catch (Exception ex) {
            log.error("检测在线异常:" + ex.getMessage());
            return false;
        }
        return false;
    }
    @Override
    public boolean pTZControl(CameraCmd cmd) {
        String cameraId = cmd.getCameraId();
        boolean enable = cmd.isEnable();
        Integer chanNo = cmd.getChanNo();
        Integer speed = cmd.getSpeed();
        Integer code = cmd.getCode();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        int dwStop;
        if (enable) {
            dwStop = 0;//开启
        } else {
            dwStop = 1;//关闭
        }
        int dwPTZCommand = -1;
        switch (code) {
            /*方向*/
            case 1:
                dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTTOP;
                break;
            case 2:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL;
                break;
            case 3:
                dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTTOP;
                break;
            case 4:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL;
                break;
            case 5:
                dwPTZCommand = HCNetSDK.RUN_SEQ;
                break;
            case 6:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL;
                break;
            case 7:
                dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTDOWN;
                break;
            case 8:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_DOWN_CONTROL;
                break;
            case 9:
                dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTDOWN;
                break;
            /*焦距*/
            case 10:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_ADD_CONTROL;
                break;
            case 11:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_DEC_CONTROL;
                break;
            /*焦点*/
            case 12:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_ADD_CONTROL;
                break;
            case 13:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_DEC_CONTROL;
                break;
            /*光圈*/
            case 14:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_ADD_CONTROL;
                break;
            case 15:
                dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_DEC_CONTROL;
                break;
        }
        boolean bool = LoginModule.netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, dwPTZCommand, speed, speed, 0, dwStop);
        if (!bool) {
            log.error("控制失败,请稍后重试" + getErrorCodePrint());
        }
        return bool;
    }
    @Override
    public Map<String, Object> getPtz(CameraCmd cmd) {
        Map<String, Object> ptzMap = new HashMap<>();
        String cameraId = cmd.getCameraId();
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return null;
        }
        LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
        NetSDKLib.NET_PTZ_LOCATION_INFO dh_ptz_location_info = new NetSDKLib.NET_PTZ_LOCATION_INFO();
        boolean b = ConfigModule.queryDevState(loginId, NET_DEVSTATE_PTZ_LOCATION, dh_ptz_location_info);
        if (b) {
            DecimalFormat df = new DecimalFormat("0.0");//设置保留位数
            String nPTZPan = df.format((float)dh_ptz_location_info.nPTZPan / 10);
            String nPTZTilt = df.format((float)dh_ptz_location_info.nPTZTilt/10);
            String nPTZZoom = df.format((float)dh_ptz_location_info.nPTZZoom);
            ptzMap.put("p", nPTZPan);
            ptzMap.put("t", nPTZTilt);
            ptzMap.put("z", nPTZZoom);
        }
        return ptzMap;
    }
    // 设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数
    private static class DisConnect implements NetSDKLib.fDisConnect {
        public void invoke(LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
            System.out.printf("Device[%s] Port[%d] DisConnect!\n", pchDVRIP, nDVRPort);
        }
    }
    // 网络连接恢复,设备重连成功回调
    // 通过 CLIENT_SetAutoReconnect 设置该回调函数,当已断线的设备重连成功时,SDK会调用该函数
    private static class HaveReConnect implements NetSDKLib.fHaveReConnect {
        @Override
        public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
            System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);
        }
    }
}
ard-work/src/main/java/com/ruoyi/device/hiksdk/common/GlobalVariable.java
@@ -14,7 +14,7 @@
@Data
public class GlobalVariable {
    //保存相机登录信息
    public static Map<String, Integer> loginMap = new HashMap<>();
    public static Map<String, Object> loginMap = new HashMap<>();
    //相机预览字典
    public static Map<String, Integer> previewMap = new HashMap<>();
    //线程字典
ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java
@@ -8,6 +8,7 @@
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.service.IArdCamerasService;
import com.ruoyi.device.dhsdk.service.IDhClientService;
import com.ruoyi.device.hiksdk.service.IHikClientService;
import com.ruoyi.common.annotation.Anonymous;
import com.ruoyi.common.core.domain.AjaxResult;
@@ -37,6 +38,8 @@
    @Resource
    private IHikClientService sdk;
    @Resource
    private IDhClientService ClientService;
    @Resource
    private IArdCamerasService ardCamerasService;
    /**
ard-work/src/main/java/com/ruoyi/device/hiksdk/sdk/LoginResultCallBack.java
@@ -39,7 +39,6 @@
    @Override
    public int invoke(int lUserID, int dwResult, HCNetSDK.NET_DVR_DEVICEINFO_V30 lpDeviceinfo, Pointer pUser) {
        MediaClient mediaClient=SpringUtils.getBean(MediaClient.class);
        IVtduService vtduService = SpringUtils.getBean(IVtduService.class);
        IArdChannelService ardChannelService = SpringUtils.getBean(IArdChannelService.class);
        IHikClientService hikClientService = SpringUtils.getBean(IHikClientService.class);
@@ -103,4 +102,4 @@
        ardCamerasService.updateArdCameras(camera);
        return 1;
    }
}
}
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/IHikClientService.java
@@ -27,7 +27,7 @@
    void loginAll();
    //注销
    boolean loginOut(String cameraId);
    boolean logout(String cameraId);
    //在线状态
    boolean isOnLine(CameraCmd cmd);
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
@@ -65,7 +65,7 @@
        try {
            log.debug("开始加载sdk库文件路径");
            if (Platform.isWindows()) {
                String WIN_PATH = System.getProperty("user.dir") + File.separator + "lib" + File.separator + "HCNetSDK.dll";
                String WIN_PATH = System.getProperty("user.dir") + File.separator + "lib\\hikDll\\HCNetSDK.dll";
                log.debug("当前Windows平台的sdk库路径:" + WIN_PATH);
                hCNetSDK = (HCNetSDK) Native.loadLibrary(WIN_PATH, HCNetSDK.class);
            } else {
@@ -277,7 +277,9 @@
    public void loginAll() {
        try {
            log.debug("加载lib完成!");
            List<ArdCameras> ardCameras = ardCamerasService.selectArdCamerasListNoDataScope(new ArdCameras());
            ArdCameras ardCamera = new ArdCameras();
            ardCamera.setFactory("1");
            List<ArdCameras> ardCameras = ardCamerasService.selectArdCamerasListNoDataScope(ardCamera);
            for (ArdCameras camera : ardCameras) {
                Thread.sleep(500);
                //异步登录
@@ -297,11 +299,11 @@
     * @修改人和其它信息
     */
    @Override
    public boolean loginOut(String cameraId) {
    public boolean logout(String cameraId) {
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        boolean b = hCNetSDK.NET_DVR_Logout(userId);
        if (b) {
            GlobalVariable.loginMap.remove(cameraId);
@@ -321,7 +323,7 @@
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return false;
            }
            Integer userId = GlobalVariable.loginMap.get(cameraId);
            Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
            return hCNetSDK.NET_DVR_RemoteControl(userId, NET_DVR_CHECK_USER_STATUS, null, 0);
        } catch (Exception ex) {
            log.error("检测在线异常:" + ex.getMessage());
@@ -350,7 +352,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        int dwStop;
        if (enable) {
            dwStop = 0;//开启
@@ -436,7 +438,7 @@
            return false;
        }
        // 获取参数
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        HCNetSDK.NET_DVR_STD_CONFIG struStdCfg = new HCNetSDK.NET_DVR_STD_CONFIG();
        HCNetSDK.NET_DVR_GIS_INFO struGisInfo = new HCNetSDK.NET_DVR_GIS_INFO();
        struGisInfo.struPtzPosEx.dwFocus = dwFocusPos;
@@ -470,7 +472,7 @@
            return new HashMap<>();
        }
        // 获取参数
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        HCNetSDK.NET_DVR_STD_CONFIG struStdCfg = new HCNetSDK.NET_DVR_STD_CONFIG();
        HCNetSDK.NET_DVR_GIS_INFO struGisInfo = new HCNetSDK.NET_DVR_GIS_INFO();
        struStdCfg.read();
@@ -507,7 +509,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        boolean bool = hCNetSDK.NET_DVR_PTZPreset_Other(userId, channelNum, SET_PRESET, PresetIndex);
        if (!bool) {
            int code = hCNetSDK.NET_DVR_GetLastError();
@@ -530,7 +532,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        boolean bool = hCNetSDK.NET_DVR_PTZPreset_Other(userId, channelNum, GOTO_PRESET, PresetIndex);
        if (!bool) {
            int code = hCNetSDK.NET_DVR_GetLastError();
@@ -554,7 +556,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return null;
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        Map<String, String> map = new HashMap<>();
        NET_DVR_COMPRESSIONCFG_V30 compressioncfg = new NET_DVR_COMPRESSIONCFG_V30();
@@ -794,7 +796,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return null;
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        NET_DVR_PTZPOS m_ptzPosCurrent = new NET_DVR_PTZPOS();
        Pointer pioint = m_ptzPosCurrent.getPointer();
@@ -846,7 +848,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        NET_DVR_PTZPOS m_ptzPosCurrent = new NET_DVR_PTZPOS();
        m_ptzPosCurrent.wAction = 1;
        try {
@@ -878,7 +880,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        NET_DVR_PTZPOS m_ptzPosCurrent = new NET_DVR_PTZPOS();
        m_ptzPosCurrent.wAction = 1;
        try {
@@ -965,7 +967,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return -1;
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        NET_DVR_PTZ_LOCKCFG netDvrPtzLockcfg = new NET_DVR_PTZ_LOCKCFG();
        Pointer point = netDvrPtzLockcfg.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
@@ -997,7 +999,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        NET_DVR_INITIALPOSITIONCTRL initialpositionctrl = new NET_DVR_INITIALPOSITIONCTRL();
        initialpositionctrl.dwSize = initialpositionctrl.size();
@@ -1029,7 +1031,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return new HashMap<>();
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        NET_DVR_PTZSCOPE m_ptzPosCurrent = new NET_DVR_PTZSCOPE();
        Pointer point = m_ptzPosCurrent.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
@@ -1078,7 +1080,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        NET_DVR_CAMERAPARAMCFG_EX struCameraParam = new NET_DVR_CAMERAPARAMCFG_EX();
        Pointer point = struCameraParam.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
@@ -1124,7 +1126,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        NET_DVR_CAMERAPARAMCFG_EX struDayNigh = new NET_DVR_CAMERAPARAMCFG_EX();
        Pointer point = struDayNigh.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
@@ -1172,7 +1174,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        NET_DVR_FOCUSMODE_CFG struFocusMode = new NET_DVR_FOCUSMODE_CFG();
        Pointer point = struFocusMode.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
@@ -1215,7 +1217,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return "";
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        NET_DVR_FOCUSMODE_CFG struFocusMode = new NET_DVR_FOCUSMODE_CFG();
        Pointer point = struFocusMode.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
@@ -1245,7 +1247,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        int dwStop;
        if (enable) {
            dwStop = 0;//开启
@@ -1278,7 +1280,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return false;
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        NET_DVR_DEVSERVER_CFG struDeicing = new NET_DVR_DEVSERVER_CFG();
        Pointer point = struDeicing.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
@@ -1315,7 +1317,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return "";
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        NET_DVR_WORKSTATE_V30 devwork = new NET_DVR_WORKSTATE_V30();
        if (!hCNetSDK.NET_DVR_GetDVRWorkState_V30(userId, devwork)) {
            // 返回Boolean值,判断是否获取设备能力
@@ -1358,7 +1360,7 @@
        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
            return "";
        }
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        //图片信息
        NET_DVR_JPEGPARA jpeg = new NET_DVR_JPEGPARA();
        //设置图片分辨率
@@ -1422,7 +1424,7 @@
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return "";
            }
            Integer userId = GlobalVariable.loginMap.get(cameraId);
            Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
            //强制I帧结构体对象
            HCNetSDK.NET_DVR_I_FRAME netDvrIFrame = new HCNetSDK.NET_DVR_I_FRAME();   //新建结构体对象
            netDvrIFrame.read();
@@ -1483,7 +1485,7 @@
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return;
            }
            Integer userId = GlobalVariable.loginMap.get(cameraId);
            Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
            //强制I帧结构体对象
            HCNetSDK.NET_DVR_I_FRAME netDvrIFrame = new HCNetSDK.NET_DVR_I_FRAME();   //新建结构体对象
            netDvrIFrame.read();
@@ -1538,7 +1540,7 @@
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return "";
            }
            Integer userId = GlobalVariable.loginMap.get(cameraId);
            Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
            //region 强制I帧
            HCNetSDK.NET_DVR_I_FRAME netDvrIFrame = new HCNetSDK.NET_DVR_I_FRAME();   //新建结构体对象
            netDvrIFrame.read();
@@ -1591,7 +1593,7 @@
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return;
            }
            Integer userId = GlobalVariable.loginMap.get(cameraId);
            Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
            //强制I帧结构体对象
            HCNetSDK.NET_DVR_I_FRAME netDvrIFrame = new HCNetSDK.NET_DVR_I_FRAME();   //新建结构体对象
            netDvrIFrame.read();
@@ -1676,7 +1678,7 @@
            return new HashMap<>();
        }
        // 获取参数
        Integer userId = GlobalVariable.loginMap.get(cameraId);
        Integer userId = (Integer)GlobalVariable.loginMap.get(cameraId);
        HCNetSDK.NET_DVR_STD_CONFIG struStdCfg = new HCNetSDK.NET_DVR_STD_CONFIG();
        HCNetSDK.NET_DVR_GIS_INFO struGisInfo = new HCNetSDK.NET_DVR_GIS_INFO();
        struStdCfg.read();
ard-work/src/main/resources/dynamic-lib-load.xml
对比新文件
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" ?>
<dynamic-lib>
    <win64>
        <lib>avnetsdk</lib>
        <lib>dhconfigsdk</lib>
        <lib>dhnetsdk</lib>
        <lib>dhplay</lib>
        <lib>RenderEngine</lib>
        <lib>ImageAlg</lib>
        <lib>Infra</lib>
        <lib>IvsDrawer</lib>
        <lib>StreamConvertor</lib>
    </win64>
    <win32>
        <lib>avnetsdk</lib>
        <lib>dhconfigsdk</lib>
        <lib>dhnetsdk</lib>
        <lib>dhplay</lib>
        <lib>RenderEngine</lib>
        <lib>Infra</lib>
        <lib>ImageAlg</lib>
        <lib>StreamConvertor</lib>
    </win32>
    <linux64>
        <lib>avnetsdk</lib>
        <lib>dhnetsdk</lib>
        <lib>dhconfigsdk</lib>
        <lib>StreamConvertor</lib>
    </linux64>
    <linux32>
        <lib>avnetsdk</lib>
        <lib>dhconfigsdk</lib>
        <lib>dhnetsdk</lib>
    </linux32>
    <mac64>
        <lib>avnetsdk</lib>
        <lib>dhnetsdk</lib>
        <lib>dhconfigsdk</lib>
        <lib>StreamConvertor</lib>
    </mac64>
</dynamic-lib>
ard-work/src/main/resources/mapper/device/ArdCamerasMapper.xml
@@ -13,6 +13,7 @@
        <result property="username" column="username"/>
        <result property="password" column="password"/>
        <result property="gdtype" column="gdtype"/>
        <result property="factory" column="factory"/>
        <result property="chanNum" column="channel"/>
        <result property="longitude" column="longitude"/>
        <result property="latitude" column="latitude"/>
@@ -44,6 +45,7 @@
               c.username,
               c.password,
               c.gdtype,
               c.factory,
               c.channel,
               c.longitude,
               c.latitude,
@@ -80,6 +82,7 @@
            <if test="username != null  and username != ''">and c.username like '%'||#{username}||'%'</if>
            <if test="password != null  and password != ''">and c.password = #{password}</if>
            <if test="gdtype != null  and gdtype != ''">and c.gdtype = #{gdtype}</if>
            <if test="factory != null  and factory != ''">and c.factory = #{factory}</if>
            <if test="chanNum != null ">and c.channel = #{chanNum}</if>
            <if test="longitude != null ">and c.longitude = #{longitude}</if>
            <if test="latitude != null ">and c.latitude = #{latitude}</if>
@@ -113,6 +116,7 @@
            <if test="username != null  and username != ''">and c.username like '%'||#{username}||'%'</if>
            <if test="password != null  and password != ''">and c.password = #{password}</if>
            <if test="gdtype != null  and gdtype != ''">and c.gdtype = #{gdtype}</if>
            <if test="factory != null  and factory != ''">and c.factory = #{factory}</if>
            <if test="chanNum != null ">and c.channel = #{chanNum}</if>
            <if test="longitude != null ">and c.longitude = #{longitude}</if>
            <if test="latitude != null ">and c.latitude = #{latitude}</if>
@@ -150,6 +154,7 @@
            <if test="username != null">username,</if>
            <if test="password != null">password,</if>
            <if test="gdtype != null">gdtype,</if>
            <if test="factory != null">factory,</if>
            <if test="chanNum != null">channel,</if>
            <if test="longitude != null">longitude,</if>
            <if test="latitude != null">latitude,</if>
@@ -181,6 +186,7 @@
            <if test="username != null">#{username},</if>
            <if test="password != null">#{password},</if>
            <if test="gdtype != null">#{gdtype},</if>
            <if test="factory != null">#{factory},</if>
            <if test="chanNum != null">#{chanNum},</if>
            <if test="longitude != null">#{longitude},</if>
            <if test="latitude != null">#{latitude},</if>
@@ -215,6 +221,7 @@
            <if test="username != null">username = #{username},</if>
            <if test="password != null">password = #{password},</if>
            <if test="gdtype != null">gdtype = #{gdtype},</if>
            <if test="factory != null">factory = #{factory},</if>
            <if test="chanNum != null">channel = #{chanNum},</if>
            <if test="longitude != null">longitude = #{longitude},</if>
            <if test="latitude != null">latitude = #{latitude},</if>
ard-work/src/main/resources/resources_en_US.properties
对比新文件
@@ -0,0 +1,1071 @@
# FunctionList
FUNCTIONLIST=FunctionList
REALPLAY=RealPlay
CAPTURE_PICTURE=Capture Picture
MULTIREALPLAY=MultiRealPlay
DOWNLOAD_RECORD=Download Record
ITS_EVENT=TrafficEvent
TALK=Talk
DEVICESEARCH_DEVICEINIT=DeviceSearchAndInit
PTZ=PTZ Control
FACERECOGNITION=FaceRecognition
ALARM_LISTEN=Alarm Listen
DEVICE_CONTROL=Device Control
AUTOREGISTER=AutoRegister
REMOTE_OPEN_DOOR=Remote Open Door
ONLINE=Online
# Login Info
DEVICE_IP=Device IP
DEVICE_PORT=Port
USERNAME=UserName
PASSWORD=Password
IP=IP
LOGIN=Login
LOGOUT=Logout
LOGIN_SUCCEED=Login Succeed
LOGIN_FAILED=Login Failed
DISCONNECT=Device disconnect
DISCONNECT_RECONNECTING=Device disconnect, reconnecting
PROMPT_MESSAGE=Prompt Message
ERROR_MESSAGE=Error Message
SUCCEED=Succeed
FAILED=Failed
PLEASE_INPUT_DEVICE_IP=Please input device IP
PLEASE_INPUT_DEVICE_PORT=Please input device port
PLEASE_INPUT_DEVICE_USERNAME=Please input userName
PLEASE_INPUT_DEVICE_PASSWORD=Please input password
PLEASE_INPUT_CONFIRM_PASSWORD=Please input confirm password
# Error Info
NET_NOERROR=No error
NET_ERROR=Unknown error
NET_SYSTEM_ERROR=System error
NET_NETWORK_ERROR=Protocol error it may result from network timeout
NET_DEV_VER_NOMATCH=Device protocol does not match
NET_INVALID_HANDLE=Handle is invalid
NET_OPEN_CHANNEL_ERROR=Failed to open channel
NET_CLOSE_CHANNEL_ERROR=Failed to close channel
NET_ILLEGAL_PARAM=User parameter is illegal
NET_SDK_INIT_ERROR=SDK initialization error
NET_SDK_UNINIT_ERROR=SDK clear error
NET_RENDER_OPEN_ERROR=Error occurs when apply for render resources
NET_DEC_OPEN_ERROR=Error occurs when opening the decoder library
NET_DEC_CLOSE_ERROR=Error occurs when closing the decoder library
NET_MULTIPLAY_NOCHANNEL=The detected channel number is 0 in multiple-channel preview
NET_TALK_INIT_ERROR=Failed to initialize record library
NET_TALK_NOT_INIT=The record library has not been initialized
NET_TALK_SENDDATA_ERROR=Error occurs when sending out audio data
NET_REAL_ALREADY_SAVING=The real-time has been protected
NET_NOT_SAVING=The real-time data has not been save
NET_OPEN_FILE_ERROR=Error occurs when opening the file
NET_PTZ_SET_TIMER_ERROR=Failed to enable PTZ to control timer
NET_RETURN_DATA_ERROR=Error occurs when verify returned data
NET_INSUFFICIENT_BUFFER=There is no sufficient buffer
NET_NOT_SUPPORTED=The current SDK does not support this funcntion
NET_NO_RECORD_FOUND=There is no searched result
NET_NOT_AUTHORIZED=You have no operation right
NET_NOT_NOW=Can not operate right now
NET_NO_TALK_CHANNEL=There is no audio talk channel
NET_NO_AUDIO=There is no audio
NET_NO_INIT=The network SDK has not been initialized
NET_DOWNLOAD_END=The download completed
NET_EMPTY_LIST=There is no searched result
NET_ERROR_GETCFG_SYSATTR=Failed to get system property setup
NET_ERROR_GETCFG_SERIAL=Failed to get SN
NET_ERROR_GETCFG_GENERAL=Failed to get general property
NET_ERROR_GETCFG_DSPCAP=Failed to get DSP capacity description
NET_ERROR_GETCFG_NETCFG=Failed to get network channel setup
NET_ERROR_GETCFG_CHANNAME=Failed to get channel name
NET_ERROR_GETCFG_VIDEO=Failed to get video property
NET_ERROR_GETCFG_RECORD=Failed to get record setup
NET_ERROR_GETCFG_PRONAME=Failed to get decoder protocol name
NET_ERROR_GETCFG_FUNCNAME=Failed to get 232 COM function name
NET_ERROR_GETCFG_485DECODER=Failed to get decoder property
NET_ERROR_GETCFG_232COM=Failed to get 232 COM setup
NET_ERROR_GETCFG_ALARMIN=Failed to get external alarm input setup
NET_ERROR_GETCFG_ALARMDET=Failed to get motion detection alarm
NET_ERROR_GETCFG_SYSTIME=Failed to get device time
NET_ERROR_GETCFG_PREVIEW=Failed to get preview parameter
NET_ERROR_GETCFG_AUTOMT=Failed to get audio maintenance setup
NET_ERROR_GETCFG_VIDEOMTRX=Failed to get video matrix setup
NET_ERROR_GETCFG_COVER=Failed to get privacy mask zone setup
NET_ERROR_GETCFG_WATERMAKE=Failed to get video watermark setup
NET_ERROR_GETCFG_MULTICAST=Failed to get config, omulticast port by channel
NET_ERROR_SETCFG_GENERAL=Failed to modify general property
NET_ERROR_SETCFG_NETCFG=Failed to modify channel setup
NET_ERROR_SETCFG_CHANNAME=Failed to modify channel name
NET_ERROR_SETCFG_VIDEO=Failed to modify video channel
NET_ERROR_SETCFG_RECORD=Failed to modify record setup
NET_ERROR_SETCFG_485DECODER=Failed to modify decoder property
NET_ERROR_SETCFG_232COM=Failed to modify 232 COM setup
NET_ERROR_SETCFG_ALARMIN=Failed to modify external input alarm setup
NET_ERROR_SETCFG_ALARMDET=Failed to modify motion detection alarm setup
NET_ERROR_SETCFG_SYSTIME=Failed to modify device time
NET_ERROR_SETCFG_PREVIEW=Failed to modify preview parameter
NET_ERROR_SETCFG_AUTOMT=Failed to modify auto maintenance setup
NET_ERROR_SETCFG_VIDEOMTRX=Failed to modify video matrix setup
NET_ERROR_SETCFG_COVER=Failed to modify privacy mask zone
NET_ERROR_SETCFG_WATERMAKE=Failed to modify video watermark setup
NET_ERROR_SETCFG_WLAN=Failed to modify wireless network information
NET_ERROR_SETCFG_WLANDEV=Failed to select wireless network device
NET_ERROR_SETCFG_REGISTER=Failed to modify the actively registration parameter setup
NET_ERROR_SETCFG_CAMERA=Failed to modify camera property
NET_ERROR_SETCFG_INFRARED=Failed to modify IR alarm setup
NET_ERROR_SETCFG_SOUNDALARM=Failed to modify audio alarm setup
NET_ERROR_SETCFG_STORAGE=Failed to modify storage position setup
NET_AUDIOENCODE_NOTINIT=The audio encode port has not been successfully initialized
NET_DATA_TOOLONGH=The data are too long
NET_UNSUPPORTED=The device does not support current operation
NET_DEVICE_BUSY=Device resources is not sufficient
NET_SERVER_STARTED=The server has boot up
NET_SERVER_STOPPED=The server has not fully boot up
NET_LISTER_INCORRECT_SERIAL=Input serial number is not correct
NET_QUERY_DISKINFO_FAILED=Failed to get HDD information
NET_ERROR_GETCFG_SESSION=Failed to get connect session information
NET_USER_FLASEPWD_TRYTIME=The password you typed is incorrect You have exceeded the maximum number of retries
NET_LOGIN_ERROR_PASSWORD=Password is not correct
NET_LOGIN_ERROR_USER=The account does not exist
NET_LOGIN_ERROR_TIMEOUT=Time out for log in returned value
NET_LOGIN_ERROR_RELOGGIN=The account has logged in
NET_LOGIN_ERROR_LOCKED=The account has been locked
NET_LOGIN_ERROR_BLACKLIST=The account has been in the block list
NET_LOGIN_ERROR_BUSY=Resources are not sufficient System is busy now
NET_LOGIN_ERROR_CONNECT=Time out Please check network and try again
NET_LOGIN_ERROR_NETWORK=Network connection failed
NET_LOGIN_ERROR_SUBCONNECT=Successfully logged in the device but can not create video channel Please check network connection
NET_LOGIN_ERROR_MAXCONNECT=Exceed the max connect number
NET_LOGIN_ERROR_PROTOCOL3_ONLY=Only support 3 protocol
NET_LOGIN_ERROR_UKEY_LOST=There is no USB or USB info error
NET_LOGIN_ERROR_NO_AUTHORIZED=Client-end IP address has no right to login
NET_LOGIN_ERROR_USER_OR_PASSOWRD=user or password error
NET_LOGIN_ERROR_DEVICE_NOT_INIT=cannot login because the device has not been init,please init the device and then login
NET_RENDER_SOUND_ON_ERROR=Error occurs when Render library open audio
NET_RENDER_SOUND_OFF_ERROR=Error occurs when Render library close audio
NET_RENDER_SET_VOLUME_ERROR=Error occurs when Render library control volume
NET_RENDER_ADJUST_ERROR=Error occurs when Render library set video parameter
NET_RENDER_PAUSE_ERROR=Error occurs when Render library pause play
NET_RENDER_SNAP_ERROR=Render library snapshot error
NET_RENDER_STEP_ERROR=Render library stepper error
NET_RENDER_FRAMERATE_ERROR=Error occurs when Render library set frame rate
NET_RENDER_DISPLAYREGION_ERROR=Error occurs when Render lib setting show region
NET_RENDER_GETOSDTIME_ERROR=An error occurred when Render library getting current play time
NET_GROUP_EXIST=Group name has been existed
NET_GROUP_NOEXIST=The group name does not exist
NET_GROUP_RIGHTOVER=The group right exceeds the right list!
NET_GROUP_HAVEUSER=The group can not be removed since there is user in it!
NET_GROUP_RIGHTUSE=The user has used one of the group right It can not be removed
NET_GROUP_SAMENAME=New group name has been existed
NET_USER_EXIST=The user name has been existed
NET_USER_NOEXIST=The account does not exist
NET_USER_RIGHTOVER=User right exceeds the group right
NET_USER_PWD=Reserved account It does not allow to be modified
NET_USER_FLASEPWD=password is not correct
NET_USER_NOMATCHING=Password is invalid
NET_USER_INUSE=account in use
NET_ERROR_GETCFG_ETHERNET=Failed to get network card setup
NET_ERROR_GETCFG_WLAN=Failed to get wireless network information
NET_ERROR_GETCFG_WLANDEV=Failed to get wireless network device
NET_ERROR_GETCFG_REGISTER=Failed to get actively registration parameter
NET_ERROR_GETCFG_CAMERA=Failed to get camera property
NET_ERROR_GETCFG_INFRARED=Failed to get IR alarm setup
NET_ERROR_GETCFG_SOUNDALARM=Failed to get audio alarm setup
NET_ERROR_GETCFG_STORAGE=Failed to get storage position
NET_ERROR_GETCFG_MAIL=Failed to get mail setup
NET_CONFIG_DEVBUSY=Can not set right now
NET_CONFIG_DATAILLEGAL=The configuration setup data are illegal
NET_ERROR_GETCFG_DST=Failed to get DST setup
NET_ERROR_SETCFG_DST=Failed to set DST
NET_ERROR_GETCFG_VIDEO_OSD=Failed to get video OSD setup
NET_ERROR_SETCFG_VIDEO_OSD=Failed to set video OSD
NET_ERROR_GETCFG_GPRSCDMA=Failed to get CDMA\GPRS configuration
NET_ERROR_SETCFG_GPRSCDMA=Failed to set CDMA\GPRS configuration
NET_ERROR_GETCFG_IPFILTER= Failed to get IP Filter configuration
NET_ERROR_SETCFG_IPFILTER=Failed to set IP Filter configuration
NET_ERROR_GETCFG_TALKENCODE=Failed to get Talk Encode configuration
NET_ERROR_SETCFG_TALKENCODE=Failed to set Talk Encode configuration
NET_ERROR_GETCFG_RECORDLEN=Failed to get The length of the video package configuration
NET_ERROR_SETCFG_RECORDLEN=Failed to set The length of the video package configuration
NET_DONT_SUPPORT_SUBAREA=Not support Network hard disk partition
NET_ERROR_GET_AUTOREGSERVER=Failed to get the register server information
NET_ERROR_CONTROL_AUTOREGISTER=Failed to control actively registration
NET_ERROR_DISCONNECT_AUTOREGISTER=Failed to disconnect actively registration
NET_ERROR_GETCFG_MMS=Failed to get mms configuration
NET_ERROR_SETCFG_MMS=Failed to set mms configuration
NET_ERROR_GETCFG_SMSACTIVATION=Failed to get SMS configuration
NET_ERROR_SETCFG_SMSACTIVATION=Failed to set SMS configuration
NET_ERROR_GETCFG_DIALINACTIVATION=Failed to get activation of a wireless connection
NET_ERROR_SETCFG_DIALINACTIVATION=Failed to set activation of a wireless connection
NET_ERROR_GETCFG_VIDEOOUT=Failed to get the parameter of video output
NET_ERROR_SETCFG_VIDEOOUT=Failed to set the configuration of video output
NET_ERROR_GETCFG_OSDENABLE=Failed to get osd overlay enabling
NET_ERROR_SETCFG_OSDENABLE=Failed to set OSD overlay enabling
NET_ERROR_SETCFG_ENCODERINFO=Failed to set digital input configuration of front encoders
NET_ERROR_GETCFG_TVADJUST=Failed to get TV adjust configuration
NET_ERROR_SETCFG_TVADJUST=Failed to set TV adjust configuration
NET_ERROR_CONNECT_FAILED=Failed to request to establish a connection
NET_ERROR_SETCFG_BURNFILE=Failed to request to upload burn files
NET_ERROR_SNIFFER_GETCFG=Failed to get capture configuration information
NET_ERROR_SNIFFER_SETCFG=Failed to set capture configuration information
NET_ERROR_DOWNLOADRATE_GETCFG=Failed to get download restrictions information
NET_ERROR_DOWNLOADRATE_SETCFG=Failed to set download restrictions information
NET_ERROR_SEARCH_TRANSCOM=Failed to query serial port parameters
NET_ERROR_GETCFG_POINT=Failed to get the preset info
NET_ERROR_SETCFG_POINT=Failed to set the preset info
NET_SDK_LOGOUT_ERROR=SDK log out the device abnormally
NET_ERROR_GET_VEHICLE_CFG=Failed to get vehicle configuration
NET_ERROR_SET_VEHICLE_CFG=Failed to set vehicle configuration
NET_ERROR_GET_ATM_OVERLAY_CFG=Failed to get ATM overlay configuration
NET_ERROR_SET_ATM_OVERLAY_CFG=Failed to set ATM overlay configuration
NET_ERROR_GET_ATM_OVERLAY_ABILITY=Failed to get ATM overlay ability
NET_ERROR_GET_DECODER_TOUR_CFG=Failed to get decoder tour configuration
NET_ERROR_SET_DECODER_TOUR_CFG=Failed to set decoder tour configuration
NET_ERROR_CTRL_DECODER_TOUR=Failed to control decoder tour
NET_GROUP_OVERSUPPORTNUM=Beyond the device supports for the largest number of user groups
NET_USER_OVERSUPPORTNUM=Beyond the device supports for the largest number of users
NET_ERROR_GET_SIP_CFG=Failed to get SIP configuration
NET_ERROR_SET_SIP_CFG=Failed to set SIP configuration
NET_ERROR_GET_SIP_ABILITY=Failed to get SIP capability
NET_ERROR_GET_WIFI_AP_CFG=Failed to get "WIFI ap' configuration
NET_ERROR_SET_WIFI_AP_CFG=Failed to set "WIFI ap" configuration
NET_ERROR_GET_DECODE_POLICY=Failed to get decode policy
NET_ERROR_SET_DECODE_POLICY=Failed to set decode policy
NET_ERROR_TALK_REJECT=refuse talk
NET_ERROR_TALK_OPENED=talk has opened by other client
NET_ERROR_TALK_RESOURCE_CONFLICIT=resource conflict
NET_ERROR_TALK_UNSUPPORTED_ENCODE=unsupported encode type
NET_ERROR_TALK_RIGHTLESS=no right
NET_ERROR_TALK_FAILED=request failed
NET_ERROR_GET_MACHINE_CFG=Failed to get device relative config
NET_ERROR_SET_MACHINE_CFG=Failed to set device relative config
NET_ERROR_GET_DATA_FAILED=get data failed
NET_ERROR_MAC_VALIDATE_FAILED=MAC validate failed
NET_ERROR_GET_INSTANCE=Failed to get server instance
NET_ERROR_JSON_REQUEST=Generated json string is error
NET_ERROR_JSON_RESPONSE=The responding json string is error
NET_ERROR_VERSION_HIGHER=The protocol version is lower than current version
NET_SPARE_NO_CAPACITY=Hotspare disk operation failed The capacity is low
NET_ERROR_SOURCE_IN_USE=Display source is used by other output
NET_ERROR_REAVE=advanced users grab low-level user resource
NET_ERROR_NETFORBID=net forbid
NET_ERROR_GETCFG_MACFILTER=get MAC filter configuration error
NET_ERROR_SETCFG_MACFILTER=set MAC filter configuration error
NET_ERROR_GETCFG_IPMACFILTER=get IP/MAC filter configuration error
NET_ERROR_SETCFG_IPMACFILTER=set IP/MAC filter configuration error
NET_ERROR_OPERATION_OVERTIME=operation over time
NET_ERROR_SENIOR_VALIDATE_FAILED=senior validation failure
NET_ERROR_DEVICE_ID_NOT_EXIST=device ID is not exist
NET_ERROR_UNSUPPORTED=unsupport operation
NET_ERROR_PROXY_DLLLOAD=proxy dll load error
NET_ERROR_PROXY_ILLEGAL_PARAM= proxy user parameter is not legal
NET_ERROR_PROXY_INVALID_HANDLE=handle invalid
NET_ERROR_PROXY_LOGIN_DEVICE_ERROR=login device error
NET_ERROR_PROXY_START_SERVER_ERROR=start proxy server error
NET_ERROR_SPEAK_FAILED=request speak failed
NET_ERROR_NOT_SUPPORT_F6=unsupport F6
NET_ERROR_CD_UNREADY=CD is not ready
NET_ERROR_DIR_NOT_EXIST=Directory does not exist
NET_ERROR_UNSUPPORTED_SPLIT_MODE=The device does not support the segmentation model
NET_ERROR_OPEN_WND_PARAM=Open the window parameter is illegal
NET_ERROR_LIMITED_WND_COUNT=Open the window more than limit
NET_ERROR_UNMATCHED_REQUEST=Request command with the current pattern don't match
NET_RENDER_ENABLELARGEPICADJUSTMENT_ERROR=Render Library to enable high-definition image internal adjustment strategy error
NET_ERROR_UPGRADE_FAILED=Upgrade equipment failure
NET_ERROR_NO_TARGET_DEVICE=Can't find the target device
NET_ERROR_NO_VERIFY_DEVICE=Can't find the verify device
NET_ERROR_CASCADE_RIGHTLESS=No cascade permissions
NET_ERROR_LOW_PRIORITY=low priority
NET_ERROR_REMOTE_REQUEST_TIMEOUT=The remote device request timeout
NET_ERROR_LIMITED_INPUT_SOURCE=Input source beyond maximum route restrictions
NET_ERROR_SET_LOG_PRINT_INFO=Failed to set log print
NET_ERROR_PARAM_DWSIZE_ERROR="dwSize" is not initialized in input param
NET_ERROR_LIMITED_MONITORWALL_COUNT=TV wall exceed limit
NET_ERROR_PART_PROCESS_FAILED=Fail to execute part of the process
NET_ERROR_TARGET_NOT_SUPPORT=Fail to transmit due to not supported by target
NET_ERROR_VISITE_FILE=Access to the file failed
NET_ERROR_DEVICE_STATUS_BUSY=Device busy
NET_USER_PWD_NOT_AUTHORIZED=Fail to change the password
NET_USER_PWD_NOT_STRONG=Password strength is not enough
NET_ERROR_NO_SUCH_CONFIG=No corresponding setup
NET_ERROR_AUDIO_RECORD_FAILED=Failed to record audio
NET_ERROR_SEND_DATA_FAILED=Failed to send out data
NET_ERROR_OBSOLESCENT_INTERFACE=Abandoned port
NET_ERROR_INSUFFICIENT_INTERAL_BUF=Internal buffer is not sufficient
NET_ERROR_NEED_ENCRYPTION_PASSWORD=verify password when changing device IP
NET_ERROR_NOSUPPORT_RECORD =device not support the record
NET_ERROR_SERIALIZE_ERROR=Failed to serialize data
NET_ERROR_DESERIALIZE_ERROR=Failed to deserialize data
NET_ERROR_LOWRATEWPAN_ID_EXISTED=the wireless id is already existed
NET_ERROR_LOWRATEWPAN_ID_LIMIT=the wireless id limited
NET_ERROR_LOWRATEWPAN_ID_ABNORMAL=add the wireless id abnormaly
NET_ERROR_ENCRYPT=encrypt data fail
NET_ERROR_PWD_ILLEGAL=new password illegal
NET_ERROR_DEVICE_ALREADY_INIT=device is already initiation
NET_ERROR_SECURITY_CODE=security code check out fail
NET_ERROR_SECURITY_CODE_TIMEOUT=security code out of time
NET_ERROR_GET_PWD_SPECI=get password specification fail
NET_ERROR_NO_AUTHORITY_OF_OPERATION=no authority of operation
NET_ERROR_DECRYPT=decrypt data fail
NET_ERROR_2D_CODE=2D code check out fail
NET_ERROR_INVALID_REQUEST=Invalid request
NET_ERROR_PWD_RESET_DISABLE=password reset unable
NET_ERROR_PLAY_PRIVATE_DATA=Failed to display private data,such as rule box
NET_ERROR_ROBOT_OPERATE_FAILED=robot operate failed
NET_ERROR_PHOTOSIZE_EXCEEDSLIMIT=photo size exceeds limit
NET_ERROR_USERID_INVALID=Invalid userId
NET_ERROR_EXTRACTFEATURE_FAILED=photo extract feature failed
NET_ERROR_PHOTO_EXIST=photo exist
NET_ERROR_PHOTO_OVERFLOW=photo over flow
NET_ERROR_CHANNEL_ALREADY_OPENED=channel has already been opened
NET_ERROR_CREATE_SOCKET=create socket error
NET_ERROR_CHANNEL_NUM=Invalid channel number
NET_ERROR_FACE_RECOGNITION_SERVER_GROUP_ID_EXCEED=target recognition server group id exceed
# RealPlay Info
START_REALPLAY=Start RealPlay
STOP_REALPLAY=Stop RealPlay
ATTACH=Attach
DETACH=Detach
REALPLAY_SUCCEED=Success to start realPlay
REALPLAY_FAILED=Failed to start realPlay
CHN=Chn
CHANNEL=Channel
STREAM_TYPE=Stream
MASTER_AND_SUB_STREAM=Main/Sub stream
MASTER_STREAM=Main Stream
SUB_STREAM=Sub Stream
# Capture Picture
LOCAL_CAPTURE=Local Capture
REMOTE_CAPTURE=Remote Capture
TIMER_CAPTURE=Timer Capture
STOP_CAPTURE=Stop Capture
INTERVAL=Interval
TIME_INTERVAL_ILLEGAL=Time Interval Illegal
PLEASE_START_REALPLAY=Please Start Real Play
# PTZ Info
PTZ_CONTROL=PTZControl
LEFT_UP=LeftUp
UP=Up
RIGHT_UP=RightUp
LEFT=Left
RIGHT=Right
LEFT_DOWN=LeftDown
DOWN=Down
RIGHT_DOWN=RightDown
ZOOM_ADD=Zoom+
ZOOM_DEC=Zoom-
FOCUS_ADD=Focus+
FOCUS_DEC=Focus-
IRIS_ADD=Iris+
IRIS_DEC=Iris-
SPEED=Speed
#ITS
EVENT_INFO=Event Information
EVENT_NAME=Event Name
EVENT_TIME=Event Time
EVENT_PICTURE=Event and Picture
PLATE_PICTURE=Plate Picture
LICENSE_PLATE=License Plate
PLATE_TYPE=Plate Type
PLATE_COLOR=Plate Color
VEHICLE_TYPE=Vehicle Type
VEHICLE_SIZE=Vehicle Size
VEHICLE_COLOR=Vehicle Color
FILE_COUNT=File Count
FILE_INDEX=File Index
GROUP_ID=Group ID
ILLEGAL_PLACE=Illegal Place
LANE_NUMBER=Lane Number
MANUAL_CAPTURE=Manual Capture
OPEN_STROBE=Open Strobe
CLOSE_STROBE=Close Strobe
INDEX=Index
OPERATE=Operate
FUNCTION=Function
UNDEFINED_COLOR=Undefined Color
BLACK=Black
WHITE=White
RED=Red
BLUE=Blue
GREEN=Green
YELLOW=Yellow
GRAY=Gray
ORANGE=Orange
LIGHT_DUTY=Light Duty
MEDIUM=Medium
OVER_SIZE=Over Size
MINI_SIZE=Miniature Size
LARGE_SIZE=Large Size
NO_PLATENUMBER=No PlateNumber
MANUALSNAP_SUCCEED=Manual snap succeed
MANUALSNAP_FAILED=Manual snap failed
OPEN_STROBE_SUCCEED=Open strobe succeed
OPEN_STROBE_FAILED=Open strobe failed
CLOSE_STROBE_SUCCEED=Close strobe succeed
CLOSE_STROBE_FAILED=Close strobe failed
EVENT_IVS_TRAFFICJUNCTION=Junction
EVENT_IVS_TRAFFIC_RUNREDLIGHT=RunRedLight
EVENT_IVS_TRAFFIC_OVERLINE=OverLine
EVENT_IVS_TRAFFIC_RETROGRADE=ReTrograde
EVENT_IVS_TRAFFIC_TURNLEFT=TurnLeft
EVENT_IVS_TRAFFIC_TURNRIGHT=TurnRight
EVENT_IVS_TRAFFIC_UTURN=UTurn
EVENT_IVS_TRAFFIC_OVERSPEED=OverSpeed
EVENT_IVS_TRAFFIC_UNDERSPEED=UnderSpeed
EVENT_IVS_TRAFFIC_PARKING=Parking
EVENT_IVS_TRAFFIC_WRONGROUTE=WrongRoute
EVENT_IVS_TRAFFIC_CROSSLANE=CrossLane
EVENT_IVS_TRAFFIC_OVERYELLOWLINE=OverYellowLine
EVENT_IVS_TRAFFIC_YELLOWPLATEINLANE=YellowPlateInLane
EVENT_IVS_TRAFFIC_PEDESTRAINPRIORITY=PedestrainPriority
EVENT_IVS_TRAFFIC_MANUALSNAP=ManualSnap
EVENT_IVS_TRAFFIC_VEHICLEINROUTE=VehicleInRoute
EVENT_IVS_TRAFFIC_VEHICLEINBUSROUTE=VehicleInBusRoute
EVENT_IVS_TRAFFIC_BACKING=Backing
EVENT_IVS_TRAFFIC_PARKINGSPACEPARKING=ParkingSpaceParking
EVENT_IVS_TRAFFIC_PARKINGSPACENOPARKING=ParkingSpaceNoParking
EVENT_IVS_TRAFFIC_WITHOUT_SAFEBELT=WithoutSafeBelt
# DownLoad Info
DOWNLOAD_RECORD_BYTIME=DownloadRecordByTime
DOWNLOAD_RECORD_BYFILE=DownloadRecordByFile
QUERY=Query
DOWNLOAD=DownLoad
STOP_DOWNLOAD=StopDownLoad
START_TIME=Start Time
END_TIME=End Time
RECORD_TYPE=Record Type
GENERAL_RECORD=General Record
ALARM_RECORD=Alarm Record
MOTION_DETECTION=Motion Detection Record
CARD_NUMBER_RECORD=Card Number Record
INTELLIGENT_DETECTION=intelligent Record
POS_RECORD=pos Record
QUERY_RECORD_IS_NOT_EXIST=Query record is not exist
PLEASE_CHECK_RECORD_TIME=Please check record time
PLEASE_SELECT_TIME_AGAIN=Please select time again,max time different is 6 hour
DOWNLOAD_COMPLETED=Download completed
PLEASE_FIRST_QUERY_RECORD=Please first query record
PLEASE_FIRST_SELECT_ROW_WITH_DATA=Please first select row with data
# Time Set
YEAR=Year
MONTH=Month
DAY=Day
HOUR=Hour
MINUTE=Minute
SECOND=Second
CONFIRM=Confirm
CANCEL=Cancel
DATE_CHOOSER=Date Chooser
MONDAY=Mon
TUESDAY=Tue
WEDNESDAY=Wed
THURSDAY=Thur
FRIDAY=Fri
SATURDAY=Sat
SUNDAY=Sun
# Talk
TRANSMIT_TYPE=Transmit Type
LOCAL_TRANSMIT_TYPE=Local(not transmit)
REMOTE_TRANSMIT_TYPE=Remote(transmit)
TRANSMIT_CHANNEL=Speaker Channel
START_TALK=Start Talk
STOP_TALK=Stop Talk
TALK_FAILED=Talk Failed
# DeviceSearchAndInt
DEVICESEARCH_OPERATE=DeviceSearch Operate
DEVICESEARCH_RESULT=DeviceSearch Result
DEVICEINIT=DeviceInit
DEVICESEARCH=DeviceSearch
DEVICE_POINT_TO_POINT_SEARCH=Device IP Point To Point Search
START_SEARCH=Start Search
STOP_SEARCH=Stop Search
START_IP=Start IP
END_IP=End IP
DEVICE_TYPE=Device Type
MAC=MAC
SN=SN
DEVICE_INIT_STATE=Initialized State
INIT_PASSWD=Initialization Password
PHONE=Phone
MAIL=Mail
IP_VERSION=IP Version
SUB_MASK=Sub Mask
GETWAY=GetWay
DETAIL_TYPE=Detail Type
HTTP_PORT=HTTP Port
LOCAL_IP=local ip
CONFIRM_PASSWORD=Confirm Password
OLD_DEVICE=Old Device
DONOT_SUPPORT_INITIALIZATION=Do not support initialization
NOT_INITIALIZED=Uninitialized
INITIALIZED=Initialized
THE_IP_CONTROL_SCOPE=The scope is too large, please control it between the 1000
PLEASE_FIRST_SELECT_INITIALIZED_DEVICE=Please first select initialized device
PLEASE_INPUT_PHONE=Please input phone
PLEASE_INPUT_MAIL=Please input mail
INCONSISTENT=The password and the confirm password are inconsistent
PLEASE_CHECK_IP=Please check IP
SEARCHING_WAITING=Searching, please waiting
START_LISTEN=Start Listen
STOP_LISTEN=Stop Listen
SHOW_ALARM_EVENT=Show Alarm Event Info
ALARM_LISTEN_FAILED=Alarm Listen Failed
ALARM_MESSAGE=Alarm Message
EXTERNAL_ALARM=External alarm
MOTION_ALARM=Motion detection alarm
VIDEOLOST_ALARM=Video loss alarm
SHELTER_ALARM=Camera masking alarm
DISKFULL_ALARM=HDD full alarm
DISKERROR_ALARM=HDD error alarm
START=start
STOP=stop
CURRENT_TIME=Current Time
DEVICE_REBOOT=Device Reboot
SYNCHRONIZE_TIME=Synchronize Time
REBOOT=Reboot
SET_TIME=Set Time
GET_TIME=Get Time
REBOOT_TIPS=Are you sure you want to reboot it?
OPERATE_SUCCESS=Operate Success
#FaceRecognition
FACE_GROUP_ID=Group Id
FACE_GROUP_NAME=Group Name
PERSON_COUNT=Person Count
GROUP_OPERATE=Group Operate
PERSON_OPERATE=Person Operate
FACE_RECOGNITION_EVENT=FaceRecognition Event
FACE_DETECT_EVENT=FaceDetect Event
GLOBAL_PICTURE=Global Picture
PERSON_PICTURE=Person Picture
CANDIDATE_PICTURE=Candidate Picture
TIME=Time
SEX=Sex
AGE=Age
COLOR=Color
EYE=Eye
MOUTH=Mouth
MASK=Mask
BEARD=Beard
MALE=Male
FEMALE=Female
ID_CARD=Id Card
OFFICE_CARD=office card
PASSPORT=Passport
UNIDENTIFIED=Unidentified
HAVE_BEARD=Have Beard
NO_BEARD=No Beard
OPEN_MOUTH=Open Mouth
CLOSE_MOUTH=Close Mouth
YELLOW_COLOR=Yellow
BLACK_COLOR=Black
WHITE_COLOR=White
OPEN_EYE=Open Eye
CLOSE_EYE=Close Eye
SMILE=Smile
ANGER=Anger
SADNESS=Sadness
DISGUST=Disgust
FEAR=Fear
SURPRISE=Surprise
NEUTRAL=Neutral
LAUGH=Laugh
WEAR_MASK=Wear Mask
NO_MASK=No Mask
WEAR_GLASSES=Wear Glasses
NO_GLASSES=No Glasses
UNKNOW=UnKnow
UNLIMITED=Unlimited
NAME=Name
BIRTHDAY=Birthday
ID_NO=Id No
ID_TYPE=ID Type
SIMILARITY=Similarity
UID=UID
STRANGER=Stranger
GLASSES=glasses
PICTURE_PATH=picture path
FACE_LIBRARY_ID=face library id
FACE_LIBRARY_NAME=face library name
ADD=Add
MODIFY=Modify
FRESH=Fresh
ADD_GROUP=Add Group
MODIFY_GROUP=Modify Group
DEL_GROUP=Delete Group
DISPOSITION=Disposition
DEL_DISPOSITION=Delete Disposition
FIND_CONDITION=Find Condition
FIND_PERSON=Find Person
ADD_PERSON=Add Person
MODIFY_PERSON=Modify Person
DEL_PERSON=Delete Person
PREVIOUSPAGE=Previous Page
LASTPAGE=Last Page
SELECT_PICTURE=Select Picture
SEARCH_BY_PIC=Search by Picture
DOWNLOAD_QUERY_PICTURE=Download the query Picture
FACE_LIBRARY=face library
HISTORY_LIBRARY=history library
CHOOSE_FACE_PIC=Please select a face picture
EVENT_TYPE=Event Type
PAGES_NUMBER=Pages Number
SIMILARITY_RANGE=Similarity range[0, 100]
PLEASE_INPUT_GROUPNAME=Please input groupName
PLEASE_SELECT_GROUP=Please select group
PLEASE_SELECT_PERSON=Please select person
PLEASE_ADD_DISPOSITION_INFO=Please add disposition info
PLEASE_SELECT_DEL_DISPOSITION_INFO=Please select delDisposition info
#AutoRegister
AUTOREGISTER_LISTEN=AutoRegister Listen
DEVICE_CONFIG=Device Configure
DEVICE_LIST=Device List
DEVICE_MANAGER=Device Manager
ADD_DEVICE=Add Device
MODIFY_DEVICE=Modify Device
DELETE_DEVICE=Delete Device
CLEAR_DEVICE=Clear Device
IMPORT_DEVICE=Import Device
EXPORT_DEVICE=Export Device
DEVICE_ID=Device ID
ENABLE=Enable
REGISTER_ADDRESS=Register Address
REGISTER_PORT=Register Port
GET=Get
SET=Set
RECORD=Record
DEVICE_LOGIN=Device has logged in
ALREADY_EXISTED=Already existed
ALREADY_EXISTED_WHETHER_OR_NOT_TO_COVER=Already existed, whether or not to cover(no, not export)
FILE_OPEN_PLEASE_CLOSE_FILE=The file is opened, please first close the file
IMPORT_COMPLETION=Import completed
EXPORT_COMPLETION=Export completed
FILE_NOT_EXIST=File is not existed
PLEASE_INPUT=Please input
MAX_SUPPORT_100=Maximum support is 100
#Attendance
ATTENDANCE=Attendance
USER_ID=User ID
USER_NAME=User Name
CARD_NO=Card No
QUERY_CONDITION=Query Condition
USER_OPERATE=User Operate
FINGERPRINT_OPERATE=FingerPrint Operate
OPERATE_BY_USER_ID=Operate FingerPrint By User ID
OPERATE_BY_FINGERPRINT_ID=Operate FingerPrint By FingerPrint ID
FINGERPRINT_ID=FingerPrint ID
DELETE=Delete
SEARCH=Search
SEARCH_FINGERPRINT=Search FingerPrint
ADD_FINGERPRINT=Add FingerPrint
DELETE_FINGERPRINT=Delete FingerPrint
SUBSCRIBE=Subscribe
UNSUBSCRIBE=UnSubscribe
USER_LIST=User List
NEXT_PAGE=Next Page
USER_INFO=User Info
DOOROPEN_METHOD=Open Door Method
FINGERPRINT=FingerPrint
FINGERPRINT_INFO=FingerPrint Info
FINGERPRINT_DATA=FingerPrint Data
CARD=Card
DELETE_FINGERPRINT_PROMPT=It will delete all fingerprint of this user
SUBSCRIBE_FAILED=Subscribe failed
FINGERPRINT_ID_ILLEGAL=FingerPrint id illegal
FINGERPRINT_COLLECTION=FingerPrint Collection
START_COLLECTION=Start Collection
STOP_COLLECTION=Stop Collection
IN_THE_COLLECTION=In collection...
COLLECTION_COMPLETED=Collection completed
COLLECTION_FAILED=Collection failed
FINGERPRINT_ID_NOT_EXIST=FingerPrint Id not exist
USER_ID_EXCEED_LENGTH=User id exceed max length
USER_NAME_EXCEED_LENGTH=User name exceed max length
CARD_NO_EXCEED_LENGTH=Card no exceed max length
CARD_NAME_EXCEED_LENGTH=Card name exceed max length
CARD_PASSWD_EXCEED_LENGTH=Card password exceed max length
#Gate
GATE=FaceOpenDoor
CARD_OPERATE=Card Operate
CARD_INFO=Card Information
CARD_MANAGER=Card Manager
CLEAR=Clear
OPEN_STATUS=Open Status
OPEN_METHOD=Open Method
TEMPERATURE=temperture
MASK_STATUS=mask status
CARD_UNKNOW=UnKnown Card
CARD_GENERAL=General Card
CARD_VIP=VIP Card
CARD_GUEST=Guest Card
CARD_PATROL=Patrol Card
CARD_BACKLIST=BackList Card
CARD_COERCE=Coerce Card
CARD_POLLING=Polling Card
CARD_MOTHERCARD=Mother Card
STATE_UNKNOWN=UnKnown
STATE_NORMAL=Normal
STATE_LOSE=Lose
STATE_LOGOFF=LogOff
STATE_FREEZE=Freeze
STATE_ARREARS=Arrears
STATE_OVERDUE=OverDue
STATE_PREARREARS=PreArrears
RECORD_NO=Record No
CARD_NAME=Card Name
CARD_STATUS=Card Status
CARD_PASSWORD=Card Password
CARD_TYPE=Card Type
CARD_NUM=Card Number
USE_TIMES=Use Times
IS_FIRST_ENTER=IsFirstEnter
IS_VALID=IsValid
VALID_PERIOD=Valid Period
VALID_START_TIME=Valid Start Time
VALID_END_TIME=Valid End Time
FIRST_ENTER=FirstEnter
NO_FIRST_ENTER=No FirstEnter
VALID=Valid
INVALID=Invalid
PLEASE_SELECT_CARD=Please select card
PLEASE_INPUT_CARDNO=Please input cardNo
PLEASE_INPUT_USERID=Please input userId
WANT_CLEAR_ALL_INFO=Do you want to clear all information ?
ADD_CARD_INDO_FAILED=Failed to add card information
ADD_CARD_INFO_AND_PERSON_PICTURE_SUCCEED=Succeed to add card information and person picture
ADD_CARD_INFO_SUCCEED_BUT_ADD_PERSON_PICTURE_FAILED=Succeed to add card information, but failed to add person picture
CARD_EXISTED_ADD_PERSON_PICTURE_SUCCEED=Card information is existed, succeed to add person picture
MODIFY_CARD_INFO_SUCCEED=Succeed to modify card information
MODIFY_CARD_INFO_FAILED=Failed to modify card information
MODIFY_CARD_INFO_AND_PERSON_PICTURE_SUCCEED=Succeed to modify card information and person picture
MODIFY_CARD_INFO_SUCCEED_BUT_MODIFY_PERSON_PICTURE_FAILED=Succeed to modify card information, but failed to modify person picture
NET_ACCESS_DOOROPEN_METHOD_UNKNOWN=UnKnow
NET_ACCESS_DOOROPEN_METHOD_PWD_ONLY=Password
NET_ACCESS_DOOROPEN_METHOD_CARD=Card
NET_ACCESS_DOOROPEN_METHOD_CARD_FIRST=First Card Then Password
NET_ACCESS_DOOROPEN_METHOD_PWD_FIRST=First Password Then Card
NET_ACCESS_DOOROPEN_METHOD_REMOTE=Remote Open
NET_ACCESS_DOOROPEN_METHOD_BUTTON=Open Door Button
NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT=fingerprint lock
NET_ACCESS_DOOROPEN_METHOD_PWD_CARD_FINGERPRINT=password+swipe card+fingerprint combination unlock
NET_ACCESS_DOOROPEN_METHOD_PWD_FINGERPRINT=password+fingerprint combination unlock
NET_ACCESS_DOOROPEN_METHOD_CARD_FINGERPRINT=swipe card+fingerprint combination unlock
NET_ACCESS_DOOROPEN_METHOD_PERSONS=multi-people unlock
NET_ACCESS_DOOROPEN_METHOD_KEY=Key
NET_ACCESS_DOOROPEN_METHOD_COERCE_PWD=Use force password to open the door
NET_ACCESS_DOOROPEN_METHOD_QRCODE=Use QR Code
NET_ACCESS_DOOROPEN_METHOD_FACE_RECOGNITION=face recogniton to open the door
NET_ACCESS_DOOROPEN_METHOD_FACEIDCARD=comparsion of face and ID card
NET_ACCESS_DOOROPEN_METHOD_FACEIDCARD_AND_IDCARD=ID card  and compasion of face and ID card
NET_ACCESS_DOOROPEN_METHOD_BLUETOOTH=Bluetooth
NET_ACCESS_DOOROPEN_METHOD_CUSTOM_PASSWORD=Custom password
NET_ACCESS_DOOROPEN_METHOD_USERID_AND_PWD=UserID and password
NET_ACCESS_DOOROPEN_METHOD_FACE_AND_PWD=Face and password
NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_AND_PWD=Fingerprint and password
NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_AND_FACE= FingerPrint and face
NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FACE=Card and face
NET_ACCESS_DOOROPEN_METHOD_FACE_OR_PWD=Face or password
NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_OR_PWD=Fingerprint or password
NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_OR_FACE=Fingerprint or face
NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FACE=Card or face
NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FINGERPRINT=Card or fingerprint
NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_AND_FACE_AND_PWD=Fingerprint and face and password
NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FACE_AND_PWD=Card and face and password
NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FINGERPRINT_AND_PWD=Card and fingerprint and password
NET_ACCESS_DOOROPEN_METHOD_CARD_AND_PWD_AND_FACE=Card and password and face
NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_OR_FACE_OR_PWD=Fingerprint or face or password
NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FACE_OR_PWD=Card or face or password
NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FINGERPRINT_OR_FACE=Card or fingerprint or face
NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FINGERPRINT_AND_FACE_AND_PWD=Card and fingerprint and face and password
NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FINGERPRINT_OR_FACE_OR_PWD=Card or fingerprint or face or password
NET_ACCESS_DOOROPEN_METHOD_FACEIPCARDANDIDCARD_OR_CARD_OR_FACE=ID card  and compasion of face and ID card or card or face
NET_ACCESS_DOOROPEN_METHOD_FACEIDCARD_OR_CARD_OR_FACE=ID card  and compasion of face or card or face
#ThermalCamera
THERMAL_CAMERA=Thermal Camera
THERMAL_OPERATE=Operate
POINT_QUERY=Query Point
ITEM_QUERY=Query Item
TEMPER_QUERY=Query Temperature
HEATMAP=HeatMap
POINT_TEMPER=Point Temperature
ITEM_TEMPER=Item Temperature
X=X
Y=Y
COORDINATE_ILLEGAL=Coordinate Illegal
QUERY_RESULT=Query Result
METER_TYPE=Meter Type
TEMPER_UNIT=Temperature Unit
TEMPER=Temperature
UNKNOWN=Unknown
SPOT=Spot
LINE=Line
AREA=Area
CENTIGRADE=Celsius
FAHRENHEIT=Fahrenheit
PRESET_ID=Preset Id
RULE_ID=Rule Id
TEMPER_AVER=Average Temperature
TEMPER_MAX=Maximum Temperature
TEMPER_MIN=Minimum Temperature
TEMPER_MID=Middle Temperature
TEMPER_STD=Standard Deviation
INPUT_ILLEGAL=Input Illegal
TEMPER_INFO=Temperature Info
FIVE_MINUTES=Five Minutes
TEN_MINUTES=Ten Minutes
FIFTEEN_MINUTES=Fifteen Minutes
THIRTY_MINUTES=Thirty Minutes
SAVE_PERIOD=Save Period
QUERY_LIST=Query List
RECORD_TIME=Record Time
ITEM_NAME=Name
COORDINATE=Coordinate
NO_RECORD=No Record
HEATMAP_OPERATE=Operate
IDLE=Idle
ACQUIRING=Acquiring
RADIOMETRY_ATTACH=Attach
RADIOMETRY_DETACH=Detach
RADIOMETRY_FETCH=Fetch
SAVE_HEATMAP=Save HeatMap
HEATMAP_METADATA_INFO=HeatMap MetaData
HEIGHT=Height
WIDTH=Width
LENGTH=Size
SENSOR_TYPE=Sensor Type
HEATMAP_SAVE_SUCCESS=HeatMap Save Success
#matrix screen
MATRIX_SCREEN=Lattice Screen
PASSING_STATE=Passing state
PASSING_CAR=pass car
NO_CAR=no car
IN_TIME=Entry time
OUT_TIME=departure time
PLATE_NUMBER=plate number
CAR_OWNER=car owner
PARKING_TIME=parking time
USER_TYPE=user type
MONTHLY_CARD_USER=monthly card user
ANNUAL_CARD_USER=annual card user
LONG_TERM_USER=long term user/VIP
TEMPORARY_USER=temporary user/Visitor
PARKING_CHARGE=parking charge
DAYS_DUE=days due
REMAINING_PARKING_SPACES=Remaining parking spaces
VEHICLES_NOT_ALLOWED_TO_PASS=vehicles not allowed to pass
ALLOWED_VEHICLES_TO_PASS=allowed vehicles to pass
SET_UP=set up
SUCCESSFULLY_ISSUED=Successfully issued
DELIVERY FAILED=Delivery failed
CUSTOM_USER_CLASS=Custom user class
REMARKS_INFORMATION=Remarks information
CUSTOM_INFORMATION=Custom information
# human number statistic
HUMAN_NUMBER_STATISTIC_TITLE=Human Number Statistic
HUMAN_NUMBER_STATISTIC_CONTROL=Human Number Statistic Control
HUMAN_NUMBER_STATISTIC_EVENT_TITLE=Human Number Statistic Event List
HUMAN_NUMBER_STATISTIC_EVENT_CHANNEL=Channel
HUMAN_NUMBER_STATISTIC_EVENT_TIME=EventTime
HUMAN_NUMBER_STATISTIC_EVENT_HOUR_IN=HourIn
HUMAN_NUMBER_STATISTIC_EVENT_HOUR_OUT=HourOut
HUMAN_NUMBER_STATISTIC_EVENT_TODAY_IN=TodayIn
HUMAN_NUMBER_STATISTIC_EVENT_TODAY_OUT=TodayOut
HUMAN_NUMBER_STATISTIC_EVENT_TOTAL_IN=TotalIn
HUMAN_NUMBER_STATISTIC_EVENT_TOTAL_OUT=TotalOut
HUMAN_NUMBER_STATIC_EVENT_OSD_CLEAR=OSD Clear
VTO_ALARM_EVENT_ROOM_NO=RoomNo.
VTO_ALARM_EVENT_CARD_NO=CardNo.
VTO_ALARM_EVENT_TIME=Time
VTO_ALARM_EVENT_OPEN_METHOD=OpenMethod
VTO_ALARM_EVENT_STATUS=Status
VTO_REAL_LOAD_ROOM_NO=RoomNo.
VTO_REAL_LOAD_CARD_NO=CardNO.
VTO_REAL_LOAD_TIME=Time
VTO_REAL_LOAD_EVENT_INFO=EventInfo
VTO_OPERATE_MANAGER_TITLE=Card&Fingerprint&FaceManager
VTO_OPERATE_MANAGER_REC_NO=RecNo.
VTO_OPERATE_MANAGER_ROOM_NO=RoomNo.
VTO_OPERATE_MANAGER_CARD_NO=CardNo.
VTO_OPERATE_MANAGER_FINGER_PRINT_DATA=FingerprintData
VTO_OPERATE_INFO_TITLE=Add
VTO_OPERATE_COLLECTION_FINGER_PRINT_TITLE=CollectionFingerPrint
DOOR_OPEN=Open Door
DOOR_CLOSE=Close Door
EVENT_OPERATE=Event Operate
START_REAL_LOAD_PIC=StartRealLoad
STOP_REAL_LOAD_PIC=StopRealLoad
ALARM_EVENT=AlarmEvent
REAL_LOAD_EVENT=RealLoadEvent
COLLECTION_RESULT=CollectionResult
NEED_FINGER_PRINT=Need FingerPrint
FACE_INFO=FaceInfo
OPEN=open
VTO=VTO
SCADA=SCADA
TRAFFIC_ALLOW_LIST=Traffic Allow List
MODIFY_CARD_FACE_FAILED=failed to modify face info.
EM_MASK_STATE_UNKNOWN=unknown
EM_MASK_STATE_NODISTI=unrecognized
EM_MASK_STATE_NOMASK=Not wearing mask
EM_MASK_STATE_WEAR=wearing mask
END_SEARCH=End of query
DOWNLOAD_PICTURE=download picture
ENTER_PICTURE_PATH=Please enter the picture path
LOADING=The equipment is being processed
QUERY_CARD_EXIST_FAILED=Check if the cardNo exists failed
CARD_EXIST=The cardNo already exists
INPUT_ROOM_NO=please input room number
ROOM_NO_EXCEED_LENGTH=room number exceed max length
REMOVE_CARD_FACE_FAILED=remove card face failed
STOP_LISTEN_FAILED=stop listen failed
SCREEN_NUMBER=screen number
TEXT_CONTENT=text content
TEXT_CONTENT_TYPE=text content type
TEXT_CONTENT_COLOR=text content color
SCROLL_TYPE=scroll type
SCROLL_SPEED=scroll speed
ORDINARY=ordinary
QR_CODE=QR code
LOCAL_TIME=local time
RESOURCE=resource
NOT_ROLLING=not rolling
SCROLL_LEFT_AND_RIGHT=scroll left and right
SCROLL_UP_AND_DOWN=scroll up and right
NUMBER_STRING=number string
VOICE_TEXT=vioce text
ISSUED=issued
PROMPT=Please add corresponding parameters
SCADA_DEVICE_LIST=device list
DEVICE_NAME=device name
POINT_ID=point id
IF_VALID_SIGNAL_POINT=valid signal point
POINT_NAME=point name
ALARM_DESCRIBE=alarm describe
ALARM_LEVEL=alarm level
ALARM_DELAY=alarm delay
ALARM_TYPE=alarm type
ALARM_TIME=alarm time
COLLECT_TIME=collect time
SCADA_POINT_LIST=point list
SCADA_ATTACH_ALARM=attach alarm
SCADA_ATTACH_INFO=attach info
SCADA_ATTACH=start listen
BTN_LIST = get
ALLOWLIST_OPERATION=allowlist operation
SINGLE_UPLOAD=single upload
LICENSE_PLATE_RUN=The license plate to run
FUZZY_QUERY=fuzzy query
DELETE_ALL=delete all
AUTHORIZATION=authorization
UNAUTHORIZATION=unauthorized
BATCH_UPLOAD=batch upload
BROWSE=browse
UPLOAD=upload
QUERY_INFORMATION=query information
DIALOG=dialog
LICENSE_PLATE_NUMBER=license plate number
MODIFY_PANEL=modify panel
SERIAL_NUMBER=serial number
OPEN_MODEL=open model
LICENSE_PLATE_LENGTH_TOO_LONG=License plate length is too long
NAME_TOO_LONG=The name is too long
ADD_SUCCESS= add a success
ADD_FAIL=add a fail
DELETE_SUCCESS=delete a success
DELETE_FAIL=delete a fail
MODIFY_SUCCESS=modify the success
MODIFY_FAIL=modify the fail
UPLOAD_SUCCESS=Uploaded successfully
ENTER_QUERY_DATA=Please enter the data to query
FILLING_RULES=fill in legal characters
UPLOAD_FAIL=upload fail
UPLOADING=uploading
SURE_UPLOAD=Are you sure to upload?
DATA_NUMBER=pieces of data
SELECT_DATA=Please select data
ard-work/src/main/resources/resources_zh_CN.properties
对比新文件
@@ -0,0 +1 @@
# FunctionList FUNCTIONLIST=\u529F\u80FD\u5217\u8868 REALPLAY=\u5B9E\u65F6\u9884\u89C8 CAPTURE_PICTURE=\u6293\u62CD\u56FE\u7247 MULTIREALPLAY=\u53CC\u901A\u9053\u5B9E\u65F6\u9884\u89C8 DOWNLOAD_RECORD=\u4E0B\u8F7D\u5F55\u50CF ITS_EVENT=\u667A\u80FD\u4EA4\u901A TALK=\u8BED\u97F3\u5BF9\u8BB2 DEVICESEARCH_DEVICEINIT=\u8BBE\u5907\u641C\u7D22\u548C\u8BBE\u5907\u521D\u59CB\u5316 PTZ=\u4E91\u53F0\u63A7\u5236 FACERECOGNITION=\u76EE\u6807\u8BC6\u522B ALARM_LISTEN=\u62A5\u8B66\u76D1\u542C DEVICE_CONTROL=\u8BBE\u5907\u63A7\u5236 AUTOREGISTER=\u4E3B\u52A8\u6CE8\u518C ONLINE=\u5728\u7EBF # Login Info DEVICE_IP=\u8BBE\u5907\u5730\u5740 DEVICE_PORT=\u7AEF\u53E3\u53F7 USERNAME=\u7528\u6237\u540D PASSWORD=\u5BC6\u7801 IP=\u5730\u5740 LOGIN=\u767B\u5F55 LOGOUT=\u767B\u51FA LOGIN_SUCCEED=\u767B\u5F55\u6210\u529F LOGIN_FAILED=\u767B\u5F55\u5931\u8D25 DISCONNECT=\u8BBE\u5907\u65AD\u7EBF DISCONNECT_RECONNECTING=\u8BBE\u5907\u65AD\u7EBF\uFF0C\u6B63\u5728\u91CD\u8FDE\u4E2D PROMPT_MESSAGE=\u63D0\u793A\u4FE1\u606F ERROR_MESSAGE=\u9519\u8BEF\u4FE1\u606F SUCCEED=\u6210\u529F FAILED=\u5931\u8D25 PLEASE_INPUT_DEVICE_IP=\u8BF7\u8F93\u5165\u8BBE\u5907\u5730\u5740 PLEASE_INPUT_DEVICE_PORT=\u8BF7\u8F93\u5165\u8BBE\u5907\u7AEF\u53E3\u53F7 PLEASE_INPUT_DEVICE_USERNAME=\u8BF7\u8F93\u5165\u7528\u6237\u540D PLEASE_INPUT_DEVICE_PASSWORD=\u8BF7\u8F93\u5165\u5BC6\u7801 PLEASE_INPUT_CONFIRM_PASSWORD=\u8BF7\u8F93\u5165\u786E\u8BA4\u5BC6\u7801 # Error Info NET_NOERROR=\u6CA1\u6709\u9519\u8BEF NET_ERROR=\u672A\u77E5\u9519\u8BEF NET_SYSTEM_ERROR=Windows\u7CFB\u7EDF\u51FA\u9519 NET_NETWORK_ERROR=\u7F51\u7EDC\u9519\u8BEF\uFF0C\u53EF\u80FD\u662F\u56E0\u4E3A\u7F51\u7EDC\u8D85\u65F6 NET_DEV_VER_NOMATCH=\u8BBE\u5907\u534F\u8BAE\u4E0D\u5339\u914D NET_INVALID_HANDLE=\u53E5\u67C4\u65E0\u6548 NET_OPEN_CHANNEL_ERROR=\u6253\u5F00\u901A\u9053\u5931\u8D25 NET_CLOSE_CHANNEL_ERROR=\u5173\u95ED\u901A\u9053\u5931\u8D25 NET_ILLEGAL_PARAM=\u7528\u6237\u53C2\u6570\u4E0D\u5408\u6CD5 NET_SDK_INIT_ERROR=SDK\u521D\u59CB\u5316\u51FA\u9519 NET_SDK_UNINIT_ERROR=SDK\u6E05\u7406\u51FA\u9519 NET_RENDER_OPEN_ERROR=\u7533\u8BF7render\u8D44\u6E90\u51FA\u9519 NET_DEC_OPEN_ERROR=\u6253\u5F00\u89E3\u7801\u5E93\u51FA\u9519 NET_DEC_CLOSE_ERROR=\u5173\u95ED\u89E3\u7801\u5E93\u51FA\u9519 NET_MULTIPLAY_NOCHANNEL=\u591A\u753B\u9762\u9884\u89C8\u4E2D\u68C0\u6D4B\u5230\u901A\u9053\u6570\u4E3A0 NET_TALK_INIT_ERROR=\u5F55\u97F3\u5E93\u521D\u59CB\u5316\u5931\u8D25 NET_TALK_NOT_INIT=\u5F55\u97F3\u5E93\u672A\u7ECF\u521D\u59CB\u5316 NET_TALK_SENDDATA_ERROR=\u53D1\u9001\u97F3\u9891\u6570\u636E\u51FA\u9519 NET_REAL_ALREADY_SAVING=\u5B9E\u65F6\u6570\u636E\u5DF2\u7ECF\u5904\u4E8E\u4FDD\u5B58\u72B6\u6001 NET_NOT_SAVING=\u672A\u4FDD\u5B58\u5B9E\u65F6\u6570\u636E NET_OPEN_FILE_ERROR=\u6253\u5F00\u6587\u4EF6\u51FA\u9519 NET_PTZ_SET_TIMER_ERROR=\u542F\u52A8\u4E91\u53F0\u63A7\u5236\u5B9A\u65F6\u5668\u5931\u8D25 NET_RETURN_DATA_ERROR=\u5BF9\u8FD4\u56DE\u6570\u636E\u7684\u6821\u9A8C\u51FA\u9519 NET_INSUFFICIENT_BUFFER=\u6CA1\u6709\u8DB3\u591F\u7684\u7F13\u5B58 NET_NOT_SUPPORTED=\u5F53\u524DSDK\u672A\u652F\u6301\u8BE5\u529F\u80FD NET_NO_RECORD_FOUND=\u67E5\u8BE2\u4E0D\u5230\u5F55\u50CF NET_NOT_AUTHORIZED=\u65E0\u64CD\u4F5C\u6743\u9650 NET_NOT_NOW=\u6682\u65F6\u65E0\u6CD5\u6267\u884C NET_NO_TALK_CHANNEL=\u672A\u53D1\u73B0\u5BF9\u8BB2\u901A\u9053 NET_NO_AUDIO=\u672A\u53D1\u73B0\u97F3\u9891 NET_NO_INIT=\u7F51\u7EDCSDK\u672A\u7ECF\u521D\u59CB\u5316 NET_DOWNLOAD_END=\u4E0B\u8F7D\u5DF2\u7ED3\u675F NET_EMPTY_LIST=\u67E5\u8BE2\u7ED3\u679C\u4E3A\u7A7A NET_ERROR_GETCFG_SYSATTR=\u83B7\u53D6\u7CFB\u7EDF\u5C5E\u6027\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_SERIAL=\u83B7\u53D6\u5E8F\u5217\u53F7\u5931\u8D25 NET_ERROR_GETCFG_GENERAL=\u83B7\u53D6\u5E38\u89C4\u5C5E\u6027\u5931\u8D25 NET_ERROR_GETCFG_DSPCAP=\u83B7\u53D6DSP\u80FD\u529B\u63CF\u8FF0\u5931\u8D25 NET_ERROR_GETCFG_NETCFG=\u83B7\u53D6\u7F51\u7EDC\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_CHANNAME=\u83B7\u53D6\u901A\u9053\u540D\u79F0\u5931\u8D25 NET_ERROR_GETCFG_VIDEO=\u83B7\u53D6\u89C6\u9891\u5C5E\u6027\u5931\u8D25 NET_ERROR_GETCFG_RECORD=\u83B7\u53D6\u5F55\u8C61\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_PRONAME=\u83B7\u53D6\u89E3\u7801\u5668\u534F\u8BAE\u540D\u79F0\u5931\u8D25 NET_ERROR_GETCFG_FUNCNAME=\u83B7\u53D6232\u4E32\u53E3\u529F\u80FD\u540D\u79F0\u5931\u8D25 NET_ERROR_GETCFG_485DECODER=\u83B7\u53D6\u89E3\u7801\u5668\u5C5E\u6027\u5931\u8D25 NET_ERROR_GETCFG_232COM=\u83B7\u53D6232\u4E32\u53E3\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_ALARMIN=\u83B7\u53D6\u5916\u90E8\u62A5\u8B66\u8F93\u5165\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_ALARMDET=\u83B7\u53D6\u52A8\u6001\u68C0\u6D4B\u62A5\u8B66\u5931\u8D25 NET_ERROR_GETCFG_SYSTIME=\u83B7\u53D6\u8BBE\u5907\u65F6\u95F4\u5931\u8D25 NET_ERROR_GETCFG_PREVIEW=\u83B7\u53D6\u9884\u89C8\u53C2\u6570\u5931\u8D25 NET_ERROR_GETCFG_AUTOMT=\u83B7\u53D6\u81EA\u52A8\u7EF4\u62A4\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_VIDEOMTRX=\u83B7\u53D6\u89C6\u9891\u77E9\u9635\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_COVER=\u83B7\u53D6\u533A\u57DF\u906E\u6321\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_WATERMAKE=\u83B7\u53D6\u56FE\u8C61\u6C34\u5370\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_MULTICAST=\u83B7\u53D6\u914D\u7F6E\u5931\u8D25\u4F4D\u7F6E\uFF1A\u7EC4\u64AD\u7AEF\u53E3\u6309\u901A\u9053\u914D\u7F6E NET_ERROR_SETCFG_GENERAL=\u4FEE\u6539\u5E38\u89C4\u5C5E\u6027\u5931\u8D25 NET_ERROR_SETCFG_NETCFG=\u4FEE\u6539\u7F51\u7EDC\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_CHANNAME=\u4FEE\u6539\u901A\u9053\u540D\u79F0\u5931\u8D25 NET_ERROR_SETCFG_VIDEO=\u4FEE\u6539\u89C6\u9891\u5C5E\u6027\u5931\u8D25 NET_ERROR_SETCFG_RECORD=\u4FEE\u6539\u5F55\u8C61\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_485DECODER=\u4FEE\u6539\u89E3\u7801\u5668\u5C5E\u6027\u5931\u8D25 NET_ERROR_SETCFG_232COM=\u4FEE\u6539232\u4E32\u53E3\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_ALARMIN=\u4FEE\u6539\u5916\u90E8\u8F93\u5165\u62A5\u8B66\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_ALARMDET=\u4FEE\u6539\u52A8\u6001\u68C0\u6D4B\u62A5\u8B66\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_SYSTIME=\u4FEE\u6539\u8BBE\u5907\u65F6\u95F4\u5931\u8D25 NET_ERROR_SETCFG_PREVIEW=\u4FEE\u6539\u9884\u89C8\u53C2\u6570\u5931\u8D25 NET_ERROR_SETCFG_AUTOMT=\u4FEE\u6539\u81EA\u52A8\u7EF4\u62A4\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_VIDEOMTRX=\u4FEE\u6539\u89C6\u9891\u77E9\u9635\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_COVER=\u4FEE\u6539\u533A\u57DF\u906E\u6321\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_WATERMAKE=\u4FEE\u6539\u56FE\u8C61\u6C34\u5370\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_WLAN=\u4FEE\u6539\u65E0\u7EBF\u7F51\u7EDC\u4FE1\u606F\u5931\u8D25 NET_ERROR_SETCFG_WLANDEV=\u9009\u62E9\u65E0\u7EBF\u7F51\u7EDC\u8BBE\u5907\u5931\u8D25 NET_ERROR_SETCFG_REGISTER=\u4FEE\u6539\u4E3B\u52A8\u6CE8\u518C\u53C2\u6570\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_CAMERA=\u4FEE\u6539\u6444\u50CF\u5934\u5C5E\u6027\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_INFRARED=\u4FEE\u6539\u7EA2\u5916\u62A5\u8B66\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_SOUNDALARM=\u4FEE\u6539\u97F3\u9891\u62A5\u8B66\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_STORAGE=\u4FEE\u6539\u5B58\u50A8\u4F4D\u7F6E\u914D\u7F6E\u5931\u8D25 NET_AUDIOENCODE_NOTINIT=\u97F3\u9891\u7F16\u7801\u63A5\u53E3\u6CA1\u6709\u6210\u529F\u521D\u59CB\u5316 NET_DATA_TOOLONGH=\u6570\u636E\u8FC7\u957F NET_UNSUPPORTED=\u8BBE\u5907\u4E0D\u652F\u6301\u8BE5\u64CD\u4F5C NET_DEVICE_BUSY=\u8BBE\u5907\u8D44\u6E90\u4E0D\u8DB3 NET_SERVER_STARTED=\u670D\u52A1\u5668\u5DF2\u7ECF\u542F\u52A8 NET_SERVER_STOPPED=\u670D\u52A1\u5668\u5C1A\u672A\u6210\u529F\u542F\u52A8 NET_LISTER_INCORRECT_SERIAL=\u8F93\u5165\u5E8F\u5217\u53F7\u6709\u8BEF NET_QUERY_DISKINFO_FAILED=\u83B7\u53D6\u786C\u76D8\u4FE1\u606F\u5931\u8D25 NET_ERROR_GETCFG_SESSION=\u83B7\u53D6\u8FDE\u63A5Session\u4FE1\u606F NET_USER_FLASEPWD_TRYTIME=\u8F93\u5165\u5BC6\u7801\u9519\u8BEF\u8D85\u8FC7\u9650\u5236\u6B21\u6570 NET_LOGIN_ERROR_PASSWORD=\u5BC6\u7801\u4E0D\u6B63\u786E NET_LOGIN_ERROR_USER=\u5E10\u6237\u4E0D\u5B58\u5728 NET_LOGIN_ERROR_TIMEOUT=\u7B49\u5F85\u767B\u5F55\u8FD4\u56DE\u8D85\u65F6 NET_LOGIN_ERROR_RELOGGIN=\u5E10\u53F7\u5DF2\u767B\u5F55 NET_LOGIN_ERROR_LOCKED=\u5E10\u53F7\u5DF2\u88AB\u9501\u5B9A NET_LOGIN_ERROR_BLACKLIST=\u5E10\u53F7\u5DF2\u88AB\u5217\u4E3A\u7981\u6B62\u540D\u5355 NET_LOGIN_ERROR_BUSY=\u8D44\u6E90\u4E0D\u8DB3\uFF0C\u7CFB\u7EDF\u5FD9 NET_LOGIN_ERROR_CONNECT=\u767B\u5F55\u8BBE\u5907\u8D85\u65F6\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u5E76\u91CD\u8BD5 NET_LOGIN_ERROR_NETWORK=\u7F51\u7EDC\u8FDE\u63A5\u5931\u8D25 NET_LOGIN_ERROR_SUBCONNECT=\u767B\u5F55\u8BBE\u5907\u6210\u529F\uFF0C\u4F46\u65E0\u6CD5\u521B\u5EFA\u89C6\u9891\u901A\u9053\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u72B6\u51B5 NET_LOGIN_ERROR_MAXCONNECT=\u8D85\u8FC7\u6700\u5927\u8FDE\u63A5\u6570 NET_LOGIN_ERROR_PROTOCOL3_ONLY=\u53EA\u652F\u63013\u4EE3\u534F\u8BAE NET_LOGIN_ERROR_UKEY_LOST=\u672A\u63D2\u5165U\u76FE\u6216U\u76FE\u4FE1\u606F\u9519\u8BEF NET_LOGIN_ERROR_NO_AUTHORIZED=\u5BA2\u6237\u7AEFIP\u5730\u5740\u6CA1\u6709\u767B\u5F55\u6743\u9650 NET_LOGIN_ERROR_USER_OR_PASSOWRD=\u8D26\u53F7\u6216\u5BC6\u7801\u9519\u8BEF NET_LOGIN_ERROR_DEVICE_NOT_INIT=\u8BBE\u5907\u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u4E0D\u80FD\u767B\u5F55\uFF0C\u8BF7\u5148\u521D\u59CB\u5316\u8BBE\u5907 NET_RENDER_SOUND_ON_ERROR=Render\u5E93\u6253\u5F00\u97F3\u9891\u51FA\u9519 NET_RENDER_SOUND_OFF_ERROR=Render\u5E93\u5173\u95ED\u97F3\u9891\u51FA\u9519 NET_RENDER_SET_VOLUME_ERROR=Render\u5E93\u63A7\u5236\u97F3\u91CF\u51FA\u9519 NET_RENDER_ADJUST_ERROR=Render\u5E93\u8BBE\u7F6E\u753B\u9762\u53C2\u6570\u51FA\u9519 NET_RENDER_PAUSE_ERROR=Render\u5E93\u6682\u505C\u64AD\u653E\u51FA\u9519 NET_RENDER_SNAP_ERROR=Render\u5E93\u6293\u56FE\u51FA\u9519 NET_RENDER_STEP_ERROR=Render\u5E93\u6B65\u8FDB\u51FA\u9519 NET_RENDER_FRAMERATE_ERROR=Render\u5E93\u8BBE\u7F6E\u5E27\u7387\u51FA\u9519 NET_RENDER_DISPLAYREGION_ERROR=Render\u5E93\u8BBE\u7F6E\u663E\u793A\u533A\u57DF\u51FA\u9519 NET_RENDER_GETOSDTIME_ERROR=Render\u5E93\u83B7\u53D6\u5F53\u524D\u64AD\u653E\u65F6\u95F4\u51FA\u9519 NET_GROUP_EXIST=\u7EC4\u540D\u5DF2\u5B58\u5728 NET_GROUP_NOEXIST=\u7EC4\u540D\u4E0D\u5B58\u5728 NET_GROUP_RIGHTOVER=\u7EC4\u7684\u6743\u9650\u8D85\u51FA\u6743\u9650\u5217\u8868\u8303\u56F4 NET_GROUP_HAVEUSER=\u7EC4\u4E0B\u6709\u7528\u6237\uFF0C\u4E0D\u80FD\u5220\u9664 NET_GROUP_RIGHTUSE=\u7EC4\u7684\u67D0\u4E2A\u6743\u9650\u88AB\u7528\u6237\u4F7F\u7528\uFF0C\u4E0D\u80FD\u5220\u9664 NET_GROUP_SAMENAME=\u65B0\u7EC4\u540D\u540C\u5DF2\u6709\u7EC4\u540D\u91CD\u590D NET_USER_EXIST=\u7528\u6237\u5DF2\u5B58\u5728 NET_USER_NOEXIST=\u7528\u6237\u4E0D\u5B58\u5728 NET_USER_RIGHTOVER=\u7528\u6237\u6743\u9650\u8D85\u51FA\u7EC4\u6743\u9650 NET_USER_PWD=\u4FDD\u7559\u5E10\u53F7\uFF0C\u4E0D\u5BB9\u8BB8\u4FEE\u6539\u5BC6\u7801 NET_USER_FLASEPWD=\u5BC6\u7801\u4E0D\u6B63\u786E NET_USER_NOMATCHING=\u5BC6\u7801\u4E0D\u5339\u914D NET_USER_INUSE=\u8D26\u53F7\u6B63\u5728\u4F7F\u7528\u4E2D NET_ERROR_GETCFG_ETHERNET=\u83B7\u53D6\u7F51\u5361\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_WLAN=\u83B7\u53D6\u65E0\u7EBF\u7F51\u7EDC\u4FE1\u606F\u5931\u8D25 NET_ERROR_GETCFG_WLANDEV=\u83B7\u53D6\u65E0\u7EBF\u7F51\u7EDC\u8BBE\u5907\u5931\u8D25 NET_ERROR_GETCFG_REGISTER=\u83B7\u53D6\u4E3B\u52A8\u6CE8\u518C\u53C2\u6570\u5931\u8D25 NET_ERROR_GETCFG_CAMERA=\u83B7\u53D6\u6444\u50CF\u5934\u5C5E\u6027\u5931\u8D25 NET_ERROR_GETCFG_INFRARED=\u83B7\u53D6\u7EA2\u5916\u62A5\u8B66\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_SOUNDALARM=\u83B7\u53D6\u97F3\u9891\u62A5\u8B66\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_STORAGE=\u83B7\u53D6\u5B58\u50A8\u4F4D\u7F6E\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_MAIL=\u83B7\u53D6\u90AE\u4EF6\u914D\u7F6E\u5931\u8D25 NET_CONFIG_DEVBUSY=\u6682\u65F6\u65E0\u6CD5\u8BBE\u7F6E NET_CONFIG_DATAILLEGAL=\u914D\u7F6E\u6570\u636E\u4E0D\u5408\u6CD5 NET_ERROR_GETCFG_DST=\u83B7\u53D6\u590F\u4EE4\u65F6\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_DST=\u8BBE\u7F6E\u590F\u4EE4\u65F6\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_VIDEO_OSD=\u83B7\u53D6\u89C6\u9891OSD\u53E0\u52A0\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_VIDEO_OSD=\u8BBE\u7F6E\u89C6\u9891OSD\u53E0\u52A0\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_GPRSCDMA=\u83B7\u53D6CDMA\GPRS\u7F51\u7EDC\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_GPRSCDMA=\u8BBE\u7F6ECDMA\GPRS\u7F51\u7EDC\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_IPFILTER=\u83B7\u53D6IP\u8FC7\u6EE4\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_IPFILTER=\u8BBE\u7F6EIP\u8FC7\u6EE4\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_TALKENCODE=\u83B7\u53D6\u8BED\u97F3\u5BF9\u8BB2\u7F16\u7801\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_TALKENCODE=\u8BBE\u7F6E\u8BED\u97F3\u5BF9\u8BB2\u7F16\u7801\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_RECORDLEN=\u83B7\u53D6\u5F55\u50CF\u6253\u5305\u957F\u5EA6\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_RECORDLEN=\u8BBE\u7F6E\u5F55\u50CF\u6253\u5305\u957F\u5EA6\u914D\u7F6E\u5931\u8D25 NET_DONT_SUPPORT_SUBAREA=\u4E0D\u652F\u6301\u7F51\u7EDC\u786C\u76D8\u5206\u533A NET_ERROR_GET_AUTOREGSERVER=\u83B7\u53D6\u8BBE\u5907\u4E0A\u4E3B\u52A8\u6CE8\u518C\u670D\u52A1\u5668\u4FE1\u606F\u5931\u8D25 NET_ERROR_CONTROL_AUTOREGISTER=\u4E3B\u52A8\u6CE8\u518C\u91CD\u5B9A\u5411\u6CE8\u518C\u9519\u8BEF NET_ERROR_DISCONNECT_AUTOREGISTER=\u65AD\u5F00\u4E3B\u52A8\u6CE8\u518C\u670D\u52A1\u5668\u9519\u8BEF NET_ERROR_GETCFG_MMS=\u83B7\u53D6mms\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_MMS=\u8BBE\u7F6Emms\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_SMSACTIVATION=\u83B7\u53D6\u77ED\u4FE1\u6FC0\u6D3B\u65E0\u7EBF\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_SMSACTIVATION=\u8BBE\u7F6E\u77ED\u4FE1\u6FC0\u6D3B\u65E0\u7EBF\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_DIALINACTIVATION=\u83B7\u53D6\u62E8\u53F7\u6FC0\u6D3B\u65E0\u7EBF\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_DIALINACTIVATION=\u8BBE\u7F6E\u62E8\u53F7\u6FC0\u6D3B\u65E0\u7EBF\u8FDE\u63A5\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_VIDEOOUT=\u67E5\u8BE2\u89C6\u9891\u8F93\u51FA\u53C2\u6570\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_VIDEOOUT=\u8BBE\u7F6E\u89C6\u9891\u8F93\u51FA\u53C2\u6570\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_OSDENABLE=\u83B7\u53D6osd\u53E0\u52A0\u4F7F\u80FD\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_OSDENABLE=\u8BBE\u7F6Eosd\u53E0\u52A0\u4F7F\u80FD\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_ENCODERINFO=\u8BBE\u7F6E\u6570\u5B57\u901A\u9053\u524D\u7AEF\u7F16\u7801\u63A5\u5165\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_TVADJUST=\u83B7\u53D6TV\u8C03\u8282\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_TVADJUST=\u8BBE\u7F6ETV\u8C03\u8282\u914D\u7F6E\u5931\u8D25 NET_ERROR_CONNECT_FAILED=\u8BF7\u6C42\u5EFA\u7ACB\u8FDE\u63A5\u5931\u8D25 NET_ERROR_SETCFG_BURNFILE=\u8BF7\u6C42\u523B\u5F55\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25 NET_ERROR_SNIFFER_GETCFG=\u83B7\u53D6\u6293\u5305\u914D\u7F6E\u4FE1\u606F\u5931\u8D25 NET_ERROR_SNIFFER_SETCFG=\u8BBE\u7F6E\u6293\u5305\u914D\u7F6E\u4FE1\u606F\u5931\u8D25 NET_ERROR_DOWNLOADRATE_GETCFG=\u67E5\u8BE2\u4E0B\u8F7D\u9650\u5236\u4FE1\u606F\u5931\u8D25 NET_ERROR_DOWNLOADRATE_SETCFG=\u8BBE\u7F6E\u4E0B\u8F7D\u9650\u5236\u4FE1\u606F\u5931\u8D25 NET_ERROR_SEARCH_TRANSCOM=\u67E5\u8BE2\u4E32\u53E3\u53C2\u6570\u5931\u8D25 NET_ERROR_GETCFG_POINT=\u83B7\u53D6\u9884\u5236\u70B9\u4FE1\u606F\u9519\u8BEF NET_ERROR_SETCFG_POINT=\u8BBE\u7F6E\u9884\u5236\u70B9\u4FE1\u606F\u9519\u8BEF NET_SDK_LOGOUT_ERROR=SDK\u6CA1\u6709\u6B63\u5E38\u767B\u51FA\u8BBE\u5907 NET_ERROR_GET_VEHICLE_CFG=\u83B7\u53D6\u8F66\u8F7D\u914D\u7F6E\u5931\u8D25 NET_ERROR_SET_VEHICLE_CFG=\u8BBE\u7F6E\u8F66\u8F7D\u914D\u7F6E\u5931\u8D25 NET_ERROR_GET_ATM_OVERLAY_CFG=\u83B7\u53D6atm\u53E0\u52A0\u914D\u7F6E\u5931\u8D25 NET_ERROR_SET_ATM_OVERLAY_CFG=\u8BBE\u7F6Eatm\u53E0\u52A0\u914D\u7F6E\u5931\u8D25 NET_ERROR_GET_ATM_OVERLAY_ABILITY=\u83B7\u53D6atm\u53E0\u52A0\u80FD\u529B\u5931\u8D25 NET_ERROR_GET_DECODER_TOUR_CFG=\u83B7\u53D6\u89E3\u7801\u5668\u89E3\u7801\u8F6E\u5DE1\u914D\u7F6E\u5931\u8D25 NET_ERROR_SET_DECODER_TOUR_CFG=\u8BBE\u7F6E\u89E3\u7801\u5668\u89E3\u7801\u8F6E\u5DE1\u914D\u7F6E\u5931\u8D25 NET_ERROR_CTRL_DECODER_TOUR=\u63A7\u5236\u89E3\u7801\u5668\u89E3\u7801\u8F6E\u5DE1\u5931\u8D25 NET_GROUP_OVERSUPPORTNUM=\u8D85\u51FA\u8BBE\u5907\u652F\u6301\u6700\u5927\u7528\u6237\u7EC4\u6570\u76EE NET_USER_OVERSUPPORTNUM=\u8D85\u51FA\u8BBE\u5907\u652F\u6301\u6700\u5927\u7528\u6237\u6570\u76EE NET_ERROR_GET_SIP_CFG=\u83B7\u53D6SIP\u914D\u7F6E\u5931\u8D25 NET_ERROR_SET_SIP_CFG=\u8BBE\u7F6ESIP\u914D\u7F6E\u5931\u8D25 NET_ERROR_GET_SIP_ABILITY=\u83B7\u53D6SIP\u80FD\u529B\u5931\u8D25 NET_ERROR_GET_WIFI_AP_CFG=\u83B7\u53D6WIFIap\u914D\u7F6E\u5931\u8D25 NET_ERROR_SET_WIFI_AP_CFG=\u8BBE\u7F6EWIFIap\u914D\u7F6E\u5931\u8D25 NET_ERROR_GET_DECODE_POLICY=\u83B7\u53D6\u89E3\u7801\u7B56\u7565\u914D\u7F6E\u5931\u8D25 NET_ERROR_SET_DECODE_POLICY=\u8BBE\u7F6E\u89E3\u7801\u7B56\u7565\u914D\u7F6E\u5931\u8D25 NET_ERROR_TALK_REJECT=\u62D2\u7EDD\u5BF9\u8BB2 NET_ERROR_TALK_OPENED=\u5BF9\u8BB2\u88AB\u5176\u4ED6\u5BA2\u6237\u7AEF\u6253\u5F00 NET_ERROR_TALK_RESOURCE_CONFLICIT=\u8D44\u6E90\u51B2\u7A81 NET_ERROR_TALK_UNSUPPORTED_ENCODE=\u4E0D\u652F\u6301\u7684\u8BED\u97F3\u7F16\u7801\u683C\u5F0F NET_ERROR_TALK_RIGHTLESS=\u65E0\u6743\u9650 NET_ERROR_TALK_FAILED=\u8BF7\u6C42\u5BF9\u8BB2\u5931\u8D25 NET_ERROR_GET_MACHINE_CFG=\u83B7\u53D6\u673A\u5668\u76F8\u5173\u914D\u7F6E\u5931\u8D25 NET_ERROR_SET_MACHINE_CFG=\u8BBE\u7F6E\u673A\u5668\u76F8\u5173\u914D\u7F6E\u5931\u8D25 NET_ERROR_GET_DATA_FAILED=\u8BBE\u5907\u65E0\u6CD5\u83B7\u53D6\u5F53\u524D\u8BF7\u6C42\u6570\u636E NET_ERROR_MAC_VALIDATE_FAILED=MAC\u5730\u5740\u9A8C\u8BC1\u5931\u8D25 NET_ERROR_GET_INSTANCE=\u83B7\u53D6\u670D\u52A1\u5668\u5B9E\u4F8B\u5931\u8D25 NET_ERROR_JSON_REQUEST=\u751F\u6210\u7684json\u5B57\u7B26\u4E32\u9519\u8BEF NET_ERROR_JSON_RESPONSE=\u54CD\u5E94\u7684json\u5B57\u7B26\u4E32\u9519\u8BEF NET_ERROR_VERSION_HIGHER=\u534F\u8BAE\u7248\u672C\u4F4E\u4E8E\u5F53\u524D\u4F7F\u7528\u7684\u7248\u672C NET_SPARE_NO_CAPACITY=\u8BBE\u5907\u64CD\u4F5C\u5931\u8D25,\u5BB9\u91CF\u4E0D\u8DB3 NET_ERROR_SOURCE_IN_USE=\u663E\u793A\u6E90\u88AB\u5176\u4ED6\u8F93\u51FA\u5360\u7528 NET_ERROR_REAVE=\u9AD8\u7EA7\u7528\u6237\u62A2\u5360\u4F4E\u7EA7\u7528\u6237\u8D44\u6E90 NET_ERROR_NETFORBID=\u7981\u6B62\u5165\u7F51 NET_ERROR_GETCFG_MACFILTER=\u83B7\u53D6MAC\u8FC7\u6EE4\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_MACFILTER=\u8BBE\u7F6EMAC\u8FC7\u6EE4\u914D\u7F6E\u5931\u8D25 NET_ERROR_GETCFG_IPMACFILTER=\u83B7\u53D6IP/MAC\u8FC7\u6EE4\u914D\u7F6E\u5931\u8D25 NET_ERROR_SETCFG_IPMACFILTER=\u8BBE\u7F6EIP/MAC\u8FC7\u6EE4\u914D\u7F6E\u5931\u8D25 NET_ERROR_OPERATION_OVERTIME=\u5F53\u524D\u64CD\u4F5C\u8D85\u65F6 NET_ERROR_SENIOR_VALIDATE_FAILED=\u9AD8\u7EA7\u6821\u9A8C\u5931\u8D25 NET_ERROR_DEVICE_ID_NOT_EXIST=\u8BBE\u5907ID\u4E0D\u5B58\u5728 NET_ERROR_UNSUPPORTED=\u4E0D\u652F\u6301\u5F53\u524D\u64CD\u4F5C NET_ERROR_PROXY_DLLLOAD=\u4EE3\u7406\u5E93\u52A0\u8F7D\u5931\u8D25 NET_ERROR_PROXY_ILLEGAL_PARAM=\u4EE3\u7406\u7528\u6237\u53C2\u6570\u4E0D\u5408\u6CD5 NET_ERROR_PROXY_INVALID_HANDLE=\u4EE3\u7406\u53E5\u67C4\u65E0\u6548 NET_ERROR_PROXY_LOGIN_DEVICE_ERROR=\u4EE3\u7406\u767B\u5165\u524D\u7AEF\u8BBE\u5907\u5931\u8D25 NET_ERROR_PROXY_START_SERVER_ERROR=\u542F\u52A8\u4EE3\u7406\u670D\u52A1\u5931\u8D25 NET_ERROR_SPEAK_FAILED=\u8BF7\u6C42\u558A\u8BDD\u5931\u8D25 NET_ERROR_NOT_SUPPORT_F6=\u8BBE\u5907\u4E0D\u652F\u6301\u6B64F6\u63A5\u53E3\u8C03\u7528 NET_ERROR_CD_UNREADY=\u5149\u76D8\u672A\u5C31\u7EEA NET_ERROR_DIR_NOT_EXIST=\u76EE\u5F55\u4E0D\u5B58\u5728 NET_ERROR_UNSUPPORTED_SPLIT_MODE=\u8BBE\u5907\u4E0D\u652F\u6301\u7684\u5206\u5272\u6A21\u5F0F NET_ERROR_OPEN_WND_PARAM=\u5F00\u7A97\u53C2\u6570\u4E0D\u5408\u6CD5 NET_ERROR_LIMITED_WND_COUNT=\u5F00\u7A97\u6570\u91CF\u8D85\u8FC7\u9650\u5236 NET_ERROR_UNMATCHED_REQUEST=\u8BF7\u6C42\u547D\u4EE4\u4E0E\u5F53\u524D\u6A21\u5F0F\u4E0D\u5339\u914D NET_RENDER_ENABLELARGEPICADJUSTMENT_ERROR=Render\u5E93\u542F\u7528\u9AD8\u6E05\u56FE\u50CF\u5185\u90E8\u8C03\u6574\u7B56\u7565\u51FA\u9519 NET_ERROR_UPGRADE_FAILED=\u8BBE\u5907\u5347\u7EA7\u5931\u8D25 NET_ERROR_NO_TARGET_DEVICE=\u627E\u4E0D\u5230\u76EE\u6807\u8BBE\u5907 NET_ERROR_NO_VERIFY_DEVICE=\u627E\u4E0D\u5230\u9A8C\u8BC1\u8BBE\u5907 NET_ERROR_CASCADE_RIGHTLESS=\u65E0\u7EA7\u8054\u6743\u9650 NET_ERROR_LOW_PRIORITY=\u4F4E\u4F18\u5148\u7EA7 NET_ERROR_REMOTE_REQUEST_TIMEOUT=\u8FDC\u7A0B\u8BBE\u5907\u8BF7\u6C42\u8D85\u65F6 NET_ERROR_LIMITED_INPUT_SOURCE=\u8F93\u5165\u6E90\u8D85\u51FA\u6700\u5927\u8DEF\u6570\u9650\u5236 NET_ERROR_SET_LOG_PRINT_INFO=\u8BBE\u7F6E\u65E5\u5FD7\u6253\u5370\u5931\u8D25 NET_ERROR_PARAM_DWSIZE_ERROR=\u5165\u53C2\u7684dwsize\u5B57\u6BB5\u51FA\u9519 NET_ERROR_LIMITED_MONITORWALL_COUNT=\u7535\u89C6\u5899\u6570\u91CF\u8D85\u8FC7\u4E0A\u9650 NET_ERROR_PART_PROCESS_FAILED=\u90E8\u5206\u8FC7\u7A0B\u6267\u884C\u5931\u8D25 NET_ERROR_TARGET_NOT_SUPPORT=\u8BE5\u529F\u80FD\u4E0D\u652F\u6301\u8F6C\u53D1 NET_ERROR_VISITE_FILE=\u8BBF\u95EE\u6587\u4EF6\u5931\u8D25 NET_ERROR_DEVICE_STATUS_BUSY=\u8BBE\u5907\u5FD9 NET_USER_PWD_NOT_AUTHORIZED=\u4FEE\u6539\u5BC6\u7801\u65E0\u6743\u9650 NET_USER_PWD_NOT_STRONG=\u5BC6\u7801\u5F3A\u5EA6\u4E0D\u591F NET_ERROR_NO_SUCH_CONFIG=\u6CA1\u6709\u5BF9\u5E94\u7684\u914D\u7F6E NET_ERROR_AUDIO_RECORD_FAILED=\u5F55\u97F3\u5931\u8D25 NET_ERROR_SEND_DATA_FAILED=\u6570\u636E\u53D1\u9001\u5931\u8D25 NET_ERROR_OBSOLESCENT_INTERFACE=\u5E9F\u5F03\u63A5\u53E3 NET_ERROR_INSUFFICIENT_INTERAL_BUF=\u5185\u90E8\u7F13\u51B2\u4E0D\u8DB3 NET_ERROR_NEED_ENCRYPTION_PASSWORD=\u4FEE\u6539\u8BBE\u5907ip\u65F6,\u9700\u8981\u6821\u9A8C\u5BC6\u7801 NET_ERROR_NOSUPPORT_RECORD=\u8BBE\u5907\u4E0D\u652F\u6301\u6B64\u8BB0\u5F55\u96C6 NET_ERROR_SERIALIZE_ERROR=\u6570\u636E\u5E8F\u5217\u5316\u9519\u8BEF NET_ERROR_DESERIALIZE_ERROR=\u6570\u636E\u53CD\u5E8F\u5217\u5316\u9519\u8BEF NET_ERROR_LOWRATEWPAN_ID_EXISTED=\u8BE5\u65E0\u7EBFID\u5DF2\u5B58\u5728 NET_ERROR_LOWRATEWPAN_ID_LIMIT=\u65E0\u7EBFID\u6570\u91CF\u5DF2\u8D85\u9650 NET_ERROR_LOWRATEWPAN_ID_ABNORMAL=\u65E0\u7EBF\u5F02\u5E38\u6DFB\u52A0 NET_ERROR_ENCRYPT=\u52A0\u5BC6\u6570\u636E\u5931\u8D25 NET_ERROR_PWD_ILLEGAL=\u65B0\u5BC6\u7801\u4E0D\u5408\u89C4\u8303 NET_ERROR_DEVICE_ALREADY_INIT=\u8BBE\u5907\u5DF2\u7ECF\u521D\u59CB\u5316 NET_ERROR_SECURITY_CODE=\u5B89\u5168\u7801\u9519\u8BEF NET_ERROR_SECURITY_CODE_TIMEOUT=\u5B89\u5168\u7801\u8D85\u51FA\u6709\u6548\u671F NET_ERROR_GET_PWD_SPECI=\u83B7\u53D6\u5BC6\u7801\u89C4\u8303\u5931\u8D25 NET_ERROR_NO_AUTHORITY_OF_OPERATION=\u65E0\u6743\u9650\u8FDB\u884C\u8BE5\u64CD\u4F5C NET_ERROR_DECRYPT=\u89E3\u5BC6\u6570\u636E\u5931\u8D25 NET_ERROR_2D_CODE=2Dcode\u6821\u9A8C\u5931\u8D25 NET_ERROR_INVALID_REQUEST=\u975E\u6CD5\u7684RPC\u8BF7\u6C42 NET_ERROR_PWD_RESET_DISABLE=\u5BC6\u7801\u91CD\u7F6E\u529F\u80FD\u5DF2\u5173\u95ED NET_ERROR_PLAY_PRIVATE_DATA=\u663E\u793A\u79C1\u6709\u6570\u636E\uFF0C\u6BD4\u5982\u89C4\u5219\u6846\u7B49\u5931\u8D25 NET_ERROR_ROBOT_OPERATE_FAILED=\u673A\u5668\u4EBA\u64CD\u4F5C\u5931\u8D25 NET_ERROR_PHOTOSIZE_EXCEEDSLIMIT=\u56FE\u7247\u5927\u5C0F\u8D85\u9650 NET_ERROR_USERID_INVALID=\u7528\u6237ID\u4E0D\u5B58\u5728 NET_ERROR_EXTRACTFEATURE_FAILED=\u7167\u7247\u7279\u5F81\u503C\u63D0\u53D6\u5931\u8D25 NET_ERROR_PHOTO_EXIST=\u7167\u7247\u5DF2\u5B58\u5728 NET_ERROR_PHOTO_OVERFLOW=\u7167\u7247\u6570\u91CF\u8D85\u8FC7\u4E0A\u9650 NET_ERROR_CHANNEL_ALREADY_OPENED=\u901A\u9053\u5DF2\u7ECF\u6253\u5F00 NET_ERROR_CREATE_SOCKET=\u521B\u5EFA\u5957\u63A5\u5B57\u5931\u8D25 NET_ERROR_CHANNEL_NUM=\u901A\u9053\u53F7\u9519\u8BEF NET_ERROR_FACE_RECOGNITION_SERVER_GROUP_ID_EXCEED=\u7EC4ID\u8D85\u8FC7\u6700\u5927\u503C # RealPlay Info START_REALPLAY=\u5F00\u59CB\u9884\u89C8 STOP_REALPLAY=\u505C\u6B62\u9884\u89C8 ATTACH=\u667A\u80FD\u8BA2\u9605 DETACH=\u53D6\u6D88\u8BA2\u9605 REALPLAY_SUCCEED=\u5B9E\u65F6\u9884\u89C8\u6210\u529F REALPLAY_FAILED=\u5B9E\u65F6\u9884\u89C8\u5931\u8D25 CHN=\u901A\u9053 CHANNEL=\u901A\u9053 STREAM_TYPE=\u7801\u6D41 MASTER_AND_SUB_STREAM=\u4E3B\u8F85\u7801\u6D41 MASTER_STREAM=\u4E3B\u7801\u6D41 SUB_STREAM=\u8F85\u7801\u6D41 # Capture Picture LOCAL_CAPTURE=\u672C\u5730\u6293\u56FE REMOTE_CAPTURE=\u8FDC\u7A0B\u6293\u56FE TIMER_CAPTURE=\u5B9A\u65F6\u6293\u56FE STOP_CAPTURE=\u505C\u6B62\u6293\u56FE INTERVAL=\u95F4\u9694 TIME_INTERVAL_ILLEGAL=\u65F6\u95F4\u95F4\u9694\u8F93\u5165\u975E\u6CD5  PLEASE_START_REALPLAY=\u8BF7\u5148\u6253\u5F00\u5B9E\u65F6\u9884\u89C8 # PTZ Info  PTZ_CONTROL=\u4E91\u53F0\u63A7\u5236 LEFT_UP=\u5DE6\u4E0A UP=\u4E0A RIGHT_UP=\u53F3\u4E0A LEFT=\u5DE6 RIGHT=\u53F3 LEFT_DOWN=\u5DE6\u4E0B DOWN=\u4E0B RIGHT_DOWN=\u53F3\u4E0B ZOOM_ADD=\u53D8\u500D+ ZOOM_DEC=\u53D8\u500D- FOCUS_ADD=\u8C03\u7126+ FOCUS_DEC=\u8C03\u7126- IRIS_ADD=\u5149\u5708+ IRIS_DEC=\u5149\u5708- SPEED=\u901F\u7387 #ITS EVENT_INFO=\u4E8B\u4EF6\u4FE1\u606F EVENT_NAME=\u4E8B\u4EF6\u540D\u79F0 EVENT_TIME=\u4E8B\u4EF6\u65F6\u95F4 EVENT_PICTURE=\u4E8B\u4EF6\u4EE5\u53CA\u56FE\u7247 PLATE_PICTURE=\u8F66\u724C\u56FE LICENSE_PLATE=\u8F66\u724C\u53F7 PLATE_TYPE=\u8F66\u724C\u7C7B\u578B PLATE_COLOR=\u8F66\u724C\u989C\u8272 VEHICLE_TYPE=\u8F66\u8F86\u7C7B\u578B VEHICLE_SIZE=\u8F66\u8F86\u5927\u5C0F VEHICLE_COLOR=\u8F66\u8F86\u989C\u8272 FILE_COUNT=\u6587\u4EF6\u603B\u6570 FILE_INDEX=\u6587\u4EF6\u7F16\u53F7 GROUP_ID=\u7EC4ID ILLEGAL_PLACE=\u8FDD\u6CD5\u5730\u70B9 LANE_NUMBER=\u8F66\u9053\u53F7 MANUAL_CAPTURE=\u624B\u52A8\u6293\u62CD OPEN_STROBE=\u51FA\u5165\u53E3\u5F00\u95F8 CLOSE_STROBE=\u51FA\u5165\u53E3\u5173\u95F8 INDEX=\u5E8F\u53F7 OPERATE=\u64CD\u4F5C FUNCTION=\u57FA\u672C UNDEFINED_COLOR=\u672A\u5B9A\u4E49\u989C\u8272 BLACK=\u9ED1\u8272 WHITE=\u767D\u8272 RED=\u7EA2\u8272 BLUE=\u84DD\u8272 GREEN=\u7EFF\u8272 YELLOW=\u9EC4\u8272 GRAY=\u7070\u8272 ORANGE=\u6A59\u8272 LIGHT_DUTY=\u5C0F\u578B\u8F66 MEDIUM=\u4E2D\u578B\u8F66 OVER_SIZE=\u5927\u578B\u8F66 MINI_SIZE=\u5FAE\u578B\u8F66 LARGE_SIZE=\u957F\u8F66 NO_PLATENUMBER=\u65E0\u8F66\u724C MANUALSNAP_SUCCEED=\u624B\u52A8\u6293\u62CD\u6210\u529F MANUALSNAP_FAILED=\u624B\u52A8\u6293\u62CD\u5931\u8D25 OPEN_STROBE_SUCCEED=\u5F00\u95F8\u6210\u529F OPEN_STROBE_FAILED=\u5F00\u95F8\u5931\u8D25 CLOSE_STROBE_SUCCEED=\u5173\u95F8\u6210\u529F CLOSE_STROBE_FAILED=\u5173\u95F8\u5931\u8D25 EVENT_IVS_TRAFFICJUNCTION=\u4EA4\u901A\u5361\u53E3 EVENT_IVS_TRAFFIC_RUNREDLIGHT=\u95EF\u7EA2\u706F EVENT_IVS_TRAFFIC_OVERLINE=\u538B\u8F66\u9053\u7EBF EVENT_IVS_TRAFFIC_RETROGRADE=\u9006\u884C EVENT_IVS_TRAFFIC_TURNLEFT=\u8FDD\u7AE0\u5DE6\u8F6C EVENT_IVS_TRAFFIC_TURNRIGHT=\u8FDD\u7AE0\u53F3\u8F6C EVENT_IVS_TRAFFIC_UTURN=\u8FDD\u7AE0\u6389\u5934 EVENT_IVS_TRAFFIC_OVERSPEED=\u8D85\u901F EVENT_IVS_TRAFFIC_UNDERSPEED=\u4F4E\u901F EVENT_IVS_TRAFFIC_PARKING=\u8FDD\u7AE0\u505C\u8F66 EVENT_IVS_TRAFFIC_WRONGROUTE=\u4E0D\u6309\u8F66\u9053\u884C\u9A76 EVENT_IVS_TRAFFIC_CROSSLANE=\u8FDD\u7AE0\u53D8\u9053 EVENT_IVS_TRAFFIC_OVERYELLOWLINE=\u538B\u9EC4\u7EBF EVENT_IVS_TRAFFIC_YELLOWPLATEINLANE=\u9EC4\u724C\u8F66\u5360\u9053 EVENT_IVS_TRAFFIC_PEDESTRAINPRIORITY=\u6591\u9A6C\u7EBF\u884C\u4EBA\u4F18\u5148 EVENT_IVS_TRAFFIC_MANUALSNAP=\u4EA4\u901A\u624B\u52A8\u6293\u62CD EVENT_IVS_TRAFFIC_VEHICLEINROUTE=\u6709\u8F66\u5360\u9053 EVENT_IVS_TRAFFIC_VEHICLEINBUSROUTE=\u5360\u7528\u516C\u4EA4\u8F66\u9053 EVENT_IVS_TRAFFIC_BACKING=\u8FDD\u7AE0\u5012\u8F66 EVENT_IVS_TRAFFIC_PARKINGSPACEPARKING=\u8F66\u4F4D\u6709\u8F66 EVENT_IVS_TRAFFIC_PARKINGSPACENOPARKING=\u8F66\u4F4D\u65E0\u8F66 EVENT_IVS_TRAFFIC_WITHOUT_SAFEBELT=\u4EA4\u901A\u672A\u7CFB\u5B89\u5168\u5E26 # DownLoad Info DOWNLOAD_RECORD_BYTIME=\u6309\u65F6\u95F4\u4E0B\u8F7D DOWNLOAD_RECORD_BYFILE=\u6309\u6587\u4EF6\u4E0B\u8F7D QUERY=\u67E5\u8BE2  DOWNLOAD=\u4E0B\u8F7D STOP_DOWNLOAD=\u505C\u6B62\u4E0B\u8F7D START_TIME=\u5F00\u59CB\u65F6\u95F4 END_TIME=\u7ED3\u675F\u65F6\u95F4 RECORD_TYPE=\u5F55\u50CF\u7C7B\u578B GENERAL_RECORD=\u666E\u901A\u5F55\u50CF ALARM_RECORD=\u62A5\u8B66\u5F55\u50CF MOTION_DETECTION=\u79FB\u52A8\u68C0\u6D4B\u5F55\u50CF CARD_NUMBER_RECORD=\u5361\u53F7\u5F55\u50CF INTELLIGENT_DETECTION=\u667A\u80FD\u5F55\u50CF POS_RECORD=POS\u5F55\u50CF QUERY_RECORD_IS_NOT_EXIST=\u67E5\u8BE2\u5F55\u50CF\u4E0D\u5B58\u5728 PLEASE_CHECK_RECORD_TIME=\u8BF7\u68C0\u67E5\u5F55\u50CF\u65F6\u95F4 PLEASE_SELECT_TIME_AGAIN=\u8BF7\u91CD\u65B0\u9009\u62E9\u65F6\u95F4\uFF0C\u6700\u5927\u65F6\u95F4\u5DEE6\u5C0F\u65F6 DOWNLOAD_COMPLETED=\u4E0B\u8F7D\u7ED3\u675F PLEASE_FIRST_QUERY_RECORD=\u8BF7\u5148\u67E5\u8BE2\u5F55\u50CF PLEASE_FIRST_SELECT_ROW_WITH_DATA=\u8BF7\u5148\u9009\u62E9\u6709\u5F55\u50CF\u7684\u4E00\u884C # Time Set YEAR=\u5E74 MONTH=\u6708 DAY=\u65E5 HOUR=\u65F6 MINUTE=\u5206 SECOND=\u79D2 CONFIRM=\u786E\u5B9A CANCEL=\u53D6\u6D88 DATE_CHOOSER=\u65F6\u95F4\u9009\u62E9 MONDAY=\u661F\u671F\u4E00 TUESDAY=\u661F\u671F\u4E8C WEDNESDAY=\u661F\u671F\u4E09 THURSDAY=\u661F\u671F\u56DB FRIDAY=\u661F\u671F\u4E94 SATURDAY=\u661F\u671F\u516D SUNDAY=\u661F\u671F\u65E5 # Talk TRANSMIT_TYPE=\u8F6C\u53D1\u7C7B\u578B LOCAL_TRANSMIT_TYPE=\u672C\u5730\uFF08\u4E0D\u8F6C\u53D1\uFF09 REMOTE_TRANSMIT_TYPE=\u8FDC\u7A0B\uFF08\u8F6C\u53D1\uFF09 TRANSMIT_CHANNEL=\u8F6C\u53D1\u901A\u9053 START_TALK=\u5F00\u59CB\u901A\u8BDD STOP_TALK=\u7ED3\u675F\u901A\u8BDD TALK_FAILED=\u901A\u8BDD\u5931\u8D25 # DeviceSearchAndInt DEVICESEARCH_OPERATE=\u8BBE\u5907\u641C\u7D22\u64CD\u4F5C DEVICESEARCH_RESULT=\u8BBE\u5907\u641C\u7D22\u7ED3\u679C DEVICEINIT=\u8BBE\u5907\u521D\u59CB\u5316 DEVICESEARCH=\u8BBE\u5907\u641C\u7D22 DEVICE_POINT_TO_POINT_SEARCH=\u8BBE\u5907IP\u70B9\u5BF9\u70B9\u641C\u7D22 START_SEARCH=\u5F00\u59CB\u641C\u7D22 STOP_SEARCH=\u505C\u6B62\u641C\u7D22 START_IP=\u8D77\u59CBIP END_IP=\u7ED3\u675FIP DEVICE_TYPE=\u8BBE\u5907\u7C7B\u578B MAC=MAC SN=\u5E8F\u5217\u53F7 DEVICE_INIT_STATE=\u521D\u59CB\u5316\u72B6\u6001 INIT_PASSWD=\u521D\u59CB\u5316\u5BC6\u7801 PHONE=\u624B\u673A\u53F7 MAIL=\u90AE\u7BB1 IP_VERSION=IP\u7248\u672C SUB_MASK=\u5B50\u7F51\u63A9\u7801 GETWAY=\u7F51\u5173 DETAIL_TYPE=\u8BE6\u7EC6\u7C7B\u578B HTTP_PORT=HTTP\u7AEF\u53E3\u53F7 LOCAL_IP=\u672C\u5730ip CONFIRM_PASSWORD=\u786E\u8BA4\u5BC6\u7801 OLD_DEVICE=\u8001\u8BBE\u5907 DONOT_SUPPORT_INITIALIZATION=\u4E0D\u652F\u6301\u521D\u59CB\u5316 NOT_INITIALIZED=\u672A\u521D\u59CB\u5316 INITIALIZED=\u5DF2\u521D\u59CB\u5316 THE_IP_CONTROL_SCOPE=\u8303\u56F4\u592A\u5927\uFF0C\u8BF7\u63A7\u5236\u57281000\u4E2A\u4E4B\u95F4 PLEASE_FIRST_SELECT_INITIALIZED_DEVICE=\u8BF7\u5148\u9009\u62E9\u9700\u8981\u521D\u59CB\u5316\u7684\u8BBE\u5907 PLEASE_INPUT_PHONE=\u8BF7\u8F93\u5165\u624B\u673A\u53F7 PLEASE_INPUT_MAIL=\u8BF7\u8F93\u5165\u90AE\u7BB1 INCONSISTENT=\u5BC6\u7801\u548C\u786E\u8BA4\u5BC6\u7801\u4E0D\u4E00\u81F4 PLEASE_CHECK_IP=\u8BF7\u68C0\u67E5IP SEARCHING_WAITING=\u6B63\u5728\u641C\u7D22\uFF0C\u8BF7\u7B49\u5F85\u641C\u7D22\u7ED3\u675F START_LISTEN=\u5F00\u59CB\u76D1\u542C STOP_LISTEN=\u505C\u6B62\u76D1\u542C SHOW_ALARM_EVENT=\u62A5\u8B66\u4E8B\u4EF6\u7ED3\u679C\u4FE1\u606F ALARM_LISTEN_FAILED=\u62A5\u8B66\u76D1\u542C\u5931\u8D25 ALARM_MESSAGE=\u62A5\u8B66\u4FE1\u606F EXTERNAL_ALARM=\u5916\u90E8\u62A5\u8B66 MOTION_ALARM=\u52A8\u6001\u68C0\u6D4B\u62A5\u8B66 VIDEOLOST_ALARM=\u89C6\u9891\u4E22\u5931\u62A5\u8B66 SHELTER_ALARM=\u89C6\u9891\u906E\u6321\u62A5\u8B66 DISKFULL_ALARM=\u786C\u76D8\u6EE1\u62A5\u8B66 DISKERROR_ALARM=\u574F\u786C\u76D8\u62A5\u8B66 START=\u5F00\u59CB STOP=\u7ED3\u675F CURRENT_TIME=\u5F53\u524D\u65F6\u95F4 DEVICE_REBOOT=\u8BBE\u5907\u91CD\u542F SYNCHRONIZE_TIME=\u65F6\u95F4\u540C\u6B65 REBOOT=\u91CD\u542F SET_TIME=\u8BBE\u7F6E\u65F6\u95F4 GET_TIME=\u83B7\u53D6\u65F6\u95F4 REBOOT_TIPS=\u60A8\u786E\u5B9A\u8981\u91CD\u542F\u5417\uFF1F OPERATE_SUCCESS=\u64CD\u4F5C\u6210\u529F #FaceRecognition FACE_GROUP_ID=\u4EBA\u8138\u5E93ID FACE_GROUP_NAME=\u4EBA\u8138\u5E93\u540D\u79F0 PERSON_COUNT=\u4EBA\u5458\u4E2A\u6570 GROUP_OPERATE=\u4EBA\u8138\u5E93\u64CD\u4F5C PERSON_OPERATE=\u4EBA\u5458\u64CD\u4F5C FACE_RECOGNITION_EVENT=\u76EE\u6807\u8BC6\u522B\u4E8B\u4EF6 FACE_DETECT_EVENT=\u4EBA\u8138\u68C0\u6D4B\u4E8B\u4EF6 GLOBAL_PICTURE=\u5168\u666F\u56FE PERSON_PICTURE=\u4EBA\u8138\u56FE CANDIDATE_PICTURE=\u5019\u9009\u4EBA\u56FE TIME=\u65F6\u95F4 SEX=\u6027\u522B AGE=\u5E74\u9F84 COLOR= EYE=\u773C\u775B MOUTH=\u5634\u5DF4 MASK=\u53E3\u7F69 BEARD=\u80E1\u5B50 MALE=\u7537 FEMALE=\u5973 ID_CARD=\u8EAB\u4EFD\u8BC1 OFFICE_CARD=\u519B\u5B98\u8BC1 PASSPORT=\u62A4\u7167 UNIDENTIFIED=\u672A\u8BC6\u522B HAVE_BEARD=\u6709\u80E1\u5B50 NO_BEARD=\u6CA1\u80E1\u5B50 OPEN_MOUTH=\u5F20\u5634 CLOSE_MOUTH=\u95ED\u5634 YELLOW_COLOR= BLACK_COLOR= WHITE_COLOR= OPEN_EYE=\u7741\u773C CLOSE_EYE=\u95ED\u773C SMILE=\u5FAE\u7B11 ANGER=\u6124\u6012 SADNESS=\u60B2\u4F24 DISGUST=\u538C\u6076 FEAR=\u5BB3\u6015 SURPRISE=\u60CA\u8BB6 NEUTRAL=\u6B63\u5E38 LAUGH=\u5927\u7B11 WEAR_MASK=\u6234\u53E3\u7F69 NO_MASK=\u6CA1\u6234\u53E3\u7F69 WEAR_GLASSES=\u6234\u773C\u955C NO_GLASSES=\u4E0D\u6234\u773C\u955C UNKNOW=\u672A\u77E5 UNLIMITED=\u4E0D\u9650 NAME=\u59D3\u540D BIRTHDAY=\u751F\u65E5 ID_NO=\u8BC1\u4EF6\u53F7 ID_TYPE=\u8BC1\u4EF6\u7C7B\u578B SIMILARITY=\u76F8\u4F3C\u5EA6 UID=\u4EBA\u5458\u6807\u8BC6\u7B26 STRANGER=\u964C\u751F\u4EBA GLASSES=\u773C\u955C PICTURE_PATH=\u56FE\u7247\u8DEF\u5F84 FACE_LIBRARY_ID=\u4EBA\u8138\u5E93ID FACE_LIBRARY_NAME=\u4EBA\u8138\u5E93\u540D\u79F0 ADD=\u6DFB\u52A0 MODIFY=\u4FEE\u6539 DELETE=\u5220\u9664 FRESH=\u5237\u65B0 ADD_GROUP=\u6DFB\u52A0\u4EBA\u8138\u5E93 MODIFY_GROUP=\u4FEE\u6539\u4EBA\u8138\u5E93 DEL_GROUP=\u5220\u9664\u4EBA\u8138\u5E93 DISPOSITION=\u5E03\u63A7 DEL_DISPOSITION=\u64A4\u63A7 FIND_CONDITION=\u67E5\u627E\u6761\u4EF6 FIND_PERSON=\u67E5\u627E\u4EBA\u5458 ADD_PERSON=\u6DFB\u52A0\u4EBA\u5458 MODIFY_PERSON=\u4FEE\u6539\u4EBA\u5458 DEL_PERSON=\u5220\u9664\u4EBA\u5458 PREVIOUSPAGE=\u4E0A\u4E00\u9875 LASTPAGE=\u4E0B\u4E00\u9875 SELECT_PICTURE=\u9009\u62E9\u56FE\u7247 SEARCH_BY_PIC=\u4EE5\u56FE\u641C\u56FE DOWNLOAD_QUERY_PICTURE=\u4E0B\u8F7D\u67E5\u8BE2\u5230\u7684\u56FE\u7247 FACE_LIBRARY=\u4EBA\u8138\u5E93 HISTORY_LIBRARY=\u5386\u53F2\u5E93 CHOOSE_FACE_PIC=\u8BF7\u9009\u62E9\u4EBA\u8138\u56FE\u7247 EVENT_TYPE=\u4E8B\u4EF6\u7C7B\u578B PAGES_NUMBER=\u9875\u6570 SIMILARITY_RANGE=\u76F8\u4F3C\u5EA6\u8303\u56F4[0, 100] PLEASE_INPUT_GROUPNAME=\u8BF7\u8F93\u5165\u4EBA\u8138\u5E93\u540D\u79F0 PLEASE_SELECT_GROUP=\u8BF7\u9009\u62E9\u4EBA\u8138\u5E93 PLEASE_SELECT_PERSON=\u8BF7\u9009\u62E9\u4EBA\u5458 PLEASE_ADD_DISPOSITION_INFO=\u8BF7\u6DFB\u52A0\u5E03\u63A7\u4FE1\u606F PLEASE_SELECT_DEL_DISPOSITION_INFO=\u8BF7\u9009\u62E9\u64A4\u63A7\u4FE1\u606F #AutoRegister AUTOREGISTER_LISTEN=\u4E3B\u52A8\u6CE8\u518C\u76D1\u542C DEVICE_CONFIG=\u8BBE\u5907\u914D\u7F6E DEVICE_LIST=\u8BBE\u5907\u5217\u8868 DEVICE_MANAGER=\u8BBE\u5907\u7BA1\u7406 ADD_DEVICE=\u6DFB\u52A0\u8BBE\u5907 MODIFY_DEVICE=\u4FEE\u6539\u8BBE\u5907 DELETE_DEVICE=\u5220\u9664\u8BBE\u5907 CLEAR_DEVICE=\u6E05\u7A7A\u8BBE\u5907 IMPORT_DEVICE=\u5BFC\u5165\u8BBE\u5907 EXPORT_DEVICE=\u5BFC\u51FA\u8BBE\u5907 DEVICE_ID=\u8BBE\u5907ID ENABLE=\u542F\u7528 REGISTER_ADDRESS=\u6CE8\u518C\u5730\u5740 REGISTER_PORT=\u6CE8\u518C\u7AEF\u53E3\u53F7 GET=\u83B7\u53D6 SET=\u8BBE\u7F6E RECORD=\u5F55\u97F3 DEVICE_LOGIN=\u8BBE\u5907\u5DF2\u767B\u5F55 ALREADY_EXISTED=\u5DF2\u5B58\u5728 ALREADY_EXISTED_WHETHER_OR_NOT_TO_COVER=\u5DF2\u5B58\u5728\uFF0C\u662F\u5426\u8986\u76D6(\u5426\uFF0C\u4E0D\u4F1A\u5BFC\u51FA) FILE_OPEN_PLEASE_CLOSE_FILE=\u6587\u4EF6\u88AB\u6253\u5F00\uFF0C\u8BF7\u5148\u5173\u95ED\u6587\u4EF6 IMPORT_COMPLETION=\u5BFC\u5165\u5B8C\u6210 EXPORT_COMPLETION=\u5BFC\u51FA\u5B8C\u6210 FILE_NOT_EXIST=\u6587\u4EF6\u4E0D\u5B58\u5728 PLEASE_INPUT=\u8BF7\u8F93\u5165 MAX_SUPPORT_100=\u6700\u5927\u652F\u6301100\u4E2A #Attendance ATTENDANCE=\u8003\u52E4\u673A USER_ID=\u7528\u6237ID USER_NAME=\u7528\u6237\u540D CARD_NO=\u5361\u53F7 QUERY_CONDITION=\u67E5\u8BE2\u6761\u4EF6 USER_OPERATE=\u7528\u6237\u64CD\u4F5C FINGERPRINT_OPERATE=\u6307\u7EB9\u64CD\u4F5C OPERATE_BY_USER_ID=\u901A\u8FC7\u7528\u6237ID\u64CD\u4F5C\u6307\u7EB9 OPERATE_BY_FINGERPRINT_ID=\u901A\u8FC7\u6307\u7EB9ID\u64CD\u4F5C\u6307\u7EB9 FINGERPRINT_ID=\u6307\u7EB9ID SEARCH=\u67E5\u627E SEARCH_FINGERPRINT=\u67E5\u627E\u6307\u7EB9 ADD_FINGERPRINT=\u6DFB\u52A0\u6307\u7EB9 DELETE_FINGERPRINT=\u5220\u9664\u6307\u7EB9 SUBSCRIBE=\u8BA2\u9605 UNSUBSCRIBE=\u53D6\u6D88\u8BA2\u9605 USER_LIST=\u7528\u6237\u5217\u8868 NEXT_PAGE=\u4E0B\u4E00\u9875 USER_INFO=\u7528\u6237\u4FE1\u606F DOOROPEN_METHOD=\u5F00\u95E8\u65B9\u5F0F FINGERPRINT=\u6307\u7EB9 FINGERPRINT_INFO=\u6307\u7EB9\u4FE1\u606F FINGERPRINT_DATA=\u6307\u7EB9\u6570\u636E CARD=\u5361 DELETE_FINGERPRINT_PROMPT=\u5C06\u4F1A\u5220\u9664\u8BE5\u7528\u6237\u4E0B\u6240\u6709\u6307\u7EB9\u6570\u636E SUBSCRIBE_FAILED=\u8BA2\u9605\u5931\u8D25 FINGERPRINT_ID_ILLEGAL=\u6307\u7EB9ID\u975E\u6CD5 FINGERPRINT_COLLECTION=\u6307\u7EB9\u91C7\u96C6 START_COLLECTION=\u5F00\u59CB\u91C7\u96C6 STOP_COLLECTION=\u505C\u6B62\u91C7\u96C6 IN_THE_COLLECTION=\u91C7\u96C6\u4E2D... COLLECTION_COMPLETED=\u91C7\u96C6\u5B8C\u6210 COLLECTION_FAILED=\u91C7\u96C6\u5931\u8D25 FINGERPRINT_ID_NOT_EXIST=\u6307\u7EB9ID\u4E0D\u5B58\u5728 USER_ID_EXCEED_LENGTH=\u7528\u6237ID\u8D85\u8FC7\u6700\u5927\u957F\u5EA6 USER_NAME_EXCEED_LENGTH=\u7528\u6237\u540D\u8D85\u8FC7\u6700\u5927\u957F\u5EA6 CARD_NO_EXCEED_LENGTH=\u5361\u53F7\u8D85\u8FC7\u6700\u5927\u957F\u5EA6 CARD_NAME_EXCEED_LENGTH=\u5361\u540D\u8D85\u8FC7\u6700\u5927\u9650\u5236 CARD_PASSWD_EXCEED_LENGTH=\u5361\u5BC6\u7801\u8D85\u8FC7\u6700\u5927\u9650\u5236 #Gate GATE=\u4EBA\u8138\u5F00\u95E8 CARD_OPERATE=\u5361\u64CD\u4F5C CARD_INFO=\u5361\u4FE1\u606F CARD_MANAGER=\u5361\u7BA1\u7406 CLEAR=\u6E05\u7A7A OPEN_STATUS=\u5F00\u95E8\u72B6\u6001 OPEN_METHOD=\u5F00\u95E8\u65B9\u5F0F TEMPERATURE=\u6E29\u5EA6 MASK_STATUS=\u53E3\u7F69\u72B6\u6001 CARD_UNKNOW=\u672A\u77E5\u5361 CARD_GENERAL=\u4E00\u822C\u5361 CARD_VIP=VIP\u5361 CARD_GUEST=\u6765\u5BBE\u5361 CARD_PATROL=\u5DE1\u903B\u5361 CARD_BACKLIST=\u7981\u6B62\u540D\u5355\u5361 CARD_COERCE=\u80C1\u8FEB\u5361 CARD_POLLING=\u5DE1\u68C0\u5361 CARD_MOTHERCARD=\u6BCD\u5361 STATE_UNKNOWN=\u672A\u77E5 STATE_NORMAL=\u6B63\u5E38 STATE_LOSE=\u4E22\u5931 STATE_LOGOFF=\u6CE8\u9500 STATE_FREEZE=\u51BB\u7ED3 STATE_ARREARS=\u6B20\u8D39 STATE_OVERDUE=\u903E\u671F STATE_PREARREARS=\u9884\u6B20\u8D39 RECORD_NO=\u8BB0\u5F55\u96C6\u7F16\u53F7 CARD_NAME=\u5361\u540D CARD_STATUS=\u5361\u72B6\u6001 CARD_PASSWORD=\u5361\u5BC6\u7801 CARD_TYPE=\u5361\u7C7B\u578B CARD_NUM=\u8BC1\u4EF6\u53F7 USE_TIMES=\u4F7F\u7528\u6B21\u6570 IS_FIRST_ENTER=\u662F\u5426\u9996\u5361 IS_VALID=\u662F\u5426\u6709\u6548 VALID_PERIOD=\u6709\u6548\u671F VALID_START_TIME=\u6709\u6548\u5F00\u59CB\u65F6\u95F4 VALID_END_TIME=\u6709\u6548\u7ED3\u675F\u65F6\u95F4 FIRST_ENTER=\u9996\u5361 NO_FIRST_ENTER=\u975E\u9996\u5361 VALID=\u6709\u6548 INVALID=\u65E0\u6548 PLEASE_SELECT_CARD=\u8BF7\u9009\u62E9\u5361 PLEASE_INPUT_CARDNO=\u8BF7\u8F93\u5165\u5361\u53F7 PLEASE_INPUT_USERID=\u8BF7\u8F93\u5165\u7528\u6237ID WANT_CLEAR_ALL_INFO=\u4F60\u662F\u5426\u60F3\u8981\u6E05\u7A7A\u6240\u6709\u4FE1\u606F? ADD_CARD_INDO_FAILED=\u6DFB\u52A0\u5361\u4FE1\u606F\u5931\u8D25  ADD_CARD_INFO_AND_PERSON_PICTURE_SUCCEED=\u6DFB\u52A0\u5361\u4FE1\u606F\u548C\u4EBA\u8138\u6210\u529F ADD_CARD_INFO_SUCCEED_BUT_ADD_PERSON_PICTURE_FAILED=\u6DFB\u52A0\u5361\u4FE1\u606F\u6210\u529F\uFF0C\u4F46\u6DFB\u52A0\u4EBA\u8138\u5931\u8D25 CARD_EXISTED_ADD_PERSON_PICTURE_SUCCEED=\u5361\u4FE1\u606F\u5DF2\u5B58\u5728\uFF0C\u6DFB\u52A0\u4EBA\u8138\u6210\u529F MODIFY_CARD_INFO_SUCCEED=\u4FEE\u6539\u5361\u4FE1\u606F\u6210\u529F MODIFY_CARD_INFO_FAILED=\u4FEE\u6539\u5361\u4FE1\u606F\u5931\u8D25 MODIFY_CARD_INFO_AND_PERSON_PICTURE_SUCCEED=\u4FEE\u6539\u5361\u4FE1\u606F\u548C\u4EBA\u8138\u6210\u529F MODIFY_CARD_INFO_SUCCEED_BUT_MODIFY_PERSON_PICTURE_FAILED=\u4FEE\u6539\u5361\u4FE1\u606F\u6210\u529F\uFF0C\u4F46\u4FEE\u6539\u4EBA\u8138\u5931\u8D25 NET_ACCESS_DOOROPEN_METHOD_UNKNOWN=\u672A\u77E5 NET_ACCESS_DOOROPEN_METHOD_PWD_ONLY=\u5BC6\u7801\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_CARD=\u5237\u5361\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_CARD_FIRST=\u5148\u5237\u5361\u540E\u5BC6\u7801\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_PWD_FIRST=\u5148\u5BC6\u7801\u540E\u5237\u5361\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_REMOTE=\u8FDC\u7A0B\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_BUTTON=\u5F00\u9501\u6309\u94AE\u8FDB\u884C\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT=\u6307\u7EB9\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_PWD_CARD_FINGERPRINT=\u5BC6\u7801+\u5237\u5361+\u6307\u7EB9\u7EC4\u5408\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_PWD_FINGERPRINT=\u5BC6\u7801+\u6307\u7EB9\u7EC4\u5408\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_CARD_FINGERPRINT=\u5237\u5361+\u6307\u7EB9\u7EC4\u5408\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_PERSONS=\u591A\u4EBA\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_KEY=\u94A5\u5319\u5F00\u95E8 NET_ACCESS_DOOROPEN_METHOD_COERCE_PWD=\u80C1\u8FEB\u5BC6\u7801\u5F00\u95E8 NET_ACCESS_DOOROPEN_METHOD_QRCODE=\u4E8C\u7EF4\u7801\u5F00\u95E8 NET_ACCESS_DOOROPEN_METHOD_FACE_RECOGNITION=\u76EE\u6807\u8BC6\u522B\u5F00\u95E8 NET_ACCESS_DOOROPEN_METHOD_FACEIDCARD=\u4EBA\u8BC1\u5BF9\u6BD4 NET_ACCESS_DOOROPEN_METHOD_FACEIDCARD_AND_IDCARD=\u8EAB\u4EFD\u8BC1+ \u4EBA\u8BC1\u6BD4\u5BF9 NET_ACCESS_DOOROPEN_METHOD_BLUETOOTH=\u84DD\u7259\u5F00\u95E8 NET_ACCESS_DOOROPEN_METHOD_CUSTOM_PASSWORD=\u4E2A\u6027\u5316\u5BC6\u7801\u5F00\u95E8 NET_ACCESS_DOOROPEN_METHOD_USERID_AND_PWD=UserID+\u5BC6\u7801 NET_ACCESS_DOOROPEN_METHOD_FACE_AND_PWD=\u4EBA\u8138+\u5BC6\u7801\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_AND_PWD=\u6307\u7EB9+\u5BC6\u7801\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_AND_FACE=\u6307\u7EB9+\u4EBA\u8138\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FACE=\u5237\u5361+\u4EBA\u8138\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_FACE_OR_PWD=\u4EBA\u8138\u6216\u5BC6\u7801\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_OR_PWD=\u6307\u7EB9\u6216\u5BC6\u7801\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_OR_FACE=\u6307\u7EB9\u6216\u4EBA\u8138\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FACE=\u5237\u5361\u6216\u4EBA\u8138\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FINGERPRINT=\u5237\u5361\u6216\u6307\u7EB9\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_AND_FACE_AND_PWD=\u6307\u7EB9+\u4EBA\u8138+\u5BC6\u7801\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FACE_AND_PWD=\u5237\u5361+\u4EBA\u8138+\u5BC6\u7801\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FINGERPRINT_AND_PWD=\u5237\u5361+\u6307\u7EB9+\u5BC6\u7801\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_CARD_AND_PWD_AND_FACE=\u5361+\u6307\u7EB9+\u4EBA\u8138\u7EC4\u5408\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_FINGERPRINT_OR_FACE_OR_PWD=\u6307\u7EB9\u6216\u4EBA\u8138\u6216\u5BC6\u7801 NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FACE_OR_PWD =\u5361\u6216\u4EBA\u8138\u6216\u5BC6\u7801\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FINGERPRINT_OR_FACE=\u5361\u6216\u6307\u7EB9\u6216\u4EBA\u8138\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_CARD_AND_FINGERPRINT_AND_FACE_AND_PWD=\u5361+\u6307\u7EB9+\u4EBA\u8138+\u5BC6\u7801\u7EC4\u5408\u5F00\u9501  NET_ACCESS_DOOROPEN_METHOD_CARD_OR_FINGERPRINT_OR_FACE_OR_PWD=\u5361\u6216\u6307\u7EB9\u6216\u4EBA\u8138\u6216\u5BC6\u7801\u5F00\u9501 NET_ACCESS_DOOROPEN_METHOD_FACEIPCARDANDIDCARD_OR_CARD_OR_FACE=(\u8EAB\u4EFD\u8BC1+\u4EBA\u8BC1\u6BD4\u5BF9)\u6216 \u5237\u5361 \u6216 \u4EBA\u8138 NET_ACCESS_DOOROPEN_METHOD_FACEIDCARD_OR_CARD_OR_FACE=\u4EBA\u8BC1\u6BD4\u5BF9 \u6216 \u5237\u5361(\u4E8C\u7EF4\u7801) \u6216 \u4EBA\u8138 #ThemalCamera THERMAL_CAMERA=\u70ED\u6210\u50CF THERMAL_OPERATE=\u64CD\u4F5C POINT_QUERY=\u67E5\u8BE2\u6D4B\u6E29\u70B9 ITEM_QUERY=\u67E5\u8BE2\u6D4B\u6E29\u9879 TEMPER_QUERY=\u67E5\u8BE2\u6E29\u5EA6 HEATMAP=\u70ED\u56FE\u4FE1\u606F POINT_TEMPER=\u6D4B\u6E29\u70B9 ITEM_TEMPER=\u6D4B\u6E29\u9879 X=X Y=Y COORDINATE_ILLEGAL=\u5750\u6807\u975E\u6CD5 QUERY_RESULT=\u67E5\u8BE2\u7ED3\u679C METER_TYPE=\u6D4B\u6E29\u9879\u7C7B\u522B TEMPER_UNIT=\u6E29\u5EA6\u5355\u4F4D TEMPER=\u6E29\u5EA6 UNKNOWN=\u672A\u77E5 SPOT=\u70B9 LINE=\u7EBF AREA=\u533A\u57DF CENTIGRADE=\u6444\u6C0F\u5EA6 FAHRENHEIT=\u534E\u6C0F\u5EA6 PRESET_ID=\u9884\u7F6E\u70B9\u7F16\u53F7 RULE_ID=\u89C4\u5219\u7F16\u53F7 TEMPER_AVER=\u5E73\u5747\u6E29\u5EA6 TEMPER_MAX=\u6700\u9AD8\u6E29\u5EA6 TEMPER_MIN=\u6700\u4F4E\u6E29\u5EA6 TEMPER_MID=\u4E2D\u95F4\u6E29\u5EA6 TEMPER_STD=\u6807\u51C6\u65B9\u5DEE INPUT_ILLEGAL=\u8F93\u5165\u975E\u6CD5 TEMPER_INFO=\u6D4B\u6E29\u4FE1\u606F FIVE_MINUTES=\u4E94\u5206\u949F TEN_MINUTES=\u5341\u5206\u949F FIFTEEN_MINUTES=\u5341\u4E94\u5206\u949F THIRTY_MINUTES=\u4E09\u5341\u5206\u949F SAVE_PERIOD=\u4FDD\u5B58\u5468\u671F QUERY_LIST=\u67E5\u8BE2\u5217\u8868 RECORD_TIME=\u8BB0\u5F55\u65F6\u95F4 ITEM_NAME=\u540D\u79F0 COORDINATE=\u5750\u6807 NO_RECORD=\u65E0\u8BB0\u5F55 HEATMAP_OPERATE=\u64CD\u4F5C IDLE=\u7A7A\u95F2 ACQUIRING=\u83B7\u53D6\u4E2D RADIOMETRY_ATTACH=\u8BA2\u9605\u70ED\u56FE\u6570\u636E RADIOMETRY_DETACH=\u505C\u6B62\u8BA2\u9605 RADIOMETRY_FETCH=\u83B7\u53D6\u70ED\u56FE SAVE_HEATMAP=\u4FDD\u5B58\u70ED\u56FE HEATMAP_METADATA_INFO=\u70ED\u56FE\u5143\u6570\u636E HEIGHT=\u9AD8 WIDTH=\u5BBD LENGTH=\u6570\u636E\u5927\u5C0F SENSOR_TYPE=\u673A\u82AF\u7C7B\u578B HEATMAP_SAVE_SUCCESS=\u70ED\u56FE\u4FDD\u5B58\u6210\u529F # matrix screen MATRIX_SCREEN=\u70B9\u9635\u5C4F\u4E0B\u53D1 PASSING_STATE=\u8FC7\u8F66\u72B6\u6001 PASSING_CAR=\u8FC7\u8F66 NO_CAR=\u65E0\u8F66 IN_TIME=\u5165\u573A\u65F6\u95F4 OUT_TIME=\u51FA\u573A\u65F6\u95F4 PLATE_NUMBER=\u8F66\u724C\u53F7\u7801 CAR_OWNER=\u8F66\u4E3B PARKING_TIME=\u505C\u8F66\u65F6\u957F USER_TYPE=\u7528\u6237\u7C7B\u578B MONTHLY_CARD_USER=\u6708\u5361\u7528\u6237 ANNUAL_CARD_USER=\u5E74\u5361\u7528\u6237 LONG_TERM_USER=\u957F\u671F\u7528\u6237/VIP TEMPORARY_USER=\u4E34\u65F6\u7528\u6237/Visitor PARKING_CHARGE=\u505C\u8F66\u8D39 DAYS_DUE=\u5230\u671F\u5929\u6570 REMAINING_PARKING_SPACES=\u5269\u4F59\u8F66\u4F4D VEHICLES_NOT_ALLOWED_TO_PASS=\u4E0D\u5141\u8BB8\u8F66\u8F86\u901A\u8FC7 ALLOWED_VEHICLES_TO_PASS=\u5141\u8BB8\u8F66\u8F86\u901A\u8FC7 SET_UP=\u8BBE\u7F6E SUCCESSFULLY_ISSUED=\u4E0B\u53D1\u6210\u529F DELIVERY_FAILED=\u4E0B\u53D1\u5931\u8D25 CUSTOM_USER_CLASS=\u81EA\u5B9A\u4E49\u7528\u6237\u7C7B REMARKS_INFORMATION=\u5907\u6CE8\u4FE1\u606F CUSTOM_INFORMATION=\u81EA\u5B9A\u4E49\u4FE1\u606F # \uFFFD\uFFFD\uFFFD\uFFFD\u0373\uFFFD\uFFFD HUMAN_NUMBER_STATISTIC_TITLE=\u4EBA\u6570\u7EDF\u8BA1 HUMAN_NUMBER_STATISTIC_CONTROL=\u4EBA\u6570\u7EDF\u8BA1\u63A7\u5236 HUMAN_NUMBER_STATISTIC_EVENT_TITLE=\u4EBA\u6570\u7EDF\u8BA1\u4E8B\u4EF6\u5217\u8868 HUMAN_NUMBER_STATISTIC_EVENT_CHANNEL=\u901A\u9053 HUMAN_NUMBER_STATISTIC_EVENT_TIME=\u4E8B\u4EF6\u65F6\u523B HUMAN_NUMBER_STATISTIC_EVENT_HOUR_IN=\u672C\u5C0F\u65F6\u8FDB HUMAN_NUMBER_STATISTIC_EVENT_HOUR_OUT=\u672C\u5C0F\u65F6\u51FA HUMAN_NUMBER_STATISTIC_EVENT_TODAY_IN=\u4ECA\u65E5\u8FDB HUMAN_NUMBER_STATISTIC_EVENT_TODAY_OUT=\u4ECA\u65E5\u51FA HUMAN_NUMBER_STATISTIC_EVENT_TOTAL_IN=\u603B\u5171\u8FDB HUMAN_NUMBER_STATISTIC_EVENT_TOTAL_OUT=\u603B\u5171\u51FA HUMAN_NUMBER_STATIC_EVENT_OSD_CLEAR=OSD\u6E05\u9664 VTO_ALARM_EVENT_ROOM_NO=\u623F\u95F4\u53F7 VTO_ALARM_EVENT_CARD_NO=\u5361\u53F7 VTO_ALARM_EVENT_TIME=\u65F6\u95F4 VTO_ALARM_EVENT_OPEN_METHOD=\u5F00\u95E8\u65B9\u5F0F VTO_ALARM_EVENT_STATUS=\u72B6\u6001 VTO_REAL_LOAD_ROOM_NO=\u623F\u95F4\u53F7 VTO_REAL_LOAD_CARD_NO=\u5361\u53F7 VTO_REAL_LOAD_TIME=\u65F6\u95F4 VTO_REAL_LOAD_EVENT_INFO=\u4E8B\u4EF6\u4FE1\u606F VTO_OPERATE_MANAGER_TITLE=\u5361\u4E0E\u6307\u7EB9\u4E0E\u4EBA\u8138\u7BA1\u7406 VTO_OPERATE_MANAGER_REC_NO=\u7F16\u53F7 VTO_OPERATE_MANAGER_ROOM_NO=\u623F\u95F4\u53F7 VTO_OPERATE_MANAGER_CARD_NO=\u5361\u53F7 VTO_OPERATE_MANAGER_FINGER_PRINT_DATA=\u6307\u7EB9\u6570\u636E VTO_OPERATE_INFO_TITLE=\u589E\u52A0 VTO_OPERATE_COLLECTION_FINGER_PRINT_TITLE=\u91C7\u96C6\u6307\u7EB9 DOOR_OPEN=\u5F00\u95E8 DOOR_CLOSE=\u5173\u95E8 EVENT_OPERATE=\u4E8B\u4EF6\u64CD\u4F5C START_REAL_LOAD_PIC=\u5F00\u59CB\u667A\u80FD\u76D1\u542C STOP_REAL_LOAD_PIC=\u505C\u6B62\u667A\u80FD\u76D1\u542C ALARM_EVENT=\u62A5\u8B66\u4E8B\u4EF6 REAL_LOAD_EVENT=\u667A\u80FD\u4E8B\u4EF6 COLLECTION_RESULT=\u91C7\u96C6\u7ED3\u679C NEED_FINGER_PRINT=\u9700\u8981\u6307\u7EB9 FACE_INFO=\u4EBA\u8138\u4FE1\u606F OPEN=\u6253\u5F00 VTO=\u53EF\u89C6\u5BF9\u8BB2\u95E8\u53E3\u673A TRAFFIC_ALLOW_LIST=\u667A\u80FD\u4EA4\u901A\u5141\u8BB8\u540D\u5355 MODIFY_CARD_FACE_FAILED=\u4FEE\u6539\u4EBA\u8138\u5931\u8D25 EM_MASK_STATE_UNKNOWN=\u672A\u77E5 EM_MASK_STATE_NODISTI=\u672A\u8BC6\u522B EM_MASK_STATE_NOMASK=\u6CA1\u6234\u53E3\u7F69 EM_MASK_STATE_WEAR=\u6234\u53E3\u7F69 END_SEARCH=\u67E5\u8BE2\u7ED3\u675F DOWNLOAD_PICTURE=\u4E0B\u8F7D\u56FE\u7247 ENTER_PICTURE_PATH=\u8BF7\u8F93\u5165\u56FE\u7247\u8DEF\u5F84 LOADING=\u8BBE\u5907\u6B63\u5728\u5904\u7406\u4E2D REMOTE_OPEN_DOOR=\u8FDC\u7A0B\u5F00\u95E8 QUERY_CARD_EXIST_FAILED=\u68C0\u67E5\u5361\u53F7\u662F\u5426\u5B58\u5728\u5931\u8D25 CARD_EXIST=\u5361\u53F7\u5DF2\u5B58\u5728 INPUT_ROOM_NO=\u8BF7\u8F93\u5165\u623F\u95F4\u53F7 ROOM_NO_EXCEED_LENGTH=\u623F\u95F4\u53F7\u8D85\u8FC7\u6700\u5927\u957F\u5EA6 REMOVE_CARD_FACE_FAILED=\u5220\u9664\u4EBA\u8138\u5931\u8D25 #SCADA SCADA=\u52A8\u73AF\u4E3B\u673A SCADA_DEVICE_LIST=\u8BBE\u5907\u8868 SCADA_POINT_LIST=\u70B9\u4F4D\u8868 SCADA_ATTACH_ALARM=\u8BA2\u9605\u62A5\u8B66 SCADA_ATTACH_INFO=\u8BA2\u9605\u4FE1\u606F SCADA_ATTACH=\u8BA2\u9605 BTN_LIST = \u83B7\u53D6 BTN_ATTACH = \u8BA2\u9605 STOP_LISTEN_FAILED=\u505C\u6B62\u76D1\u542C\u5931\u8D25 SCREEN_NUMBER=\u5C4F\u5E55\u7F16\u53F7 TEXT_CONTENT=\u6587\u672C\u5185\u5BB9 TEXT_CONTENT_TYPE=\u6587\u672C\u7C7B\u578B TEXT_CONTENT_COLOR=\u6587\u672C\u989C\u8272 SCROLL_TYPE=\u6EDA\u52A8\u7C7B\u578B SCROLL_SPEED=\u6EDA\u52A8\u901F\u5EA6 ORDINARY=\u666E\u901A QR_CODE=\u4E8C\u7EF4\u7801 LOCAL_TIME=\u672C\u5730\u65F6\u95F4 RESOURCE=\u8D44\u6E90\u6587\u4EF6 NOT_ROLLING=\u4E0D\u6EDA\u52A8 SCROLL_LEFT_AND_RIGHT=\u5DE6\u53F3\u6EDA\u52A8 SCROLL_UP_AND_DOWN=\u4E0A\u4E0B\u7FFB\u9875\u6EDA\u52A8 NUMBER_STRING=\u6570\u5B57\u5B57\u7B26\u4E32 VOICE_TEXT=\u8BED\u97F3\u6587\u672C ISSUED=\u4E0B\u53D1 PROMPT=\u8BF7\u6DFB\u52A0\u5BF9\u5E94\u53C2\u6570 DEVICE_NAME=\u8BBE\u5907\u540D\u79F0 POINT_ID=\u70B9\u4F4DID IF_VALID_SIGNAL_POINT=\u662F\u5426\u6709\u6548\u4FE1\u53F7\u70B9 POINT_NAME=\u70B9\u4F4D\u540D\u79F0 ALARM_DESCRIBE=\u62A5\u8B66\u63CF\u8FF0 ALARM_LEVEL=\u62A5\u8B66\u7EA7\u522B ALARM_DELAY=\u62A5\u8B66\u65F6\u5EF6 ALARM_TYPE=\u62A5\u8B66\u7C7B\u578B ALARM_TIME=\u62A5\u8B66\u65F6\u95F4 COLLECT_TIME=\u91C7\u96C6\u65F6\u95F4 ALLOWLIST_OPERATION=\u5141\u8BB8\u540D\u5355\u64CD\u4F5C SINGLE_UPLOAD =\u5355\u4E2A\u4E0A\u4F20 LICENSE_PLATE_RUN=\u8F93\u5165\u8981\u67E5\u7684\u8F66\u724C\u53F7 FUZZY_QUERY=\u6A21\u7CCA\u67E5\u8BE2 DELETE_ALL=\u5168\u90E8\u5220\u9664 AUTHORIZATION=\u6388\u6743 UNAUTHORIZATION=\u672A\u6388\u6743 BATCH_UPLOAD=\u6279\u91CF\u4E0A\u4F20 BROWSE=\u6D4F\u89C8 UPLOAD=\u4E0A\u4F20 QUERY_INFORMATION=\u67E5\u8BE2\u4FE1\u606F DIALOG=\u5BF9\u8BDD\u6846 LICENSE_PLATE_NUMBER=\u8F66\u724C\u53F7 MODIFY_PANEL=\u4FEE\u6539\u9762\u677F SERIAL_NUMBER=\u5E8F\u53F7 OPEN_MODEL=\u5F00\u95F8\u6A21\u5F0F LICENSE_PLATE_LENGTH_TOO_LONG=\u8F66\u724C\u957F\u5EA6\u8FC7\u957F NAME_TOO_LONG=\u540D\u5B57\u957F\u5EA6\u8FC7\u957F ADD_SUCCESS=\u6DFB\u52A0\u6210\u529F ADD_FAIL=\u6DFB\u52A0\u5931\u8D25 DELETE_SUCCESS=\u5220\u9664\u6210\u529F DELETE_FAIL=\u5220\u9664\u5931\u8D25 MODIFY_SUCCESS=\u4FEE\u6539\u6210\u529F MODIFY_FAIL=\u4FEE\u6539\u5931\u8D25 UPLOAD_SUCCESS=\u4E0A\u4F20\u6210\u529F ENTER_QUERY_DATA=\u8BF7\u8F93\u5165\u8981\u67E5\u8BE2\u7684\u6570\u636E FILLING_RULES=\u586B\u5199\u5408\u6CD5\u5B57\u7B26 UPLOAD_FAIL=\u4E0A\u4F20\u5931\u8D25 UPLOADING=\u6B63\u5728\u4E0A\u4F20 SURE_UPLOAD=\u786E\u5B9A\u4E0A\u4F20? DATA_NUMBER=\u6761\u6570\u636E SELECT_DATA=\u8BF7\u9009\u62E9\u6570\u636E
lib/dhDll/ImageAlg.dll
Binary files differ
lib/dhDll/Infra.dll
Binary files differ
lib/dhDll/IvsDrawer.dll
Binary files differ
lib/dhDll/RenderEngine.dll
Binary files differ
lib/dhDll/StreamConvertor.dll
Binary files differ
lib/dhDll/avnetsdk.dll
Binary files differ
lib/dhDll/dhconfigsdk.dll
Binary files differ
lib/dhDll/dhnetsdk.dll
Binary files differ
lib/dhDll/dhplay.dll
Binary files differ
lib/hikDll/AudioRender.dll
Binary files differ
lib/hikDll/ClientDemoDll/calib.dll
Binary files differ
lib/hikDll/ClientDemoDll/iconv.dll
Binary files differ
lib/hikDll/ClientDemoDll/libcrypto-1_1-x64.dll
Binary files differ
lib/hikDll/ClientDemoDll/libssl-1_1-x64.dll
Binary files differ
lib/hikDll/ClientDemoDll/libxml2.dll
Binary files differ
lib/hikDll/ClientDemoDll/zlib1.dll
Binary files differ
lib/hikDll/GdiPlus.dll
Binary files differ
lib/hikDll/HCCore.dll
Binary files differ
lib/hikDll/HCNetSDK.dll
Binary files differ
lib/hikDll/HCNetSDKCom/AudioIntercom.dll
Binary files differ
lib/hikDll/HCNetSDKCom/AudioRender.dll
Binary files differ
lib/hikDll/HCNetSDKCom/HCAlarm.dll
Binary files differ
lib/hikDll/HCNetSDKCom/HCAlarm.lib
Binary files differ
lib/hikDll/HCNetSDKCom/HCCoreDevCfg.dll
Binary files differ
lib/hikDll/HCNetSDKCom/HCDisplay.dll
Binary files differ
lib/hikDll/HCNetSDKCom/HCGeneralCfgMgr.dll
Binary files differ
lib/hikDll/HCNetSDKCom/HCGeneralCfgMgr.lib
Binary files differ
lib/hikDll/HCNetSDKCom/HCIndustry.dll
Binary files differ
lib/hikDll/HCNetSDKCom/HCPlayBack.dll
Binary files differ
lib/hikDll/HCNetSDKCom/HCPreview.dll
Binary files differ
lib/hikDll/HCNetSDKCom/HCPreview.lib
Binary files differ
lib/hikDll/HCNetSDKCom/HCVoiceTalk.dll
Binary files differ
lib/hikDll/HCNetSDKCom/OpenAL32.dll
Binary files differ
lib/hikDll/HCNetSDKCom/StreamTransClient.dll
Binary files differ
lib/hikDll/HCNetSDKCom/SystemTransform.dll
Binary files differ
lib/hikDll/HCNetSDKCom/libiconv2.dll
Binary files differ
lib/hikDll/HXVA.dll
Binary files differ
lib/hikDll/HmMerge.dll
Binary files differ
lib/hikDll/MP_Render.dll
Binary files differ
lib/hikDll/NPQos.dll
Binary files differ
lib/hikDll/OpenAL32.dll
Binary files differ
lib/hikDll/PlayCtrl.dll
Binary files differ
lib/hikDll/SuperRender.dll
Binary files differ
lib/hikDll/YUVProcess.dll
Binary files differ
lib/hikDll/hlog.dll
Binary files differ
lib/hikDll/hpr.dll
Binary files differ
lib/hikDll/libcrypto-1_1-x64.dll
Binary files differ
lib/hikDll/libmmd.dll
Binary files differ
lib/hikDll/libssl-1_1-x64.dll
Binary files differ
lib/hikDll/zlib1.dll
Binary files differ
ruoyi-admin/src/main/resources/logback.xml
@@ -94,6 +94,19 @@
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!--dhSdk日志输出-->
    <appender name="dhSdk" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/dhSdk.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--按天回滚daily-->
            <fileNamePattern>${log.path}/dhSdk.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--日志最大的历史60天-->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!--minio日志输出-->
    <appender name="minio" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/minio.log</file>
@@ -245,6 +258,10 @@
    <logger name="hikSdk" level="INFO">
        <appender-ref ref="hikSdk"/>
    </logger>
    <!--dhSdk日志-->
    <logger name="dhSdk" level="INFO">
        <appender-ref ref="dhSdk"/>
    </logger>
    <!--mqtt日志-->
    <logger name="mqtt" level="INFO">
        <appender-ref ref="mqtt"/>
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SyncTask.java
@@ -50,7 +50,9 @@
     */
    public void cameraState() {
        try {
            List<ArdCameras> ardCameras = iArdCamerasService.selectArdCamerasListNoDataScope(new ArdCameras());
            ArdCameras ardCamera = new ArdCameras();
            ardCamera.setFactory("1");
            List<ArdCameras> ardCameras = iArdCamerasService.selectArdCamerasListNoDataScope(ardCamera);
            for (ArdCameras camera : ardCameras) {
                CameraCmd cmd = new CameraCmd();
                cmd.setCameraId(camera.getId());
@@ -109,7 +111,7 @@
        List<Vtdu> vtdus = vtduService.selectVtduList(new Vtdu());
        for (Vtdu vtdu : vtdus) {
            if (!nameList.contains(vtdu.getName())) {
                mediaService.addPath(vtdu.getName(),vtdu.getRtspSource(),vtdu.getMode(),vtdu.getIsCode());
                mediaService.addPath(vtdu.getName(), vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode());
            }
        }
    }