From 9aa58d20270920e571abbabc7929f0208454efb7 Mon Sep 17 00:00:00 2001 From: zcxlsm Date: Thu, 7 Aug 2025 12:06:24 +0800 Subject: [PATCH] =?UTF-8?q?feat(sdk):=20=E6=B7=BB=E5=8A=A0=E9=80=9A?= =?UTF-8?q?=E7=94=A8API=E8=B0=83=E7=94=A8=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sis/sdk/hik/service/CamearService.java | 78 ++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/CamearService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/CamearService.java index 2f66f9fc..42279dba 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/CamearService.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/CamearService.java @@ -1,5 +1,7 @@ package org.dromara.sis.sdk.hik.service; +import com.sun.jna.Memory; +import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import lombok.extern.slf4j.Slf4j; import org.dromara.sis.sdk.hik.HCNetSDK; @@ -18,7 +20,7 @@ public class CamearService extends SdkBaseServer { /** * 获取设备通道信息 * - * @return + * @return DeviceInfo */ public static DeviceInfo getDeviceChannelInfo(int lUserID) { HCNetSDK.NET_DVR_IPPARACFG_V40 lpOutBuffer = new HCNetSDK.NET_DVR_IPPARACFG_V40(); @@ -77,4 +79,78 @@ public class CamearService extends SdkBaseServer { return deviceInfo; } + public static void isAPI(int lUserID, String url) { + // 输入参数 + HCNetSDK.NET_DVR_XML_CONFIG_INPUT strInput = new HCNetSDK.NET_DVR_XML_CONFIG_INPUT(); + strInput.dwSize = strInput.size(); // 初始化结构体内存 + + // 2. 构造URL - 必须包含 \r\n 结束符 +// String url = "GET /ISAPI/Intelligent/capabilities\r\n"; + byte[] urlBytes = url.getBytes(); + Memory urlMemory = new Memory(urlBytes.length + 1); // +1 for null terminator + urlMemory.write(0, urlBytes, 0, urlBytes.length); + urlMemory.setByte(urlBytes.length, (byte) 0); // 添加NUL终止符 + + strInput.lpRequestUrl = urlMemory; + strInput.dwRequestUrlLen = urlBytes.length; // 不包括NUL终止符 + + // 3. 输入缓冲区设为空指针 + strInput.lpInBuffer = Pointer.NULL; + strInput.dwInBufferSize = 0; + + + // 输出参数 + HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT strOutput = new HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT(); + strOutput.dwSize = strOutput.size(); + + // 5. 分配输出缓冲区 (8KB) + int outBufSize = 8 * 1024; + Memory outBuffer = new Memory(outBufSize); + outBuffer.clear(); // 清零缓冲区 + + // 6. 分配状态缓冲区 (1KB) + int statusSize = 1024; + Memory statusBuffer = new Memory(statusSize); + statusBuffer.clear(); // 清零缓冲区 + + strOutput.lpOutBuffer = outBuffer; + strOutput.dwOutBufferSize = outBufSize; + strOutput.lpStatusBuffer = statusBuffer; + strOutput.dwStatusSize = statusSize; + + // 7. 调用前写入结构体 + strOutput.write(); // 将Java结构体写入本地内存 + strOutput.write(); // 将Java结构体写入本地内存 + + // 调用SDK方法 + boolean success = hcNetSDK.NET_DVR_STDXMLConfig(lUserID, strInput, strOutput); + + if (!success) { + int errorCode = hcNetSDK.NET_DVR_GetLastError(); + System.err.println("NET_DVR_STDXMLConfig failed, error code: " + errorCode); + + // 打印状态信息帮助调试 + if (strOutput.dwReturnedXMLSize > 0) { + String status = statusBuffer.getString(0); + System.err.println("Status: " + status); + } + } else { + System.out.println("NET_DVR_STDXMLConfig successfully!"); + + // 9. 读取前同步结构体字段 + strOutput.read(); // 从本地内存读取更新后的结构体 + + // 检查实际返回的数据大小 + int returnedSize = strOutput.dwReturnedXMLSize; + if (returnedSize > 0) { + // 使用正确的长度读取字符串 + String xmlResponse = outBuffer.getString(0); + System.out.println("Response size: " + returnedSize); + System.out.println(xmlResponse); + } else { + System.out.println("No data returned"); + } + } + } + }