@@ -1,45 +0,0 @@ | |||||
package com.iformall.controller.market; | |||||
import com.iformall.annotation.SystemControllerLog; | |||||
import com.iformall.common.ResultData; | |||||
import com.iformall.controller.base.BaseController; | |||||
import com.iformall.domain.po.PushLimit; | |||||
import com.iformall.haikang.alarm.Alarm; | |||||
import com.iformall.service.PushLimitService; | |||||
import io.swagger.annotations.Api; | |||||
import io.swagger.annotations.ApiOperation; | |||||
import org.slf4j.Logger; | |||||
import org.slf4j.LoggerFactory; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import org.springframework.web.bind.annotation.*; | |||||
@RestController | |||||
@RequestMapping("hknetsdk") | |||||
public class HaiKangController extends BaseController { | |||||
private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||||
@Autowired | |||||
private Alarm alarm; | |||||
@ApiOperation("监听列表") | |||||
@GetMapping("listenList") | |||||
public ResultData listenList() { | |||||
//PushLimit pushLimit = pushLimitService.getPushLimit(getTenantInfo()); | |||||
return new ResultData(); | |||||
} | |||||
@ApiOperation("开启监听") | |||||
@GetMapping("startListen") | |||||
public ResultData startListen() { | |||||
alarm.listen(); | |||||
return new ResultData(); | |||||
} | |||||
@ApiOperation("关闭监听") | |||||
@PostMapping("stopListen") | |||||
public ResultData stopListen(@RequestBody PushLimit pushLimit) { | |||||
alarm.stopListen(); | |||||
return new ResultData(); | |||||
} | |||||
} |
@@ -36,7 +36,7 @@ | |||||
<configuration> | <configuration> | ||||
<executable>true</executable> | <executable>true</executable> | ||||
<layout>ZIP</layout> | <layout>ZIP</layout> | ||||
<!-- <excludeGroupIds> | |||||
<excludeGroupIds> | |||||
antlr, | antlr, | ||||
cn.afterturn, | cn.afterturn, | ||||
ch.qos.logback, | ch.qos.logback, | ||||
@@ -156,7 +156,7 @@ | |||||
tk.mybatis, | tk.mybatis, | ||||
xmlpull, | xmlpull, | ||||
xpp3 | xpp3 | ||||
</excludeGroupIds> --> | |||||
</excludeGroupIds> | |||||
</configuration> | </configuration> | ||||
</plugin> | </plugin> | ||||
</plugins> | </plugins> | ||||
@@ -1,35 +1,215 @@ | |||||
package com.iformall.controller; | package com.iformall.controller; | ||||
import com.iformall.annotation.AuthIgnore; | |||||
import com.iformall.common.ResultData; | |||||
import com.iformall.domain.po.WxMallApply; | |||||
import com.iformall.domain.po.WxMsgValidationcode; | |||||
import com.iformall.haikang.alarm.Alarm; | |||||
import com.iformall.service.WxMallApplyService; | |||||
import io.swagger.annotations.ApiImplicitParam; | |||||
import io.swagger.annotations.ApiImplicitParams; | |||||
import org.apache.commons.fileupload.FileItem; | |||||
import org.apache.commons.fileupload.FileItemFactory; | |||||
import org.apache.commons.fileupload.disk.DiskFileItemFactory; | |||||
import org.apache.commons.fileupload.servlet.ServletFileUpload; | |||||
import org.apache.http.Header; | |||||
import org.apache.http.HttpEntity; | |||||
import org.apache.http.auth.AuthScope; | |||||
import org.apache.http.auth.UsernamePasswordCredentials; | |||||
import org.apache.http.client.CredentialsProvider; | |||||
import org.apache.http.client.HttpClient; | |||||
import org.apache.http.client.methods.CloseableHttpResponse; | |||||
import org.apache.http.client.methods.HttpGet; | |||||
import org.apache.http.client.methods.HttpPost; | |||||
import org.apache.http.entity.StringEntity; | |||||
import org.apache.http.impl.client.BasicCredentialsProvider; | |||||
import org.apache.http.impl.client.CloseableHttpClient; | |||||
import org.apache.http.impl.client.HttpClients; | |||||
import org.apache.http.message.BasicHeader; | |||||
import org.apache.http.util.EntityUtils; | |||||
import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
import org.springframework.web.bind.annotation.*; | |||||
import org.springframework.web.bind.annotation.GetMapping; | |||||
import org.springframework.web.bind.annotation.PostMapping; | |||||
import org.springframework.web.bind.annotation.RequestMapping; | |||||
import org.springframework.web.bind.annotation.RequestMethod; | |||||
import org.springframework.web.bind.annotation.RestController; | |||||
@RestController | |||||
@RequestMapping("/api/hknetsdk") | |||||
public class HaiKangController extends BaseController { | |||||
private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||||
import com.iformall.annotation.AuthIgnore; | |||||
import com.iformall.haikang.HKHttpClientInstanceFactory; | |||||
@Autowired | |||||
private Alarm alerm; | |||||
import javax.servlet.ServletException; | |||||
import javax.servlet.ServletOutputStream; | |||||
import javax.servlet.http.HttpServlet; | |||||
import javax.servlet.http.HttpServletRequest; | |||||
import javax.servlet.http.HttpServletResponse; | |||||
@AuthIgnore | |||||
@PostMapping("listen") | |||||
public ResultData add(@RequestBody WxMallApply wxMallApply) { | |||||
logger.debug("[" + getIpAddr() + "] WxMallApplyController::add"); | |||||
//Assert.notNull(wxMallApply.getName(), "角色名不能为空"); | |||||
//Assert.isTrue(!checkUnique(sysRole.getName(), null), "重复的角色名"); | |||||
return new ResultData(); | |||||
import java.io.BufferedReader; | |||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.io.InputStreamReader; | |||||
import java.nio.charset.StandardCharsets; | |||||
import java.util.List; | |||||
import java.util.UUID; | |||||
} | |||||
/** | |||||
* @author jiangxin | |||||
* @create 2021-07-08-15:33 | |||||
*/ | |||||
@RestController | |||||
@RequestMapping("/api/hk") | |||||
public class HaiKangController { | |||||
private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||||
@Autowired | |||||
HKHttpClientInstanceFactory httpFactory; | |||||
/** | |||||
* 监听接口事件解析,设备监听页面设置URL为“/notify” | |||||
* @param request | |||||
* @param response | |||||
* @throws ServletException | |||||
* @throws IOException | |||||
*/ | |||||
@AuthIgnore | |||||
@PostMapping("/notify") | |||||
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { | |||||
//解析multipart/form-data类型报文 | |||||
FileItemFactory factory = new DiskFileItemFactory(); | |||||
ServletFileUpload sf = new ServletFileUpload(factory); | |||||
try { | |||||
if (!ServletFileUpload.isMultipartContent(request)) { | |||||
throw new Exception("no multipartcontent"); | |||||
} | |||||
List<FileItem> formData = sf.parseRequest(request); | |||||
for (FileItem fi : formData) { | |||||
if (fi.isFormField()) { | |||||
//解析报文中json | |||||
System.out.println("field_name:" + fi.getFieldName()); | |||||
//打印json格式上传的事件报文 | |||||
System.out.println(fi.getString("UTF-8")); | |||||
//通过表单name属性进行解析报文 | |||||
switch (fi.getFieldName()) { | |||||
case "event_log"://门禁、身份证事件解析 | |||||
System.out.println("receive Acs event"); | |||||
break; | |||||
default: | |||||
System.out.println("unknow data"); | |||||
} | |||||
} else { | |||||
//保存报文中的图片数据 | |||||
String image_name = fi.getName(); | |||||
logger.info("image_name:" + image_name); | |||||
if (image_name != "") { | |||||
//图片保存路径 | |||||
String image_dir_path = "C:\\image\\"; | |||||
File image_dir = new File(image_dir_path); | |||||
if (!image_dir.exists()) { | |||||
image_dir.mkdir(); | |||||
} | |||||
String file_name = UUID.randomUUID().toString(); | |||||
String suffix = image_name.substring(fi.getName().lastIndexOf(".")); | |||||
System.out.println("图片报文路径:" + image_dir_path); | |||||
System.out.println("图片名称:" + file_name); | |||||
System.out.println("图片格式:" + suffix); | |||||
fi.write(new File(image_dir_path, file_name + suffix)); | |||||
} else { | |||||
throw new Exception("no file receive"); | |||||
} | |||||
} | |||||
} | |||||
//正常接收平台响应回复 | |||||
response.getWriter().write("success"); | |||||
} catch (Exception e) { | |||||
e.printStackTrace(); | |||||
response.getWriter().write("false"); | |||||
} | |||||
} | |||||
/** | |||||
* 1. 获取设备系统能力集GET /ISAPI/System/capabilities; | |||||
2. 判断是否支持事件订阅isSupportSubscribeEvent存在且为true; | |||||
3. 获取布防订阅能力GET /ISAPI/Event/notification/subscribeEventCap; | |||||
4. 建立布防订阅连接POST /ISAPI/Event/notification/subscribeEvent客户端需要设置HTTP Headers | |||||
中Connection: keep-alive; | |||||
5. (可选)修改已有布防订阅连接的订阅参数,如果想要在当前订阅配置基础上修改订阅参数,需要先获取布防订 | |||||
阅管理参数GET /ISAPI/Event/notification/subscribeEvent/<subscribeEventID>,在获取到的订阅配置基础上 | |||||
修改完成后再调用设置布防订阅管理参数PUT | |||||
/ISAPI/Event/notification/subscribeEvent/<subscribeEventID>; | |||||
6. 接收设备发送的事件,通过boundary分割解析事件消息,解析说明详见下面的 “事事件件消消息息解解析析”; | |||||
7. (可选)取消布防订阅连接PUT /ISAPI/Event/notification/unSubscribeEvent?ID=<subscribeEventID>,当使 | |||||
用HTTP方式直接和设备通信时,不需要调用此接口,直接断开布防连接即可。通过萤石、OTAP等方式透传ISAPI | |||||
事件订阅时,关闭事件订阅时需要调用此接口通知设备释放资源; | |||||
8. 设备不支持事件订阅; | |||||
* @param args | |||||
*/ | |||||
@AuthIgnore | |||||
@GetMapping("/regeister") | |||||
public void regeister(String ip,String name,String password) { | |||||
CloseableHttpClient httpClient = httpFactory.getIpHttpClient(ip, name, password); | |||||
String xmlcontent = "<SubscribeEvent xmlns=\"http://www.isapi.org/ver20/XMLSchema\" version=\"2.0\">\n" | |||||
+ "<heartbeat>15</heartbeat>\n" | |||||
+ "<eventMode>list</eventMode>\n" | |||||
+ " <EventList>\n" | |||||
+ " <Event>\n" | |||||
+ " <type>AccessControllerEvent</type>\n" | |||||
+ " <minorAlarm>0x404,0x405,0x406,0x407,0x40a,0x40b,0x40c,0x40d,0x40e,0x40f,0x410,0x408,0x409</minorAlarm>\n" | |||||
+ " <minorException>0x26,0x27,0x400,0x407,0x408,0x409,0x40a,0x40f,0x410,0x423,0x424,0x428,0x429,0x41d,0x41e,0x426,0x427,0x451,0x452</minorException>\n" | |||||
+ " <minorOperation>0x50,0x5a,0x5d,0x5e,0x70,0x71,0x76,0x77,0x79,0x7a,0x7b,0x7e,0x86,0x87,0xf0,0xf1,0x137,0x138,0x400,0x401,0x402,0x403,0x404,0x405,0x406,0x407,0x40a,0x40b,0x40c,0x40e,0x419,0x41a,0x421,0x422,0x42f,0x430,0x431,0x432,0x433,0x2601,0x41f,0x420</minorOperation>\n" | |||||
+ " <minorEvent>0x1,0x6,0x7,0x8,0x9,0xa,0xb,0xc,0xd,0xe,0xf,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x31,0x33,0x4b,0x4c,0x50,0x68,0x72,0x73,0x74,0x75,0x82,0x84,0x8e,0x97,0x98,0x9b,0xa4,0xa8,0xb5,0xc1,0xbe,0xbf,0x9f,0xa0,0x2,0x3,0x4,0x5,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x99,0x9a,0x1d,0x1e,0xa2,0xa9,0x77,0xab,0x70,0x71,0x69</minorEvent>\n" | |||||
+ " <pictureURLType>binary</pictureURLType>\n" | |||||
+ " </Event>\n" | |||||
+ " <Event>\n" | |||||
+ " <type>IDCardInfoEvent</type>\n" | |||||
+ " <minorEvent>0x69,0x70,0x71</minorEvent>\n" | |||||
+ " <pictureURLType>binary</pictureURLType>\n" | |||||
+ " </Event>\n" | |||||
+ " </EventList>\n" | |||||
+ "</SubscribeEvent>"; | |||||
executePostRequest(httpClient,ip,"/ISAPI/Event/notification/subscribeEvent",xmlcontent); | |||||
} | |||||
private void executePostRequest(CloseableHttpClient httpClient,String ip,String api,String body) { | |||||
HttpPost httpPost = new HttpPost("http://"+ip+":80"+api); | |||||
Header[] headers = {new BasicHeader("Connection","keep-alive"),new BasicHeader("asa","ass")}; | |||||
httpPost.setHeaders(headers); | |||||
StringEntity entity = new StringEntity(body, StandardCharsets.UTF_8); | |||||
httpPost.setEntity(entity); | |||||
try { | |||||
// 执行请求 | |||||
CloseableHttpResponse response = httpClient.execute(httpPost); | |||||
//return EntityUtils.toString(response.getEntity()); | |||||
try { | |||||
int statusCode = response.getStatusLine().getStatusCode(); | |||||
if (statusCode == 200) { | |||||
HttpEntity rentity = response.getEntity(); | |||||
if (null != rentity) { | |||||
// 打印服务器的响应内容 | |||||
InputStream instream = rentity.getContent(); | |||||
InputStreamReader inputStreamReader = new InputStreamReader(instream); | |||||
BufferedReader bufferedReader = new BufferedReader(inputStreamReader); | |||||
String result; | |||||
while ((result = bufferedReader.readLine()) != null) { | |||||
System.out.println("*******"+result); | |||||
} | |||||
System.out.println("*******&&&&&&&******close***************"); | |||||
bufferedReader.close(); | |||||
} | |||||
} | |||||
} catch(Exception e) { | |||||
e.printStackTrace(); | |||||
} | |||||
// finally { | |||||
// response.close(); | |||||
// } | |||||
} catch (Exception e) { | |||||
e.printStackTrace(); | |||||
} | |||||
// finally { | |||||
// try { | |||||
// httpClient.close(); | |||||
// } catch (IOException e) { | |||||
// e.printStackTrace(); | |||||
// } | |||||
// } | |||||
} | |||||
} | } |
@@ -52,31 +52,6 @@ | |||||
<artifactId>jsoup</artifactId> | <artifactId>jsoup</artifactId> | ||||
<version>1.10.2</version> | <version>1.10.2</version> | ||||
</dependency> | </dependency> | ||||
<dependency> | |||||
<groupId>com.iformall.haikang</groupId> | |||||
<artifactId>jna</artifactId> | |||||
<version>1.0.0</version> | |||||
<!-- <scope>system</scope> | |||||
<systemPath>${project.basedir}/lib/jna-1.0.0.jar</systemPath> --> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.iformall.haikang</groupId> | |||||
<artifactId>jna_1</artifactId> | |||||
<version>4.5.2</version> | |||||
<!-- <scope>system</scope> | |||||
<systemPath>${project.basedir}/lib/jna-4.5.2.jar</systemPath>--> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.iformall.haikang</groupId> | |||||
<artifactId>examples</artifactId> | |||||
<version>1.0.0</version> | |||||
<!--<scope>system</scope> | |||||
<systemPath>${project.basedir}/lib/examples-1.0.0.jar</systemPath>--> | |||||
</dependency> | |||||
</dependencies> | </dependencies> | ||||
</project> | </project> |
@@ -0,0 +1,50 @@ | |||||
package com.iformall.haikang; | |||||
import java.util.Map; | |||||
import java.util.concurrent.ConcurrentHashMap; | |||||
import org.apache.http.auth.AuthScope; | |||||
import org.apache.http.auth.UsernamePasswordCredentials; | |||||
import org.apache.http.client.CredentialsProvider; | |||||
import org.apache.http.impl.client.BasicCredentialsProvider; | |||||
import org.apache.http.impl.client.CloseableHttpClient; | |||||
import org.apache.http.impl.client.HttpClients; | |||||
import org.springframework.stereotype.Component; | |||||
@Component | |||||
public class HKHttpClientInstanceFactory { | |||||
private Map<String,CloseableHttpClient> ipHttpClientMap; | |||||
public CloseableHttpClient getIpHttpClient(String ip,String name,String password) { | |||||
synchronized (ip) { | |||||
if (null == ipHttpClientMap) { | |||||
ipHttpClientMap = new ConcurrentHashMap<String,CloseableHttpClient>(); | |||||
CloseableHttpClient httpClient = generateHttpClient(ip, name, password); | |||||
ipHttpClientMap.put(ip, httpClient); | |||||
return httpClient; | |||||
}else { | |||||
CloseableHttpClient httpClient = ipHttpClientMap.get(ip); | |||||
if (null == httpClient) { | |||||
httpClient = generateHttpClient(ip, name, password); | |||||
ipHttpClientMap.put(ip, httpClient); | |||||
} | |||||
return httpClient; | |||||
} | |||||
} | |||||
} | |||||
private CloseableHttpClient generateHttpClient(String ip,String name,String password) { | |||||
CredentialsProvider credsProvider = new BasicCredentialsProvider(); | |||||
credsProvider.setCredentials( | |||||
new AuthScope(ip, AuthScope.ANY_PORT), | |||||
new UsernamePasswordCredentials(name, password)); | |||||
// 创建一个使用认证凭据的CloseableHttpClient | |||||
CloseableHttpClient httpClient = HttpClients.custom() | |||||
.setDefaultCredentialsProvider(credsProvider) | |||||
.build(); | |||||
return httpClient; | |||||
} | |||||
} |
@@ -1,485 +0,0 @@ | |||||
package com.iformall.haikang.alarm; | |||||
import com.iformall.file.haikang.HaiKangNetSdkConfig; | |||||
import com.iformall.haikang.alarm.common.HCNetSDK; | |||||
import com.iformall.haikang.alarm.common.osSelect; | |||||
import com.sun.jna.Native; | |||||
import com.sun.jna.Pointer; | |||||
import java.util.Scanner; | |||||
import javax.annotation.PreDestroy; | |||||
import org.apache.commons.logging.LogFactory; | |||||
import org.slf4j.Logger; | |||||
import org.slf4j.LoggerFactory; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import org.springframework.stereotype.Service; | |||||
@Service | |||||
public class Alarm { | |||||
private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||||
@Autowired | |||||
HaiKangNetSdkConfig hkConfig; | |||||
private HCNetSDK hCNetSDK = null; | |||||
private int lUserID = -1;//用户句柄 实现对设备登录 | |||||
private int lAlarmHandle =-1;//报警布防句柄 | |||||
private int lListenHandle = -1;//监听句柄 | |||||
@Autowired | |||||
FMSGCallBack_V31 fMSFCallBack_V31; //报警布防回调函数 | |||||
private FMSGCallBack fMSFCallBack=null; //报警监听回调函数 | |||||
/** | |||||
* 动态库加载 | |||||
* | |||||
* @return | |||||
*/ | |||||
private boolean createSDKInstance() { | |||||
if (hCNetSDK == null) { | |||||
synchronized (HCNetSDK.class) { | |||||
String strDllPath = hkConfig.getLibdir(); | |||||
try { | |||||
if (osSelect.isWindows()) { | |||||
//win系统加载库路径 | |||||
//strDllPath = System.getProperty("user.dir") + "\\lib\\HCNetSDK.dll"; | |||||
strDllPath = strDllPath + "\\lib\\HCNetSDK.dll"; | |||||
}else if (osSelect.isLinux()) { | |||||
//Linux系统加载库路径 | |||||
//strDllPath = System.getProperty("user.dir") + "/lib/libhcnetsdk.so"; | |||||
strDllPath = strDllPath + "/lib/libhcnetsdk.so"; | |||||
} | |||||
hCNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class); | |||||
} catch (Exception ex) { | |||||
logger.error("createSDKInstance loadLibrary: " + strDllPath + " Error: " + ex.getMessage(),ex); | |||||
return false; | |||||
} | |||||
} | |||||
} | |||||
return true; | |||||
} | |||||
private void initSdk() { | |||||
if (hCNetSDK == null) { | |||||
if (!createSDKInstance()) { | |||||
logger.error("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()); | |||||
} | |||||
/**初始化*/ | |||||
hCNetSDK.NET_DVR_Init(); | |||||
/**加载日志*/ | |||||
hCNetSDK.NET_DVR_SetLogToFile(3, "./sdklog1", false); | |||||
//设置报警回调函数 | |||||
//if (fMSFCallBack_V31 == null) { | |||||
// fMSFCallBack_V31 = new FMSGCallBack_V31(); | |||||
Pointer pUser = null; | |||||
if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUser)) { | |||||
System.out.println("设置回调函数失败!"); | |||||
return; | |||||
} else { | |||||
System.out.println("设置回调函数成功!"); | |||||
} | |||||
//} | |||||
/** 设备上传的报警信息是COMM_VCA_ALARM(0x4993)类型, | |||||
在SDK初始化之后增加调用NET_DVR_SetSDKLocalCfg(enumType为NET_DVR_LOCAL_CFG_TYPE_GENERAL)设置通用参数NET_DVR_LOCAL_GENERAL_CFG的byAlarmJsonPictureSeparate为1, | |||||
将Json数据和图片数据分离上传,这样设置之后,报警布防回调函数里面接收到的报警信息类型为COMM_ISAPI_ALARM(0x6009), | |||||
报警信息结构体为NET_DVR_ALARM_ISAPI_INFO(与设备无关,SDK封装的数据结构),更便于解析。*/ | |||||
HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG struNET_DVR_LOCAL_GENERAL_CFG = new HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG(); | |||||
struNET_DVR_LOCAL_GENERAL_CFG.byAlarmJsonPictureSeparate = 1; //设置JSON透传报警数据和图片分离 | |||||
struNET_DVR_LOCAL_GENERAL_CFG.write(); | |||||
Pointer pStrNET_DVR_LOCAL_GENERAL_CFG = struNET_DVR_LOCAL_GENERAL_CFG.getPointer(); | |||||
hCNetSDK.NET_DVR_SetSDKLocalCfg(17, pStrNET_DVR_LOCAL_GENERAL_CFG); | |||||
} | |||||
} | |||||
@PreDestroy | |||||
public void onDestory() { | |||||
//释放SDK | |||||
if (hCNetSDK != null) { | |||||
stopListen(); | |||||
//设备注销 | |||||
logoutDev(lUserID); | |||||
//SDK | |||||
hCNetSDK.NET_DVR_Cleanup(); | |||||
} | |||||
} | |||||
/** | |||||
* 开启监听 | |||||
* @return | |||||
*/ | |||||
public void listen() { | |||||
if (hCNetSDK == null) { | |||||
initSdk(); | |||||
} | |||||
lUserID=loginDevice( hkConfig.getDeviceIp(), (short) 8000, hkConfig.getLoginUser(), hkConfig.getPassword()); //登录设备 | |||||
lListenHandle = startListen(hkConfig.getListenIp(),(short) hkConfig.getListenPort()); | |||||
} | |||||
/** | |||||
* 停止监听 | |||||
* @param Handle 监听句柄 | |||||
*/ | |||||
public void stopListen() | |||||
{ | |||||
int Handle = lListenHandle; | |||||
if (Handle <= -1) | |||||
{ | |||||
logger.info("监听未开启"); | |||||
return; | |||||
} | |||||
if (!hCNetSDK.NET_DVR_StopListen_V30(Handle)) { | |||||
logger.error("停止监听失败,err: "+hCNetSDK.NET_DVR_GetLastError()); | |||||
return; | |||||
} | |||||
logger.info("停止监听成功"); | |||||
return; | |||||
} | |||||
// /** | |||||
// * @param args | |||||
// */ | |||||
// public static void main(String[] args) throws 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()); | |||||
// } | |||||
// | |||||
// /**初始化*/ | |||||
// hCNetSDK.NET_DVR_Init(); | |||||
// /**加载日志*/ | |||||
// hCNetSDK.NET_DVR_SetLogToFile(3, "./sdklog1", false); | |||||
// //设置报警回调函数 | |||||
// if (fMSFCallBack_V31 == null) { | |||||
// fMSFCallBack_V31 = new FMSGCallBack_V31(); | |||||
// Pointer pUser = null; | |||||
// if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUser)) { | |||||
// System.out.println("设置回调函数失败!"); | |||||
// return; | |||||
// } else { | |||||
// System.out.println("设置回调函数成功!"); | |||||
// } | |||||
// } | |||||
// /** 设备上传的报警信息是COMM_VCA_ALARM(0x4993)类型, | |||||
// 在SDK初始化之后增加调用NET_DVR_SetSDKLocalCfg(enumType为NET_DVR_LOCAL_CFG_TYPE_GENERAL)设置通用参数NET_DVR_LOCAL_GENERAL_CFG的byAlarmJsonPictureSeparate为1, | |||||
// 将Json数据和图片数据分离上传,这样设置之后,报警布防回调函数里面接收到的报警信息类型为COMM_ISAPI_ALARM(0x6009), | |||||
// 报警信息结构体为NET_DVR_ALARM_ISAPI_INFO(与设备无关,SDK封装的数据结构),更便于解析。*/ | |||||
// | |||||
// HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG struNET_DVR_LOCAL_GENERAL_CFG = new HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG(); | |||||
// struNET_DVR_LOCAL_GENERAL_CFG.byAlarmJsonPictureSeparate = 1; //设置JSON透传报警数据和图片分离 | |||||
// struNET_DVR_LOCAL_GENERAL_CFG.write(); | |||||
// Pointer pStrNET_DVR_LOCAL_GENERAL_CFG = struNET_DVR_LOCAL_GENERAL_CFG.getPointer(); | |||||
// hCNetSDK.NET_DVR_SetSDKLocalCfg(17, pStrNET_DVR_LOCAL_GENERAL_CFG); | |||||
// | |||||
// lUserID=Alarm.loginDevice( "192.168.2.200", (short) 8000, "admin", "wushikeji001"); //登录设备 | |||||
// | |||||
// 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]报警布防示例代码"); | |||||
// lAlarmHandle=Alarm.setAlarmChan(lUserID);//报警布防,和报警监听二选一即可 | |||||
// break; | |||||
// } | |||||
// case "2": | |||||
// { | |||||
// System.out.println("\n[Module]报警撤防示例代码"); | |||||
// Alarm.closedAlarmChan(lAlarmHandle); | |||||
// break; | |||||
// } | |||||
// case "3": | |||||
// { | |||||
// //报警监听不需要登录设备,Alarm.loginDevice登录接口可以注释 | |||||
// System.out.println("\n[Module]开启报警监听示例代码"); | |||||
// lListenHandle = Alarm.startListen("192.168.2.103",(short) 7201); //传入监听PC本机的IP地址和端口 | |||||
// break; | |||||
// } | |||||
// case "4": | |||||
// { | |||||
// System.out.println("\n[Module]停止监听示例代码"); | |||||
// Alarm.stopListen(lListenHandle); | |||||
// break; | |||||
// } | |||||
// default: | |||||
// { | |||||
// System.out.println("\n未知的指令操作!请重新输入!\n"); | |||||
// } | |||||
// } | |||||
// } | |||||
// //设备注销 | |||||
// Alarm.logoutDev(lUserID); | |||||
// //释放SDK | |||||
// hCNetSDK.NET_DVR_Cleanup(); | |||||
// return; | |||||
// } | |||||
/** | |||||
* 登录设备,支持 V40 和 V30 版本,功能一致。 | |||||
* | |||||
* @param ip 设备IP地址 | |||||
* @param port SDK端口,默认为设备的8000端口 | |||||
* @param user 设备用户名 | |||||
* @param psw 设备密码 | |||||
* @return 登录成功返回用户ID,失败返回-1 | |||||
*/ | |||||
public 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; // 返回登录结果 | |||||
} | |||||
/** | |||||
* 设备登录V30 | |||||
* @param ip 设备IP | |||||
* @param port SDK端口,默认设备的8000端口 | |||||
* @param user 设备用户名 | |||||
* @param psw 设备密码 | |||||
*/ | |||||
public void loginDeviceV30(String ip, short port, String user, String psw) { | |||||
HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30(); | |||||
lUserID = hCNetSDK.NET_DVR_Login_V30(ip, port, user, psw, m_strDeviceInfo); | |||||
System.out.println("UsID:" + lUserID); | |||||
if ((lUserID == -1) || (lUserID == 0xFFFFFFFF)) { | |||||
System.out.println("登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError()); | |||||
return; | |||||
} else { | |||||
System.out.println(ip + ":设备登录成功!"); | |||||
return; | |||||
} | |||||
} | |||||
/** | |||||
* 报警布防 | |||||
* @param userID 设备登录句柄ID | |||||
* @return | |||||
*/ | |||||
public int setAlarmChan(int userID ) { | |||||
if (userID == -1) { | |||||
System.out.println("请先注册"); | |||||
return -1; | |||||
} | |||||
if (lAlarmHandle < 0)//尚未布防,需要布防 | |||||
{ | |||||
//报警布防参数设置 | |||||
HCNetSDK.NET_DVR_SETUPALARM_PARAM alarmInfo = new HCNetSDK.NET_DVR_SETUPALARM_PARAM(); | |||||
alarmInfo.dwSize = alarmInfo.size(); | |||||
alarmInfo.byLevel = 0; //布防等级 | |||||
alarmInfo.byAlarmInfoType = 1; // 智能交通报警信息上传类型:0- 老报警信息(NET_DVR_PLATE_RESULT),1- 新报警信息(NET_ITS_PLATE_RESULT) | |||||
alarmInfo.byDeployType = 0; //布防类型:0-客户端布防,1-实时布防,客户端布防仅支持一路 | |||||
alarmInfo.write(); | |||||
lAlarmHandle= hCNetSDK.NET_DVR_SetupAlarmChan_V41(userID, alarmInfo); | |||||
if (lAlarmHandle == -1) { | |||||
System.err.println("布防失败,错误码为" + hCNetSDK.NET_DVR_GetLastError()); | |||||
return -1 ; | |||||
} else { | |||||
System.out.println("布防成功"); | |||||
return lAlarmHandle; | |||||
} | |||||
} else { | |||||
System.out.println("设备已经布防,请先撤防!"); | |||||
return lAlarmHandle ; | |||||
} | |||||
} | |||||
/** | |||||
* 设备撤防 | |||||
* @param AlarmHandle 布防句柄 | |||||
*/ | |||||
public void closedAlarmChan(int AlarmHandle) | |||||
{ | |||||
if (AlarmHandle <= -1) | |||||
{ | |||||
System.out.println("设备未布防,请先布防!"); | |||||
return ; | |||||
} | |||||
if (!hCNetSDK.NET_DVR_CloseAlarmChan(AlarmHandle)) { | |||||
System.err.println("撤防失败,err "+hCNetSDK.NET_DVR_GetLastError()); | |||||
return; | |||||
} | |||||
System.out.println("撤防成功"); | |||||
return; | |||||
} | |||||
/** | |||||
* 报警布防V50接口 | |||||
* | |||||
* @param | |||||
*/ | |||||
public int setAlarmChanV50(int userID) { | |||||
if (userID == -1) { | |||||
System.out.println("请先注册"); | |||||
return -1; | |||||
} | |||||
if (lAlarmHandle < 0)//尚未布防,需要布防 | |||||
{ | |||||
//报警布防参数设置 | |||||
HCNetSDK.NET_DVR_SETUPALARM_PARAM_V50 m_strAlarmInfoV50 = new HCNetSDK.NET_DVR_SETUPALARM_PARAM_V50(); | |||||
m_strAlarmInfoV50.dwSize = m_strAlarmInfoV50.size(); | |||||
m_strAlarmInfoV50.byLevel = 0; //布防等级 | |||||
m_strAlarmInfoV50.byAlarmInfoType = 1; // 智能交通报警信息上传类型:0- 老报警信息(NET_DVR_PLATE_RESULT),1- 新报警信息(NET_ITS_PLATE_RESULT) | |||||
m_strAlarmInfoV50.byRetAlarmTypeV40 =1; //0- 移动侦测、视频丢失、遮挡、IO信号量等报警信息以普通方式上传(报警类型:COMM_ALARM_V30,报警信息结构体:NET_DVR_ALARMINFO_V30), | |||||
// 1- 报警信息以数据可变长方式上传(报警类型:COMM_ALARM_V40,报警信息结构体:NET_DVR_ALARMINFO_V40,设备若不支持则仍以普通方式上传) | |||||
m_strAlarmInfoV50.byDeployType = 0; //布防类型:0-客户端布防,1-实时布防 | |||||
m_strAlarmInfoV50.write(); | |||||
lAlarmHandle= hCNetSDK.NET_DVR_SetupAlarmChan_V50(userID, m_strAlarmInfoV50,Pointer.NULL,0); | |||||
if (lAlarmHandle == -1) { | |||||
System.err.println("布防失败,错误码为" + hCNetSDK.NET_DVR_GetLastError()); | |||||
return -1; | |||||
} else { | |||||
System.out.println("布防成功"); | |||||
return lAlarmHandle; | |||||
} | |||||
} else { | |||||
System.out.println("设备已经布防,请先撤防!"); | |||||
return lAlarmHandle; | |||||
} | |||||
} | |||||
/** | |||||
* 开启监听 | |||||
* | |||||
* @param ip 监听IP | |||||
* @param port 监听端口 | |||||
*/ | |||||
public int startListen(String ip, short port) { | |||||
if (lListenHandle <= 0){ | |||||
if (fMSFCallBack == null) { | |||||
fMSFCallBack = new FMSGCallBack(); | |||||
} | |||||
lListenHandle = hCNetSDK.NET_DVR_StartListen_V30(ip, port,fMSFCallBack, null); | |||||
if (lListenHandle == -1) { | |||||
System.out.println("监听失败" + hCNetSDK.NET_DVR_GetLastError()); | |||||
return -1; | |||||
} else { | |||||
System.out.println("监听成功"); | |||||
return lListenHandle; | |||||
} | |||||
}else { | |||||
System.out.println("监听已经开启,请先停止监听!"); | |||||
return lListenHandle; | |||||
} | |||||
} | |||||
/** | |||||
* 设备注销 | |||||
* @param | |||||
*/ | |||||
public void logoutDev(int userID) { | |||||
if (userID>-1) | |||||
{ | |||||
if (hCNetSDK.NET_DVR_Logout(userID)) { | |||||
System.out.println("注销成功"); | |||||
return; | |||||
} | |||||
}else | |||||
{ | |||||
System.out.println("设备未注册,请先注册"); | |||||
return; | |||||
} | |||||
return; | |||||
} | |||||
} |
@@ -1,17 +0,0 @@ | |||||
package com.iformall.haikang.alarm; | |||||
import com.iformall.haikang.alarm.common.HCNetSDK; | |||||
import com.sun.jna.Pointer; | |||||
/** | |||||
* @author jiangxin | |||||
* @create 2022-08-15-17:26 | |||||
*/ | |||||
public class FMSGCallBack implements HCNetSDK.FMSGCallBack { | |||||
//报警信息回调函数 | |||||
public void invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) { | |||||
AlarmDataParse.alarmDataHandle(lCommand, pAlarmer, pAlarmInfo, dwBufLen, pUser); | |||||
return; | |||||
} | |||||
} |
@@ -1,32 +0,0 @@ | |||||
package com.iformall.haikang.alarm; | |||||
import com.iformall.haikang.alarm.common.HCNetSDK; | |||||
import com.sun.jna.Pointer; | |||||
import java.io.FileNotFoundException; | |||||
import java.io.FileOutputStream; | |||||
import java.io.IOException; | |||||
import java.io.UnsupportedEncodingException; | |||||
import java.nio.ByteBuffer; | |||||
import java.text.SimpleDateFormat; | |||||
import java.util.Date; | |||||
import org.springframework.stereotype.Component; | |||||
@Component | |||||
public class FMSGCallBack_V31 implements HCNetSDK.FMSGCallBack_V31 { | |||||
//报警信息回调函数 | |||||
public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) { | |||||
AlarmDataParse.alarmDataHandle(lCommand, pAlarmer, pAlarmInfo, dwBufLen, pUser); | |||||
//AlarmDataParse.alarmDataHandle(HCNetSDK.COMM_ALARM_PDC, pAlarmer, pAlarmInfo, dwBufLen, pUser); | |||||
return true; | |||||
} | |||||
} | |||||
@@ -1,29 +0,0 @@ | |||||
package com.iformall.haikang.alarm.common; | |||||
/** | |||||
* @author | |||||
* @create 2022-03-22-11:13 | |||||
*/ | |||||
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; | |||||
} | |||||
} |
@@ -1,16 +0,0 @@ | |||||
package com.iformall.haikang.alarm.common; | |||||
/** | |||||
* @author | |||||
* @create 2022-01-19-16:40 | |||||
*/ | |||||
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"); | |||||
} | |||||
} |
@@ -1,49 +0,0 @@ | |||||
package com.iformall.haikang.face; | |||||
/** | |||||
* @Author: jiangxin14 | |||||
* @Date: 2024-08-09 15:05 | |||||
*/ | |||||
public class FaceLibManage { | |||||
/** | |||||
* 获取所有人脸库信息 | |||||
* @param userID | |||||
*/ | |||||
public static void getAllFaceLibInfo(int userID) | |||||
{ | |||||
String requestUrl = "GET /ISAPI/Intelligent/FDLib"; | |||||
String strOutXML = ISAPI.sdk_isapi(userID, requestUrl, ""); | |||||
System.out.println(strOutXML); | |||||
return; | |||||
} | |||||
/** | |||||
* 创建人脸库 | |||||
* @param userID | |||||
*/ | |||||
public static void setOneFaceLib(int userID) | |||||
{ | |||||
/*创建一个人脸库,创建成功的返回结果里面包含FDID*/ | |||||
String requestUrl = "POST /ISAPI/Intelligent/FDLib"; | |||||
String strOutXML = ISAPI.sdk_isapi(userID, requestUrl, FacePicManage.fDCreate_XmlCreat("9", "sdkceshi")); | |||||
System.out.println(strOutXML); | |||||
return; | |||||
} | |||||
/**删除一个人脸库 | |||||
/* DELETE /ISAPI/Intelligent/FDLib/<FDID>,FDID为人脸库ID | |||||
* 通过getAllFaceLib里面代码可以查询设备当前所有人脸库信息可以获取人脸库ID | |||||
*/ | |||||
public static void deleteOneFaceLib(int userID,String FDID) | |||||
{ | |||||
String requestUrl = "DELETE /ISAPI/Intelligent/FDLib/" + FDID; | |||||
String strOutXML = ISAPI.sdk_isapi(userID, requestUrl, ""); | |||||
System.out.println(strOutXML); | |||||
} | |||||
} |
@@ -1,214 +0,0 @@ | |||||
package com.iformall.haikang.face; | |||||
import com.iformall.haikang.face.common.HCNetSDK; | |||||
import com.iformall.haikang.face.common.osSelect; | |||||
import com.sun.jna.Native; | |||||
import org.dom4j.DocumentException; | |||||
import java.io.IOException; | |||||
import java.util.Scanner; | |||||
public class FaceMain { | |||||
static HCNetSDK hCNetSDK = null; | |||||
static int lUserID = -1;//用户句柄 | |||||
/** | |||||
* 根据不同操作系统选择不同的库文件和库路径 | |||||
* @return | |||||
*/ | |||||
private static boolean createSDKInstance() | |||||
{ | |||||
if(hCNetSDK == null) | |||||
{ | |||||
synchronized (HCNetSDK.class) | |||||
{ | |||||
String strDllPath = "C:\\project\\bjAirport\\bjairService\\lib\\kuwenjian"; | |||||
try | |||||
{ | |||||
//System.setProperty("jna.debug_load", "true"); | |||||
if(osSelect.isWindows()) | |||||
//win系统加载库路径 | |||||
strDllPath = System.getProperty("user.dir") + "\\lib\\HCNetSDK.dll"; | |||||
else if(osSelect.isLinux()) | |||||
//Linux系统加载库路径 | |||||
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 InterruptedException, IOException, DocumentException { | |||||
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()); | |||||
} | |||||
/*初始化*/ | |||||
hCNetSDK.NET_DVR_Init(); | |||||
/*加载日志*/ | |||||
hCNetSDK.NET_DVR_SetLogToFile(3, "./sdklog", false); | |||||
//设备登录 | |||||
lUserID=loginDevice("192.168.2.200",(short) 8000,"admin","wushikeji001"); //登录设备 | |||||
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]获取所有人脸库示例代码"); | |||||
FaceLibManage.getAllFaceLibInfo(lUserID); | |||||
break; | |||||
} | |||||
case "2": | |||||
{ | |||||
System.out.println("\n[Module]创建人脸库示例代码"); | |||||
FaceLibManage.setOneFaceLib(lUserID); | |||||
break; | |||||
} | |||||
case "3": | |||||
{ | |||||
//FDID人脸库ID调用getAllFaceLibInfo获取 | |||||
System.out.println("\n[Module]删除人脸库示例代码"); | |||||
FaceLibManage.deleteOneFaceLib(lUserID,"EC30695E85D8445AA72EFA1E85D03E52"); | |||||
break; | |||||
} | |||||
case "4": | |||||
{ | |||||
//上传人脸图片到指定人脸库 | |||||
System.out.println("\n[Module]上传人脸图片至指定人脸库代码"); | |||||
FacePicManage.uploadPic(lUserID,"0A1520C29E524490AE6100DB9E908099"); | |||||
break; | |||||
} | |||||
case "5": | |||||
{ | |||||
//通过指定人脸库ID和人员姓名进行查询 | |||||
System.out.println("\n[Module]查询指定人脸库中人脸信息代码"); | |||||
FacePicManage.searchPicInfo(lUserID); | |||||
break; | |||||
} | |||||
case "6": | |||||
{ | |||||
//人脸图片建模 | |||||
System.out.println("\n[Module]上次本地人脸图进行建模代码"); | |||||
FacePicManage.analysisImage(lUserID,".\\pic\\test.jpg"); | |||||
break; | |||||
} | |||||
case "7": | |||||
{ | |||||
//特征值搜图 | |||||
System.out.println("\n[Module]特征值搜图代码"); | |||||
FacePicManage.modeDataSearch(lUserID,"0A1520C29E524490AE6100DB9E908099"); | |||||
break; | |||||
} | |||||
case "8": | |||||
{ | |||||
//比对记录查询 | |||||
System.out.println("\n[Module]比对记录查询代码"); | |||||
FacePicManage.fcSearch(lUserID); | |||||
break; | |||||
} | |||||
default: | |||||
{ | |||||
System.out.println("\n未知的指令操作!请重新输入!\n"); | |||||
} | |||||
} | |||||
} | |||||
/*注销登录,程序退出时调用;程序同时对接多台设备时,每一台设备分别调用一次接口,传入不同的登录句柄*/ | |||||
if (lUserID>=0) | |||||
{ | |||||
hCNetSDK.NET_DVR_Logout(lUserID); | |||||
} | |||||
/*SDK反初始化,释放资源,程序退出时调用*/ | |||||
hCNetSDK.NET_DVR_Cleanup(); | |||||
} | |||||
/** | |||||
* 登录设备,支持 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; // 返回登录结果 | |||||
} | |||||
} |
@@ -1,371 +0,0 @@ | |||||
package com.iformall.haikang.face; | |||||
import com.iformall.haikang.face.common.CommonMethod; | |||||
import com.iformall.haikang.face.common.HCNetSDK; | |||||
import com.sun.jna.Pointer; | |||||
import com.sun.jna.ptr.IntByReference; | |||||
import org.dom4j.Document; | |||||
import org.dom4j.DocumentException; | |||||
import org.dom4j.DocumentHelper; | |||||
import org.dom4j.Element; | |||||
import java.io.*; | |||||
import java.util.Iterator; | |||||
import java.util.UUID; | |||||
/** | |||||
* 功能:人脸库图片上传 | |||||
*/ | |||||
public class FacePicManage { | |||||
static String ModeData; //图片建模数据 | |||||
//上传人脸图片 | |||||
public static void uploadPic(int lUserID, String FDID) throws IOException { | |||||
HCNetSDK.NET_DVR_FACELIB_COND struFaceLibCond = new HCNetSDK.NET_DVR_FACELIB_COND(); | |||||
struFaceLibCond.read(); | |||||
struFaceLibCond.dwSize = struFaceLibCond.size(); | |||||
//人脸库ID | |||||
for (int i = 0; i < HCNetSDK.NET_SDK_MAX_FDID_LEN; i++) | |||||
{ | |||||
struFaceLibCond.szFDID[i] = 0; | |||||
} | |||||
System.arraycopy(FDID.getBytes(), 0, struFaceLibCond.szFDID, 0, FDID.length()); | |||||
struFaceLibCond.byConcurrent = 0; //设备并发处理:0- 不开启(设备自动会建模),1- 开始(设备不会自动进行建模) | |||||
struFaceLibCond.byCover = 1; //是否覆盖式导入(人脸库存储满的情况下强制覆盖导入时间最久的图片数据):0- 否,1- 是 | |||||
struFaceLibCond.byCustomFaceLibID = 0; | |||||
struFaceLibCond.write(); | |||||
Pointer pStruFaceLibCond = struFaceLibCond.getPointer(); | |||||
int iUploadHandle = FaceMain.hCNetSDK.NET_DVR_UploadFile_V40(lUserID, HCNetSDK.IMPORT_DATA_TO_FACELIB, pStruFaceLibCond, | |||||
struFaceLibCond.size(), null, Pointer.NULL, 0); | |||||
if (iUploadHandle <= -1) { | |||||
int iErr = FaceMain.hCNetSDK.NET_DVR_GetLastError(); | |||||
System.err.println("NET_DVR_UploadFile_V40失败,错误号" + iErr); | |||||
return; | |||||
} else { | |||||
System.out.println("NET_DVR_UploadFile_V40成功"); | |||||
} | |||||
HCNetSDK.NET_DVR_SEND_PARAM_IN struSendParam = new HCNetSDK.NET_DVR_SEND_PARAM_IN(); | |||||
struSendParam.read(); | |||||
//本地jpg图片转成二进制byte数组 | |||||
byte[] picbyte = CommonMethod.toByteArray("./pic/test.jpeg"); | |||||
HCNetSDK.BYTE_ARRAY arraybyte = new HCNetSDK.BYTE_ARRAY(picbyte.length); | |||||
arraybyte.read(); | |||||
arraybyte.byValue = picbyte; | |||||
arraybyte.write(); | |||||
struSendParam.pSendData = arraybyte.getPointer(); | |||||
struSendParam.dwSendDataLen = picbyte.length; | |||||
struSendParam.byPicType = 1; //图片格式:1- jpg,2- bmp,3- png,4- SWF,5- GIF | |||||
//图片的附加信息缓冲区 图片上添加的属性信息,性别、身份等 | |||||
//1:xml文本导入方式 | |||||
/* byte[] AppendData = toByteArray("E:\\2.Demo汇总\\JAVA_DEMO\\01-Windows_Demo\\超脑人脸比对\\Test\\pic\\test.xml"); | |||||
HCNetSDK.BYTE_ARRAY byteArray = new HCNetSDK.BYTE_ARRAY(AppendData.length); | |||||
byteArray.read(); | |||||
byteArray.byValue = AppendData; | |||||
byteArray.write();*/ | |||||
//2:包含中文姓名的报文上传 | |||||
/** | |||||
<province>和<city>代表城市参数,城市代码参考:https://www.mca.gov.cn/mzsj/xzqh/2022/202201xzqh.html | |||||
例如:浙江省杭州市 编码为: 330100 XML报文节点应为:<province>33</province><city>01</city> | |||||
<certificateType> 证件号类型:[officerID#军官证,ID#身份证,passportID#护照,other#其他] | |||||
*/ | |||||
byte[] byFDLibName = "测试名称".getBytes("UTF-8"); | |||||
String strInBuffer1 = new String("<FaceAppendData version=\"2.0\" xmlns=\"http://www.hikvision.com/ver20/XMLSchema\"><bornTime>2014-12-12T00:00:00Z</bornTime><name>"); | |||||
String strInBuffer2 = new String("</name><sex>female</sex><province>11</province><city>01</city><certificateType>officerID</certificateType><certificateNumber>1123123123</certificateNumber><PersonInfoExtendList><PersonInfoExtend><id>1</id><enable>true</enable><name>test1</name><value>test2</value></PersonInfoExtend></PersonInfoExtendList></FaceAppendData>"); | |||||
int iStringSize = byFDLibName.length + strInBuffer1.length() + strInBuffer2.length(); | |||||
HCNetSDK.BYTE_ARRAY ptrByte = new HCNetSDK.BYTE_ARRAY(iStringSize); | |||||
System.arraycopy(strInBuffer1.getBytes(), 0, ptrByte.byValue, 0, strInBuffer1.length()); | |||||
System.arraycopy(byFDLibName, 0, ptrByte.byValue, strInBuffer1.length(), byFDLibName.length); | |||||
System.arraycopy(strInBuffer2.getBytes(), 0, ptrByte.byValue, strInBuffer1.length() + byFDLibName.length, strInBuffer2.length()); | |||||
ptrByte.write(); | |||||
struSendParam.pSendAppendData = ptrByte.getPointer(); | |||||
struSendParam.dwSendAppendDataLen = ptrByte.byValue.length; | |||||
struSendParam.write(); | |||||
int iSendData = FaceMain.hCNetSDK.NET_DVR_UploadSend(iUploadHandle, struSendParam, Pointer.NULL); | |||||
if (iSendData <= -1) { | |||||
int iErr = FaceMain.hCNetSDK.NET_DVR_GetLastError(); | |||||
System.err.println("NET_DVR_UploadSend失败,错误号" + iErr); | |||||
return; | |||||
} | |||||
while (true) { | |||||
IntByReference Pint = new IntByReference(0); | |||||
int state = FaceMain.hCNetSDK.NET_DVR_GetUploadState(iUploadHandle, Pint.getPointer()); | |||||
if (state == 1) { | |||||
System.out.println("上传成功"); | |||||
//获取图片ID | |||||
HCNetSDK.NET_DVR_UPLOAD_FILE_RET struUploadRet = new HCNetSDK.NET_DVR_UPLOAD_FILE_RET(); | |||||
boolean bUploadResult = FaceMain.hCNetSDK.NET_DVR_GetUploadResult(iUploadHandle, struUploadRet.getPointer(), struUploadRet.size()); | |||||
if (!bUploadResult) { | |||||
int iErr = FaceMain.hCNetSDK.NET_DVR_GetLastError(); | |||||
System.err.println("NET_DVR_GetUploadResult失败,错误号" + iErr); | |||||
} else { | |||||
struUploadRet.read(); | |||||
System.out.println("图片ID:" + new String(struUploadRet.sUrl, "UTF-8").trim()); | |||||
} | |||||
break; | |||||
} else if (state == 2) { | |||||
System.out.println("进度:" + Pint.getValue()); | |||||
continue; | |||||
} | |||||
System.err.println("返回值" + state); | |||||
break; | |||||
} | |||||
//关闭图片上传连接 | |||||
boolean b_Close = FaceMain.hCNetSDK.NET_DVR_UploadClose(iUploadHandle); | |||||
if (!b_Close) { | |||||
int iErr = FaceMain.hCNetSDK.NET_DVR_GetLastError(); | |||||
System.err.println("NET_DVR_UploadSend失败,错误号" + iErr); | |||||
return; | |||||
} | |||||
} | |||||
//上传人脸图片分析,获取建模数据 | |||||
public static String analysisImage(int lUserID,String fileName) throws IOException, DocumentException { | |||||
String sURL = "POST /ISAPI/Intelligent/analysisImage/face"; | |||||
HCNetSDK.BYTE_ARRAY stringRequest = new HCNetSDK.BYTE_ARRAY(1024); | |||||
stringRequest.read(); | |||||
stringRequest.byValue = sURL.getBytes(); | |||||
stringRequest.write(); | |||||
//读取二进制文件 | |||||
byte[] picbyte = CommonMethod.toByteArray(fileName); | |||||
HCNetSDK.BYTE_ARRAY byte_array = new HCNetSDK.BYTE_ARRAY(picbyte.length); | |||||
byte_array.read(); | |||||
byte_array.byValue = picbyte; | |||||
byte_array.write(); | |||||
HCNetSDK.NET_DVR_XML_CONFIG_INPUT struXMLInput = new HCNetSDK.NET_DVR_XML_CONFIG_INPUT(); | |||||
struXMLInput.read(); | |||||
struXMLInput.dwSize = struXMLInput.size(); | |||||
struXMLInput.lpRequestUrl = stringRequest.getPointer(); | |||||
struXMLInput.dwRequestUrlLen = sURL.length(); | |||||
struXMLInput.lpInBuffer = byte_array.getPointer(); //图片二进制数据 | |||||
struXMLInput.dwInBufferSize = byte_array.size(); | |||||
struXMLInput.write(); | |||||
HCNetSDK.BYTE_ARRAY stringXMLOut = new HCNetSDK.BYTE_ARRAY(8 * 1024); | |||||
stringXMLOut.read(); | |||||
HCNetSDK.BYTE_ARRAY struXMLStatus = new HCNetSDK.BYTE_ARRAY(1024); | |||||
struXMLStatus.read(); | |||||
HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT struXMLOutput = new HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT(); | |||||
struXMLOutput.read(); | |||||
struXMLOutput.dwSize = struXMLOutput.size(); | |||||
struXMLOutput.lpOutBuffer = stringXMLOut.getPointer(); | |||||
struXMLOutput.dwOutBufferSize = stringXMLOut.size(); | |||||
struXMLOutput.lpStatusBuffer = struXMLStatus.getPointer(); | |||||
struXMLOutput.dwStatusSize = struXMLStatus.size(); | |||||
struXMLOutput.write(); | |||||
if (!FaceMain.hCNetSDK.NET_DVR_STDXMLConfig(lUserID, struXMLInput, struXMLOutput)) { | |||||
int iErr = FaceMain.hCNetSDK.NET_DVR_GetLastError(); | |||||
System.err.println("NET_DVR_STDXMLConfig失败,错误号" + iErr); | |||||
return null; | |||||
} else { | |||||
stringXMLOut.read(); | |||||
System.out.println("输出文本大小:" + struXMLOutput.dwReturnedXMLSize); | |||||
//打印输出XML文本 | |||||
String strOutXML = new String(stringXMLOut.byValue).trim(); | |||||
System.out.println(strOutXML); | |||||
Document doc = null; | |||||
doc = DocumentHelper.parseText(strOutXML); // 将字符串转为XML | |||||
Element rootElt = doc.getRootElement(); // 获取根节点 | |||||
Iterator iter = rootElt.elementIterator("FaceContrastTarget"); // 获取根节点下的子节点FaceContrastTarget | |||||
while (iter.hasNext()) { | |||||
Element recordEle = (Element) iter.next(); | |||||
ModeData = recordEle.elementTextTrim("modeData"); // 拿到FaceContrastTarget节点下的子节点modeData值 | |||||
System.out.println("modeData:" + ModeData); | |||||
} | |||||
struXMLStatus.read(); | |||||
String strStatus = new String(struXMLStatus.byValue).trim(); | |||||
System.out.println(strStatus); | |||||
return ModeData; | |||||
} | |||||
} | |||||
/** | |||||
* 查询人脸库中指定人员信息 | |||||
* @param userID | |||||
*/ | |||||
public static void searchPicInfo(int userID) | |||||
{ | |||||
/*查询指定人脸库的人脸信息*/ | |||||
String requestUrl = "POST /ISAPI/Intelligent/FDLib/FDSearch"; | |||||
String HumanName = "测试人员"; //人员姓名 | |||||
String FDID = "0A1520C29E524490AE6100DB9E908099"; | |||||
String strOutXML = ISAPI.sdk_isapi(userID, requestUrl, FacePicManage.searchByName_XmlCreat(FDID, HumanName)); | |||||
System.out.println(strOutXML); | |||||
} | |||||
/** | |||||
*特征值搜图 | |||||
* @param userID | |||||
* @param FDID | |||||
* @throws DocumentException | |||||
* @throws IOException | |||||
*/ | |||||
public static void modeDataSearch(int userID,String FDID) throws DocumentException, IOException { | |||||
/**按照图片搜索*/ | |||||
String ModeData = FacePicManage.analysisImage(userID,".\\pic\\test.jpg");//上传图片分析,分析结果返回模型数据 | |||||
//使用模型数据检索人脸库 | |||||
String requestUrl = "POST /ISAPI/Intelligent/FDLib/FDSearch"; | |||||
String strOutXML = ISAPI.sdk_isapi(userID, requestUrl, FacePicManage.fDModeDate_XmlCreat(FDID, ModeData)); | |||||
System.out.println(strOutXML); | |||||
} | |||||
/** | |||||
* 此接口可以实现比对记录查询,抓怕记录查询 | |||||
* @param userID | |||||
*/ | |||||
public static void fcSearch(int userID){ | |||||
/**查询设备中存储的人脸比对结果信息*/ | |||||
String requestUrl = "POST /ISAPI/Intelligent/FDLib/FCSearch"; | |||||
String strOutXML = ISAPI.sdk_isapi(userID, requestUrl, CommonMethod.fCSearch_XmlCreat("0A1520C29E524490AE6100DB9E908099")); | |||||
System.out.println(strOutXML); | |||||
} | |||||
// 创建人脸库输入XML报文 | |||||
public static String fDCreate_XmlCreat(String ID, String Name) { | |||||
/*<CreateFDLibList version="2.0" xmlns="http://www.isapi.org/ver20/XMLSchema"> | |||||
<!--req,创建人脸比对库输入参数--> | |||||
<CreateFDLib> | |||||
<id> | |||||
<!--req, xs:integer,"表示list中子项个数,从"1"开始赋值,依次增加" --> | |||||
</id> | |||||
<name> | |||||
<!--opt, xs:string,"人脸比对库名称"--> | |||||
</name> | |||||
<thresholdValue> | |||||
<!--opt, xs:integer, "检测阈值,阈值越大检测准确率越低, 范围[0,100]"--> | |||||
</thresholdValue> | |||||
<customInfo> | |||||
<!--opt, xs:string, 人脸库附加信息--> | |||||
</customInfo> | |||||
<customFaceLibID> | |||||
<!--opt, xs:string, "自定义人脸库ID, 由上层下发给设备, 该ID由上层维护并确保唯一性, | |||||
设备侧需将自定义人脸库ID与设备生成的FDID进行关联, 确保上层可通过下发人脸库ID来替代下发FDID进行后续操作"--> | |||||
</customFaceLibID> | |||||
</CreateFDLib> | |||||
</CreateFDLibList>*/ | |||||
Document document1; | |||||
Element root = DocumentHelper.createElement("CreateFDLibList"); | |||||
document1 = DocumentHelper.createDocument(root); | |||||
Element CreateFDLib = root.addElement("CreateFDLib"); | |||||
Element id = CreateFDLib.addElement("id"); | |||||
id.setText(ID); | |||||
Element name = CreateFDLib.addElement("name"); | |||||
name.setText(Name); | |||||
Element thresholdValue = CreateFDLib.addElement("thresholdValue"); | |||||
thresholdValue.setText("70"); | |||||
String requestXml = document1.asXML(); | |||||
return requestXml; | |||||
} | |||||
//查询人脸比对库里的图片输入XML报文 | |||||
public static String fDModeDate_XmlCreat(String sFDID, String sModeData) { | |||||
Document document1; | |||||
Element root = DocumentHelper.createElement("FDSearchDescription"); | |||||
document1 = DocumentHelper.createDocument(root); | |||||
Element searchID = root.addElement("searchID"); | |||||
searchID.setText("C929433A-AD10-0001-CA62-1A701E0015F4"); | |||||
Element searchResultPosition = root.addElement("searchResultPosition"); | |||||
searchResultPosition.setText("0"); | |||||
Element maxResults = root.addElement("maxResults"); | |||||
maxResults.setText("50"); | |||||
Element FDID = root.addElement("FDID"); | |||||
FDID.setText(sFDID); | |||||
Element FaceModeList = root.addElement("FaceModeList"); | |||||
Element FaceMode = FaceModeList.addElement("FaceMode"); | |||||
Element ModeInfo = FaceMode.addElement("ModeInfo"); | |||||
Element similarity = ModeInfo.addElement("similarity"); | |||||
similarity.setText("80"); | |||||
Element modeData = ModeInfo.addElement("modeData"); | |||||
modeData.setText(sModeData); | |||||
String requestXml = document1.asXML(); | |||||
System.out.println(requestXml); | |||||
return requestXml; | |||||
} | |||||
//查询的人员输入报文 | |||||
//ID:人脸库ID | |||||
// Name: 人员姓名 | |||||
public static String searchByName_XmlCreat(String ID, String Name) { | |||||
/* <FDSearchDescription> | |||||
<searchID>C929433A-AD10-0001-CA62-1A701E0015F2</searchID> | |||||
<maxResults>50</maxResults> | |||||
<searchResultPosition>0</searchResultPosition> | |||||
<FDID>1135C03401404CC696F02B03F649ACFE</FDID> | |||||
<name>test</name> | |||||
<sex>male</sex> | |||||
<province>21</province> | |||||
<city>01</city> | |||||
</FDSearchDescription>*/ | |||||
Document document1; | |||||
Element root = DocumentHelper.createElement("FDSearchDescription"); | |||||
document1 = DocumentHelper.createDocument(root); | |||||
Element searchID = root.addElement("searchID"); | |||||
//每次查询条件不同,searchID保持不同 | |||||
searchID.setText(String.valueOf(UUID.randomUUID())); | |||||
Element maxResults = root.addElement("maxResults"); | |||||
maxResults.setText("50"); | |||||
Element searchResultPosition = root.addElement("searchResultPosition"); | |||||
searchResultPosition.setText("0"); | |||||
Element FDID = root.addElement("FDID"); | |||||
FDID.setText(ID); | |||||
//如果需要查询所有,查询报文取消name节点 | |||||
Element name = root.addElement("name"); | |||||
name.setText(Name); | |||||
String requestXml = document1.asXML(); | |||||
System.out.println(requestXml); | |||||
return requestXml; | |||||
} | |||||
//添加人脸附加信息报文 | |||||
public static String xmlFaceAppendData() throws UnsupportedEncodingException { | |||||
/* <FDSearchDescription> | |||||
<searchID>C929433A-AD10-0001-CA62-1A701E0015F2</searchID> | |||||
<maxResults>50</maxResults> | |||||
<searchResultPosition>0</searchResultPosition> | |||||
<FDID>1135C03401404CC696F02B03F649ACFE</FDID> | |||||
<name>test</name> | |||||
<sex>male</sex> | |||||
<province>21</province> | |||||
<city>01</city> | |||||
</FDSearchDescription>*/ | |||||
Document document1; | |||||
Element root = DocumentHelper.createElement("FaceAppendData"); | |||||
document1 = DocumentHelper.createDocument(root); | |||||
Element bornTime = root.addElement("bornTime"); | |||||
bornTime.setText("2020-12-12T00:00:00Z"); | |||||
Element name = root.addElement("name"); | |||||
name.setText("test"); | |||||
Element sex = root.addElement("sex"); | |||||
sex.setText("male"); | |||||
Element province = root.addElement("province"); | |||||
province.setText("11"); | |||||
Element city = root.addElement("city"); | |||||
city.setText("01"); | |||||
Element certificateType = root.addElement("certificateType"); | |||||
certificateType.setText("officerID"); | |||||
Element certificateNumber = root.addElement("certificateNumber"); | |||||
certificateNumber.setText("1123123123"); | |||||
Element PersonInfoExtendList = root.addElement("PersonInfoExtendList"); | |||||
Element PersonInfoExtend = PersonInfoExtendList.addElement("PersonInfoExtend"); | |||||
Element id = PersonInfoExtend.addElement("id"); | |||||
id.setText("1"); | |||||
Element enable = PersonInfoExtend.addElement("enable"); | |||||
enable.setText("1"); | |||||
Element name1 = PersonInfoExtend.addElement("name"); | |||||
name1.setText("1"); | |||||
Element value = PersonInfoExtend.addElement("value"); | |||||
value.setText("1"); | |||||
String requestXml = document1.asXML(); | |||||
System.out.println(requestXml); | |||||
return requestXml; | |||||
} | |||||
} |
@@ -1,182 +0,0 @@ | |||||
package com.iformall.haikang.face; | |||||
import com.iformall.haikang.face.common.CommonMethod; | |||||
import com.iformall.haikang.face.common.HCNetSDK; | |||||
import com.sun.jna.Pointer; | |||||
import com.sun.jna.ptr.IntByReference; | |||||
import java.io.IOException; | |||||
import java.io.UnsupportedEncodingException; | |||||
/** | |||||
* 自定义人脸库和自定义人脸ID集成流程 | |||||
* 自定义人脸图片所在的人脸库必须为私密库,人脸库增删时必须使用identityKey字段,不使用的话目前设备不支持增加,会导致无法检索和删除。 | |||||
*/ | |||||
public class FacePicManagebyCustom { | |||||
/** | |||||
* 自定义ID创建一个人脸库 | |||||
* @param lUserID | |||||
* @param identityKey 交互口令 | |||||
* @param name 人脸库名称 | |||||
* @param customlibid 人脸库自定义ID | |||||
* @throws UnsupportedEncodingException | |||||
* | |||||
*/ | |||||
public static void creatCustomFaceLib(int lUserID, String identityKey,String name, String customlibid ) throws UnsupportedEncodingException | |||||
{ | |||||
String result=ISAPI.sdk_isapi(lUserID,"POST /ISAPI/Intelligent/FDLib?FDType=custom&&identityKey="+identityKey,CommonMethod.xmlCreatCustomID("1",name,customlibid)); | |||||
System.out.println("创建自定义人脸库结果:"+result); | |||||
} | |||||
/** | |||||
* 查询自定义人脸库信息 | |||||
* @param lUserID | |||||
* @param identityKey | |||||
* @param customlibid | |||||
* @throws UnsupportedEncodingException | |||||
*/ | |||||
public static void getCustomFaceLib(int lUserID, String identityKey,String customlibid) throws UnsupportedEncodingException | |||||
{ | |||||
String result=ISAPI.sdk_isapi(lUserID,"GET /ISAPI/Intelligent/FDLib/"+customlibid+"?FDType=custom&&identityKey="+identityKey, ""); | |||||
System.out.println("获取自定义人脸库结果:"+result); | |||||
} | |||||
public static void delCustomFaceLib(int lUserID,String identityKey,String customlibid) throws UnsupportedEncodingException | |||||
{ | |||||
String result =ISAPI.sdk_isapi(lUserID,"DELETE /ISAPI/Intelligent/FDLib/"+customlibid+"?FDType=custom&&identityKey="+identityKey, ""); | |||||
System.out.println("删除自定义人脸库结果:"+result); | |||||
} | |||||
/** | |||||
* 自定义人脸库中添加自定义人脸ID | |||||
* @param lUserID | |||||
* @param customFDID | |||||
* @param IdentityKey | |||||
* @throws IOException | |||||
*/ | |||||
public static void uploadPicbycustomID(int lUserID, String customFDID,String IdentityKey ) throws IOException { | |||||
HCNetSDK.NET_DVR_FACELIB_COND struFaceLibCond = new HCNetSDK.NET_DVR_FACELIB_COND(); | |||||
struFaceLibCond.read(); | |||||
struFaceLibCond.dwSize = struFaceLibCond.size(); | |||||
struFaceLibCond.szFDID = customFDID.getBytes(); //人脸库ID | |||||
struFaceLibCond.byCustomFaceLibID=1; //人脸库ID是否是自定义:0- 不是,1- 是 | |||||
struFaceLibCond.byIdentityKey= IdentityKey.getBytes(); //交互操作口令 和自定义添加人脸库的IdentityKey保持一致 | |||||
struFaceLibCond.byConcurrent = 0; //设备并发处理:0- 不开启(设备自动会建模),1- 开始(设备不会自动进行建模) | |||||
struFaceLibCond.byCover = 1; //是否覆盖式导入(人脸库存储满的情况下强制覆盖导入时间最久的图片数据):0- 否,1- 是 | |||||
struFaceLibCond.write(); | |||||
Pointer pStruFaceLibCond = struFaceLibCond.getPointer(); | |||||
int iUploadHandle = FaceMain.hCNetSDK.NET_DVR_UploadFile_V40(lUserID, HCNetSDK.IMPORT_DATA_TO_FACELIB, pStruFaceLibCond, | |||||
struFaceLibCond.size(), null, Pointer.NULL, 0); | |||||
if (iUploadHandle <= -1) { | |||||
int iErr = FaceMain.hCNetSDK.NET_DVR_GetLastError(); | |||||
System.err.println("NET_DVR_UploadFile_V40失败,错误号" + iErr); | |||||
return; | |||||
} else { | |||||
System.out.println("NET_DVR_UploadFile_V40成功"); | |||||
} | |||||
HCNetSDK.NET_DVR_SEND_PARAM_IN struSendParam = new HCNetSDK.NET_DVR_SEND_PARAM_IN(); | |||||
struSendParam.read(); | |||||
//本地jpg图片转成二进制byte数组 | |||||
byte[] picbyte = CommonMethod.toByteArray(".\\pic\\test1.jpg"); | |||||
HCNetSDK.BYTE_ARRAY arraybyte = new HCNetSDK.BYTE_ARRAY(picbyte.length); | |||||
arraybyte.read(); | |||||
arraybyte.byValue = picbyte; | |||||
arraybyte.write(); | |||||
struSendParam.pSendData = arraybyte.getPointer(); | |||||
struSendParam.dwSendDataLen = picbyte.length; | |||||
struSendParam.byPicType = 1; //图片格式:1- jpg,2- bmp,3- png,4- SWF,5- GIF | |||||
struSendParam.sPicName = "test01".getBytes(); //图片名称 | |||||
//图片的附加信息缓冲区 图片上添加的属性信息,性别、身份等 | |||||
//1:xml文本导入方式 | |||||
/** byte[] AppendData = CommonMethod.toByteArray("..\\pic\\test.xml"); | |||||
HCNetSDK.BYTE_ARRAY byteArray = new HCNetSDK.BYTE_ARRAY(AppendData.length); | |||||
byteArray.read(); | |||||
byteArray.byValue = AppendData; | |||||
byteArray.write();*/ | |||||
/**2:包含中文姓名的报文上传 | |||||
<customHumanID>ID20220109</customHumanID> 表示自定义人脸ID*/ | |||||
byte[] byFDLibName = "测试名称".getBytes("UTF-8"); | |||||
String strInBuffer1 = new String("<FaceAppendData version=\"2.0\" xmlns=\"http://www.hikvision.com/ver20/XMLSchema\"><bornTime>2014-12-12T00:00:00Z</bornTime><name>"); | |||||
String strInBuffer2 = new String("</name><sex>female</sex><province>11</province><city>01</city><certificateType>officerID</certificateType><certificateNumber>1123123123</certificateNumber><PersonInfoExtendList><PersonInfoExtend><id>1</id><enable>false</enable><name>test1</name><value>test2</value></PersonInfoExtend></PersonInfoExtendList><customHumanID>ID20220109</customHumanID></FaceAppendData>"); | |||||
int iStringSize = byFDLibName.length + strInBuffer1.length() + strInBuffer2.length(); | |||||
HCNetSDK.BYTE_ARRAY ptrByte = new HCNetSDK.BYTE_ARRAY(iStringSize); | |||||
System.arraycopy(strInBuffer1.getBytes(), 0, ptrByte.byValue, 0, strInBuffer1.length()); | |||||
System.arraycopy(byFDLibName, 0, ptrByte.byValue, strInBuffer1.length(), byFDLibName.length); | |||||
System.arraycopy(strInBuffer2.getBytes(), 0, ptrByte.byValue, strInBuffer1.length() + byFDLibName.length, strInBuffer2.length()); | |||||
ptrByte.write(); | |||||
struSendParam.pSendAppendData = ptrByte.getPointer(); | |||||
struSendParam.dwSendAppendDataLen = ptrByte.byValue.length; | |||||
struSendParam.write(); | |||||
int iSendData = FaceMain.hCNetSDK.NET_DVR_UploadSend( iUploadHandle, struSendParam, Pointer.NULL); | |||||
if (iSendData <= -1) { | |||||
int iErr = FaceMain.hCNetSDK.NET_DVR_GetLastError(); | |||||
System.err.println("NET_DVR_UploadSend失败,错误号" + iErr); | |||||
return; | |||||
} | |||||
while (true) { | |||||
IntByReference Pint = new IntByReference(0); | |||||
int state = FaceMain.hCNetSDK.NET_DVR_GetUploadState(iUploadHandle, Pint.getPointer()); | |||||
if (state == 1) { | |||||
System.out.println("上传成功"); | |||||
//获取图片ID | |||||
HCNetSDK.NET_DVR_UPLOAD_FILE_RET struUploadRet = new HCNetSDK.NET_DVR_UPLOAD_FILE_RET(); | |||||
boolean bUploadResult = FaceMain.hCNetSDK.NET_DVR_GetUploadResult(iUploadHandle, struUploadRet.getPointer(), struUploadRet.size()); | |||||
if (!bUploadResult) { | |||||
int iErr = FaceMain.hCNetSDK.NET_DVR_GetLastError(); | |||||
System.err.println("NET_DVR_GetUploadResult失败,错误号" + iErr); | |||||
} else { | |||||
struUploadRet.read(); | |||||
System.out.println("图片ID:" + new String(struUploadRet.sUrl, "UTF-8")); | |||||
} | |||||
break; | |||||
} else if (state == 2) { | |||||
System.out.println("进度:" + Pint.getValue()); | |||||
continue; | |||||
} | |||||
System.err.println("返回值" + state); | |||||
break; | |||||
} | |||||
//关闭图片上传连接 | |||||
boolean b_Close = FaceMain.hCNetSDK.NET_DVR_UploadClose(iUploadHandle); | |||||
if (!b_Close) { | |||||
int iErr = FaceMain.hCNetSDK.NET_DVR_GetLastError(); | |||||
System.err.println("NET_DVR_UploadSend失败,错误号" + iErr); | |||||
return; | |||||
} | |||||
} | |||||
/** | |||||
* 根据自定义人脸ID查询人脸图片 | |||||
* @param lUserID | |||||
* @param customID 自定义人脸库ID | |||||
* @param customHumanID 自定义人脸ID | |||||
*@param identityKey 创建自定义人脸的交互口令 | |||||
* @throws UnsupportedEncodingException | |||||
*/ | |||||
public static void getFacePicBycustomID(int lUserID, String customID, String customHumanID,String identityKey) throws UnsupportedEncodingException { | |||||
String requestUrl = "GET /ISAPI/Intelligent/FDLib/" + customID + "/picture/" + customHumanID+"?FDType=custom&&identityKey="+identityKey; | |||||
String result=ISAPI.sdk_isapi(lUserID, requestUrl, ""); | |||||
System.out.println("查询自定义人脸图片结果:"+result); | |||||
} | |||||
public static void delFacePicBycustomID(int lUserID, String customID, String customHumanID,String identityKey) throws UnsupportedEncodingException | |||||
{ | |||||
String requestUrl = "DELETE /ISAPI/Intelligent/FDLib/" + customID + "/picture/" + customHumanID+"?FDType=custom&&identityKey="+identityKey; | |||||
String result=ISAPI.sdk_isapi(lUserID, requestUrl, ""); | |||||
System.out.println("删除自定义人脸图片结果:"+result); | |||||
} | |||||
} |
@@ -1,94 +0,0 @@ | |||||
package com.iformall.haikang.face; | |||||
import java.io.UnsupportedEncodingException; | |||||
import com.iformall.haikang.face.common.HCNetSDK; | |||||
/** | |||||
* 功能:透传接口实现,透传ISAPI命令 | |||||
*/ | |||||
public class ISAPI { | |||||
/** | |||||
* SDK透传ISAPI协议报文接口 | |||||
* @param lUserID | |||||
* @param url | |||||
* @param inputXml 输入报文 | |||||
* @return | |||||
* @throws UnsupportedEncodingException | |||||
*/ | |||||
public static String sdk_isapi(int lUserID, String url, String inputXml) { | |||||
String strOutXML = ""; | |||||
//输入参数 | |||||
HCNetSDK.NET_DVR_XML_CONFIG_INPUT struXMLInput = new HCNetSDK.NET_DVR_XML_CONFIG_INPUT(); | |||||
struXMLInput.read(); | |||||
struXMLInput.dwSize = struXMLInput.size(); | |||||
HCNetSDK.BYTE_ARRAY stringRequest = new HCNetSDK.BYTE_ARRAY(1024); | |||||
stringRequest.read(); | |||||
//输入ISAPI协议命令 批量查询人脸库命令:GET /ISAPI/Intelligent/FDLib | |||||
System.arraycopy(url.getBytes(), 0, stringRequest.byValue, 0, url.length()); | |||||
stringRequest.write(); | |||||
struXMLInput.lpRequestUrl = stringRequest.getPointer(); | |||||
struXMLInput.dwRequestUrlLen = url.length(); | |||||
//输入XML文本,GET命令不传输入文本 | |||||
int inputDataLen = 0; | |||||
try { | |||||
inputDataLen = inputXml.getBytes("UTF-8").length; | |||||
} catch (UnsupportedEncodingException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
if(inputDataLen > 0) | |||||
{ | |||||
HCNetSDK.BYTE_ARRAY stringInBuffer = new HCNetSDK.BYTE_ARRAY(inputDataLen); | |||||
stringInBuffer.read(); | |||||
try { | |||||
System.arraycopy(inputXml.getBytes("UTF-8"), 0, stringInBuffer.byValue, 0, inputDataLen); | |||||
} catch (UnsupportedEncodingException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
stringInBuffer.write(); | |||||
struXMLInput.lpInBuffer = stringInBuffer.getPointer(); | |||||
struXMLInput.dwInBufferSize = inputDataLen; | |||||
} | |||||
else | |||||
{ | |||||
struXMLInput.lpInBuffer = null; | |||||
struXMLInput.dwInBufferSize = 0; | |||||
} | |||||
struXMLInput.write(); | |||||
HCNetSDK.BYTE_ARRAY stringXMLOut = new HCNetSDK.BYTE_ARRAY(2*1024 * 1024); | |||||
stringXMLOut.read(); | |||||
HCNetSDK.BYTE_ARRAY struXMLStatus = new HCNetSDK.BYTE_ARRAY(1024); | |||||
struXMLStatus.read(); | |||||
HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT struXMLOutput = new HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT(); | |||||
struXMLOutput.read(); | |||||
struXMLOutput.dwSize = struXMLOutput.size(); | |||||
struXMLOutput.lpOutBuffer = stringXMLOut.getPointer(); | |||||
struXMLOutput.dwOutBufferSize = stringXMLOut.size(); | |||||
struXMLOutput.lpStatusBuffer = struXMLStatus.getPointer(); | |||||
struXMLOutput.dwStatusSize = struXMLStatus.size(); | |||||
struXMLOutput.write(); | |||||
if (!FaceMain.hCNetSDK.NET_DVR_STDXMLConfig(lUserID, struXMLInput, struXMLOutput)) { | |||||
int iErr = FaceMain.hCNetSDK.NET_DVR_GetLastError(); | |||||
System.err.println("NET_DVR_STDXMLConfig失败,错误号: " + iErr + ",URL: " + url); | |||||
return null; | |||||
} else { | |||||
stringXMLOut.read(); | |||||
System.out.println("输出文本大小:" + struXMLOutput.dwReturnedXMLSize); | |||||
//打印输出XML文本 | |||||
strOutXML = new String(stringXMLOut.byValue).trim(); | |||||
//System.out.println(strOutXML); | |||||
struXMLStatus.read(); | |||||
String strStatus = new String(struXMLStatus.byValue).trim(); | |||||
System.out.println(strStatus); | |||||
return strOutXML; | |||||
} | |||||
} | |||||
} |
@@ -1,123 +0,0 @@ | |||||
package com.iformall.haikang.face.common; | |||||
import org.dom4j.Document; | |||||
import org.dom4j.DocumentHelper; | |||||
import org.dom4j.Element; | |||||
import java.io.*; | |||||
import java.util.UUID; | |||||
public class CommonMethod { | |||||
/** | |||||
* 读取本地文件到数组中 | |||||
* | |||||
* @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(); | |||||
} | |||||
} | |||||
//int 转化为字节数组 | |||||
public static byte[] intTobyte2(int num) | |||||
{ | |||||
byte[] result=null; | |||||
ByteArrayOutputStream bos=new ByteArrayOutputStream(); | |||||
DataOutputStream dos=new DataOutputStream(bos); | |||||
try { | |||||
dos.writeInt(num); | |||||
result=bos.toByteArray(); | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
return result; | |||||
} | |||||
// 创建人脸库输入XML报文 | |||||
public static String xmlCreatCustomID(String ID, String Name,String customFaceLibID ) { | |||||
/*<CreateFDLibList version="2.0" xmlns="http://www.isapi.org/ver20/XMLSchema"> | |||||
<!--req,创建人脸比对库输入参数--> | |||||
<CreateFDLib> | |||||
<id> | |||||
<!--req, xs:integer,"表示list中子项个数,从"1"开始赋值,依次增加" --> | |||||
</id> | |||||
<name> | |||||
<!--opt, xs:string,"人脸比对库名称"--> | |||||
</name> | |||||
<thresholdValue> | |||||
<!--opt, xs:integer, "检测阈值,阈值越大检测准确率越低, 范围[0,100]"--> | |||||
</thresholdValue> | |||||
<customInfo> | |||||
<!--opt, xs:string, 人脸库附加信息--> | |||||
</customInfo> | |||||
<customFaceLibID> | |||||
<!--opt, xs:string, "自定义人脸库ID, 由上层下发给设备, 该ID由上层维护并确保唯一性, | |||||
设备侧需将自定义人脸库ID与设备生成的FDID进行关联, 确保上层可通过下发人脸库ID来替代下发FDID进行后续操作"--> | |||||
</customFaceLibID> | |||||
</CreateFDLib> | |||||
</CreateFDLibList>*/ | |||||
Document document1; | |||||
Element root = DocumentHelper.createElement("CreateFDLibList"); | |||||
document1 = DocumentHelper.createDocument(root); | |||||
Element CreateFDLib = root.addElement("CreateFDLib"); | |||||
Element id = CreateFDLib.addElement("id"); | |||||
id.setText(ID); | |||||
Element name = CreateFDLib.addElement("name"); | |||||
name.setText(Name); | |||||
Element thresholdValue = CreateFDLib.addElement("thresholdValue"); | |||||
thresholdValue.setText("70"); | |||||
Element CustomFaceLibID = CreateFDLib.addElement("customFaceLibID"); | |||||
CustomFaceLibID.setText(customFaceLibID); | |||||
String requestXml = document1.asXML(); | |||||
return requestXml; | |||||
} | |||||
//查询人脸比对数据的输入XML报文 | |||||
public static String fCSearch_XmlCreat(String fPID) { | |||||
Document document1; | |||||
Element root = DocumentHelper.createElement("FCSearchDescription"); | |||||
document1 = DocumentHelper.createDocument(root); | |||||
Element searchID = root.addElement("searchID"); | |||||
searchID.setText(String.valueOf(UUID.randomUUID())); | |||||
Element searchResultPosition = root.addElement("searchResultPosition"); | |||||
searchResultPosition.setText("0"); | |||||
Element maxResults = root.addElement("maxResults"); | |||||
maxResults.setText("50"); | |||||
Element FDID = root.addElement("FDID"); | |||||
FDID.setText(fPID); | |||||
Element snapStartTime = root.addElement("snapStartTime"); | |||||
snapStartTime.setText("2024-08-01T17:00:00Z"); | |||||
Element snapEndTime = root.addElement("snapEndTime"); | |||||
snapEndTime.setText("2024-08-09T11:53:00Z"); | |||||
Element faceMatchInfoEnable = root.addElement("faceMatchInfoEnable"); | |||||
faceMatchInfoEnable.setText("true"); | |||||
Element eventType = root.addElement("eventType"); | |||||
eventType.setText("whiteFaceContrast"); | |||||
Element sortord = root.addElement("sortord"); | |||||
sortord.setText("time"); | |||||
String requestXml = document1.asXML(); | |||||
return requestXml; | |||||
} | |||||
} |
@@ -1,16 +0,0 @@ | |||||
package com.iformall.haikang.face.common; | |||||
/** | |||||
* @author jiangxin | |||||
* @create 2022-01-19-16:40 | |||||
*/ | |||||
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"); | |||||
} | |||||
} |