whycxzp
2025-03-22 be8a251672810019d5874b846f4d47df06fde62d
海康摄像头温度点位接口
37个文件已添加
13096 ■■■■■ 已修改文件
src/main/java/com/whyc/controller/HikTempController.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/hik/AlarmDevParamCfg.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/hik/ChannelParamCfg.java 522 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/hik/Commom/CommonUtil.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/hik/Commom/osSelect.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/hik/DevManager.java 315 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/hik/NetSDKDemo/HCNetSDK.java 10935 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/hik/SdkSysCfg.java 257 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/hik/TestDemo.java 455 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/HikTempService.java 452 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCCore.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDK.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDKCom/AnalyzeData.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDKCom/AudioIntercom.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDKCom/AudioRender.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDKCom/HCAlarm.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDKCom/HCAlarm.lib 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDKCom/HCCoreDevCfg.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDKCom/HCDisplay.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDKCom/HCGeneralCfgMgr.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDKCom/HCGeneralCfgMgr.lib 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDKCom/HCIndustry.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDKCom/HCPlayBack.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDKCom/HCPreview.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDKCom/HCPreview.lib 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDKCom/HCVoiceTalk.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDKCom/OpenAL32.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDKCom/StreamTransClient.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDKCom/SystemTransform.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/HCNetSDKCom/libiconv2.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/examples.jar 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/hlog.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/hpr.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/jna.jar 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/libcrypto-1_1-x64.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/libssl-1_1-x64.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/lib/hik/zlib1.dll 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/HikTempController.java
New file
@@ -0,0 +1,26 @@
package com.whyc.controller;
import com.whyc.dto.Response;
import com.whyc.service.HikTempService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
@RequestMapping("hikTemp")
@RestController
@Api("海康摄像头温度点位")
public class HikTempController {
    @Autowired
    private HikTempService service;
    @GetMapping("getTempPoint")
    public Response getTempPoint(String ip) throws IOException, InterruptedException {
        return service.getTempPoint(ip);
    }
}
src/main/java/com/whyc/hik/AlarmDevParamCfg.java
New file
@@ -0,0 +1,55 @@
package com.whyc.hik;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.whyc.hik.NetSDKDemo.HCNetSDK;
import static com.whyc.hik.TestDemo.hCNetSDK;
/**
 * 报警主机设备相关参数获取与配置
 * @Author: jiangxin14
 * @Date: 2024-08-26  10:02
 */
public class AlarmDevParamCfg {
    /**
     * 获取报警主机RS485参数
     *
     * @param lUserID
     */
    public static void getRs485Cfg(int lUserID) {
        HCNetSDK.NET_DVR_ALARM_RS485CFG rs485CFG = new HCNetSDK.NET_DVR_ALARM_RS485CFG();
        rs485CFG.dwSize = rs485CFG.size();
        Pointer pointer = rs485CFG.getPointer();
        IntByReference pInt1 = new IntByReference(0);
        rs485CFG.write();
        boolean bGetRs485 = hCNetSDK.NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_ALARM_RS485CFG, 3, pointer, rs485CFG.dwSize, pInt1);
        if (!bGetRs485) {
            System.out.println("获取报警主机RS485参数失败!错误号:" + hCNetSDK.NET_DVR_GetLastError());
            return;
        }
        rs485CFG.read();
        return;
    }
    public static void getRs485SlotInfo(int iUserID) {
        HCNetSDK.NET_DVR_ALARMHOST_RS485_SLOT_CFG strRs485SlotCFG = new HCNetSDK.NET_DVR_ALARMHOST_RS485_SLOT_CFG();
        strRs485SlotCFG.dwSize = strRs485SlotCFG.size();
        Pointer pRs485SlotCFG = strRs485SlotCFG.getPointer();
        IntByReference pInt1 = new IntByReference(0);
        strRs485SlotCFG.write();
        String Schannel = "0000000100000001";  //高2字节表示485通道号,低2字节表示槽位号,都从1开始
        int channel = Integer.parseInt(Schannel, 2);
        boolean bRs485Slot = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_ALARMHOST_RS485_SLOT_CFG, channel, pRs485SlotCFG, strRs485SlotCFG.dwSize, pInt1);
        if (!bRs485Slot) {
            System.out.println("获取报警主机RS485槽位参数失败!错误号:" + hCNetSDK.NET_DVR_GetLastError());
            return;
        }
        strRs485SlotCFG.read();
        return;
    }
}
src/main/java/com/whyc/hik/ChannelParamCfg.java
New file
@@ -0,0 +1,522 @@
package com.whyc.hik;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.whyc.hik.NetSDKDemo.HCNetSDK;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import static com.whyc.hik.TestDemo.hCNetSDK;
/**
 * 通道参数配置
 * @Author: jiangxin14
 * @Date: 2024-08-26  09:46
 */
