CameraController.java 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. package com.ruoyi.web.controller.camera;
  2. import com.alibaba.fastjson2.JSON;
  3. import com.alibaba.fastjson2.JSONException;
  4. import com.alibaba.fastjson2.JSONObject;
  5. import com.ruoyi.Common.ConfigFileUtil;
  6. import com.ruoyi.alarm.Alarm;
  7. import com.ruoyi.common.annotation.Log;
  8. import com.ruoyi.common.core.controller.BaseController;
  9. import com.ruoyi.common.core.domain.AjaxResult;
  10. import com.ruoyi.common.core.page.TableDataInfo;
  11. import com.ruoyi.common.core.redis.RedisCache;
  12. import com.ruoyi.common.enums.BusinessType;
  13. import com.ruoyi.common.exception.ServiceException;
  14. import com.ruoyi.common.utils.DateUtils;
  15. import com.ruoyi.common.utils.StringUtils;
  16. import com.ruoyi.common.utils.poi.ExcelUtil;
  17. import com.ruoyi.hksdk.HCNetSDK;
  18. import com.ruoyi.system.domain.BomanReservat;
  19. import com.ruoyi.system.domain.EquipmentConfiguration;
  20. import com.ruoyi.system.domain.OpeningDoorRecord;
  21. import com.ruoyi.system.domain.PersonnelManagement;
  22. import com.ruoyi.system.domain.vo.CameraInfoVo;
  23. import com.ruoyi.system.service.CameraService;
  24. import com.ruoyi.system.service.IEquipmentConfigurationService;
  25. import com.ruoyi.system.service.IOpeningDoorRecordService;
  26. import com.ruoyi.system.service.IPersonnelManagementService;
  27. import com.sun.jna.Pointer;
  28. import com.sun.jna.ptr.IntByReference;
  29. import org.apache.commons.lang3.ObjectUtils;
  30. import org.springframework.beans.factory.annotation.Autowired;
  31. import org.springframework.context.annotation.Configuration;
  32. import org.springframework.scheduling.annotation.Async;
  33. import org.springframework.scheduling.annotation.EnableScheduling;
  34. import org.springframework.scheduling.annotation.Scheduled;
  35. import org.springframework.security.access.prepost.PreAuthorize;
  36. import org.springframework.web.bind.annotation.*;
  37. import javax.servlet.http.HttpServletResponse;
  38. import java.io.UnsupportedEncodingException;
  39. import java.util.HashMap;
  40. import java.util.List;
  41. import java.util.Map;
  42. import static com.ruoyi.common.constant.CommonConstants.LOGIN_USER_SMS;
  43. import static com.ruoyi.common.constant.CommonConstants.OPEN_DOOR;
  44. /**
  45. * 安防管理Controller
  46. *
  47. * @author ruoyi
  48. * @date 2024-02-28
  49. */
  50. @Configuration
  51. @EnableScheduling
  52. @RestController
  53. @RequestMapping("/camera")
  54. public class CameraController extends BaseController {
  55. @Autowired
  56. private CameraService cameraService;
  57. @Autowired
  58. private IEquipmentConfigurationService equipmentConfigurationService;
  59. @Autowired
  60. private IOpeningDoorRecordService openingDoorRecordService;
  61. @Autowired
  62. private RedisCache redisCache;
  63. /**
  64. * 在考勤机器获取考勤数据 一小时一次
  65. */
  66. @Async
  67. @Scheduled(cron = "0 0 * * * ? ")
  68. public void configureTasks() {
  69. System.out.println(DateUtils.getNowDate() +"开始执行定时任务");
  70. cameraService.configureTasks();
  71. System.out.println(DateUtils.getNowDate() +"定时任务结束");
  72. }
  73. /**
  74. * 查询安防设备列表
  75. */
  76. @PreAuthorize("@ss.hasPermi('system:camera:list')")
  77. @GetMapping("/list")
  78. public AjaxResult list(CameraInfoVo cameraInfoVo) {
  79. return cameraService.selectCameraList(cameraInfoVo);
  80. }
  81. /**
  82. * 获取设备视频地址(放开)
  83. */
  84. @PreAuthorize("@ss.hasPermi('system:camera:video')")
  85. @GetMapping("/video/{cameraIndexCode}")
  86. public AjaxResult video(@PathVariable String cameraIndexCode) {
  87. return cameraService.video(cameraIndexCode);
  88. }
  89. /**
  90. * 获取设备视频地址(放开,app)
  91. */
  92. @PreAuthorize("@ss.hasPermi('system:camera:app:video')")
  93. @GetMapping("/app/video/{cameraIndexCode}")
  94. public AjaxResult appVideo(@PathVariable String cameraIndexCode) {
  95. return cameraService.appVideo(cameraIndexCode);
  96. }
  97. /**
  98. * 查询安防设备列表(放开)
  99. */
  100. @GetMapping("/open/list")
  101. public AjaxResult listOpen(CameraInfoVo cameraInfoVo) {
  102. return cameraService.selectCameraList(cameraInfoVo);
  103. }
  104. /**
  105. * 获取设备视频地址(放开)
  106. */
  107. @GetMapping("/open/video/{cameraIndexCode}")
  108. public AjaxResult videoOpen(@PathVariable String cameraIndexCode) {
  109. return cameraService.video(cameraIndexCode);
  110. }
  111. /**
  112. * 设备关闭
  113. */
  114. @GetMapping("/video/closeDz")
  115. @PreAuthorize("@ss.hasPermi('system:camera:closeDz')")
  116. public AjaxResult closeDz(EquipmentConfiguration equipmentConfiguration) {
  117. equipmentConfiguration = equipmentConfigurationService.selectEquipmentConfigurationByEquipmentName(equipmentConfiguration.getEquipmentName());
  118. if(StringUtils.isEmpty(equipmentConfiguration.getEquipmentName())){
  119. return AjaxResult.error("设备列表暂无当前设备");
  120. }
  121. String ip = equipmentConfiguration.getEquipmentIp();
  122. short prot = (short) Short.parseShort(equipmentConfiguration.getEquipmentPort());
  123. String login = equipmentConfiguration.getLoginName();
  124. String pwd = equipmentConfiguration.getLoginPwd();
  125. int tdh = Alarm.login_V40( ip, prot, login, pwd);; //登录设备
  126. String ret="落竿失败!";
  127. try {
  128. HCNetSDK.NET_DVR_BARRIERGATE_CFG cfg = new HCNetSDK.NET_DVR_BARRIERGATE_CFG();
  129. // cfg.read();
  130. cfg.dwChannel=tdh; //通道号
  131. cfg.dwSize=cfg.size(); //结构体大小
  132. cfg.byLaneNo=1; //道闸号:0-表示无效值(设备需要做有效值判断),1-道闸1
  133. cfg.byBarrierGateCtrl=0; // 控制参数:0-关闭道闸,1-开启道闸,2-停止道闸,3-锁定道闸
  134. cfg.byRes[0]=0; //保留,置为0
  135. //起竿操作
  136. Pointer name = cfg.getPointer();
  137. cfg.write();
  138. boolean a=Alarm.controlsDz(tdh, 3128, name, cfg.size());
  139. if(a) {
  140. ret="落竿成功!";
  141. }else {
  142. ret="落竿失败!"+Alarm.controlsDzError();
  143. //失败重新布防, 可以不布防
  144. //new HikVisionService().run();
  145. }
  146. System.out.println("关闸结果--"+a+"-- 提示内容:"+ret);
  147. //保存记录
  148. OpeningDoorRecord openingDoorRecord = new OpeningDoorRecord();
  149. openingDoorRecord.setEntranceGuardName(equipmentConfiguration.getEquipmentName());
  150. openingDoorRecord.setType("2");
  151. openingDoorRecordService.insertOpeningDoorRecord(openingDoorRecord);
  152. //注销用户
  153. boolean b=Alarm.logout(tdh);
  154. } catch (Exception e) {
  155. e.printStackTrace();
  156. }
  157. return AjaxResult.success(ret);
  158. }
  159. /**
  160. * 设备打开
  161. */
  162. @GetMapping("/video/openDz")
  163. @PreAuthorize("@ss.hasPermi('system:camera:openDz')")
  164. public AjaxResult openDz(EquipmentConfiguration equipmentConfiguration) {
  165. equipmentConfiguration = equipmentConfigurationService.selectEquipmentConfigurationByEquipmentName(equipmentConfiguration.getEquipmentName());
  166. if(StringUtils.isEmpty(equipmentConfiguration.getEquipmentName())){
  167. return AjaxResult.error("设备列表暂无当前设备");
  168. }
  169. String ip = equipmentConfiguration.getEquipmentIp();
  170. short prot = (short) Short.parseShort(equipmentConfiguration.getEquipmentPort());
  171. String login = equipmentConfiguration.getLoginName();
  172. String pwd = equipmentConfiguration.getLoginPwd();
  173. int tdh = Alarm.login_V40( ip, prot, login, pwd);; //登录设备
  174. //Alarm.setAlarm();
  175. String ret="起竿失败!";
  176. try {
  177. HCNetSDK.NET_DVR_BARRIERGATE_CFG cfg = new HCNetSDK.NET_DVR_BARRIERGATE_CFG();
  178. // cfg.read();
  179. cfg.dwChannel=tdh; //通道号
  180. cfg.dwSize=cfg.size(); //结构体大小
  181. cfg.byLaneNo=1; //道闸号:0-表示无效值(设备需要做有效值判断),1-道闸1
  182. cfg.byBarrierGateCtrl=1; // 控制参数:0-关闭道闸,1-开启道闸,2-停止道闸,3-锁定道闸
  183. cfg.byRes[0]=0; //保留,置为0
  184. //起竿操作
  185. Pointer name = cfg.getPointer();
  186. cfg.write();
  187. boolean a=Alarm.controlsDz(tdh, 3128, name, cfg.size());
  188. if(a) {
  189. ret="起竿成功!";
  190. }else {
  191. ret="起竿失败!"+Alarm.controlsDzError();
  192. //失败重新布防, 可以不布防
  193. //new HikVisionService().run();
  194. }
  195. System.out.println("开闸结果--"+a+"-- 提示内容:"+ret);
  196. //保存记录
  197. OpeningDoorRecord openingDoorRecord = new OpeningDoorRecord();
  198. openingDoorRecord.setEntranceGuardName(equipmentConfiguration.getEquipmentName());
  199. openingDoorRecord.setType("1");
  200. openingDoorRecordService.insertOpeningDoorRecord(openingDoorRecord);
  201. //注销用户
  202. boolean b=Alarm.logout(tdh);
  203. } catch (Exception e) {
  204. e.printStackTrace();
  205. }
  206. return AjaxResult.success(ret);
  207. }
  208. /**
  209. * 设备打开
  210. */
  211. @GetMapping("/yzm/openDz")
  212. public AjaxResult yzmOpenDz(EquipmentConfiguration equipmentConfiguration) {
  213. //验证码校验
  214. Object cacheObject = redisCache.getCacheObject(OPEN_DOOR + equipmentConfiguration.getPhoneNumber());
  215. if(ObjectUtils.isEmpty(cacheObject) || !equipmentConfiguration.getCode().equals(cacheObject)){
  216. throw new ServiceException("验证码错误");
  217. }
  218. redisCache.deleteObject(LOGIN_USER_SMS + equipmentConfiguration.getPhoneNumber());
  219. equipmentConfiguration = equipmentConfigurationService.selectEquipmentConfigurationByEquipmentName(equipmentConfiguration.getEquipmentName());
  220. if(StringUtils.isEmpty(equipmentConfiguration.getEquipmentName())){
  221. return AjaxResult.error("设备列表暂无当前设备");
  222. }
  223. String ip = equipmentConfiguration.getEquipmentIp();
  224. short prot = (short) Short.parseShort(equipmentConfiguration.getEquipmentPort());
  225. String login = equipmentConfiguration.getLoginName();
  226. String pwd = equipmentConfiguration.getLoginPwd();
  227. int tdh = Alarm.login_V40( ip, prot, login, pwd);; //登录设备
  228. //Alarm.setAlarm();
  229. String ret="起竿失败!";
  230. try {
  231. HCNetSDK.NET_DVR_BARRIERGATE_CFG cfg = new HCNetSDK.NET_DVR_BARRIERGATE_CFG();
  232. // cfg.read();
  233. cfg.dwChannel=tdh; //通道号
  234. cfg.dwSize=cfg.size(); //结构体大小
  235. cfg.byLaneNo=1; //道闸号:0-表示无效值(设备需要做有效值判断),1-道闸1
  236. cfg.byBarrierGateCtrl=1; // 控制参数:0-关闭道闸,1-开启道闸,2-停止道闸,3-锁定道闸
  237. cfg.byRes[0]=0; //保留,置为0
  238. //起竿操作
  239. Pointer name = cfg.getPointer();
  240. cfg.write();
  241. boolean a=Alarm.controlsDz(tdh, 3128, name, cfg.size());
  242. if(a) {
  243. ret="起竿成功!";
  244. }else {
  245. ret="起竿失败!"+Alarm.controlsDzError();
  246. //失败重新布防, 可以不布防
  247. //new HikVisionService().run();
  248. }
  249. System.out.println("开闸结果--"+a+"-- 提示内容:"+ret);
  250. //保存记录
  251. OpeningDoorRecord openingDoorRecord = new OpeningDoorRecord();
  252. openingDoorRecord.setEntranceGuardName(equipmentConfiguration.getEquipmentName());
  253. openingDoorRecord.setType("1");
  254. openingDoorRecordService.insertOpeningDoorRecord(openingDoorRecord);
  255. //注销用户
  256. boolean b=Alarm.logout(tdh);
  257. } catch (Exception e) {
  258. e.printStackTrace();
  259. }
  260. return AjaxResult.success(ret);
  261. }
  262. /**
  263. * 下发人员信息
  264. * @param equipmentConfiguration 下发的设备信息
  265. * @param bomanReservat 下发的人员信息
  266. * @return
  267. */
  268. public void issueUser(EquipmentConfiguration equipmentConfiguration, BomanReservat bomanReservat) {
  269. String employeeNo = "tem"+bomanReservat.getReservatId();
  270. //验证码校验
  271. Object cacheObject = redisCache.getCacheObject(OPEN_DOOR + equipmentConfiguration.getPhoneNumber());
  272. if(ObjectUtils.isEmpty(cacheObject) || !equipmentConfiguration.getCode().equals(cacheObject)){
  273. throw new ServiceException("验证码错误");
  274. }
  275. redisCache.deleteObject(LOGIN_USER_SMS + equipmentConfiguration.getPhoneNumber());
  276. equipmentConfiguration = equipmentConfigurationService.selectEquipmentConfigurationByEquipmentName(equipmentConfiguration.getEquipmentName());
  277. if(StringUtils.isEmpty(equipmentConfiguration.getEquipmentName())){
  278. //return AjaxResult.error("设备列表暂无当前设备");
  279. return;
  280. }
  281. String ip = equipmentConfiguration.getEquipmentIp();
  282. short prot = (short) Short.parseShort(equipmentConfiguration.getEquipmentPort());
  283. String login = equipmentConfiguration.getLoginName();
  284. String pwd = equipmentConfiguration.getLoginPwd();
  285. int lUserID = Alarm.login_V40( ip, prot, login, pwd); //登录设备
  286. //Alarm.setAlarm();
  287. //String ret="起竿失败!";
  288. try {
  289. HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组
  290. String strInBuffer = "POST /ISAPI/AccessControl/UserInfo/Record?format=json"; //此URL也是下发人员
  291. // String strInBuffer = "PUT /ISAPI/AccessControl/UserInfo/SetUp?format=json";
  292. System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
  293. ptrByteArray.write();
  294. //长连接
  295. int lHandler = Alarm.startRemote(lUserID,HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length());
  296. //int lHandler = Alarm.hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
  297. if (lHandler < 0) {
  298. System.out.println("AddUserInfo NET_DVR_StartRemoteConfig 失败,错误码为" + Alarm.controlsDzError());
  299. return;
  300. } else {
  301. System.out.println("AddUserInfo NET_DVR_StartRemoteConfig 成功!");
  302. //输入参数,XML或者JSON数据,下发人员信息json报文,其他参数设置参考conf/acs/AddUserInfoParam.json中报文参数
  303. Map<String, Object> parameter = new HashMap<>();
  304. parameter.put("employeeNo", employeeNo); // 员工ID
  305. parameter.put("name", bomanReservat.getVisitName()); // 员工名称
  306. parameter.put("enable", true); // 是否启用
  307. parameter.put("doorNo", 1); // 门编号
  308. String input = ConfigFileUtil.getReqBodyFromTemplate("conf/acs/AddUserInfoParam.json", parameter);
  309. System.out.println("下发人员参数:"+input);
  310. byte[] byInbuffer = input.getBytes("utf-8");
  311. int iInBufLen = byInbuffer.length;
  312. HCNetSDK.BYTE_ARRAY ptrInBuffer = new HCNetSDK.BYTE_ARRAY(iInBufLen);
  313. ptrInBuffer.read();
  314. System.arraycopy(byInbuffer,0,ptrInBuffer.byValue,0, iInBufLen);
  315. ptrInBuffer.write();
  316. //下发人员信息
  317. HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(1024);
  318. // Pointer ptr =new PointerByReference()
  319. IntByReference pInt = new IntByReference(0);
  320. while (true) {
  321. int dwState = Alarm.sendWith(lHandler, ptrInBuffer.getPointer(), iInBufLen, ptrOutuff.getPointer(), 1024, pInt);
  322. if (dwState == -1) {
  323. System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + Alarm.controlsDzError());
  324. break;
  325. }
  326. //读取返回的json并解析
  327. ptrOutuff.read();
  328. String strResult = new String(ptrOutuff.byValue).trim();
  329. System.out.println("dwState:" + dwState + ",strResult:" + strResult);
  330. JSONObject jsonResult = JSON.parseObject(strResult);
  331. int statusCode = (int) jsonResult.get("statusCode");
  332. String statusString = jsonResult.getString("statusString");
  333. if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) {
  334. System.out.println("配置等待");
  335. Thread.sleep(10);
  336. continue;
  337. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) {
  338. System.out.println("下发人员失败, json retun:" + jsonResult.toString());
  339. break;
  340. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
  341. System.out.println("下发人员异常, json retun:" + jsonResult.toString());
  342. break;
  343. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {//返回NET_SDK_CONFIG_STATUS_SUCCESS代表流程走通了,但并不代表下发成功,比如有些设备可能因为人员已存在等原因下发失败,所以需要解析Json报文
  344. if (statusCode != 1) {
  345. System.out.println("下发人员成功,但是有异常情况:" + jsonResult.toString());
  346. } else {
  347. System.out.println("下发人员成功: json retun:" + jsonResult.toString());
  348. }
  349. //按URL方式下发人脸图片
  350. addFaceByUrl(lUserID,employeeNo,bomanReservat.getHumanFaceData());
  351. break;
  352. } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
  353. //下发人员时:dwState其实不会走到这里,因为设备不知道我们会下发多少个人,所以长连接需要我们主动关闭
  354. System.out.println("下发人员完成");
  355. break;
  356. }
  357. }
  358. if (!Alarm.stopRemote(lHandler)) {
  359. System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + Alarm.controlsDzError());
  360. } else {
  361. System.out.println("NET_DVR_StopRemoteConfig接口成功");
  362. }
  363. }
  364. //注销用户
  365. boolean b=Alarm.logout(lUserID);
  366. } catch (Exception e) {
  367. e.printStackTrace();
  368. }
  369. }
  370. /**
  371. * 按URL方式下发人脸图片
  372. * @param userID 用户注销ID
  373. * @param employeeNo 人员工号
  374. * @throws
  375. */
  376. public static void addFaceByUrl(int userID,String employeeNo,String url) throws JSONException {
  377. HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组
  378. String strInBuffer = "PUT /ISAPI/Intelligent/FDLib/FDSetUp?format=json";
  379. System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
  380. ptrByteArray.write();
  381. int lHandler = Alarm.startRemote(userID,HCNetSDK.NET_DVR_FACE_DATA_RECORD, ptrByteArray.getPointer(), strInBuffer.length());
  382. if (lHandler < 0)
  383. {
  384. System.out.println("Addface NET_DVR_StartRemoteConfig 失败,错误码为"+Alarm.controlsDzError());
  385. return;
  386. }
  387. else{
  388. System.out.println("Addface NET_DVR_StartRemoteConfig 成功!");
  389. HCNetSDK.NET_DVR_JSON_DATA_CFG struAddFaceDataCfg = new HCNetSDK.NET_DVR_JSON_DATA_CFG();
  390. struAddFaceDataCfg.read();
  391. JSONObject jsonObject = new JSONObject();
  392. //jsonObject.put("faceURL","http://10.17.34.106:6011/pic?7DD9D70207A9D7F576F99AC197B2D6CAface.jpg"); //人脸图片URL,平台自己实现,需要保证设备可以正常访问
  393. jsonObject.put("faceURL",url); //人脸图片URL,平台自己实现,需要保证设备可以正常访问
  394. jsonObject.put("faceLibType", "blackFD");
  395. jsonObject.put("FDID", "fce"+employeeNo);
  396. jsonObject.put("FPID", employeeNo);//人脸下发关联的工号
  397. String strJsonData = jsonObject.toString();
  398. System.arraycopy(strJsonData.getBytes(), 0, ptrByteArray.byValue, 0, strJsonData.length());//字符串拷贝到数组中
  399. ptrByteArray.write();
  400. struAddFaceDataCfg.dwSize = struAddFaceDataCfg.size();
  401. struAddFaceDataCfg.lpJsonData = ptrByteArray.getPointer();
  402. struAddFaceDataCfg.dwJsonDataSize = strJsonData.length();
  403. struAddFaceDataCfg.lpPicData = null;
  404. struAddFaceDataCfg.dwPicDataSize=0;
  405. struAddFaceDataCfg.write();
  406. HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(1024);
  407. IntByReference pInt = new IntByReference(0);
  408. while(true){
  409. int dwState = Alarm.sendWith(lHandler, struAddFaceDataCfg.getPointer(), struAddFaceDataCfg.dwSize ,ptrOutuff.getPointer(), 1024, pInt);
  410. if(dwState == -1){
  411. System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + Alarm.controlsDzError());
  412. break;
  413. }
  414. //读取返回的json并解析
  415. ptrOutuff.read();
  416. String strResult = new String(ptrOutuff.byValue).trim();
  417. System.out.println("dwState:" + dwState + ",strResult:" + strResult);
  418. JSONObject jsonResult = JSON.parseObject(strResult);
  419. int statusCode = (int) jsonResult.get("statusCode");
  420. String statusString = jsonResult.getString("statusString");
  421. if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT)
  422. {
  423. System.out.println("配置等待");
  424. try {
  425. Thread.sleep(10);
  426. } catch (InterruptedException e) {
  427. e.printStackTrace();
  428. }
  429. continue;
  430. }
  431. else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED)
  432. {
  433. System.out.println("下发人脸失败, json retun:" + jsonResult.toString());
  434. break;
  435. }
  436. else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION)
  437. {
  438. System.out.println("下发人脸异常, json retun:" + jsonResult.toString());
  439. break;
  440. }
  441. else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS)
  442. {//返回NET_SDK_CONFIG_STATUS_SUCCESS代表流程走通了,但并不代表下发成功,比如人脸图片不符合设备规范等原因,所以需要解析Json报文
  443. if (statusCode != 1){
  444. System.out.println("下发人脸成功,但是有异常情况:" + jsonResult.toString());
  445. }
  446. else{
  447. System.out.println("下发人脸成功, json retun:" + jsonResult.toString());
  448. }
  449. break;
  450. }
  451. else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
  452. //下发人脸时:dwState其实不会走到这里,因为设备不知道我们会下发多少个人,所以长连接需要我们主动关闭
  453. System.out.println("下发人脸完成");
  454. break;
  455. }
  456. }
  457. if(!Alarm.stopRemote(lHandler)){
  458. System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + Alarm.controlsDzError());
  459. }
  460. else{
  461. System.out.println("NET_DVR_StopRemoteConfig接口成功");
  462. }
  463. }
  464. }
  465. /**
  466. * 门禁事件查询,基于起止时间,事件类型进行查询
  467. * @param
  468. * @throws UnsupportedEncodingException
  469. * @throws InterruptedException
  470. */
  471. @GetMapping("/yzm/cs")
  472. public void searchAllEvent() throws UnsupportedEncodingException, InterruptedException {
  473. int lUserID = Alarm.login_V40( "60.171.161.56", (short) 18107, "admin", "zxy@7000"); //登录设备
  474. int i = 0; //事件条数
  475. HCNetSDK.NET_DVR_ACS_EVENT_COND struAcsEventCond = new HCNetSDK.NET_DVR_ACS_EVENT_COND();
  476. struAcsEventCond.read();
  477. struAcsEventCond.dwSize = struAcsEventCond.size();
  478. //查询全部主次类型的报警
  479. struAcsEventCond.dwMajor = 5; // 主次事件类型设为0,代表查询所有事件
  480. struAcsEventCond.dwMinor = 15; //
  481. //开始时间
  482. struAcsEventCond.struStartTime.dwYear = 2025;
  483. struAcsEventCond.struStartTime.dwMonth = 3;
  484. struAcsEventCond.struStartTime.dwDay = 01;
  485. struAcsEventCond.struStartTime.dwHour = 0;
  486. struAcsEventCond.struStartTime.dwMinute = 0;
  487. struAcsEventCond.struStartTime.dwSecond = 0;
  488. //结束时间
  489. struAcsEventCond.struEndTime.dwYear = 2025;
  490. struAcsEventCond.struEndTime.dwMonth = 4;
  491. struAcsEventCond.struEndTime.dwDay = 9;
  492. struAcsEventCond.struEndTime.dwHour = 23;
  493. struAcsEventCond.struEndTime.dwMinute = 59;
  494. struAcsEventCond.struEndTime.dwSecond = 59;
  495. struAcsEventCond.wInductiveEventType = 1;
  496. struAcsEventCond.byPicEnable = 0; //是否带图片,0-不带图片,1-带图片
  497. struAcsEventCond.write();
  498. Pointer ptrStruEventCond = struAcsEventCond.getPointer();
  499. int m_lSearchEventHandle = Alarm.startRemote(lUserID,HCNetSDK.NET_DVR_GET_ACS_EVENT, ptrStruEventCond, struAcsEventCond.size());
  500. //int m_lSearchEventHandle = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_GET_ACS_EVENT, ptrStruEventCond, struAcsEventCond.size(), null, null);
  501. if (m_lSearchEventHandle<=-1)
  502. {
  503. System.out.println("NET_DVR_StartRemoteConfig调用失败,错误码:" + Alarm.controlsDzError());
  504. }
  505. HCNetSDK.NET_DVR_ACS_EVENT_CFG struAcsEventCfg = new HCNetSDK.NET_DVR_ACS_EVENT_CFG();
  506. struAcsEventCfg.read();
  507. struAcsEventCfg.dwSize = struAcsEventCfg.size();
  508. struAcsEventCfg.write();
  509. Pointer ptrStruEventCfg = struAcsEventCfg.getPointer();
  510. while (true) {
  511. System.out.println("i=" + i);
  512. int dwEventSearch = Alarm.nextRemote(m_lSearchEventHandle, ptrStruEventCfg, struAcsEventCfg.size());
  513. if (dwEventSearch <= -1) {
  514. System.out.println("NET_DVR_GetNextRemoteConfig接口调用失败,错误码:" + Alarm.controlsDzError());
  515. return;
  516. }
  517. if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_NEED_WAIT) {
  518. System.out.println("配置等待....");
  519. Thread.sleep(10);
  520. continue;
  521. } else if (dwEventSearch == HCNetSDK.NET_SDK_NEXT_STATUS__FINISH) {
  522. System.out.println("获取事件完成");
  523. break;
  524. } else if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_FAILED) {
  525. System.out.println("获取事件出现异常");
  526. break;
  527. } else if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS) {
  528. struAcsEventCfg.read();
  529. //获取的事件信息通过struAcsEventCfg结构体进行解析,
  530. System.out.println(i + "获取事件成功, 报警主类型:" + Integer.toHexString(struAcsEventCfg.dwMajor) + "报警次类型:" + Integer.toHexString(struAcsEventCfg.dwMinor) + "卡号:" + new String(struAcsEventCfg.struAcsEventInfo.byCardNo).trim());
  531. /**
  532. * 工号有两个字段,dwEmployeeNo表示工号,当值为0时,表示无效,解析byEmployeeNo参数
  533. */
  534. /* System.out.println("工号1:"+struAcsEventCfg.struAcsEventInfo.dwEmployeeNo);
  535. System.out.println("工号2:"+new String(struAcsEventCfg.struAcsEventInfo.byEmployeeNo));
  536. //人脸温度数据,需要设备和支持测温功能
  537. System.out.println("人脸温度:" + struAcsEventCfg.struAcsEventInfo.fCurrTemperature + "是否异常:" + struAcsEventCfg.struAcsEventInfo.byIsAbnomalTemperature);
  538. //口罩功能,需要设备支持此功能 0-保留,1-未知,2-不戴口罩,3-戴口罩
  539. System.out.println("是否带口罩:"+struAcsEventCfg.struAcsEventInfo.byMask);*/
  540. System.out.println("刷卡时间:年:"+struAcsEventCfg.struTime.dwYear+" 月:"+struAcsEventCfg.struTime.dwMonth+" 日:"+struAcsEventCfg.struTime.dwDay+
  541. " 时:"+struAcsEventCfg.struTime.dwHour+" 分:"+struAcsEventCfg.struTime.dwMinute+" 秒:"+struAcsEventCfg.struTime.dwSecond);
  542. System.out.println("刷卡信息:"+new String(struAcsEventCfg.struAcsEventInfo.byCardNo));
  543. //todo 人脸图片保存
  544. i++;
  545. continue;
  546. }else{
  547. break;
  548. }
  549. }
  550. i = 0;
  551. if (!Alarm.stopRemote(m_lSearchEventHandle)) {
  552. System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + Alarm.controlsDzError());
  553. } else {
  554. System.out.println("NET_DVR_StopRemoteConfig接口成功");
  555. }
  556. //注销用户
  557. boolean b=Alarm.logout(lUserID);
  558. return;
  559. }
  560. }