feat(sdk): 添加通用API调用方法

This commit is contained in:
zcxlsm 2025-08-07 12:06:24 +08:00
parent 20faf13328
commit 9aa58d2027

View File

@ -1,5 +1,7 @@
package org.dromara.sis.sdk.hik.service; package org.dromara.sis.sdk.hik.service;
import com.sun.jna.Memory;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.sis.sdk.hik.HCNetSDK; 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) { public static DeviceInfo getDeviceChannelInfo(int lUserID) {
HCNetSDK.NET_DVR_IPPARACFG_V40 lpOutBuffer = new HCNetSDK.NET_DVR_IPPARACFG_V40(); HCNetSDK.NET_DVR_IPPARACFG_V40 lpOutBuffer = new HCNetSDK.NET_DVR_IPPARACFG_V40();
@ -77,4 +79,78 @@ public class CamearService extends SdkBaseServer {
return deviceInfo; 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");
}
}
}
} }