public class ChannelParamCfg {
    /**
     * 获取与设置设备图像参数
     * @param iUserID
     */
    //获取设备的图像参数-移动侦测高亮显示
    public static void GetandSetPicCfg(int iUserID) {
        HCNetSDK.NET_DVR_PICCFG_V40 strPicCfg = new HCNetSDK.NET_DVR_PICCFG_V40();
        strPicCfg.dwSize = strPicCfg.size();
        Pointer pStrPicCfg = strPicCfg.getPointer();
        NativeLong lChannel = new NativeLong(1);
        IntByReference pInt = new IntByReference(0);
        boolean b_GetPicCfg = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_PICCFG_V40, lChannel.intValue(),
                pStrPicCfg, strPicCfg.size(), pInt);
        if (b_GetPicCfg == false) {
            System.out.println("获取图像参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        strPicCfg.read();
        System.out.println("通道号:" + lChannel );
        System.out.println("预览的图像是否显示OSD:" + strPicCfg.dwShowOsd);
        System.out.println("移动侦测高亮显示是否开启:"+strPicCfg.struMotion.byEnableDisplay);
        strPicCfg.read();
        //直接把获取到的参数设置回去,如果有需要可以自行修改其中需要修改的字段
        boolean b_SetPicCfg = hCNetSDK.NET_DVR_SetDVRConfig(iUserID, HCNetSDK.NET_DVR_SET_PICCFG_V40,lChannel.intValue(),
                pStrPicCfg, strPicCfg.size());
        if (b_SetPicCfg == false) {
            System.out.println("设置图像参数移动侦测高亮参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        else {
            System.out.println("设置移动侦测高亮参数成功");
        }
    }
    /**
     * 球机PTZ参数获取设置
     * @param iUserID
     */
    public static void SetPTZcfg(int iUserID) {
        HCNetSDK.NET_DVR_PTZPOS struPtTZPos = new HCNetSDK.NET_DVR_PTZPOS();
        IntByReference pUsers = new IntByReference(1);
        boolean b_GetPTZ = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_PTZPOS, 1, struPtTZPos.getPointer(), struPtTZPos.size(), pUsers);
        if (b_GetPTZ == false) {
            System.out.println("获取PTZ坐标信息失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        } else {
            struPtTZPos.read();
            int wPanPos = Integer.parseInt(Integer.toHexString(struPtTZPos.wPanPos).trim());
            float WPanPos = wPanPos * 0.1f;
            int wTiltPos = Integer.parseInt(Integer.toHexString(struPtTZPos.wTiltPos).trim());
            float WTiltPos = wTiltPos * 0.1f;
            int wZoomPos = Integer.parseInt(Integer.toHexString(struPtTZPos.wZoomPos).trim());
            float WZoomPos = wZoomPos * 0.1f;
            System.out.println("P参数:" + WPanPos + "\n");
            System.out.println("T参数:" + wTiltPos + "\n");
            System.out.println("Z参数:" + wZoomPos + "\n");
        }
//        struPtTZPos.wAction = 2;
        //本结构体中的wAction参数是设置时的操作类型,因此获取时该参数无效。实际显示的PTZ值是获取到的十六进制值的十分之一,
        // 如获取的水平参数P的值是0x1750,实际显示的P值为175度;获取到的垂直参数T的值是0x0789,实际显示的T值为78.9度,如果T未负值,获取的值减去360
        // 获取到的变倍参数Z的值是0x1100,实际显示的Z值为110倍。
//        String pHex="13669";
//        int pInter=Integer.parseInt(pHex);
//        short pInter = 13669;
//        System.out.println(pInter);
//        struPtTZPos.wPanPos = (short) pInter;
//        struPtTZPos.write();
//        boolean b_SetPTZ = hCNetSDK.NET_DVR_SetDVRConfig(iUserID, HCNetSDK.NET_DVR_SET_PTZPOS, 1, struPtTZPos.getPointer(), struPtTZPos.size());
//        if (b_GetPTZ == false) {
//            System.out.println("设置PTZ坐标信息失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
//        } else {
//
//            System.out.println("设置PTZ成功");
//        }
    }
    /**
     * 设置云台锁定信息
     * @param iUserID
     */
    public static void SetPTZLOCKCFG(int iUserID) {
        HCNetSDK.NET_DVR_PTZ_LOCKCFG struPtzLockCfg =new HCNetSDK.NET_DVR_PTZ_LOCKCFG();
        struPtzLockCfg.dwSize =struPtzLockCfg.size();
        Pointer pStrPtzLockCfg = struPtzLockCfg.getPointer();
        NativeLong lChannel = new NativeLong(1);
        IntByReference pInt = new IntByReference(0);
        boolean b_GetPtzLockCfg = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_PTZLOCKCFG, lChannel.intValue(),
                pStrPtzLockCfg, struPtzLockCfg.size(), pInt);
        if (b_GetPtzLockCfg == false) {
            System.out.println("获取云台锁定信息失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        struPtzLockCfg.read();
        System.out.println("通道号:" + lChannel );
        System.out.println("云台锁定控制状态为:" + struPtzLockCfg.byWorkMode);
        struPtzLockCfg.read();
        struPtzLockCfg.byWorkMode= 1;    //0- 解锁,1- 锁定
        struPtzLockCfg.write();
        boolean b_SetPtzLockCfg = hCNetSDK.NET_DVR_SetDVRConfig(iUserID, HCNetSDK.NET_DVR_SET_PTZLOCKCFG,lChannel.intValue(),
                pStrPtzLockCfg, struPtzLockCfg.size());
        if (b_SetPtzLockCfg== false) {
            System.out.println("设置云台锁定信息失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        else {
            System.out.println("设置云台锁定信息成功");
            System.out.println("云台锁定控制状态当前为:" + struPtzLockCfg.byWorkMode);
        }
    }
//        public static void PTZControlOther(int iUserID){
//          boolean b_ptzcontrol=hCNetSDK.NET_DVR_PTZControl_Other(iUserID,1,HCNetSDK.TILT_UP,0);
//
//          if( b_ptzcontrol==false){
//              System.out.println("云台向上转动失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
//          }else{
//              System.out.println("设置向上转动成功");
//            }
    //      }
    /**
     * 获取(设置)前端参数(扩展)
     * @param iUserID
     */
    public static void GetCameraPara(int iUserID) {
        HCNetSDK.NET_DVR_CAMERAPARAMCFG_EX struCameraParam = new HCNetSDK.NET_DVR_CAMERAPARAMCFG_EX();
        Pointer pstruCameraParam = struCameraParam.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
        boolean b_GetCameraParam = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_CCDPARAMCFG_EX, 1, pstruCameraParam, struCameraParam.size(), ibrBytesReturned);
        if (!b_GetCameraParam) {
            System.out.println("获取前端参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        struCameraParam.read();
        System.out.println("是否开启旋转:" + struCameraParam.struCorridorMode.byEnableCorridorMode);
        //直接把获取到的参数设置回去,如果有需要可以自行修改其中需要修改的字段
        boolean b_SetCameraParam = hCNetSDK.NET_DVR_SetDVRConfig(iUserID, HCNetSDK.NET_DVR_SET_CCDPARAMCFG_EX, 1, pstruCameraParam, struCameraParam.size());
        if (!b_SetCameraParam) {
            System.out.println("设置前端参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        struCameraParam.read();
        System.out.println("设置成功");
    }
    //获取和设置网络参数
    public  static  void  GetNetCfg(int iUserID) {
        HCNetSDK.NET_DVR_NETCFG_V50 struNetCfg = new HCNetSDK.NET_DVR_NETCFG_V50();
        Pointer pstruNetCfg = struNetCfg.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
        boolean b_GetNetCfg = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_NETCFG_V50, 1, pstruNetCfg, struNetCfg.size(), ibrBytesReturned);
        if (!b_GetNetCfg) {
            System.out.println("获取网络参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        struNetCfg.read();
        System.out.println("是否启用DHCP:" + struNetCfg.byUseDhcp);
        //直接把获取到的参数设置回去,如果有需要可以自行修改其中需要修改的字段
        boolean b_SetNetCfg = hCNetSDK.NET_DVR_SetDVRConfig(iUserID, HCNetSDK.NET_DVR_SET_NETCFG_V50, 1, pstruNetCfg, struNetCfg.size());
        if (!b_SetNetCfg) {
            System.out.println("设置网络参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        struNetCfg.read();
        System.out.println("设置成功");
    }
    //获取和设置录像计划
    public static void GetRecordCfg(int iUserID){
        HCNetSDK.NET_DVR_RECORD_V40 struRecordCfg = new HCNetSDK.NET_DVR_RECORD_V40();
        Pointer pstruRecordCfg = struRecordCfg.getPointer();
        //System.out.println("指针为:"+pstruRecordCfg);
        IntByReference ibrBytesReturned = new IntByReference(1);
        boolean b_GetRecordCfg = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_RECORDCFG_V40, 1, pstruRecordCfg, struRecordCfg.size(), ibrBytesReturned);
        if (!b_GetRecordCfg) {
            System.out.println("获取录像计划失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        struRecordCfg.read();
        System.out.println("码流类型:" + struRecordCfg.byStreamType);
        //直接把获取到的参数设置回去,如果有需要可以自行修改其中需要修改的字段
        boolean b_SetRecordCfg = hCNetSDK.NET_DVR_SetDVRConfig(iUserID, HCNetSDK.NET_DVR_SET_RECORDCFG_V40, 1, pstruRecordCfg, struRecordCfg.size());
        if (!b_SetRecordCfg) {
            System.out.println("设置录像计划失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        struRecordCfg.read();
        System.out.println("设置成功");
    }
    /**
     * 获取快球聚焦模式信息。
     * @param iUserID
     */
    public static void GetFocusMode(int iUserID) {
        HCNetSDK.NET_DVR_FOCUSMODE_CFG struFocusMode = new HCNetSDK.NET_DVR_FOCUSMODE_CFG();
        struFocusMode.read();
        struFocusMode.dwSize = struFocusMode.size();
        struFocusMode.write();
        Pointer pFocusMode = struFocusMode.getPointer();
        IntByReference ibrBytesReturned = new IntByReference(0);
        boolean b_GetCameraParam = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_FOCUSMODECFG, 1, pFocusMode, struFocusMode.size(), ibrBytesReturned);
        if (!b_GetCameraParam) {
            System.out.println("获取快球聚焦模式失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        struFocusMode.read();
        System.out.println("聚焦模式:" + struFocusMode.byFocusMode);
        struFocusMode.byFocusMode = 1;
        struFocusMode.byFocusDefinitionDisplay = 1;
        struFocusMode.byFocusSpeedLevel = 3;
        struFocusMode.write();
        boolean b_SetCameraParam = hCNetSDK.NET_DVR_SetDVRConfig(iUserID, HCNetSDK.NET_DVR_SET_FOCUSMODECFG, 1, pFocusMode, struFocusMode.size());
        if (!b_SetCameraParam) {
            System.out.println("设置快球聚焦模式失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        struFocusMode.read();
        System.out.println("设置成功");
    }
    /**
     * 获取IP通道
     * @param iUserID
     * @throws UnsupportedEncodingException
     */
    public static void GetIPChannelInfo(int iUserID) throws UnsupportedEncodingException {
        IntByReference ibrBytesReturned = new IntByReference(0);//获取IP接入配置参数
        HCNetSDK.NET_DVR_IPPARACFG_V40 m_strIpparaCfg = new HCNetSDK.NET_DVR_IPPARACFG_V40();
        m_strIpparaCfg.write();
        //lpIpParaConfig 接收数据的缓冲指针
        Pointer lpIpParaConfig = m_strIpparaCfg.getPointer();
        boolean bRet = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_IPPARACFG_V40, 0, lpIpParaConfig, m_strIpparaCfg.size(), ibrBytesReturned);
        m_strIpparaCfg.read();
        System.out.println("起始数字通道号:" + m_strIpparaCfg.dwStartDChan);
        for (int iChannum = 0; iChannum < m_strIpparaCfg.dwDChanNum; iChannum++) {
            int channum = iChannum + m_strIpparaCfg.dwStartDChan;
            HCNetSDK.NET_DVR_PICCFG_V40 strPicCfg = new HCNetSDK.NET_DVR_PICCFG_V40();
            strPicCfg.dwSize = strPicCfg.size();
            strPicCfg.write();
            Pointer pStrPicCfg = strPicCfg.getPointer();
            NativeLong lChannel = new NativeLong(channum);
            IntByReference pInt = new IntByReference(0);
            boolean b_GetPicCfg = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_PICCFG_V40, lChannel.intValue(),
                    pStrPicCfg, strPicCfg.size(), pInt);
//            if (b_GetPicCfg == false) {
//                System.out.println("获取图像参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
//            }
            strPicCfg.read();
            m_strIpparaCfg.struStreamMode[iChannum].read();
            if (m_strIpparaCfg.struStreamMode[iChannum].byGetStreamType == 0) {
                m_strIpparaCfg.struStreamMode[iChannum].uGetStream.setType(HCNetSDK.NET_DVR_IPCHANINFO.class);
                m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.read();
                System.out.println("--------------第"+ (iChannum+1) + "个通道------------------");
                int channel = m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byIPID   + m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byIPIDHigh * 256;
                System.out.println("channel:" +  channel);
                if(channel > 0){
                    System.out.println("ip: " + new String(m_strIpparaCfg.struIPDevInfo[channel-1].struIP.sIpV4).trim());
                }
                System.out.println("name: " + new String(strPicCfg.sChanName,"GBK").trim());
                if (m_strIpparaCfg.struStreamMode[iChannum].uGetStream.struChanInfo.byEnable == 1) {
                    System.out.println("IP通道" + channum + "在线");
                } else {
                    System.out.println("IP通道" + channum + "不在线");
                }
            }
        }
    }
    /**
     * 获取高精度PTZ绝对位置配置,一般热成像设备支持
     * @param iUserID
     */
    //
    public static void GetPTZAbsoluteEx(int iUserID) {
        HCNetSDK.NET_DVR_STD_CONFIG struSTDcfg = new HCNetSDK.NET_DVR_STD_CONFIG();
        HCNetSDK.NET_DVR_PTZABSOLUTEEX_CFG struPTZ = new HCNetSDK.NET_DVR_PTZABSOLUTEEX_CFG();
        struSTDcfg.read();
        IntByReference channel = new IntByReference(1);
        struSTDcfg.lpCondBuffer = channel.getPointer();
        struSTDcfg.dwCondSize = 4;
        struSTDcfg.lpOutBuffer = struPTZ.getPointer();
        struSTDcfg.dwOutSize = struPTZ.size();
        struSTDcfg.lpInBuffer = Pointer.NULL;
        struSTDcfg.dwInSize = 0;
        struSTDcfg.write();
        boolean bGetPTZ = hCNetSDK.NET_DVR_GetSTDConfig(iUserID, HCNetSDK.NET_DVR_GET_PTZABSOLUTEEX, struSTDcfg);
        if (bGetPTZ == false) {
            System.out.println("获取PTZ参数错误,错误码:" + hCNetSDK.NET_DVR_GetLastError());
            return;
        }
        struPTZ.read();
        System.out.println("焦距范围:" + struPTZ.dwFocalLen);
        System.out.println("聚焦参数:" + struPTZ.struPTZCtrl.dwFocus);
        return;
    }
    /**
     * 设置球机预置点
     * @param iUserID
     */
    public static void GetCruisePoint(int iUserID) {
        HCNetSDK.NET_DVR_CRUISEPOINT_COND struCruisepointCond = new HCNetSDK.NET_DVR_CRUISEPOINT_COND();
        struCruisepointCond.read();
        struCruisepointCond.dwSize = struCruisepointCond.size();
        struCruisepointCond.dwChan = 1;
        struCruisepointCond.wRouteNo = 1;
        struCruisepointCond.write();
        HCNetSDK.NET_DVR_CRUISEPOINT_V50 struCruisepointV40 = new HCNetSDK.NET_DVR_CRUISEPOINT_V50();
        struCruisepointV40.read();
        struCruisepointV40.dwSize = struCruisepointV40.size();
        struCruisepointV40.write();
        // 错误信息列表
        IntByReference pInt = new IntByReference(0);
        Pointer lpStatusList = pInt.getPointer();
        boolean flag = hCNetSDK.NET_DVR_GetDeviceConfig(iUserID, 6714, 1,
                struCruisepointCond.getPointer(), struCruisepointCond.size(), lpStatusList, struCruisepointV40.getPointer(), struCruisepointV40.size());
        if (flag == false) {
            int iErr = hCNetSDK.NET_DVR_GetLastError();
            System.out.println("NET_DVR_STDXMLConfig失败,错误号:" + iErr);
            return;
        }
        struCruisepointV40.read();
    }
    /**
     * 设备抓图保存到缓冲区
     * @param iUserID
     */
    public static void GetPictoPointer(int iUserID) {
        HCNetSDK.NET_DVR_JPEGPARA jpegpara = new HCNetSDK.NET_DVR_JPEGPARA();
        jpegpara.read();
        jpegpara.wPicSize = 255;
        jpegpara.wPicQuality = 0;
        jpegpara.write();
        HCNetSDK.BYTE_ARRAY byte_array = new HCNetSDK.BYTE_ARRAY(10 * 1024 * 1024);
        IntByReference ret = new IntByReference(0);
        boolean b = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(iUserID, 1, jpegpara, byte_array.getPointer(), byte_array.size(), ret);
        if (b == false) {
            System.out.println("抓图失败:" + hCNetSDK.NET_DVR_GetLastError());
            return;
        }
        byte_array.read();
        System.out.println("ret:"+ret.getValue());
        String filePath = ".\\pic\\test.jpg"; // 指定保存文件的路径和名称
        try {
            WriteBytesToFile(byte_array.byValue,ret.getValue(), filePath);
            System.out.println("图片已成功保存为:" + filePath);
        } catch (IOException e) {
            System.err.println("写入文件时发生错误:" + e.getMessage());
            e.printStackTrace();
        }
        System.out.println("抓图成功");
        return;
    }
    /**
     * 将字节数组写入到指定的文件路径。
     *
     * @param bytes 字节数组
     * @param filePath 文件保存路径
     * @throws IOException 如果文件写入过程中发生错误
     */
    private static void WriteBytesToFile(byte[] bytes,int len, String filePath) throws IOException {
        File file = new File(filePath);
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(bytes,0,len);
        fos.close(); // 关闭输出流
    }
    /**
     * 这里应该替换为你实际获取字节数组的方法。
     * 示例中省略具体实现,直接返回null。
     *
     * @return 图片的字节数组
     */
    private static byte[] getYourImageBytes() {
        // 这里应该是从数据库、网络或其他来源获取字节数组的逻辑
        // 返回示例:null,实际使用时需要替换为有效数据
        return null;
    }
    /**
     * 录像起止时间查询
     * @param iUserID
     */
    public static void SearchRecordTime(int iUserID) {
        HCNetSDK.NET_DVR_RECORD_TIME_SPAN_INQUIRY struRecInq = new HCNetSDK.NET_DVR_RECORD_TIME_SPAN_INQUIRY();
        struRecInq.read();
        struRecInq.dwSize = struRecInq.size();
        struRecInq.byType = 0;
        struRecInq.write();
        HCNetSDK.NET_DVR_RECORD_TIME_SPAN struRecSpan = new HCNetSDK.NET_DVR_RECORD_TIME_SPAN();
        //通道号说明:一般IPC/IPD通道号为1,32路以及以下路数的NVR的IP通道通道号从33开始,64路及以上路数的NVR的IP通道通道号从1开始。
        if (hCNetSDK.NET_DVR_InquiryRecordTimeSpan(iUserID, 35, struRecInq, struRecSpan) == false) {
            System.out.println("录像起止时间查询失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        } else {
            System.out.println("录像起止时间查询成功");
            struRecSpan.read();
            System.out.println("开启时间:" + "年:" + struRecSpan.strBeginTime.dwYear + "\n");
            System.out.println("开启时间:" + "月:" + struRecSpan.strBeginTime.dwMonth + "\n");
            System.out.println("开启时间:" + "日:" + struRecSpan.strBeginTime.dwDay + "\n");
            System.out.println("开启时间:" + "时:" + struRecSpan.strBeginTime.dwHour + "\n");
            System.out.println("停止时间:" + "年:" + struRecSpan.strEndTime.dwYear + "\n");
            System.out.println("停止时间:" + "月:" + struRecSpan.strEndTime.dwMonth + "\n");
            System.out.println("停止时间:" + "日:" + struRecSpan.strEndTime.dwDay + "\n");
            System.out.println("停止时间:" + "时:" + struRecSpan.strEndTime.dwHour + "\n");
        }
    }
    /**
     * 月历录像查询
     * @param iUserID
     */
    public static void GetRecMonth(int iUserID) {
        HCNetSDK.NET_DVR_MRD_SEARCH_PARAM struMrdSeaParam = new HCNetSDK.NET_DVR_MRD_SEARCH_PARAM();
        struMrdSeaParam.read();
        struMrdSeaParam.dwSize = struMrdSeaParam.size();
        struMrdSeaParam.wYear = 2021;
        struMrdSeaParam.byMonth = 1;
        //通道号说明:一般IPC/IPD通道号为1,32路以及以下路数的NVR的IP通道通道号从33开始,64路及以上路数的NVR的IP通道通道号从1开始。
        struMrdSeaParam.struStreamInfo.dwChannel = 33;
        struMrdSeaParam.write();
        HCNetSDK.NET_DVR_MRD_SEARCH_RESULT struMrdSeaResu = new HCNetSDK.NET_DVR_MRD_SEARCH_RESULT();
        struMrdSeaResu.read();
        struMrdSeaResu.dwSize = struMrdSeaResu.size();
        struMrdSeaResu.write();
        IntByReference list = new IntByReference(0);
        boolean b_GetResult = hCNetSDK.NET_DVR_GetDeviceConfig(iUserID, HCNetSDK.NET_DVR_GET_MONTHLY_RECORD_DISTRIBUTION, 0, struMrdSeaParam.getPointer(),
                struMrdSeaParam.size(), list.getPointer(), struMrdSeaResu.getPointer(), struMrdSeaResu.size());
        if (b_GetResult == false) {
            System.out.println("月历录像查询失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        } else {
            struMrdSeaResu.read();
            for (int i = 0; i <= 32; i++) {
                int day = i + 1;
                System.out.println("" + day + "号是否录像文件" + struMrdSeaResu.byRecordDistribution[i]);
            }
        }
    }
    /**
     * 设备抓图
     * @param iUserID
     */
    public static void CaptureJPEGPicture(int iUserID) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
//        String curTime0 = sdf.format(new Date());
        Boolean result = false;
        int count = 0;
        while (!result) {
            try {
                Thread.sleep(1 * 1000); //设置暂停的时间 5 秒
                String curTime0 = sdf.format(new Date());
                count++;
                String filename = ".\\pic\\" + curTime0 + count + ".jpg" + "\0";
                byte[] fileByte = filename.getBytes("UTF-8");
                HCNetSDK.NET_DVR_JPEGPARA strJpegParm = new HCNetSDK.NET_DVR_JPEGPARA();
                strJpegParm.read();
                strJpegParm.wPicSize = 2;
                strJpegParm.wPicQuality = 0;
                strJpegParm.write();
                boolean b_Cap = hCNetSDK.NET_DVR_CaptureJPEGPicture(iUserID, 1, strJpegParm, fileByte);
                if (b_Cap == false) {
                    System.out.println("抓图失败,错误码为:" + hCNetSDK.NET_DVR_GetLastError());
                    return;
                }
                System.out.println(sdf.format(new Date()) + "--循环执行第" + count + "次");
                if (count == 3) {
                    result = true;
                    break;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    }
}
src/main/java/com/whyc/hik/Commom/CommonUtil.java
New file
@@ -0,0 +1,67 @@
package com.whyc.hik.Commom;
import java.io.*;
public class CommonUtil {
    //SDK时间解析
    public static String parseTime(int time) {
        int year = (time >> 26) + 2000;
        int month = (time >> 22) & 15;
        int day = (time >> 17) & 31;
        int hour = (time >> 12) & 31;
        int min = (time >> 6) & 63;
        int second = (time >> 0) & 63;
        String sTime = year + "-" + month + "-" + day + "-" + hour + ":" + min + ":" + second;
//        System.out.println(sTime);
        return sTime;
    }
    //分辨率解析
    public static String parseResolution(int dwResolution) {
        int interlace = (((dwResolution) >> 28) & 0x1);
        int width = ((((dwResolution) >> 19) & 0x1ff) << 3);  //宽
        int hight = ((((dwResolution) >> 8) & 0x7ff) << 1); //高
        int fps = ((dwResolution) & 0xff);  //帧率
        String result = width + "*" + hight + "_" + fps;
        return result;
    }
    /**
     * 读取本地文件到数组中
     *
     * @param filename 本地文件
     * @return 返回读取到的数据到 byte数组
     * @throws IOException
     */
    public static byte[] toByteArray(String filename) throws IOException {
        File file = new File(filename);
        if (!file.exists()) {
            throw new FileNotFoundException(filename);
        }
        ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length());
        BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
        try {
            byte[] buffer = new byte[1024];
            int len;
            while (-1 != (len = in.read(buffer, 0, buffer.length))) {
                bos.write(buffer, 0, len);
            }
            return bos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
            throw e;
        } finally {
            bos.close();
            in.close();
        }
    }
}
src/main/java/com/whyc/hik/Commom/osSelect.java
New file
@@ -0,0 +1,12 @@
package com.whyc.hik.Commom;
public class osSelect {
    public static boolean isLinux() {
        return System.getProperty("os.name").toLowerCase().contains("linux");
    }
    public static boolean isWindows() {
        return System.getProperty("os.name").toLowerCase().contains("windows");
    }
}
src/main/java/com/whyc/hik/DevManager.java
New file
@@ -0,0 +1,315 @@
package com.whyc.hik;
import com.sun.jna.Memory;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.whyc.hik.NetSDKDemo.HCNetSDK;
import static com.whyc.hik.TestDemo.hCNetSDK;
/**
 * 设备维护管理
 * @Author: jiangxin14
 * @Date: 2024-08-12  16:56
 */
public class DevManager {
    public static fRemoteConfigCallBack fDevStatusCallBack = null;
    /**
     * 手动获取设备在线状态
     * @param iUserID
     */
    public static void getDeviceStatus(int iUserID) {
        boolean devStatus = TestDemo.hCNetSDK.NET_DVR_RemoteControl(iUserID, HCNetSDK.NET_DVR_CHECK_USER_STATUS, null, 0);
        if (devStatus == false) {
            System.out.println("设备不在线");
        } else {
            System.out.println("设备在线");
        }
    }
    /**
     * 获取设备工作状态,CPU,硬盘状态,通道状态,一般适用于硬盘录像机设备
     * @param iUserID
     */
    public static void getWorkS(int iUserID) {
        HCNetSDK.NET_DVR_GETWORKSTATE_COND strWorkStatusCond = new HCNetSDK.NET_DVR_GETWORKSTATE_COND();
        strWorkStatusCond.read();
        strWorkStatusCond.dwSize = strWorkStatusCond.size(); //设置结构体大小
        strWorkStatusCond.byFindChanByCond = 0; //0- 查找全部通道,1- 根据dwFindChanNo数组中各元素所指定的有效通道号进行查找
        strWorkStatusCond.byFindHardByCond = 0; //0- 查找全部磁盘,1- 根据dwFindHardStatus数组中各元素所指定的有效硬盘号进行查找
        strWorkStatusCond.write();
        Pointer lpInBuffer = strWorkStatusCond.getPointer();
        Pointer pUser = null;
        if (fDevStatusCallBack == null)
        {
            fDevStatusCallBack =new fRemoteConfigCallBack();
        }
        int devStatus = TestDemo.hCNetSDK.NET_DVR_StartRemoteConfig(iUserID,HCNetSDK.NET_DVR_GET_WORK_STATUS_V50,lpInBuffer,strWorkStatusCond.size(),
                fDevStatusCallBack,pUser);
        if (devStatus <= -1) {
            System.err.println("获取设备状态NET_DVR_StartRemoteConfig建立失败,错误码:" + TestDemo.hCNetSDK.NET_DVR_GetLastError());
            return;
        }
        System.out.println("获取设备工作状态成功");
        // 添加延时,这里假设延时 5 秒,可根据实际情况调整
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //调用 NET_DVR_StopRemoteConfig 停止远程配置
        boolean stopResult = hCNetSDK.NET_DVR_StopRemoteConfig(devStatus);
        if (stopResult) {
            System.out.println("成功停止远程配置");
        } else {
            System.err.println("停止远程配置失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
    }
    /**
     * 获取设备状态回调函数
     */
    static class fRemoteConfigCallBack  implements   HCNetSDK.FRemoteConfigCallBack
    {
        public void invoke(int dwType, Pointer lpBuffer, int dwBufLen, Pointer pUserData){
            switch (dwType)
            {
                case HCNetSDK.NET_SDK_CALLBACK_TYPE_STATUS:
                {
                    HCNetSDK.BYTE_ARRAY struCallbackStatus = new HCNetSDK.BYTE_ARRAY(dwBufLen);
                    struCallbackStatus.write();
                    Pointer pStatus = struCallbackStatus.getPointer();
                    pStatus.write(0, lpBuffer.getByteArray(0, struCallbackStatus.size()), 0, dwBufLen);
                    struCallbackStatus.read();
//                    System.out.println(new String(struCallbackStatus.byValue));
                    break;
                }
                case HCNetSDK.NET_SDK_CALLBACK_TYPE_PROGRESS:
                {
                    HCNetSDK.BYTE_ARRAY struPrscess = new HCNetSDK.BYTE_ARRAY(dwBufLen);
                    struPrscess.write();
                    Pointer pStatus = struPrscess.getPointer();
                    pStatus.write(0, lpBuffer.getByteArray(0, struPrscess.size()), 0, dwBufLen);
                    struPrscess.read();
                    System.out.println("进度值:"+ new String(struPrscess.byValue));
                    break;
                }
                case HCNetSDK.NET_SDK_CALLBACK_TYPE_DATA:{
                    HCNetSDK.NET_DVR_WORKSTATE_V40 strWorKStatus = new HCNetSDK.NET_DVR_WORKSTATE_V40();
                    strWorKStatus.read();
                    strWorKStatus.dwSize = strWorKStatus.size();
                    strWorKStatus.write();
                    Pointer lpOutBuffer = strWorKStatus.getPointer();
                    lpOutBuffer.write(0, lpBuffer.getByteArray(0, strWorKStatus.size()), 0, dwBufLen);
                    strWorKStatus.read();
                    System.out.println("设备状态:"+strWorKStatus.dwDeviceStatic);//0-正常;1-CPU占用率太高,超过85%;2-硬件错误,例如串口异常
                    System.out.println("第一个硬盘状态:硬盘容量:"+strWorKStatus.struHardDiskStatic[0].dwVolume+" 硬盘剩余容量:"+strWorKStatus.struHardDiskStatic[0].dwFreeSpace+
                            " 硬盘状态:"+strWorKStatus.struHardDiskStatic[0].dwHardDiskStatic);
                    System.out.println("第一路通道状态:是否录像:"+strWorKStatus.struChanStatic[0].byRecordStatic+" 信号连接状态:"+strWorKStatus.struChanStatic[0].bySignalStatic+
                            " 连接该通道的客户端个数:"+strWorKStatus.struChanStatic[0].dwLinkNum);
                    break;
                }
                default:{
                    break;
                }
            }
        }
    }
    //获取设备的基本参数
    public static void  getDeviceInfo(int iUserID) {
        HCNetSDK.NET_DVR_DEVICECFG_V40 m_strDeviceCfg = new HCNetSDK.NET_DVR_DEVICECFG_V40();
        m_strDeviceCfg.dwSize = m_strDeviceCfg.size();
        m_strDeviceCfg.write();
        Pointer pStrDeviceCfg = m_strDeviceCfg.getPointer();
        IntByReference pInt = new IntByReference(0);
        boolean b_GetCfg = TestDemo.hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_DEVICECFG_V40,
                0Xffffffff, pStrDeviceCfg, m_strDeviceCfg.dwSize, pInt);
        if (b_GetCfg == false) {
            System.out.println("获取参数失败  错误码:" + TestDemo.hCNetSDK.NET_DVR_GetLastError());
        }
        System.out.println("获取参数成功");
        m_strDeviceCfg.read();
        System.out.println("设备名称:" + new String(m_strDeviceCfg.sDVRName).trim() + "设备序列号:" + new String(m_strDeviceCfg.sSerialNumber));
        System.out.println("模拟通道个数" + m_strDeviceCfg.byChanNum);
        parseVersion(m_strDeviceCfg.dwSoftwareVersion);
        parseBuildTime(m_strDeviceCfg.dwSoftwareBuildDate);
        parseDSPBuildDate(m_strDeviceCfg.dwDSPSoftwareBuildDate);
    }
    public  static void parseBuildTime(int buildTime)
    {
        int year =( (buildTime & 0XFF << 16) >> 16)+2000;
        int month = (buildTime & 0XFF << 8) >> 8 ;
        int data = buildTime & 0xFF;
        System.out.println("Build:"+year+"."+month+"."+data);
    }
    public  static void parseDSPBuildDate(int DSPBuildDate )
    {
        int year =( (DSPBuildDate & 0XFF << 16) >> 16)+2000;
        int month = (DSPBuildDate & 0XFF << 8) >> 8 ;
        int data = DSPBuildDate & 0xFF;
        System.out.println("DSPBuildDate:"+year+"."+month+"."+data);
    }
    //设备版本解析
    public static void parseVersion(int version) {
        int firstVersion = (version & 0XFF << 24) >> 24;
        int secondVersion = (version & 0XFF << 16) >> 16 ;
        int lowVersion = version & 0XFF;
        System.out.println("firstVersion:"+ firstVersion);
        System.out.println("secondVersion:"+ secondVersion);
        System.out.println("lowVersion:"+ lowVersion);
    }
    //获取设备软硬件能力
    public  static  void  GetSofthardware_Ability(int iUserID){
        Pointer pInBuf = null;
        int dwInLength = 0;
        int dwOutLength = 1024*10;
        Memory pOutBuf = new Memory(dwOutLength);
        boolean result = hCNetSDK.NET_DVR_GetDeviceAbility(iUserID, hCNetSDK.DEVICE_SOFTHARDWARE_ABILITY, pInBuf, dwInLength, pOutBuf, dwOutLength);
        if (result) {
            // 从输出缓冲区获取 XML 数据
            String xmlData = pOutBuf.getString(0);
            System.out.println("设备软硬件能力信息(XML 格式):");
            System.out.println(xmlData);
        }else {
            System.out.println("获取设备软硬件能力失败!错误码:"+hCNetSDK.NET_DVR_GetLastError());
        }
    }
    //设备JPEG抓图能力
    public  static  void  GetJPEG_Cap_Ability(int iUserID){
        // 构建输入的 XML 数据
        String inputXml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                "<!--req, 获取JPEG抓图能力时pInBuf参数描述-->\n" +
                "<JpegCaptureAbility version=\"2.0\">\n" +
                "        <channelNO>1</channelNO><!--req,通道号-->\n" +
                "</JpegCaptureAbility>";
        // 输入缓冲区
        byte[] inputBytes = inputXml.getBytes();
        int dwInLength = inputBytes.length;
        Memory pInBuf = new Memory(dwInLength);
        pInBuf.write(0, inputBytes, 0, dwInLength);
        int dwOutLength = 1024*10;// 输出缓冲区
        Memory pOutBuf = new Memory(dwOutLength);
        boolean result = hCNetSDK.NET_DVR_GetDeviceAbility(iUserID, hCNetSDK.DEVICE_JPEG_CAP_ABILITY, pInBuf, dwInLength, pOutBuf, dwOutLength);
        if (result) {
            // 从输出缓冲区获取 XML 数据
            String xmlData = pOutBuf.getString(0);
            System.out.println("设备JPEG抓图能力(XML 格式):");
            System.out.println(xmlData);
        }else {
            System.out.println("设备JPEG抓图能力!错误码:"+hCNetSDK.NET_DVR_GetLastError());
        }
    }
    //日志查找
    public  static  void  FindLog(int iUserID){
        // 初始化查找条件
        HCNetSDK.NET_DVR_FIND_LOG_COND findCond = new HCNetSDK.NET_DVR_FIND_LOG_COND();
        findCond.dwSelectMode = 2;//按2-时间查找
        findCond.dwMainType = 0; //日志主类型,全部
        findCond.dwSubType = 0; //日志次类型,全部
        // 初始化开始时间
        HCNetSDK.NET_DVR_TIME_V50 startTime = new HCNetSDK.NET_DVR_TIME_V50();
        startTime.wYear = 2023;
        startTime.byMonth = 2;
        startTime.byDay = 1;
        startTime.byHour = 0;
        startTime.byMinute = 0;
        startTime.bySecond = 0;
        startTime.byISO8601 = 0;
        startTime.wMillisecond = 0;
        startTime.cTimeDifferenceH = 0;
        startTime.cTimeDifferenceM = 0;
        // 初始化结束时间
        HCNetSDK.NET_DVR_TIME_V50 endTime = new HCNetSDK.NET_DVR_TIME_V50();
        endTime.wYear = 2023;
        endTime.byMonth = 2;
        endTime.byDay = 7;
        endTime.byHour = 11;
        endTime.byMinute = 22;
        endTime.bySecond = 0;
        endTime.byISO8601 = 0;
        endTime.wMillisecond = 0;
        endTime.cTimeDifferenceH = 0;
        endTime.cTimeDifferenceM = 0;
        // 将开始时间和结束时间赋值给查找条件结构体
        findCond.struStartTime = startTime;
        findCond.struEndTime = endTime;
        // 开始查找日志
        int lLogHandle = hCNetSDK.NET_DVR_FindDVRLog_V50(iUserID, findCond);
        if (lLogHandle < 0) {
            System.out.println("日志查找失败,错误码:"+hCNetSDK.NET_DVR_GetLastError());
            return;
        }
        // 用于存储是否找到日志的标志
        boolean foundLog = false;
        // 日志信息结构体实例
        HCNetSDK.NET_DVR_LOG_V50 logData = new HCNetSDK.NET_DVR_LOG_V50();
        // 循环获取日志
        int result = hCNetSDK.NET_DVR_FindNextLog_V50(lLogHandle, logData);
        HCNetSDK.NET_DVR_TIME_V50 logTime = logData.struLogTime;
        HCNetSDK.NET_DVR_IPADDR remoteHostAddr = logData.struRemoteHostAddr;
        while (result>0) {
            foundLog = true;
            if(result==1000){
                System.out.println("获取日志信息成功:");
                System.out.println("日志时间: " + logTime.wYear + "-" + logTime.byMonth + "-" + logTime.byDay + " " +
                        logTime.byHour + ":" + logTime.byMinute + ":" + logTime.bySecond+ ", 主类型: " + logData.dwMajorType + ", 次类型: " + logData.dwMinorType
                        + ", 远程主机地址: " + remoteHostAddr.getIpV4String());
                result = hCNetSDK.NET_DVR_FindNextLog_V50(lLogHandle, logData);
            } else if (result==HCNetSDK.NET_DVR_FILE_NOFIND) {
                System.out.println("未查找到日志");
                break;
            } else if (result==HCNetSDK.NET_DVR_ISFINDING) {
                System.out.println("正在查找请等待");
                result = hCNetSDK.NET_DVR_FindNextLog_V50(lLogHandle, logData);
            } else if (result==HCNetSDK.NET_DVR_NOMOREFILE) {
                System.out.println("没有更多的日志,查找结束");
                break;
            } else if (result==HCNetSDK.NET_DVR_FILE_EXCEPTION) {
                System.out.println("查找日志时异常");
                break;
            }
        }
        // 根据是否找到日志输出相应信息
        if (!foundLog){
            System.out.println("查找失败");
        }
        // 释放查找日志的资源
        boolean closeResult = hCNetSDK.NET_DVR_FindLogClose_V30(lLogHandle);
        if (closeResult) {
            System.out.println("日志查找资源释放成功");
        } else {
            System.out.println("日志查找资源释放失败,错误码: "+hCNetSDK.NET_DVR_GetLastError());
        }
    }
}
src/main/java/com/whyc/hik/NetSDKDemo/HCNetSDK.java
New file
Diff too large
src/main/java/com/whyc/hik/SdkSysCfg.java
New file
@@ -0,0 +1,257 @@
package com.whyc.hik;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.whyc.hik.NetSDKDemo.HCNetSDK;
import java.io.UnsupportedEncodingException;
import static com.whyc.hik.TestDemo.hCNetSDK;
/**
 * @Author: jiangxin14
 * @Date: 2024-08-24  15:59
 */
public class SdkSysCfg {
    public static flowTestcallback flowcallback; //网络流量监测回调函数
    public static dev_work_state_cb workStateCb; //设备状态回调
    /**
     * PC电脑有多网卡,绑定网卡,指定使用的实际网卡
     */
    public static void getandBindIP() {
        HCNetSDK.BYTE_TWODIM[] struByteArray = new HCNetSDK.BYTE_TWODIM[16];
        IntByReference pInt = new IntByReference(0);
        boolean pEnableBind = false;
        if (!hCNetSDK.NET_DVR_GetLocalIP(struByteArray, pInt, pEnableBind)) {
            System.out.println("NET_DVR_GetLocalIP失败,错误号:" + hCNetSDK.NET_DVR_GetLastError());
        } else {
            int inum = pInt.getValue();
            for (int i = 0; i < inum; i++) {
                System.out.println("网卡序号:" + i + ", 网卡IP: " + new String(struByteArray[i].strIP).trim());
                //选择需要绑定的网卡
                if ("10.9.137.101".equals(new String(struByteArray[i].strIP))) {
                    hCNetSDK.NET_DVR_SetValidIP(i, true);
                }
            }
        }
    }
    /**
     * 绑定PC端访问设备的端口访问
     */
    //端口绑定
    public void bindPort() {
        HCNetSDK.NET_DVR_LOCAL_TCP_PORT_BIND_CFG strLocalTcpBind = new HCNetSDK.NET_DVR_LOCAL_TCP_PORT_BIND_CFG();
        strLocalTcpBind.read();
        strLocalTcpBind.wLocalBindTcpMinPort = 30000;
        strLocalTcpBind.wLocalBindTcpMaxPort = 30200;
        strLocalTcpBind.write();
        Pointer pStrLocalTcoBind = strLocalTcpBind.getPointer();
        if (hCNetSDK.NET_DVR_SetSDKLocalCfg(0, pStrLocalTcoBind) == false) {
            System.out.println("绑定失败,错误码为" + hCNetSDK.NET_DVR_GetLastError());
        }
        System.out.println("绑定成功");
    }
    /**
     * 获取与设置设备时间参数
     * @param iUserID
     */
    public static void GetandSetDevTime(int iUserID) {
        HCNetSDK.NET_DVR_TIME m_Time = new HCNetSDK.NET_DVR_TIME();
        Pointer pTime = m_Time.getPointer();
        IntByReference pInt = new IntByReference(0);
        boolean b_GetTime = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_TIMECFG, 0xffffffff, pTime, m_Time.size(), pInt);
        if (b_GetTime == false) {
            System.out.println("获取时间参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        m_Time.read();
        System.out.println("年:" + m_Time.dwYear + "月:" + m_Time.dwMonth + "日:" + m_Time.dwDay + "时:" + m_Time.dwHour +
                "分:" + m_Time.dwMinute + "秒:" + m_Time.dwSecond);
        //直接把获取到的参数设置回去,如果有需要可以自行修改其中需要修改的字段
        boolean b_SetPicCfg = hCNetSDK.NET_DVR_SetDVRConfig(iUserID, HCNetSDK.NET_DVR_SET_TIMECFG,0xffffffff,
                m_Time.getPointer(), m_Time.size());
        if (b_SetPicCfg == false) {
            System.out.println("设置时间失败,错误码:" +  hCNetSDK.NET_DVR_GetLastError());
        }
        else {
            System.out.println("设置时间参数成功");
        }
    }
    /**
     * 获取用户参数
     * @param iUserID
     * @throws UnsupportedEncodingException
     */
    public static void getUsrCfg(int iUserID) throws UnsupportedEncodingException {
        HCNetSDK.NET_DVR_USER_V30  usercfg= new HCNetSDK.NET_DVR_USER_V30();
        usercfg.dwSize = usercfg.size();
        Pointer pUserCfg = usercfg.getPointer();
        NativeLong lChannel = new NativeLong(1);
        IntByReference pInt = new IntByReference(0);
        boolean b_GetUserCfg = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_USERCFG_V30, lChannel.intValue(),
                pUserCfg, usercfg.size(), pInt);
        if (b_GetUserCfg == false) {
            System.out.println("获取用户参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        usercfg.read();
        //System.out.println("用户名称:" + usercfg.struUser[1].sUserName);
        System.out.println("name: " + new String(usercfg.struUser[0].sUserName,"GBK").trim());
        System.out.println("password: " + new String(usercfg.struUser[0].sPassword,"GBK").trim());
    }
    static class flowTestcallback implements HCNetSDK.FLOWTESTCALLBACK {
        public void invoke(int lFlowHandle, HCNetSDK.NET_DVR_FLOW_INFO pFlowInfo,
                           Pointer pUser) {
            pFlowInfo.read();
            System.out.println("发送的流量数据:" + pFlowInfo.dwSendFlowSize);
            System.out.println("接收的流量数据:" + pFlowInfo.dwRecvFlowSize);
        }
    }
    /**
     * 设备网络流量监测
     * @param iUserID
     * @throws InterruptedException
     */
    public void netFlowDec(int iUserID) throws InterruptedException {
        HCNetSDK.NET_DVR_FLOW_TEST_PARAM struFlowPam = new HCNetSDK.NET_DVR_FLOW_TEST_PARAM();
        struFlowPam.read();
        struFlowPam.dwSize = struFlowPam.size();
        struFlowPam.lCardIndex = 0;
        struFlowPam.dwInterval = 1;
        struFlowPam.write();
        Pointer pUser = null;
        if (flowcallback == null) {
            flowcallback = new flowTestcallback();
        }
        int FlowHandle = hCNetSDK.NET_DVR_StartNetworkFlowTest(iUserID, struFlowPam, flowcallback, pUser);
        if (FlowHandle <= -1) {
            System.out.println("开启流量检测失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        } else {
            System.out.println("开启流量检测成功");
        }
        Thread.sleep(20000);
        hCNetSDK.NET_DVR_StopNetworkFlowTest(FlowHandle);
    }
    /**
     * 球机GIS信息获取,需要特定设置支持
     * @param iUserID
     */
    public static void GetGisInfo(int iUserID) {
        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();
        IntByReference lchannel = new IntByReference(1);
        struStdCfg.lpCondBuffer = lchannel.getPointer();
        struStdCfg.dwCondSize = 4;
        struStdCfg.lpOutBuffer = struGisInfo.getPointer();
        struStdCfg.dwOutSize = struGisInfo.size();
        struStdCfg.write();//设置前之前要write()
        boolean getSTDConfig = hCNetSDK.NET_DVR_GetSTDConfig(iUserID, HCNetSDK.NET_DVR_GET_GISINFO, struStdCfg);
        if (getSTDConfig == false) {
            System.out.println("查询GIS信息失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        } else {
            struGisInfo.read();
            System.out.println("查询成功\n");
            System.out.println(struGisInfo.struPtzPos.fPanPos + "\n");
            System.out.println(struGisInfo.struPtzPos.fTiltPos + "\n");
            System.out.println(struGisInfo.struPtzPos.fZoomPos + "\n");
            System.out.println(struGisInfo.fHorizontalValue);
            System.out.println(struGisInfo.fVerticalValue);
        }
    }
    static class dev_work_state_cb implements HCNetSDK.DEV_WORK_STATE_CB {
        public boolean invoke(Pointer pUserdata, int iUserID, HCNetSDK.NET_DVR_WORKSTATE_V40 lpWorkState) {
            lpWorkState.read();
            System.out.println("设备状态:" + lpWorkState.dwDeviceStatic);
            for (int i = 0; i < HCNetSDK.MAX_CHANNUM_V40; i++) {
                int channel = i + 1;
                System.out.println("第" + channel + "通道是否在录像:" + lpWorkState.struChanStatic[i].byRecordStatic);
            }
            return true;
        }
    }
    //定时巡检设备
    public static void regularInspection() {
        HCNetSDK.NET_DVR_CHECK_DEV_STATE struCheckStatus = new HCNetSDK.NET_DVR_CHECK_DEV_STATE();
        struCheckStatus.read();
        struCheckStatus.dwTimeout = 1000; //定时检测设备工作状态,单位:ms,0表示使用默认值(30000),最小值为1000
        if (workStateCb == null) {
            workStateCb = new dev_work_state_cb();
        }
        struCheckStatus.fnStateCB = workStateCb;
        struCheckStatus.write();
        boolean b_state = hCNetSDK.NET_DVR_StartGetDevState(struCheckStatus);
        if (!b_state) {
            System.out.println("定时巡检设备状态失败:" + hCNetSDK.NET_DVR_GetLastError());
        }
    }
    //获取GB28181参数
    public static void getGB28181Info(int iUserID) {
        HCNetSDK.NET_DVR_STREAM_INFO streamInfo = new HCNetSDK.NET_DVR_STREAM_INFO();
        streamInfo.read();
        streamInfo.dwSize = streamInfo.size(); //设置结构体大小
        streamInfo.dwChannel = 1; //设置通道
        streamInfo.write();
        Pointer lpInBuffer = streamInfo.getPointer();
        HCNetSDK.NET_DVR_GBT28181_CHANINFO_CFG gbt28181ChaninfoCfg = new HCNetSDK.NET_DVR_GBT28181_CHANINFO_CFG();
        gbt28181ChaninfoCfg.read();
        gbt28181ChaninfoCfg.dwSize = gbt28181ChaninfoCfg.size();
        gbt28181ChaninfoCfg.write();
        Pointer lpOutBuffer = gbt28181ChaninfoCfg.getPointer();
        IntByReference lpBytesReturned = new IntByReference(0);
        //3251对应它的宏定义
        boolean bRet = hCNetSDK.NET_DVR_GetDeviceConfig(iUserID, 3251, 1, lpInBuffer,
                streamInfo.size(), lpBytesReturned.getPointer(), lpOutBuffer, gbt28181ChaninfoCfg.size());
        gbt28181ChaninfoCfg.read();
        if (bRet == false) {
            System.out.println("获取失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
            return;
        }
    }
    /**
     * 获取码流加密信息
     * @param iUserID
     */
    public static void GetAesKeyInfo(int iUserID) {
        HCNetSDK.NET_DVR_AES_KEY_INFO net_dvr_aes_key_info = new HCNetSDK.NET_DVR_AES_KEY_INFO();
        net_dvr_aes_key_info.read();
        Pointer pnet_dvr_aes_key_info = net_dvr_aes_key_info.getPointer();
        IntByReference pInt = new IntByReference(0);
        boolean b_GetCfg = hCNetSDK.NET_DVR_GetDVRConfig(iUserID, HCNetSDK.NET_DVR_GET_AES_KEY,
                0Xffffffff, pnet_dvr_aes_key_info, net_dvr_aes_key_info.size(), pInt);
        if (b_GetCfg == false) {
            System.out.println("获取码流加密失败  错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        System.out.println("获取码流加密信息成功");
    }
}
src/main/java/com/whyc/hik/TestDemo.java
New file
@@ -0,0 +1,455 @@
package com.whyc.hik;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.whyc.dto.Point;
import com.whyc.dto.TempPoint;
import com.whyc.hik.Commom.osSelect;
import com.whyc.hik.NetSDKDemo.HCNetSDK;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
 * @create 2020-07-27-10:42
 */
public class TestDemo {
    static HCNetSDK hCNetSDK = null;
    static int lUserID = -1; //用户句柄
    public static FExceptionCallBack_Imp fExceptionCallBack;
    static class FExceptionCallBack_Imp implements HCNetSDK.FExceptionCallBack {
        public void invoke(int dwType, int lUserID, int lHandle, Pointer pUser) {
            System.out.println("异常事件类型:" + dwType);
            return;
        }
    }
    /**
     * 动态库加载
     *
     * @return
     */
    private static boolean createSDKInstance() {
        if (hCNetSDK == null) {
            synchronized (HCNetSDK.class) {
                String strDllPath = "";
                try {
                    if (osSelect.isWindows()) {
                        //win系统加载SDK库路径
                        strDllPath = System.getProperty("user.dir") + "\\src\\main\\resources\\lib\\Hik\\HCNetSDK.dll";
                    }
                    else if (osSelect.isLinux()) {
                        //Linux系统加载SDK库路径
                        strDllPath = System.getProperty("user.dir") + "/lib/libhcnetsdk.so";
                    }
                    hCNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class);
                } catch (Exception ex) {
                    System.out.println("loadLibrary: " + strDllPath + " Error: " + ex.getMessage());
                    return false;
                }
            }
        }
        return true;
    }
    public static void main(String[] args) throws IOException, InterruptedException {
        if (hCNetSDK == null) {
            if (!createSDKInstance()) {
                System.out.println("Load SDK fail");
                return;
            }
        }
        //linux系统建议调用以下接口加载组件库
        if (osSelect.isLinux()) {
            HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256);
            HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256);
            //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限
            String strPath1 = System.getProperty("user.dir") + "/lib/libcrypto.so.1.1";
            String strPath2 = System.getProperty("user.dir") + "/lib/libssl.so.1.1";
            System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length());
            ptrByteArray1.write();
            hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_LIBEAY_PATH, ptrByteArray1.getPointer());
            System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length());
            ptrByteArray2.write();
            hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_SSLEAY_PATH, ptrByteArray2.getPointer());
            String strPathCom = System.getProperty("user.dir") + "/lib/";
            HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
            System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
            struComPath.write();
            hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_SDK_PATH, struComPath.getPointer());
        }
        //SDK初始化,一个程序进程只需要调用一次
        hCNetSDK.NET_DVR_Init();
        if (fExceptionCallBack == null) {
            fExceptionCallBack = new FExceptionCallBack_Imp();
        }
        Pointer pUser = null;
        if (!hCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, 0, fExceptionCallBack, pUser)) {
            return;
        }
        System.out.println("设置异常消息回调成功");
        //启用SDK写日志
        hCNetSDK.NET_DVR_SetLogToFile(3, "./sdkLog", false);
        //登录设备,每一台设备只需要登录一次
        //lUserID = TestDemo.loginDevice("10.9.137.21", (short) 8000, "admin", "Cpfwb518+");
        lUserID = TestDemo.loginDevice("192.168.10.16", (short) 8000, "admin", "fg001@hdw");
        //hCNetSDK.NET_DVR_STDXMLConfig(lUserID, "<?xml version=\"1.0\" encoding=\"GB2312\"?><GetDeviceInfo><dwSize>0</dwSize></GetDeviceInfo>", "GetDeviceInfo", 1000);
        /*========== 红外 抓图测温 Start==========*/
        //抓热图
        HCNetSDK.NET_DVR_JPEGPICTURE_WITH_APPENDDATA m_strJpegWithAppendData = new HCNetSDK.NET_DVR_JPEGPICTURE_WITH_APPENDDATA();
        m_strJpegWithAppendData.dwSize = m_strJpegWithAppendData.size();
        HCNetSDK.BYTE_ARRAY ptrJpegByte = new HCNetSDK.BYTE_ARRAY(2*1024*1024);
        HCNetSDK.BYTE_ARRAY ptrP2PDataByte  = new HCNetSDK.BYTE_ARRAY(2*1024*1024);
        m_strJpegWithAppendData.pJpegPicBuff = ptrJpegByte.getPointer();
        m_strJpegWithAppendData.pP2PDataBuff = ptrP2PDataByte.getPointer();
        m_strJpegWithAppendData.dwJpegPicLen = 2*1024*1024;
        m_strJpegWithAppendData.dwP2PDataLen = 2*1024*1024;
        m_strJpegWithAppendData.write();
        boolean resBoolean = hCNetSDK.NET_DVR_CaptureJPEGPicture_WithAppendData(lUserID, 2, m_strJpegWithAppendData);
        if (resBoolean) {
            System.out.println("抓图成功");
            //m_strJpegWithAppendData.read();
            // 定义文件名
            String cFilename = "Jpegwithappend_1.data";
            String cFilename2 = "Jpegwithappend_1.csv";
            // 创建文件输出流
            try (FileOutputStream fos = new FileOutputStream(cFilename)) {
                // 将数据写入文件
                //fos.write(m_strJpegWithAppendData.pP2PDataBuff, 0, m_strJpegWithAppendData.dwP2PDataLen);
                Pointer pP2PDataBuff = m_strJpegWithAppendData.pP2PDataBuff;
                fos.write(pP2PDataBuff.getByteArray(0, m_strJpegWithAppendData.dwP2PDataLen), 0, m_strJpegWithAppendData.dwP2PDataLen);
            } catch (IOException e) {
                e.printStackTrace(); // 捕获并处理异常
            }
            analyzeData(m_strJpegWithAppendData.dwP2PDataLen, cFilename, cFilename2);
            //获取红外结果并解析
        }else {
            System.out.printf("抓热图失败:%s",hCNetSDK.NET_DVR_GetLastError());
        }
        /*========== 红外 抓图测温 End==========*/
        hCNetSDK.NET_DVR_CaptureJPEGPicture_WithAppendData(lUserID,1,null);
        for (boolean exit = false; !exit; ) {
            System.out.println("请输入您想要执行的demo实例! (退出请输入yes)");
            Scanner input = new Scanner(System.in);
            String str = input.next();
            // 转换为标准输入
            str = str.toLowerCase();
            if (str.equals("yes")) {
                // 退出程序
                exit = true;
                break;
            }
            switch (str) {
                case "1":
                {
                    System.out.println("\n[Module]手动获取设备在线状态");
                    DevManager.getDeviceStatus(lUserID);
                    break;
                }
                case "2":
                {
                    System.out.println("\n[Module]获取设备工作状态代码");
                    DevManager.getWorkS(lUserID);
                    break;
                }
                case "3":
                {
                    System.out.println("\n[Module]获取设备基本信息");
                    DevManager.getDeviceInfo(lUserID);
                    break;
                }
                case "4":
                {
                    System.out.println("\n[Module]设备抓图代码");
                    ChannelParamCfg.CaptureJPEGPicture(lUserID);
                    break;
                }
                case "5":
                {
                    //适用NVR等硬盘录像机设备
                    System.out.println("\n[Module]查询设备通道状态代码");
                    ChannelParamCfg.GetIPChannelInfo(lUserID);
                    break;
                }
                case "6":
                {
                    //获取和设置前端扩展参数
                    System.out.println("\n[Module]获取和设置前端扩展参数");
                    ChannelParamCfg.GetCameraPara(lUserID);
                    break;
                }
                case "7":
                {
                    //获取和设置网络参数
                    System.out.println("\n[Module]获取和设置网络参数");
                    ChannelParamCfg.GetNetCfg(lUserID);
                    break;
                }
                case "8":
                {
                    //获取和设置录像参数
                    System.out.println("\n[Module]获取和设置录像参数");
                    ChannelParamCfg.GetRecordCfg(lUserID);
                    break;
                }
                case "9":
                {
                    //获取和设置图像参数
                    System.out.println("\n[Module]获取和设置图像参数");
                    ChannelParamCfg.GetandSetPicCfg(lUserID);
                    break;
                }
                case "10":
                {
                    //获取和设置时间参数
                    System.out.println("\n[Module]获取和设置时间参数");
                    SdkSysCfg.GetandSetDevTime(lUserID);
                    break;
                }
                case "11":
                {
                    //获取设备软硬件能力信息
                    System.out.println("\n[Module]获取设备软硬件能力");
                    DevManager.GetSofthardware_Ability(lUserID);
                    break;
                }
                case "12":
                {
                    //获取设备JPEG抓图能力
                    System.out.println("\n[Module]获取设备JPEG抓图能力");
                    DevManager.GetJPEG_Cap_Ability(lUserID);
                    break;
                }
                case "13":
                {
                    //日志查找
                    System.out.println("\n[Module]日志查找");
                    DevManager.FindLog(lUserID);
                    break;
                }
                default:
                {
                    System.out.println("\n未知的指令操作!请重新输入!\n");
                }
            }
        }
        Thread.sleep(2000);
        //程序退出的时候调用注销登录接口,每一台设备分别调用一次
        if (hCNetSDK.NET_DVR_Logout(lUserID)) {
            System.out.println("注销成功");
        }
        //释放SDK资源,程序退出时调用,只需要调用一次
        hCNetSDK.NET_DVR_Cleanup();
        return;
    }
    public static void analyzeData(int dwP2PDataLen, String cFilename, String cFilename2) throws IOException {
        // 打开本地保存的文件
        String inputFilename = cFilename;
        String outputFilename = cFilename2;
        int m_AnalysisHotPic_W = 384; // 根据抓热图接口返回的图像宽dwJpegPicWidth进行赋值
        int m_AnalysisHotPic_H = 288; // 根据抓热图接口返回的图像高dwJpegPicHeight进行赋值
        int bufSize = m_AnalysisHotPic_H * m_AnalysisHotPic_W * 4;
        try (RandomAccessFile datafilefp = new RandomAccessFile(inputFilename, "r");
             FileOutputStream fp = new FileOutputStream(outputFilename)) {
            // 读取文件里面所有数据
            byte[] pDataBuf = new byte[bufSize];
            int bytesRead = datafilefp.read(pDataBuf);
            if (bytesRead != bufSize) {
                System.out.println("Failed to read the entire file");
                return;
            }
            float minTemp = 10000.0f;
            float maxTemp = -10000.0f;
            //存储极值温度的坐标,如果是相同的极值温度,就也同步添加坐标点
            TempPoint minTempPoint = new TempPoint();
            TempPoint maxTempPoint = new TempPoint();
            ByteBuffer buffer = ByteBuffer.wrap(pDataBuf);
            buffer.order(ByteOrder.LITTLE_ENDIAN); // 根据实际情况调整字节序
            for (int iWriteHeight = 0; iWriteHeight < m_AnalysisHotPic_H; ++iWriteHeight) {
                for (int iWriteWidth = 0; iWriteWidth < m_AnalysisHotPic_W; ++iWriteWidth) {
                    float fTemp = buffer.getFloat();
                    // 判断fTemp是否是一个正常值,不是则赋值最大或最小,防止设备崩溃
                    fTemp = (9999 < fTemp) ? 9999 : ((-9999 > fTemp) ? -9999 : fTemp);
                    //只保留以为小数
                    fTemp = BigDecimal.valueOf(fTemp).setScale(1, BigDecimal.ROUND_HALF_UP).floatValue();
                    //minTemp = (minTemp > fTemp) ? fTemp : minTemp;
                    if(minTemp >= fTemp){
                        minTemp = fTemp;
                        //查看存的最低温度是不是当前温度,不是的话,要清空最低温度map,
                        //同时把最新的最低温度和坐标保存
                        Float minTempOld = minTempPoint.getTemp();
                        if(minTempOld == null || minTempOld!=minTemp){ //首次赋值 或者 需要重置最低温度
                            minTempPoint.setTemp(minTemp);
                            List<Point> points = new ArrayList<>();
                            Point point = new Point(iWriteWidth,iWriteHeight);
                            points.add(point);
                            minTempPoint.setPoints(points);
                        }else { //存在最低温度相同的另外一个点,保存下来进入最低温度列表
                            List<Point> points = minTempPoint.getPoints();
                            points.add(new Point(iWriteWidth,iWriteHeight));
                        }
                    }
                    //maxTemp = (maxTemp < fTemp) ? fTemp : maxTemp;
                    if(maxTemp <= fTemp){
                        maxTemp = fTemp;
                        //查看存的最高温度是不是当前温度,不是的话,要清空最高温度map,
                        //同时把最新的最高温度和坐标保存
                        Float maxTempOld = maxTempPoint.getTemp();
                        if(maxTempOld == null || maxTempOld!=maxTemp){ //首次赋值 或者 需要重置最高温度
                            maxTempPoint.setTemp(maxTemp);
                            List<Point> points = new ArrayList<>();
                            Point point = new Point(iWriteWidth,iWriteHeight);
                            points.add(point);
                            maxTempPoint.setPoints(points);
                        }else { //存在最高温度相同的另外一个点,保存下来进入最高温度列表
                            List<Point> points = maxTempPoint.getPoints();
                            points.add(new Point(iWriteWidth,iWriteHeight));
                        }
                    }
                    String temp = String.format("%.2f,", fTemp);
                    fp.write(temp.getBytes());
                }
                fp.write("\n".getBytes());
            }
            System.out.println("Min Temperature: " + minTempPoint);
            System.out.println("Max Temperature: " + maxTempPoint);
        } catch (IOException e) {
            e.printStackTrace(); // 捕获并处理异常
        }
    }
    /**
     * 设备登录V30
     *
     * @param ip   设备IP
     * @param port SDK端口,默认设备的8000端口
     * @param user 设备用户名
     * @param psw  设备密码
     */
    public static int login_V30(String ip, short port, String user, String psw) {
        HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
        int iUserID = hCNetSDK.NET_DVR_Login_V30(ip, port, user, psw, m_strDeviceInfo);
        System.out.println("UserID:" + lUserID);
        if ((iUserID == -1) || (iUserID == 0xFFFFFFFF)) {
            System.out.println("登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError());
            return iUserID;
        } else {
            System.out.println(ip + ":设备登录成功!");
            return iUserID;
        }
    }
    /**
     * 登录设备,支持 V40 和 V30 版本,功能一致。
     *
     * @param ip      设备IP地址
     * @param port    SDK端口,默认为设备的8000端口
     * @param user    设备用户名
     * @param psw     设备密码
     * @return 登录成功返回用户ID,失败返回-1
     */
    public static int loginDevice(String ip, short port, String user, String psw) {
        // 创建设备登录信息和设备信息对象
        HCNetSDK.NET_DVR_USER_LOGIN_INFO loginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();
        HCNetSDK.NET_DVR_DEVICEINFO_V40 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();
        // 设置设备IP地址
        byte[] deviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
        byte[] ipBytes = ip.getBytes();
        System.arraycopy(ipBytes, 0, deviceAddress, 0, Math.min(ipBytes.length, deviceAddress.length));
        loginInfo.sDeviceAddress = deviceAddress;
        // 设置用户名和密码
        byte[] userName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
        byte[] password = psw.getBytes();
        System.arraycopy(user.getBytes(), 0, userName, 0, Math.min(user.length(), userName.length));
        System.arraycopy(password, 0, loginInfo.sPassword, 0, Math.min(password.length, loginInfo.sPassword.length));
        loginInfo.sUserName = userName;
        // 设置端口和登录模式
        loginInfo.wPort = port;
        loginInfo.bUseAsynLogin = false; // 同步登录
        loginInfo.byLoginMode = 0; // 使用SDK私有协议
        // 执行登录操作
        int userID = hCNetSDK.NET_DVR_Login_V40(loginInfo, deviceInfo);
        if (userID == -1) {
            System.err.println("登录失败,错误码为: " + hCNetSDK.NET_DVR_GetLastError());
        } else {
            System.out.println(ip + " 设备登录成功!");
            // 处理通道号逻辑
            int startDChan = deviceInfo.struDeviceV30.byStartDChan;
            System.out.println("预览起始通道号: " + startDChan);
        }
        return userID; // 返回登录结果
    }
}
src/main/java/com/whyc/service/HikTempService.java
New file
@@ -0,0 +1,452 @@
package com.whyc.service;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.whyc.dto.Point;
import com.whyc.dto.Response;
import com.whyc.dto.TempPoint;
import com.whyc.hik.ChannelParamCfg;
import com.whyc.hik.Commom.osSelect;
import com.whyc.hik.DevManager;
import com.whyc.hik.NetSDKDemo.HCNetSDK;
import com.whyc.hik.SdkSysCfg;
import org.springframework.stereotype.Service;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.math.BigDecimal;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.*;
@Service
public class HikTempService {
    static HCNetSDK hCNetSDK = null;
    static int lUserID = -1; //用户句柄
    public static FExceptionCallBack_Imp fExceptionCallBack;
    public Response getTempPoint(String ip) throws IOException, InterruptedException {
        if (hCNetSDK == null) {
            if (!createSDKInstance()) {
                System.out.println("Load SDK fail");
                return new Response().set(1,false,"Load SDK fail");
            }
        }
        //linux系统建议调用以下接口加载组件库
        if (osSelect.isLinux()) {
            HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256);
            HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256);
            //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限
            String strPath1 = System.getProperty("user.dir") + "/lib/libcrypto.so.1.1";
            String strPath2 = System.getProperty("user.dir") + "/lib/libssl.so.1.1";
            System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length());
            ptrByteArray1.write();
            hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_LIBEAY_PATH, ptrByteArray1.getPointer());
            System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length());
            ptrByteArray2.write();
            hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_SSLEAY_PATH, ptrByteArray2.getPointer());
            String strPathCom = System.getProperty("user.dir") + "/lib/";
            HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
            System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
            struComPath.write();
            hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_SDK_PATH, struComPath.getPointer());
        }
        //SDK初始化,一个程序进程只需要调用一次
        hCNetSDK.NET_DVR_Init();
        if (fExceptionCallBack == null) {
            fExceptionCallBack = new FExceptionCallBack_Imp();
        }
        Pointer pUser = null;
        if (!hCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, 0, fExceptionCallBack, pUser)) {
            return new Response().set(1,false,"设置异常消息回调失败");
        }
        System.out.println("设置异常消息回调成功");
        //启用SDK写日志
        hCNetSDK.NET_DVR_SetLogToFile(3, "./sdkLog", false);
        //登录设备,每一台设备只需要登录一次
        //lUserID = TestDemo.loginDevice("10.9.137.21", (short) 8000, "admin", "Cpfwb518+");
        lUserID = HikTempService.loginDevice("192.168.10.16", (short) 8000, "admin", "fg001@hdw");
        //hCNetSDK.NET_DVR_STDXMLConfig(lUserID, "<?xml version=\"1.0\" encoding=\"GB2312\"?><GetDeviceInfo><dwSize>0</dwSize></GetDeviceInfo>", "GetDeviceInfo", 1000);
        /*========== 红外 抓图测温 Start==========*/
        //抓热图
        HCNetSDK.NET_DVR_JPEGPICTURE_WITH_APPENDDATA m_strJpegWithAppendData = new HCNetSDK.NET_DVR_JPEGPICTURE_WITH_APPENDDATA();
        m_strJpegWithAppendData.dwSize = m_strJpegWithAppendData.size();
        HCNetSDK.BYTE_ARRAY ptrJpegByte = new HCNetSDK.BYTE_ARRAY(2*1024*1024);
        HCNetSDK.BYTE_ARRAY ptrP2PDataByte  = new HCNetSDK.BYTE_ARRAY(2*1024*1024);
        m_strJpegWithAppendData.pJpegPicBuff = ptrJpegByte.getPointer();
        m_strJpegWithAppendData.pP2PDataBuff = ptrP2PDataByte.getPointer();
        m_strJpegWithAppendData.dwJpegPicLen = 2*1024*1024;
        m_strJpegWithAppendData.dwP2PDataLen = 2*1024*1024;
        m_strJpegWithAppendData.write();
        Map<String, TempPoint> tempPointMap;
        boolean resBoolean = hCNetSDK.NET_DVR_CaptureJPEGPicture_WithAppendData(lUserID, 2, m_strJpegWithAppendData);
        if (resBoolean) {
            System.out.println("抓图成功");
            //m_strJpegWithAppendData.read();
            // 定义文件名
            String cFilename = "Jpegwithappend_"+ip+".data";
            String cFilename2 = "Jpegwithappend_"+ip+".csv";
            // 创建文件输出流
            FileOutputStream fos = new FileOutputStream(cFilename);
            // 将数据写入文件
            //fos.write(m_strJpegWithAppendData.pP2PDataBuff, 0, m_strJpegWithAppendData.dwP2PDataLen);
            Pointer pP2PDataBuff = m_strJpegWithAppendData.pP2PDataBuff;
            fos.write(pP2PDataBuff.getByteArray(0, m_strJpegWithAppendData.dwP2PDataLen), 0, m_strJpegWithAppendData.dwP2PDataLen);
            //获取红外结果并解析
            tempPointMap = analyzeData(m_strJpegWithAppendData.dwP2PDataLen, cFilename, cFilename2);
        }else {
            System.out.printf("抓热图失败:%s",hCNetSDK.NET_DVR_GetLastError());
            return new Response().set(1,false,String.format("抓热图失败:%s",hCNetSDK.NET_DVR_GetLastError()));
        }
        /*========== 红外 抓图测温 End==========*/
        /*for (boolean exit = false; !exit; ) {
            System.out.println("请输入您想要执行的demo实例! (退出请输入yes)");
            Scanner input = new Scanner(System.in);
            String str = input.next();
            // 转换为标准输入
            str = str.toLowerCase();
            if (str.equals("yes")) {
                // 退出程序
                exit = true;
                break;
            }
            switch (str) {
                case "1":
                {
                    System.out.println("\n[Module]手动获取设备在线状态");
                    DevManager.getDeviceStatus(lUserID);
                    break;
                }
                case "2":
                {
                    System.out.println("\n[Module]获取设备工作状态代码");
                    DevManager.getWorkS(lUserID);
                    break;
                }
                case "3":
                {
                    System.out.println("\n[Module]获取设备基本信息");
                    DevManager.getDeviceInfo(lUserID);
                    break;
                }
                case "4":
                {
                    System.out.println("\n[Module]设备抓图代码");
                    ChannelParamCfg.CaptureJPEGPicture(lUserID);
                    break;
                }
                case "5":
                {
                    //适用NVR等硬盘录像机设备
                    System.out.println("\n[Module]查询设备通道状态代码");
                    ChannelParamCfg.GetIPChannelInfo(lUserID);
                    break;
                }
                case "6":
                {
                    //获取和设置前端扩展参数
                    System.out.println("\n[Module]获取和设置前端扩展参数");
                    ChannelParamCfg.GetCameraPara(lUserID);
                    break;
                }
                case "7":
                {
                    //获取和设置网络参数
                    System.out.println("\n[Module]获取和设置网络参数");
                    ChannelParamCfg.GetNetCfg(lUserID);
                    break;
                }
                case "8":
                {
                    //获取和设置录像参数
                    System.out.println("\n[Module]获取和设置录像参数");
                    ChannelParamCfg.GetRecordCfg(lUserID);
                    break;
                }
                case "9":
                {
                    //获取和设置图像参数
                    System.out.println("\n[Module]获取和设置图像参数");
                    ChannelParamCfg.GetandSetPicCfg(lUserID);
                    break;
                }
                case "10":
                {
                    //获取和设置时间参数
                    System.out.println("\n[Module]获取和设置时间参数");
                    SdkSysCfg.GetandSetDevTime(lUserID);
                    break;
                }
                case "11":
                {
                    //获取设备软硬件能力信息
                    System.out.println("\n[Module]获取设备软硬件能力");
                    DevManager.GetSofthardware_Ability(lUserID);
                    break;
                }
                case "12":
                {
                    //获取设备JPEG抓图能力
                    System.out.println("\n[Module]获取设备JPEG抓图能力");
                    DevManager.GetJPEG_Cap_Ability(lUserID);
                    break;
                }
                case "13":
                {
                    //日志查找
                    System.out.println("\n[Module]日志查找");
                    DevManager.FindLog(lUserID);
                    break;
                }
                default:
                {
                    System.out.println("\n未知的指令操作!请重新输入!\n");
                }
            }
        }*/
        //程序退出的时候调用注销登录接口,每一台设备分别调用一次
        if (hCNetSDK.NET_DVR_Logout(lUserID)) {
            System.out.println("注销成功");
        }
        //释放SDK资源,程序退出时调用,只需要调用一次
        hCNetSDK.NET_DVR_Cleanup();
        return new Response().setII(1,true,tempPointMap,null);
    }
    static class FExceptionCallBack_Imp implements HCNetSDK.FExceptionCallBack {
        public void invoke(int dwType, int lUserID, int lHandle, Pointer pUser) {
            System.out.println("异常事件类型:" + dwType);
            return;
        }
    }
    /**
     * 动态库加载
     *
     * @return
     */
    private static boolean createSDKInstance() {
        if (hCNetSDK == null) {
            synchronized (HCNetSDK.class) {
                String strDllPath = "";
                try {
                    if (osSelect.isWindows()) {
                        //win系统加载SDK库路径
                        strDllPath = System.getProperty("user.dir") + "\\src\\main\\resources\\lib\\Hik\\HCNetSDK.dll";
                    }
                    else if (osSelect.isLinux()) {
                        //Linux系统加载SDK库路径
                        strDllPath = System.getProperty("user.dir") + "/lib/libhcnetsdk.so";
                    }
                    hCNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class);
                } catch (Exception ex) {
                    System.out.println("loadLibrary: " + strDllPath + " Error: " + ex.getMessage());
                    return false;
                }
            }
        }
        return true;
    }
    public Map<String,TempPoint> analyzeData(int dwP2PDataLen, String cFilename, String cFilename2) throws IOException {
        Map<String,TempPoint> tempMap = new HashMap<String, TempPoint>();
        // 打开本地保存的文件
        String inputFilename = cFilename;
        String outputFilename = cFilename2;
        int m_AnalysisHotPic_W = 384; // 根据抓热图接口返回的图像宽dwJpegPicWidth进行赋值
        int m_AnalysisHotPic_H = 288; // 根据抓热图接口返回的图像高dwJpegPicHeight进行赋值
        int bufSize = m_AnalysisHotPic_H * m_AnalysisHotPic_W * 4;
        try (RandomAccessFile datafilefp = new RandomAccessFile(inputFilename, "r");
             FileOutputStream fp = new FileOutputStream(outputFilename)) {
            // 读取文件里面所有数据
            byte[] pDataBuf = new byte[bufSize];
            int bytesRead = datafilefp.read(pDataBuf);
            if (bytesRead != bufSize) {
                System.out.println("Failed to read the entire file");
                return tempMap;
            }
            float minTemp = 10000.0f;
            float maxTemp = -10000.0f;
            //存储极值温度的坐标,如果是相同的极值温度,就也同步添加坐标点
            TempPoint minTempPoint = new TempPoint();
            TempPoint maxTempPoint = new TempPoint();
            ByteBuffer buffer = ByteBuffer.wrap(pDataBuf);
            buffer.order(ByteOrder.LITTLE_ENDIAN); // 根据实际情况调整字节序
            for (int iWriteHeight = 0; iWriteHeight < m_AnalysisHotPic_H; ++iWriteHeight) {
                for (int iWriteWidth = 0; iWriteWidth < m_AnalysisHotPic_W; ++iWriteWidth) {
                    float fTemp = buffer.getFloat();
                    // 判断fTemp是否是一个正常值,不是则赋值最大或最小,防止设备崩溃
                    fTemp = (9999 < fTemp) ? 9999 : ((-9999 > fTemp) ? -9999 : fTemp);
                    //只保留以为小数
                    fTemp = BigDecimal.valueOf(fTemp).setScale(1, BigDecimal.ROUND_HALF_UP).floatValue();
                    //minTemp = (minTemp > fTemp) ? fTemp : minTemp;
                    if(minTemp >= fTemp){
                        minTemp = fTemp;
                        //查看存的最低温度是不是当前温度,不是的话,要清空最低温度map,
                        //同时把最新的最低温度和坐标保存
                        Float minTempOld = minTempPoint.getTemp();
                        if(minTempOld == null || minTempOld!=minTemp){ //首次赋值 或者 需要重置最低温度
                            minTempPoint.setTemp(minTemp);
                            List<Point> points = new ArrayList<>();
                            Point point = new Point(iWriteWidth,iWriteHeight);
                            points.add(point);
                            minTempPoint.setPoints(points);
                        }else { //存在最低温度相同的另外一个点,保存下来进入最低温度列表
                            List<Point> points = minTempPoint.getPoints();
                            points.add(new Point(iWriteWidth,iWriteHeight));
                        }
                    }
                    //maxTemp = (maxTemp < fTemp) ? fTemp : maxTemp;
                    if(maxTemp <= fTemp){
                        maxTemp = fTemp;
                        //查看存的最高温度是不是当前温度,不是的话,要清空最高温度map,
                        //同时把最新的最高温度和坐标保存
                        Float maxTempOld = maxTempPoint.getTemp();
                        if(maxTempOld == null || maxTempOld!=maxTemp){ //首次赋值 或者 需要重置最高温度
                            maxTempPoint.setTemp(maxTemp);
                            List<Point> points = new ArrayList<>();
                            Point point = new Point(iWriteWidth,iWriteHeight);
                            points.add(point);
                            maxTempPoint.setPoints(points);
                        }else { //存在最高温度相同的另外一个点,保存下来进入最高温度列表
                            List<Point> points = maxTempPoint.getPoints();
                            points.add(new Point(iWriteWidth,iWriteHeight));
                        }
                    }
                    String temp = String.format("%.2f,", fTemp);
                    fp.write(temp.getBytes());
                }
                fp.write("\n".getBytes());
            }
            System.out.println("Min Temperature: " + minTempPoint);
            System.out.println("Max Temperature: " + maxTempPoint);
            tempMap.put("minTempPoint",minTempPoint);
            tempMap.put("maxTempPoint",maxTempPoint);
        }
        return  tempMap;
    }
    /**
     * 设备登录V30
     *
     * @param ip   设备IP
     * @param port SDK端口,默认设备的8000端口
     * @param user 设备用户名
     * @param psw  设备密码
     */
    public static int login_V30(String ip, short port, String user, String psw) {
        HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
        int iUserID = hCNetSDK.NET_DVR_Login_V30(ip, port, user, psw, m_strDeviceInfo);
        System.out.println("UserID:" + lUserID);
        if ((iUserID == -1) || (iUserID == 0xFFFFFFFF)) {
            System.out.println("登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError());
            return iUserID;
        } else {
            System.out.println(ip + ":设备登录成功!");
            return iUserID;
        }
    }
    /**
     * 登录设备,支持 V40 和 V30 版本,功能一致。
     *
     * @param ip      设备IP地址
     * @param port    SDK端口,默认为设备的8000端口
     * @param user    设备用户名
     * @param psw     设备密码
     * @return 登录成功返回用户ID,失败返回-1
     */
    public static int loginDevice(String ip, short port, String user, String psw) {
        // 创建设备登录信息和设备信息对象
        HCNetSDK.NET_DVR_USER_LOGIN_INFO loginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();
        HCNetSDK.NET_DVR_DEVICEINFO_V40 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();
        // 设置设备IP地址
        byte[] deviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
        byte[] ipBytes = ip.getBytes();
        System.arraycopy(ipBytes, 0, deviceAddress, 0, Math.min(ipBytes.length, deviceAddress.length));
        loginInfo.sDeviceAddress = deviceAddress;
        // 设置用户名和密码
        byte[] userName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
        byte[] password = psw.getBytes();
        System.arraycopy(user.getBytes(), 0, userName, 0, Math.min(user.length(), userName.length));
        System.arraycopy(password, 0, loginInfo.sPassword, 0, Math.min(password.length, loginInfo.sPassword.length));
        loginInfo.sUserName = userName;
        // 设置端口和登录模式
        loginInfo.wPort = port;
        loginInfo.bUseAsynLogin = false; // 同步登录
        loginInfo.byLoginMode = 0; // 使用SDK私有协议
        // 执行登录操作
        int userID = hCNetSDK.NET_DVR_Login_V40(loginInfo, deviceInfo);
        if (userID == -1) {
            System.err.println("登录失败,错误码为: " + hCNetSDK.NET_DVR_GetLastError());
        } else {
            System.out.println(ip + " 设备登录成功!");
            // 处理通道号逻辑
            int startDChan = deviceInfo.struDeviceV30.byStartDChan;
            System.out.println("预览起始通道号: " + startDChan);
        }
        return userID; // 返回登录结果
    }
}
src/main/resources/lib/hik/HCCore.dll
Binary files differ
src/main/resources/lib/hik/HCNetSDK.dll
Binary files differ
src/main/resources/lib/hik/HCNetSDKCom/AnalyzeData.dll
Binary files differ
src/main/resources/lib/hik/HCNetSDKCom/AudioIntercom.dll
Binary files differ
src/main/resources/lib/hik/HCNetSDKCom/AudioRender.dll
Binary files differ
src/main/resources/lib/hik/HCNetSDKCom/HCAlarm.dll
Binary files differ
src/main/resources/lib/hik/HCNetSDKCom/HCAlarm.lib
Binary files differ
src/main/resources/lib/hik/HCNetSDKCom/HCCoreDevCfg.dll
Binary files differ
src/main/resources/lib/hik/HCNetSDKCom/HCDisplay.dll
Binary files differ
src/main/resources/lib/hik/HCNetSDKCom/HCGeneralCfgMgr.dll
Binary files differ
src/main/resources/lib/hik/HCNetSDKCom/HCGeneralCfgMgr.lib
Binary files differ
src/main/resources/lib/hik/HCNetSDKCom/HCIndustry.dll
Binary files differ
src/main/resources/lib/hik/HCNetSDKCom/HCPlayBack.dll
Binary files differ
src/main/resources/lib/hik/HCNetSDKCom/HCPreview.dll
Binary files differ
src/main/resources/lib/hik/HCNetSDKCom/HCPreview.lib
Binary files differ
src/main/resources/lib/hik/HCNetSDKCom/HCVoiceTalk.dll
Binary files differ
src/main/resources/lib/hik/HCNetSDKCom/OpenAL32.dll
Binary files differ
src/main/resources/lib/hik/HCNetSDKCom/StreamTransClient.dll
Binary files differ
src/main/resources/lib/hik/HCNetSDKCom/SystemTransform.dll
Binary files differ
src/main/resources/lib/hik/HCNetSDKCom/libiconv2.dll
Binary files differ
src/main/resources/lib/hik/examples.jar
Binary files differ
src/main/resources/lib/hik/hlog.dll
Binary files differ
src/main/resources/lib/hik/hpr.dll
Binary files differ
src/main/resources/lib/hik/jna.jar
Binary files differ
src/main/resources/lib/hik/libcrypto-1_1-x64.dll
Binary files differ
src/main/resources/lib/hik/libssl-1_1-x64.dll
Binary files differ
src/main/resources/lib/hik/zlib1.dll
Binary files differ