Commit e9c21db6 authored by 赵啸非's avatar 赵啸非

添加海康人员查询接口

parent a888b865
...@@ -18,8 +18,14 @@ ...@@ -18,8 +18,14 @@
<outputDirectory>boot</outputDirectory> <outputDirectory>boot</outputDirectory>
<fileMode>0755</fileMode> <fileMode>0755</fileMode>
</fileSet> </fileSet>
<fileSet>
<directory>${project.parent.basedir}/lib</directory>
<outputDirectory>lib</outputDirectory>
<fileMode>0755</fileMode>
</fileSet>
<fileSet> <fileSet>
<directory>./db</directory> <directory>${project.parent.basedir}/db</directory>
<includes> <includes>
<include>*.sql</include> <include>*.sql</include>
</includes> </includes>
......
...@@ -35,7 +35,7 @@ import java.util.stream.Collectors; ...@@ -35,7 +35,7 @@ import java.util.stream.Collectors;
* 同步获取下午海康门禁事件 * 同步获取下午海康门禁事件
*/ */
@Slf4j @Slf4j
@Service("SyncDoorsEventAfterTask") //@Service("SyncDoorsEventAfterTask")
public class SyncDoorsEventAfterTaskImpl implements ITaskExcuteService { public class SyncDoorsEventAfterTaskImpl implements ITaskExcuteService {
@Autowired @Autowired
......
...@@ -39,7 +39,7 @@ import java.util.stream.Collectors; ...@@ -39,7 +39,7 @@ import java.util.stream.Collectors;
* 同步获取当天海康门禁事件 * 同步获取当天海康门禁事件
*/ */
@Slf4j @Slf4j
@Service("SyncDoorsEventTask") //@Service("SyncDoorsEventTask")
public class SyncDoorsEventTaskImpl implements ITaskExcuteService { public class SyncDoorsEventTaskImpl implements ITaskExcuteService {
@Autowired @Autowired
......
...@@ -38,7 +38,7 @@ import java.util.stream.Collectors; ...@@ -38,7 +38,7 @@ import java.util.stream.Collectors;
* 同步海康用户 * 同步海康用户
*/ */
@Slf4j @Slf4j
@Service("SyncUserTask") //@Service("SyncUserTask")
public class SyncUserTaskImpl implements ITaskExcuteService { public class SyncUserTaskImpl implements ITaskExcuteService {
@Autowired @Autowired
......
...@@ -100,7 +100,7 @@ public class AcsMain { ...@@ -100,7 +100,7 @@ public class AcsMain {
/**门禁主机参数设置(获取)*/ /**门禁主机参数设置(获取)*/
ACSManage.acsCfg(lUserID); // ACSManage.acsCfg(lUserID);
/**获取门禁主机工作状态*/ /**获取门禁主机工作状态*/
// ACSManage.getAcsStatus(lUserID); // ACSManage.getAcsStatus(lUserID);
...@@ -118,7 +118,7 @@ public class AcsMain { ...@@ -118,7 +118,7 @@ public class AcsMain {
/** /**
* 删除人员 * 删除人员
*/ */
// UserManage.deleteUserInfo(lUserID); UserManage.deleteUserInfo(lUserID);
/**获取所有卡*/ /**获取所有卡*/
// CardManage.getAllCard(lUserID); // CardManage.getAllCard(lUserID);
......
package com.mortals.xhx.module.hik; package com.mortals.xhx.module.hik;
import com.hikvision.artemis.sdk.config.ArtemisConfig; import com.hikvision.artemis.sdk.config.ArtemisConfig;
import com.mortals.xhx.hikdoor.Commom.osSelect;
import com.mortals.xhx.hikdoor.NetSDKDemo.HCNetSDK;
import com.mortals.xhx.module.door.model.DoorEntity;
import com.sun.jna.Native;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@Slf4j
public abstract class AbstractHikService { public abstract class AbstractHikService {
@Value("${hik.host:}") @Value("${hik.host:}")
...@@ -23,6 +29,111 @@ public abstract class AbstractHikService { ...@@ -23,6 +29,111 @@ public abstract class AbstractHikService {
public String ARTEMIS_PATH = "/artemis"; public String ARTEMIS_PATH = "/artemis";
protected Map<String, String> path = new HashMap<>(2); protected Map<String, String> path = new HashMap<>(2);
// int lUserID = -1;//用户句柄
static int iCharEncodeType = 0; //设备字符集
protected HCNetSDK createSDKInstance() {
HCNetSDK hCNetSDK = null;
if (hCNetSDK == null) {
synchronized (HCNetSDK.class) {
String strDllPath = "";
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) {
log.error("loadLibrary: " + strDllPath + " Error: " + ex.getMessage());
return hCNetSDK;
}
}
}
return hCNetSDK;
}
/**
* 返回用户句柄
*
* @param hCNetSDK
* @return
*/
public HCNetSDK initLoadSdk(HCNetSDK hCNetSDK) {
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(3, ptrByteArray1.getPointer());
System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length());
ptrByteArray2.write();
hCNetSDK.NET_DVR_SetSDKInitCfg(4, 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(2, struComPath.getPointer());
}
/**初始化*/
hCNetSDK.NET_DVR_Init();
/**加载日志*/
boolean i = hCNetSDK.NET_DVR_SetLogToFile(3, "./sdklog", false);
return hCNetSDK;
}
protected int login(HCNetSDK hCNetSDK, DoorEntity doorEntity) {
int lUserID = -1;//用户句柄
//注册
HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();//设备登录信息
String m_sDeviceIP = doorEntity.getIp();//设备ip地址
m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());
String m_sUsername = doorEntity.getUsername();//设备用户名
m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());
String m_sPassword = doorEntity.getPassword();//设备密码
m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());
m_strLoginInfo.wPort = doorEntity.getPort().shortValue(); //sdk端口
m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是
m_strLoginInfo.write();
HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();//设备信息
lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
if (lUserID == -1) {
log.info("登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError());
return lUserID;
} else {
log.info("登录成功!");
m_strDeviceInfo.read();
iCharEncodeType = m_strDeviceInfo.byCharEncodeType;
return lUserID;
}
}
/**
* 登出操作
*/
public void logout(HCNetSDK hCNetSDK, int lUserID) {
/**登出和清理,释放SDK资源*/
if (lUserID >= 0) {
hCNetSDK.NET_DVR_Logout(lUserID);
}
}
protected ArtemisConfig getArtemisConfig() { protected ArtemisConfig getArtemisConfig() {
......
package com.mortals.xhx.module.hik.staff.model.req.org;
import lombok.Data;
@Data
public class OrgListReq{
private String orgName;
private String orgIndexCodes;
private int pageNo;
private int pageSize;
}
\ No newline at end of file
package com.mortals.xhx.module.hik.staff.model.req.person;
import com.mortals.xhx.module.hik.BaseReq;
import lombok.Data;
import java.io.Serializable;
@Data
public class PersonReq extends BaseReq implements Serializable {
/**
* 当前页
*/
private Integer pageNo;
/**
* 每页大小
*/
private Integer pageSize;
}
package com.mortals.xhx.module.hik.staff.model.rsp.org;
import lombok.Data;
import java.util.List;
@Data
public class OrgDataInfo {
private List<OrgInfo> list;
private Integer total;
private Integer totalPage;
private Integer pageNo;
}
package com.mortals.xhx.module.hik.staff.model.rsp.org;
import lombok.Data;
@Data
public class OrgInfo {
private String orgName;
private String orgNo;
private String orgPath;
private String parentOrgIndexCode;
private String orgIndexCode;
private String updateTime;
private String parentOrgName;
}
\ No newline at end of file
package com.mortals.xhx.module.hik.staff.model.rsp.person;
import lombok.Data;
import java.util.List;
@Data
public class PersonDataInfo {
private List<PersonInfo> list;
private Integer total;
private Integer totalPage;
private Integer pageNo;
}
package com.mortals.xhx.module.hik.staff.model.rsp.person;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import java.util.Date;
@Data
public class PersonInfo{
private String personId;
private String personName;
private int gender;
private String orgPath;
private String orgIndexCode;
private String orgName;
private int certificateType;
private String certificateNo;
@JSONField(format = "yyyy-MM-dd'T'HH:mm:ssXXX")
private Date updateTime;
private String phoneNo;
private PersonPhoto personPhoto;
private String jobNo;
}
\ No newline at end of file
package com.mortals.xhx.module.hik.staff.model.rsp.person;
import lombok.Data;
@Data
public class PersonPhoto{
private String personPhotoIndexCode;
private String picUri;
private String personId;
private String serverIndexCode;
}
\ No newline at end of file
package com.mortals.xhx.module.hik.staff.model.rsp.staff;
import lombok.Data;
@Data
public class StaffInfo {
private String employeeNo;
private String name;
private String gender;
private String userType;
private String password;
private String belongGroup;
private int numOfCard;
private int numOfFace;
}
\ No newline at end of file
package com.mortals.xhx.module.hik.staff.model.rsp.staff;
import com.alibaba.fastjson.annotation.JSONField;
import com.mortals.xhx.module.hik.staff.model.rsp.person.PersonInfo;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class ValidInfo {
private Boolean enable;
@JSONField(format = "yyyy-MM-dd'T'HH:mm:ss")
private Date beginTime;
@JSONField(format = "yyyy-MM-dd'T'HH:mm:ss")
private Date endTime;
}
package com.mortals.xhx.module.hik.staff.service;
import com.mortals.framework.common.Rest;
import com.mortals.xhx.module.door.model.DoorEntity;
import com.mortals.xhx.module.hik.staff.model.req.person.PersonReq;
import com.mortals.xhx.module.hik.staff.model.rsp.person.PersonDataInfo;
/**
* 海康人员接口对接类
*
* @author:
* @date: 2023/4/12 17:47
*/
public interface IHikStaffService {
/**
* 获取人员接口
*
* @param personReq
* @return
*/
Rest<PersonDataInfo> getPersonList(PersonReq personReq, DoorEntity doorEntity);
/**
* 获取所有人员接口
*
* @return
*/
Rest<PersonDataInfo> getAllPersonList(DoorEntity doorEntity);
}
package com.mortals.xhx.module.hik.staff.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import com.mortals.framework.common.Rest;
import com.mortals.xhx.hikdoor.Acs.AcsMain;
import com.mortals.xhx.hikdoor.NetSDKDemo.HCNetSDK;
import com.mortals.xhx.module.door.model.DoorEntity;
import com.mortals.xhx.module.hik.AbstractHikService;
import com.mortals.xhx.module.hik.HikApiRest;
import com.mortals.xhx.module.hik.staff.model.req.person.PersonReq;
import com.mortals.xhx.module.hik.staff.model.rsp.person.PersonDataInfo;
import com.mortals.xhx.module.hik.staff.service.IHikStaffService;
import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j;
import org.json.JSONObject;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
/**
* 海康人员接口类
*
* @author: zxfei
* @date: 2023/4/12 17:51
*/
@Service("hikStaffService")
@Slf4j
public class HikStaffServiceImpl extends AbstractHikService implements IHikStaffService {
//查询所有人员
@Override
public Rest<PersonDataInfo> getPersonList(PersonReq personReq, DoorEntity doorEntity) {
//todo 新的链接设备
HCNetSDK hCNetSDK = createSDKInstance();
initLoadSdk(hCNetSDK);
int userID = login(hCNetSDK, doorEntity);
HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组
String strInBuffer = "POST /ISAPI/AccessControl/UserInfo/Search?format=json";
System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
ptrByteArray.write();
int lHandler = hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
if(lHandler < 0){
log.info("SearchUserInfo NET_DVR_StartRemoteConfig 失败,错误码为"+hCNetSDK.NET_DVR_GetLastError());
}
else{
//组装查询的JSON报文,这边查询的是所有的人员
JSONObject jsonObject = new JSONObject();
JSONObject jsonSearchCond = new JSONObject();
//如果需要查询指定的工号人员信息,把下面注释的内容去除掉即可
/* JSONArray EmployeeNoList = new JSONArray();
JSONObject employeeNo1 = new JSONObject();
employeeNo1.put("employeeNo", "12346");
JSONObject employeeNo2 = new JSONObject();
employeeNo2.put("employeeNo", "1000");
EmployeeNoList.put(employeeNo1);
EmployeeNoList.put(employeeNo2);
jsonSearchCond.put("EmployeeNoList", EmployeeNoList);*/
jsonSearchCond.put("searchID", "20211126");
jsonSearchCond.put("searchResultPosition", 0);
jsonSearchCond.put("maxResults", 150);
jsonObject.put("UserInfoSearchCond", jsonSearchCond);
String strInbuff = jsonObject.toString();
log.info("查询的json报文:" + strInbuff);
//把string传递到Byte数组中,后续用.getPointer()方法传入指针地址中。
HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(strInbuff.length());
System.arraycopy(strInbuff.getBytes(), 0, ptrInbuff.byValue, 0, strInbuff.length());
ptrInbuff.write();
//定义接收结果的结构体
HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(1024*1024);
IntByReference pInt = new IntByReference(0);
while(true){
int dwState = hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInbuff.getPointer(), strInbuff.length(), ptrOutuff.getPointer(), 1024*1024, pInt);
System.out.println(dwState);
if(dwState == -1){
System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
break;
}
else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT)
{
System.out.println("配置等待");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
continue;
}
else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED)
{
System.out.println("查询人员失败");
break;
}
else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION)
{
System.out.println("查询人员异常");
break;
}
else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS)
{
ptrOutuff.read();
System.out.println("查询人员成功, json:" + new String(ptrOutuff.byValue).trim());
break;
}
else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
System.out.println("获取人员完成");
break;
}
}
if(!hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)){
System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
}
else{
System.out.println("NET_DVR_StopRemoteConfig接口成功");
lHandler = -1;
}
}
ArtemisConfig config = getArtemisConfig();
String getCamsApi = ARTEMIS_PATH + "/api/resource/v1/person/personList";
Map<String, String> path = new HashMap<>(2);
path.put(protocol, getCamsApi);
try {
String respJson = ArtemisHttpUtil.doPostStringArtemis(config, path, JSON.toJSONString(personReq), null, null, "application/json");
log.info("person resp=>{}", respJson);
HikApiRest<PersonDataInfo> rest = JSON.parseObject(respJson, new TypeReference<HikApiRest<PersonDataInfo>>() {
});
if ("0".equals(rest.getCode())) {
return Rest.ok(rest.getData());
} else {
log.info("person error resp=>{}", respJson);
return Rest.fail(rest.getMsg());
}
} catch (Exception e) {
log.error("获取人员异常", e);
return Rest.fail(e.getMessage());
}
}
@Override
public Rest<PersonDataInfo> getAllPersonList(DoorEntity doorEntity) {
return null;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment