You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

435 lines
14 KiB

  1. package com.yzx.impl;
  2. import com.netsdk.common.Res;
  3. import com.netsdk.demo.frame.Gate.CardManegerDialog;
  4. import com.netsdk.demo.module.DeviceLogModule;
  5. import com.netsdk.demo.module.GateModule;
  6. import com.netsdk.demo.module.LoginModule;
  7. import com.netsdk.demo.module.TalkModule;
  8. import com.netsdk.lib.NetSDKLib;
  9. import com.netsdk.lib.ToolKits;
  10. import com.netsdk.lib.structure.DH_DEVICE_LOG_ITEM_EX;
  11. import com.netsdk.lib.structure.NET_TIME;
  12. import com.sun.jna.Memory;
  13. import com.sun.jna.Pointer;
  14. import com.yzx.IHardwareEquipment;
  15. import com.yzx.pojo.FaceRecrodInfo;
  16. import com.yzx.pojo.UserFaceInfo;
  17. import javax.imageio.ImageIO;
  18. import javax.swing.*;
  19. import java.awt.image.BufferedImage;
  20. import java.io.ByteArrayInputStream;
  21. import java.io.File;
  22. import java.io.IOException;
  23. import java.io.UnsupportedEncodingException;
  24. import java.util.*;
  25. public class DaHua implements IHardwareEquipment {
  26. // 设备断线通知回调
  27. private static DisConnect disConnect = new DisConnect();
  28. // 网络连接恢复
  29. private static HaveReConnect haveReConnect = new HaveReConnect();
  30. // 订阅句柄
  31. public static NetSDKLib.LLong m_hAttachHandle = new NetSDKLib.LLong(0);
  32. private AnalyzerDataCB analyzerCallback = new AnalyzerDataCB();
  33. private HardwareEquipmentInfo info;
  34. static{
  35. //初始化
  36. LoginModule.init(disConnect, haveReConnect); // 打开工程,初始化
  37. }
  38. public DaHua(HardwareEquipmentInfo info){
  39. this.info = info;
  40. }
  41. public boolean openDoor(){
  42. this.login(info.getIp(),info.getPort(),info.getUsername(),info.getPassword());
  43. NetSDKLib.NET_CTRL_ACCESS_OPEN openInfo = new NetSDKLib.NET_CTRL_ACCESS_OPEN();
  44. openInfo.nChannelID = 0;
  45. openInfo.emOpenDoorType = NetSDKLib.EM_OPEN_DOOR_TYPE.EM_OPEN_DOOR_TYPE_REMOTE;
  46. Pointer pointer = new Memory(openInfo.size());
  47. ToolKits.SetStructDataToPointer(openInfo, pointer, 0);
  48. boolean ret = LoginModule.netsdk.CLIENT_ControlDeviceEx(LoginModule.m_hLoginHandle,
  49. NetSDKLib.CtrlType.CTRLTYPE_CTRL_ACCESS_OPEN, pointer, null, 10000);
  50. if (!ret) {
  51. return false;
  52. }
  53. this.logout();
  54. return true;
  55. }
  56. /**
  57. * 获取系统日志
  58. * @param startTime 开始时间格式 yyyy/MM/dd/hh/mm/ss
  59. * @param endTime 结束时间格式 yyyy/MM/dd/hh/mm/ss
  60. * @return
  61. */
  62. public boolean getSystemLog(String startTime,String endTime){
  63. this.login(info.getIp(),info.getPort(),info.getUsername(),info.getPassword());
  64. NET_TIME netTimeStart = new NET_TIME(startTime);
  65. NET_TIME netTimeEnd = new NET_TIME(endTime);
  66. DH_DEVICE_LOG_ITEM_EX[] systemLog = DeviceLogModule.getSystemLog(netTimeStart, netTimeEnd);
  67. //退出登录
  68. this.logout();
  69. return true;
  70. }
  71. /**
  72. * 获取开门记录
  73. * @param time
  74. * @return
  75. */
  76. public List<FaceRecrodInfo> getAllRecord(NetSDKLib.NET_TIME time){
  77. List<FaceRecrodInfo> faceRecrodInfoList = new ArrayList<>();
  78. this.login(info.getIp(),info.getPort(),info.getUsername(),info.getPassword());
  79. int count = 0;
  80. int index = 0;
  81. int nFindCount = 100;
  82. // 日期: 为空,查询所有开门信息
  83. // 获取查询句柄
  84. if(!GateModule.findRecord(time)) {
  85. return faceRecrodInfoList;
  86. }
  87. // 查询具体信息
  88. while(true) {
  89. NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARDREC[] pstRecord = GateModule.findNextRecord(nFindCount);
  90. if(pstRecord == null) {
  91. break;
  92. }
  93. for(int i = 0; i < pstRecord.length; i++) {
  94. index = i + count * nFindCount;
  95. try {
  96. FaceRecrodInfo faceRecrodInfo = new FaceRecrodInfo();
  97. faceRecrodInfo.setIndex(index);
  98. faceRecrodInfo.setRecordNo(pstRecord[i].nRecNo);
  99. faceRecrodInfo.setCardNo(new String(pstRecord[i].szCardNo));
  100. faceRecrodInfo.setEmployeeNo(new String(pstRecord[i].szUserID).trim());
  101. faceRecrodInfo.setEmployeeName(new String(pstRecord[i].szCardName, "GBK").trim());
  102. faceRecrodInfo.setTime(pstRecord[i].stuTime.toStringTimeEx());
  103. faceRecrodInfo.setSnapUrl(new String(pstRecord[i].szSnapFtpUrl).trim());
  104. faceRecrodInfoList.add(faceRecrodInfo);
  105. } catch (UnsupportedEncodingException e) {
  106. e.printStackTrace();
  107. }
  108. }
  109. if (pstRecord.length < nFindCount) {
  110. break;
  111. } else {
  112. count ++;
  113. }
  114. }
  115. // 关闭查询接口
  116. GateModule.findRecordClose();
  117. //退出登录
  118. this.logout();
  119. return faceRecrodInfoList;
  120. }
  121. /**
  122. * 添加或修改用户
  123. * @return
  124. */
  125. public boolean addOrEditPersion(UserFaceInfo userFaceInfo){
  126. this.login(info.getIp(),info.getPort(),info.getUsername(),info.getPassword());
  127. //查询用户
  128. String employeeNo = userFaceInfo.getEmployeeNo();
  129. int recordNo = this.findRecordNo(employeeNo);
  130. if(recordNo != 0){//编辑
  131. if(this.updateUserCard(userFaceInfo) && this.updateUserFace(employeeNo,userFaceInfo.getImageBytes())){
  132. return true;
  133. }
  134. }else{//添加
  135. if(this.addUserCard(userFaceInfo) && this.updateUserFace(employeeNo,userFaceInfo.getImageBytes())){
  136. return true;
  137. }
  138. }
  139. this.logout();
  140. return false;
  141. }
  142. public boolean deletePerson(UserFaceInfo userFaceInfo){
  143. this.login(info.getIp(),info.getPort(),info.getUsername(),info.getPassword());
  144. //查询用户
  145. String employeeNo = userFaceInfo.getEmployeeNo();
  146. int recordNo = this.findRecordNo(employeeNo);
  147. if(recordNo != 0){
  148. if(GateModule.deleteCard(recordNo) && GateModule.deleteFaceInfo(employeeNo)){
  149. return true;
  150. }
  151. }
  152. this.logout();
  153. return false;
  154. }
  155. /**
  156. * 添加人脸
  157. * @param userId
  158. * @param imageBytes
  159. * @return
  160. */
  161. private boolean addUserFace(String userId,byte[] imageBytes){
  162. Memory memory = ToolKits.readPictureBytes(imageBytes);
  163. boolean b = GateModule.addFaceInfo(userId, memory);
  164. return b;
  165. }
  166. /**
  167. * 更新人脸
  168. * @param userId
  169. * @param imageBytes
  170. * @return
  171. */
  172. private boolean updateUserFace(String userId,byte[] imageBytes){
  173. Memory memory = ToolKits.readPictureBytes(imageBytes);
  174. boolean b = GateModule.modifyFaceInfo(userId, memory);
  175. return b;
  176. }
  177. /**
  178. * 添加用户卡
  179. * @param userFaceInfo
  180. * @return
  181. */
  182. private boolean addUserCard(UserFaceInfo userFaceInfo){
  183. String employeeNo = userFaceInfo.getEmployeeNo();
  184. String employeeName = userFaceInfo.getEmployeeName();
  185. String startTime = userFaceInfo.getStartTime();
  186. String endTime = userFaceInfo.getEndTime();
  187. String cardNo = userFaceInfo.getCardNo();
  188. this.login(info.getIp(),info.getPort(),info.getUsername(),info.getPassword());
  189. boolean b = GateModule.insertCard(cardNo, employeeNo, employeeName, "", 0, 0, 0, 0, 1, startTime, endTime);
  190. return b;
  191. }
  192. /**
  193. * 更新用户卡
  194. * @param userFaceInfo
  195. * @return
  196. */
  197. private boolean updateUserCard(UserFaceInfo userFaceInfo){
  198. String employeeNo = userFaceInfo.getEmployeeNo();
  199. String employeeName = userFaceInfo.getEmployeeName();
  200. String startTime = userFaceInfo.getStartTime();
  201. String endTime = userFaceInfo.getEndTime();
  202. String cardNo = userFaceInfo.getCardNo();
  203. this.login(info.getIp(),info.getPort(),info.getUsername(),info.getPassword());
  204. //根据userId 查询记录集编号
  205. int recordNo = this.findRecordNo(employeeNo);
  206. boolean b = GateModule.modifyCard(recordNo,cardNo, employeeNo, employeeName, "", 0, 0, 0, 0, 1, startTime, endTime);
  207. return b;
  208. }
  209. private int findRecordNo(String employeeNo) {
  210. int nFindCount = 1;
  211. // 卡号: 为空,查询所有的卡信息
  212. // 获取查询句柄
  213. if(!GateModule.findCard("",employeeNo)) {
  214. return 0;
  215. }
  216. // 查询具体信息
  217. while(true) {
  218. NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARD[] pstRecord = GateModule.findNextCard(nFindCount);
  219. if(pstRecord == null) {
  220. break;
  221. }
  222. Optional<NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARD> any = Arrays.stream(pstRecord).findAny();
  223. if(any.isPresent()){
  224. return any.get().nRecNo;
  225. }
  226. if (pstRecord.length < nFindCount) {
  227. break;
  228. }
  229. }
  230. // 关闭查询接口
  231. GateModule.findCardClose();
  232. return 0;
  233. }
  234. public List<UserFaceInfo> findAllCard() {
  235. this.login(info.getIp(),info.getPort(),info.getUsername(),info.getPassword());
  236. List<UserFaceInfo> userFaceInfoList = new ArrayList<>();
  237. int nFindCount = 1;
  238. // 卡号: 为空,查询所有的卡信息
  239. // 获取查询句柄
  240. if(!GateModule.findCard("","")) {
  241. return userFaceInfoList;
  242. }
  243. // 查询具体信息
  244. while(true) {
  245. NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARD[] pstRecord = GateModule.findNextCard(nFindCount);
  246. if(pstRecord == null) {
  247. break;
  248. }
  249. for(int i = 0; i < pstRecord.length; i++) {
  250. UserFaceInfo userFaceInfo = new UserFaceInfo();
  251. try {
  252. userFaceInfo.setCardNo(new String(pstRecord[i].szCardNo).trim());
  253. userFaceInfo.setEmployeeName(new String(pstRecord[i].szCardName, "GBK").trim());
  254. userFaceInfo.setEmployeeNo(new String(pstRecord[i].szUserID).trim());
  255. userFaceInfo.setStartTime(pstRecord[i].stuValidStartTime.toStringTimeEx());
  256. userFaceInfo.setEndTime(pstRecord[i].stuValidEndTime.toStringTimeEx());
  257. userFaceInfoList.add(userFaceInfo);
  258. }catch(UnsupportedEncodingException e){
  259. e.printStackTrace();
  260. }
  261. }
  262. if (pstRecord.length < nFindCount) {
  263. break;
  264. }
  265. }
  266. // 关闭查询接口
  267. GateModule.findCardClose();
  268. this.logout();
  269. return userFaceInfoList;
  270. }
  271. public boolean clearAllPerson(){
  272. this.login(info.getIp(),info.getPort(),info.getUsername(),info.getPassword());
  273. if(GateModule.clearCard() && GateModule.clearFaceInfo()){
  274. return true;
  275. }
  276. this.logout();
  277. return false;
  278. }
  279. // 登录
  280. public boolean login(String ip,short port,String username,String password) {
  281. if(LoginModule.login(ip,
  282. port,
  283. username,
  284. password)) {
  285. // 登陆成功,将通道添加到控件
  286. } else {
  287. return false;
  288. }
  289. return true;
  290. }
  291. // 登出
  292. public void logout() {
  293. LoginModule.logout();
  294. }
  295. private static class DisConnect implements NetSDKLib.fDisConnect {
  296. public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
  297. System.out.printf("Device[%s] Port[%d] DisConnect!\n", pchDVRIP, nDVRPort);
  298. // 断线提示
  299. System.out.println(Res.string().getGate() + " : " + Res.string().getDisConnectReconnecting());
  300. }
  301. }
  302. // 网络连接恢复,设备重连成功回调
  303. // 通过 CLIENT_SetAutoReconnect 设置该回调函数,当已断线的设备重连成功时,SDK会调用该函数
  304. private static class HaveReConnect implements NetSDKLib.fHaveReConnect {
  305. public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
  306. System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);
  307. // 重连提示
  308. System.out.println(Res.string().getGate() + " : " + Res.string().getOnline());
  309. }
  310. }
  311. //消息订阅
  312. private class AnalyzerDataCB implements NetSDKLib.fAnalyzerDataCallBack {
  313. private BufferedImage gateBufferedImage = null;
  314. public int invoke(NetSDKLib.LLong lAnalyzerHandle, int dwAlarmType,
  315. Pointer pAlarmInfo, Pointer pBuffer, int dwBufSize,
  316. Pointer dwUser, int nSequence, Pointer reserved)
  317. {
  318. if (lAnalyzerHandle.longValue() == 0 || pAlarmInfo == null) {
  319. return -1;
  320. }
  321. File path = new File("./GateSnapPicture/");
  322. if (!path.exists()) {
  323. path.mkdir();
  324. }
  325. ///< 门禁事件
  326. if(dwAlarmType == NetSDKLib.EVENT_IVS_ACCESS_CTL) {
  327. NetSDKLib.DEV_EVENT_ACCESS_CTL_INFO msg = new NetSDKLib.DEV_EVENT_ACCESS_CTL_INFO();
  328. ToolKits.GetPointerData(pAlarmInfo, msg);
  329. // 保存图片,获取图片缓存
  330. String snapPicPath = path + "\\" + System.currentTimeMillis() + "GateSnapPicture.jpg"; // 保存图片地址
  331. byte[] buffer = pBuffer.getByteArray(0, dwBufSize);
  332. ByteArrayInputStream byteArrInputGlobal = new ByteArrayInputStream(buffer);
  333. try {
  334. gateBufferedImage = ImageIO.read(byteArrInputGlobal);
  335. if(gateBufferedImage != null) {
  336. ImageIO.write(gateBufferedImage, "jpg", new File(snapPicPath));
  337. }
  338. } catch (IOException e2) {
  339. e2.printStackTrace();
  340. }
  341. // 图片以及门禁信息界面显示
  342. }
  343. return 0;
  344. }
  345. }
  346. @Override
  347. public void cleanup() {
  348. }
  349. @Override
  350. public String getDeployInfo() {
  351. return null;
  352. }
  353. @Override
  354. public int getStatus() {
  355. return 0;
  356. }
  357. @Override
  358. public int setCardTemplate(CardTemplateInfo info) {
  359. return 0;
  360. }
  361. @Override
  362. public void modifyUserInfo(List<UserFaceInfo> userFaceInfos) {
  363. }
  364. }