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.

985 lines
65 KiB

  1. package com.hkversion;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.common.CommonUtil;
  4. import com.sun.jna.Pointer;
  5. import com.yzx.callback.AlarmCallback;
  6. import com.yzx.pojo.AlarmDataInfo;
  7. import java.io.FileNotFoundException;
  8. import java.io.FileOutputStream;
  9. import java.io.IOException;
  10. import java.io.UnsupportedEncodingException;
  11. import java.nio.ByteBuffer;
  12. import java.text.SimpleDateFormat;
  13. import java.util.Date;
  14. /**
  15. * @author jiangxin
  16. * @create 2022-08-15-18:04
  17. */
  18. public class AlarmDataParse {
  19. public static void alarmDataHandle(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser, AlarmCallback callback) {
  20. System.out.println("报警事件类型: lCommand:" + Integer.toHexString(lCommand));
  21. String sTime;
  22. String MonitoringSiteID;
  23. //lCommand是传的报警类型
  24. switch (lCommand) {
  25. case HCNetSDK.COMM_ITS_PLATE_RESULT://交通抓拍结果(新报警信息)
  26. HCNetSDK.NET_ITS_PLATE_RESULT strItsPlateResult = new HCNetSDK.NET_ITS_PLATE_RESULT();
  27. strItsPlateResult.write();
  28. Pointer pItsPlateInfo = strItsPlateResult.getPointer();
  29. pItsPlateInfo.write(0, pAlarmInfo.getByteArray(0, strItsPlateResult.size()), 0, strItsPlateResult.size());
  30. strItsPlateResult.read();
  31. try {
  32. String sLicense = new String(strItsPlateResult.struPlateInfo.sLicense, "GBK");
  33. byte VehicleType = strItsPlateResult.byVehicleType; //0-其他车辆,1-小型车,2-大型车,3- 行人触发,4- 二轮车触发,5- 三轮车触发,6- 机动车触发
  34. MonitoringSiteID = new String(strItsPlateResult.byMonitoringSiteID);
  35. //System.out.println("车牌号:" + sLicense + ":车辆类型:" + VehicleType + ":监控点编号:" + MonitoringSiteID);
  36. } catch (UnsupportedEncodingException e1) {
  37. // TODO Auto-generated catch block
  38. e1.printStackTrace();
  39. } catch (IOException e) {
  40. // TODO Auto-generated catch block
  41. e.printStackTrace();
  42. }
  43. /**
  44. * 报警图片保存,车牌,车辆图片
  45. */
  46. for (int i = 0; i < strItsPlateResult.dwPicNum; i++) {
  47. if (strItsPlateResult.struPicInfo[i].dwDataLen > 0) {
  48. //将字节写入文件
  49. long offset = 0;
  50. ByteBuffer buffers = strItsPlateResult.struPicInfo[i].pBuffer.getByteBuffer(offset, strItsPlateResult.struPicInfo[i].dwDataLen);
  51. byte[] bytes = new byte[strItsPlateResult.struPicInfo[i].dwDataLen];
  52. buffers.rewind();
  53. buffers.get(bytes);
  54. }
  55. }
  56. break;
  57. case HCNetSDK.COMM_ALARM_TFS: //道路违章取证报警
  58. HCNetSDK.NET_DVR_TFS_ALARM strTfsAlarm = new HCNetSDK.NET_DVR_TFS_ALARM();
  59. strTfsAlarm.write();
  60. Pointer pTfsAlarm = strTfsAlarm.getPointer();
  61. pTfsAlarm.write(0, pAlarmInfo.getByteArray(0, strTfsAlarm.size()), 0, strTfsAlarm.size());
  62. strTfsAlarm.read();
  63. sTime = CommonUtil.parseTime(strTfsAlarm.dwAbsTime); //报警绝对时间
  64. int IllegalType = strTfsAlarm.dwIllegalType; // 违章类型
  65. MonitoringSiteID = strTfsAlarm.byMonitoringSiteID.toString(); //监控点编号
  66. // 车牌信息
  67. try {
  68. String PlateInfo = "车牌号:" + new String(strTfsAlarm.struPlateInfo.sLicense, "GBK");
  69. //System.out.println("【道路违章取证报警】时间:" + sTime + "违章类型:" + IllegalType + "车牌信息:" + PlateInfo);
  70. } catch (UnsupportedEncodingException e) {
  71. e.printStackTrace();
  72. }
  73. //报警图片信息
  74. for (int i = 0; i < strTfsAlarm.dwPicNum; i++) {
  75. if (strTfsAlarm.struPicInfo[i].dwDataLen > 0) {
  76. //将字节写入文件
  77. long offset = 0;
  78. ByteBuffer buffers = strTfsAlarm.struPicInfo[i].pBuffer.getByteBuffer(offset, strTfsAlarm.struPicInfo[i].dwDataLen);
  79. byte[] bytes = new byte[strTfsAlarm.struPicInfo[i].dwDataLen];
  80. buffers.rewind();
  81. buffers.get(bytes);
  82. }
  83. }
  84. break;
  85. case HCNetSDK.COMM_ALARM_AID_V41: //道路事件检测
  86. HCNetSDK.NET_DVR_AID_ALARM_V41 strAIDAlarmV41 = new HCNetSDK.NET_DVR_AID_ALARM_V41();
  87. strAIDAlarmV41.write();
  88. Pointer pstrAIDAlarmV41 = strAIDAlarmV41.getPointer();
  89. pstrAIDAlarmV41.write(0, pAlarmInfo.getByteArray(0, strAIDAlarmV41.size()), 0, strAIDAlarmV41.size());
  90. strAIDAlarmV41.read();
  91. sTime = CommonUtil.parseTime(strAIDAlarmV41.dwAbsTime); //报警触发绝对时间
  92. MonitoringSiteID = strAIDAlarmV41.byMonitoringSiteID.toString(); //监控点编号
  93. int AIDType = strAIDAlarmV41.struAIDInfo.dwAIDType; // 交通事件类型
  94. int AIDTypeEx = strAIDAlarmV41.struAIDInfo.dwAIDTypeEx; //交通事件类型扩展
  95. //System.out.println("【道路事件检测】" + "时间:" + sTime + "监控点:" + MonitoringSiteID + "交通事件类型:" + AIDType + "交通事件类型扩展:" + AIDTypeEx);
  96. //报警图片信息
  97. if (strAIDAlarmV41.dwPicDataLen > 0 && strAIDAlarmV41.pImage != null) {
  98. //将字节写入文件
  99. long offset = 0;
  100. ByteBuffer buffers = strAIDAlarmV41.pImage.getByteBuffer(offset, strAIDAlarmV41.dwPicDataLen);
  101. byte[] bytes = new byte[strAIDAlarmV41.dwPicDataLen];
  102. buffers.rewind();
  103. buffers.get(bytes);
  104. }
  105. break;
  106. case HCNetSDK.COMM_ALARM_TPS_V41://交通数据统计的报警
  107. HCNetSDK.NET_DVR_TPS_ALARM_V41 strTPSalarmV41 = new HCNetSDK.NET_DVR_TPS_ALARM_V41();
  108. strTPSalarmV41.write();
  109. Pointer pstrTPSalarmV41 = strTPSalarmV41.getPointer();
  110. pstrTPSalarmV41.write(0, pAlarmInfo.getByteArray(0, strTPSalarmV41.size()), 0, strTPSalarmV41.size());
  111. strTPSalarmV41.read();
  112. sTime = CommonUtil.parseTime(strTPSalarmV41.dwAbsTime);
  113. MonitoringSiteID = strTPSalarmV41.byMonitoringSiteID.toString(); //监控点编号
  114. String StartTime = CommonUtil.parseTime(strTPSalarmV41.dwStartTime); //开始统计时间;
  115. String StopTime = CommonUtil.parseTime(strTPSalarmV41.dwStopTime); //结束统计时间;
  116. //System.out.println("【交通数据统计】" + "时间:" + sTime + "监控点编号:" + MonitoringSiteID + "开始统计时间:" + StartTime + "结束统计时间:" + StopTime);
  117. //车道统计参数信息
  118. for (int i = 0; i <= HCNetSDK.MAX_TPS_RULE; i++) {
  119. byte LaneNo = strTPSalarmV41.struTPSInfo.struLaneParam[i].byLaneNo; //车道号
  120. byte TrafficState = strTPSalarmV41.struTPSInfo.struLaneParam[i].byTrafficState; //车道状态 0-无效,1-畅通,2-拥挤,3-堵塞
  121. int TpsType = strTPSalarmV41.struTPSInfo.struLaneParam[i].dwTpsType; //数据变化类型标志,表示当前上传的统计参数中,哪些数据有效,按位区分
  122. int LaneVolume = strTPSalarmV41.struTPSInfo.struLaneParam[i].dwLaneVolume; //车道流量
  123. int LaneVelocity = strTPSalarmV41.struTPSInfo.struLaneParam[i].dwLaneVelocity; //车道平均速度
  124. float SpaceOccupyRation = strTPSalarmV41.struTPSInfo.struLaneParam[i].fSpaceOccupyRation; //车道占有率,百分比计算(空间上,车辆长度与监控路段总长度的比值)
  125. //System.out.println("车道号:" + LaneNo + "车道状态:" + TrafficState + "车道流量:" + LaneVolume + "车道占有率:" + SpaceOccupyRation + "\n");
  126. }
  127. break;
  128. case HCNetSDK.COMM_ALARM_TPS_REAL_TIME: //实时过车数据数据
  129. HCNetSDK.NET_DVR_TPS_REAL_TIME_INFO netDvrTpsParam = new HCNetSDK.NET_DVR_TPS_REAL_TIME_INFO();
  130. netDvrTpsParam.write();
  131. Pointer pItsParkVehicle = netDvrTpsParam.getPointer();
  132. pItsParkVehicle.write(0, pAlarmInfo.getByteArray(0, netDvrTpsParam.size()), 0, netDvrTpsParam.size());
  133. netDvrTpsParam.read();
  134. String struTime = "" + String.format("%04d", netDvrTpsParam.struTime.wYear) +
  135. String.format("%02d", netDvrTpsParam.struTime.byMonth) +
  136. String.format("%02d", netDvrTpsParam.struTime.byDay) +
  137. String.format("%02d", netDvrTpsParam.struTime.byDay) +
  138. String.format("%02d", netDvrTpsParam.struTime.byHour) +
  139. String.format("%02d", netDvrTpsParam.struTime.byMinute) +
  140. String.format("%02d", netDvrTpsParam.struTime.bySecond);
  141. Short wDeviceID = new Short(netDvrTpsParam.struTPSRealTimeInfo.wDeviceID);//设备ID
  142. int channel = netDvrTpsParam.dwChan; //触发报警通道号
  143. String byLane = new String(String.valueOf(netDvrTpsParam.struTPSRealTimeInfo.byLane)).trim();// 对应车道号
  144. String bySpeed = new String(String.valueOf(netDvrTpsParam.struTPSRealTimeInfo.bySpeed)).trim();// 对应车速(KM/H)
  145. int dwDownwardFlow = netDvrTpsParam.struTPSRealTimeInfo.dwDownwardFlow;//当前车道 从上到下车流量
  146. int dwUpwardFlow = netDvrTpsParam.struTPSRealTimeInfo.dwUpwardFlow; //当前车道 从下到上车流量
  147. //System.out.println("通道号:" + channel + "; 时间:" + struTime + ";对应车道号:" + byLane + ";当前车道 从上到下车流量:" + dwDownwardFlow + ";dwUpwardFlow:" + dwUpwardFlow);
  148. break;
  149. case HCNetSDK.COMM_ALARM_TPS_STATISTICS: //统计过车数据
  150. HCNetSDK.NET_DVR_TPS_STATISTICS_INFO netDvrTpsStatisticsInfo = new HCNetSDK.NET_DVR_TPS_STATISTICS_INFO();
  151. netDvrTpsStatisticsInfo.write();
  152. Pointer pTpsVehicle = netDvrTpsStatisticsInfo.getPointer();
  153. pTpsVehicle.write(0, pAlarmInfo.getByteArray(0, netDvrTpsStatisticsInfo.size()), 0, netDvrTpsStatisticsInfo.size());
  154. netDvrTpsStatisticsInfo.read();
  155. int Tpschannel = netDvrTpsStatisticsInfo.dwChan; //触发报警通道号
  156. //统计开始时间
  157. String struStartTime = "" + String.format("%04d", netDvrTpsStatisticsInfo.struTPSStatisticsInfo.struStartTime.wYear) +
  158. String.format("%02d", netDvrTpsStatisticsInfo.struTPSStatisticsInfo.struStartTime.byMonth) +
  159. String.format("%02d", netDvrTpsStatisticsInfo.struTPSStatisticsInfo.struStartTime.byDay) +
  160. String.format("%02d", netDvrTpsStatisticsInfo.struTPSStatisticsInfo.struStartTime.byDay) +
  161. String.format("%02d", netDvrTpsStatisticsInfo.struTPSStatisticsInfo.struStartTime.byHour) +
  162. String.format("%02d", netDvrTpsStatisticsInfo.struTPSStatisticsInfo.struStartTime.byMinute) +
  163. String.format("%02d", netDvrTpsStatisticsInfo.struTPSStatisticsInfo.struStartTime.bySecond);
  164. byte TotalLaneNum = netDvrTpsStatisticsInfo.struTPSStatisticsInfo.byTotalLaneNum; //有效车道总数
  165. //System.out.println("通道号:" + Tpschannel + "; 开始统计时间:" + struStartTime + "有效车道总数:" + TotalLaneNum);
  166. break;
  167. case HCNetSDK.COMM_ITS_PARK_VEHICLE: //停车场数据上传
  168. HCNetSDK.NET_ITS_PARK_VEHICLE strParkVehicle = new HCNetSDK.NET_ITS_PARK_VEHICLE();
  169. strParkVehicle.write();
  170. Pointer pstrParkVehicle = strParkVehicle.getPointer();
  171. pstrParkVehicle.write(0, pAlarmInfo.getByteArray(0, strParkVehicle.size()), 0, strParkVehicle.size());
  172. strParkVehicle.read();
  173. try {
  174. byte ParkError = strParkVehicle.byParkError; //停车异常:0- 正常,1- 异常
  175. String ParkingNo = new String(strParkVehicle.byParkingNo, "UTF-8"); //车位编号
  176. byte LocationStatus = strParkVehicle.byLocationStatus; //车位车辆状态 0- 无车,1- 有车
  177. MonitoringSiteID = strParkVehicle.byMonitoringSiteID.toString();
  178. String plateNo = new String(strParkVehicle.struPlateInfo.sLicense, "GBK"); //车牌号
  179. } catch (UnsupportedEncodingException e) {
  180. e.printStackTrace();
  181. }
  182. //报警图片信息
  183. for (int i = 0; i < strParkVehicle.dwPicNum; i++) {
  184. if (strParkVehicle.struPicInfo[i].dwDataLen > 0) {
  185. //将字节写入文件
  186. long offset = 0;
  187. ByteBuffer buffers = strParkVehicle.struPicInfo[i].pBuffer.getByteBuffer(offset, strParkVehicle.struPicInfo[i].dwDataLen);
  188. byte[] bytes = new byte[strParkVehicle.struPicInfo[i].dwDataLen];
  189. buffers.rewind();
  190. buffers.get(bytes);
  191. }
  192. }
  193. break;
  194. case HCNetSDK.COMM_ALARMHOST_CID_ALARM://报警主机CID报告报警上传
  195. HCNetSDK.NET_DVR_CID_ALARM strCIDalarm = new HCNetSDK.NET_DVR_CID_ALARM();
  196. strCIDalarm.write();
  197. Pointer pstrCIDalarm = strCIDalarm.getPointer();
  198. pstrCIDalarm.write(0, pAlarmInfo.getByteArray(0, strCIDalarm.size()), 0, strCIDalarm.size());
  199. strCIDalarm.read();
  200. try {
  201. String TriggerTime = "" + String.format("%04d", strCIDalarm.struTriggerTime.wYear) +
  202. String.format("%02d", strCIDalarm.struTriggerTime.byMonth) +
  203. String.format("%02d", strCIDalarm.struTriggerTime.byDay) +
  204. String.format("%02d", strCIDalarm.struTriggerTime.byDay) +
  205. String.format("%02d", strCIDalarm.struTriggerTime.byHour) +
  206. String.format("%02d", strCIDalarm.struTriggerTime.byMinute) +
  207. String.format("%02d", strCIDalarm.struTriggerTime.bySecond); //触发报警时间
  208. String sCIDCode = new String(strCIDalarm.sCIDCode, "GBK"); //CID事件号
  209. String sCIDDescribe = new String(strCIDalarm.sCIDDescribe, "GBK"); //CID事件名
  210. byte bySubSysNo = strCIDalarm.bySubSysNo; //子系统号
  211. if (strCIDalarm.wDefenceNo != 0xff)
  212. {
  213. //System.out.println("防区号:"+Integer.sum(strCIDalarm.wDefenceNo,1));
  214. }
  215. //System.out.println("【CID事件】" + "触发时间:" + TriggerTime + "CID事件号:" + sCIDCode + "CID事件名:" + sCIDDescribe + "子系统号:" + bySubSysNo);
  216. } catch (UnsupportedEncodingException e) {
  217. e.printStackTrace();
  218. }
  219. break;
  220. case HCNetSDK.COMM_IPC_AUXALARM_RESULT: //PIR报警、无线报警、呼救报警信息
  221. //System.out.println("PIR报警、无线报警、呼救报警触发");
  222. break;
  223. case HCNetSDK.COMM_ISAPI_ALARM: //ISAPI协议报警信息
  224. HCNetSDK.NET_DVR_ALARM_ISAPI_INFO struEventISAPI = new HCNetSDK.NET_DVR_ALARM_ISAPI_INFO();
  225. struEventISAPI.write();
  226. Pointer pEventISAPI = struEventISAPI.getPointer();
  227. pEventISAPI.write(0, pAlarmInfo.getByteArray(0, struEventISAPI.size()), 0, struEventISAPI.size());
  228. struEventISAPI.read();
  229. String sAlarmInfo = new String(pAlarmer.sDeviceIP);
  230. //报警数据类型:0- invalid,1- xml,2- json
  231. sAlarmInfo = "报警设备IP:" + sAlarmInfo + ":ISAPI协议报警信息, 数据格式:" + struEventISAPI.byDataType +
  232. ", 图片个数:" + struEventISAPI.byPicturesNumber;
  233. //System.out.println(sAlarmInfo);
  234. //将字节写入文件
  235. ByteBuffer jsonbuffers = struEventISAPI.pAlarmData.getByteBuffer(0, struEventISAPI.dwAlarmDataLen);
  236. byte[] jsonbytes = new byte[struEventISAPI.dwAlarmDataLen];
  237. jsonbuffers.rewind();
  238. jsonbuffers.get(jsonbytes);
  239. //图片数据保存
  240. for (int i = 0; i < struEventISAPI.byPicturesNumber; i++) {
  241. HCNetSDK.NET_DVR_ALARM_ISAPI_PICDATA struPicData = new HCNetSDK.NET_DVR_ALARM_ISAPI_PICDATA();
  242. struPicData.write();
  243. Pointer pPicData = struPicData.getPointer();
  244. pPicData.write(0, struEventISAPI.pPicPackData.getByteArray(i * struPicData.size(), struPicData.size()), 0, struPicData.size());
  245. struPicData.read();
  246. //将字节写入文件
  247. long offset = 0;
  248. ByteBuffer buffers = struPicData.pPicData.getByteBuffer(offset, struPicData.dwPicLen);
  249. byte[] bytes = new byte[struPicData.dwPicLen];
  250. buffers.rewind();
  251. buffers.get(bytes);
  252. }
  253. break;
  254. case HCNetSDK.COMM_VCA_ALARM: // 智能检测通用报警(Json或者XML数据结构)
  255. sAlarmInfo = new String(pAlarmer.sDeviceIP);
  256. //报警数据类型:0- invalid,1- xml,2- json
  257. sAlarmInfo = "报警设备IP:" + sAlarmInfo;
  258. //System.out.println(sAlarmInfo);
  259. //将字节写入文件
  260. ByteBuffer dataBuffer = pAlarmInfo.getByteBuffer(0, dwBufLen);
  261. byte[] dataByte = new byte[dwBufLen];
  262. dataBuffer.rewind();
  263. dataBuffer.get(dataByte);
  264. break;
  265. //行为分析信息
  266. case HCNetSDK.COMM_ALARM_RULE:
  267. HCNetSDK.NET_VCA_RULE_ALARM strVcaAlarm = new HCNetSDK.NET_VCA_RULE_ALARM();
  268. strVcaAlarm.write();
  269. Pointer pVCAInfo = strVcaAlarm.getPointer();
  270. pVCAInfo.write(0, pAlarmInfo.getByteArray(0, strVcaAlarm.size()), 0, strVcaAlarm.size());
  271. strVcaAlarm.read();
  272. switch (strVcaAlarm.struRuleInfo.wEventTypeEx) {
  273. case 1: //穿越警戒面 (越界侦测)
  274. //System.out.println("越界侦测报警发生");
  275. strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_TRAVERSE_PLANE.class);
  276. //System.out.println("检测目标:"+strVcaAlarm.struRuleInfo.uEventParam.struTraversePlane.byDetectionTarget); //检测目标,0表示所有目标(表示不锁定检测目标,所有目标都将进行检测),其他取值按位表示不同的检测目标:0x01-人,0x02-车
  277. //图片保存
  278. if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) {
  279. //将字节写入文件
  280. long offset = 0;
  281. ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen);
  282. byte[] bytes = new byte[strVcaAlarm.dwPicDataLen];
  283. buffers.rewind();
  284. buffers.get(bytes);
  285. }
  286. break;
  287. case 2: //目标进入区域
  288. //System.out.println("目标进入区域报警发生");
  289. strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_AREA.class);
  290. //System.out.println("检测目标:"+strVcaAlarm.struRuleInfo.uEventParam.struArea.byDetectionTarget);
  291. //图片保存
  292. if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) {
  293. //将字节写入文件
  294. long offset = 0;
  295. ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen);
  296. byte[] bytes = new byte[strVcaAlarm.dwPicDataLen];
  297. buffers.rewind();
  298. buffers.get(bytes);
  299. }
  300. break;
  301. case 3: //目标离开区域
  302. //System.out.println("目标离开区域报警触发");
  303. strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_AREA.class);
  304. //System.out.println("检测目标:"+strVcaAlarm.struRuleInfo.uEventParam.struArea.byDetectionTarget);
  305. //图片保存
  306. if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) {
  307. //将字节写入文件
  308. long offset = 0;
  309. ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen);
  310. byte[] bytes = new byte[strVcaAlarm.dwPicDataLen];
  311. buffers.rewind();
  312. buffers.get(bytes);
  313. }
  314. break;
  315. case 4: //周界入侵
  316. //System.out.println("周界入侵报警发生");
  317. strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_INTRUSION.class);
  318. //System.out.println("检测目标:"+strVcaAlarm.struRuleInfo.uEventParam.struIntrusion.byDetectionTarget);
  319. //图片保存
  320. if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) {
  321. //将字节写入文件
  322. long offset = 0;
  323. ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen);
  324. byte[] bytes = new byte[strVcaAlarm.dwPicDataLen];
  325. buffers.rewind();
  326. buffers.get(bytes);
  327. }
  328. break;
  329. case 5: //徘徊
  330. //System.out.println("徘徊事件触发");
  331. break;
  332. case 8: //快速移动(奔跑),
  333. //System.out.println("快速移动(奔跑)事件触发");
  334. break;
  335. case 15: //离岗
  336. //System.out.println("离岗事件触发");
  337. strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_LEAVE_POSITION.class);
  338. //System.out.println(strVcaAlarm.struRuleInfo.uEventParam.struLeavePos.byOnPosition);
  339. //图片保存
  340. if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) {
  341. //将字节写入文件
  342. long offset = 0;
  343. ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen);
  344. byte[] bytes = new byte[strVcaAlarm.dwPicDataLen];
  345. buffers.rewind();
  346. buffers.get(bytes);
  347. }
  348. case 20: //倒地检测
  349. //System.out.println("倒地事件触发");
  350. break;
  351. case 44: //玩手机
  352. //System.out.println("玩手机报警发生");
  353. //图片保存
  354. if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) {
  355. //将字节写入文件
  356. long offset = 0;
  357. ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen);
  358. byte[] bytes = new byte[strVcaAlarm.dwPicDataLen];
  359. buffers.rewind();
  360. buffers.get(bytes);
  361. }
  362. break;
  363. case 45: //持续检测
  364. //System.out.println("持续检测事件触发");
  365. default:
  366. //System.out.println("行为事件类型:" + strVcaAlarm.struRuleInfo.wEventTypeEx);
  367. break;
  368. }
  369. break;
  370. case HCNetSDK.COMM_ALARM_ACS: //门禁主机报警信息
  371. //组装数据
  372. AlarmDataInfo info = new AlarmDataInfo();
  373. HCNetSDK.NET_DVR_ACS_ALARM_INFO strACSInfo = new HCNetSDK.NET_DVR_ACS_ALARM_INFO();
  374. strACSInfo.write();
  375. Pointer pACSInfo = strACSInfo.getPointer();
  376. pACSInfo.write(0, pAlarmInfo.getByteArray(0, strACSInfo.size()), 0, strACSInfo.size());
  377. strACSInfo.read();
  378. /**门禁事件的详细信息解析,通过主次类型的可以判断当前的具体门禁类型,例如(主类型:0X5 次类型:0x4b 表示人脸认证通过,
  379. 主类型:0X5 次类型:0x4c 表示人脸认证失败)*/
  380. //System.out.println("【门禁主机报警信息】卡号:" + new String(strACSInfo.struAcsEventInfo.byCardNo).trim() + ",卡类型:" + strACSInfo.struAcsEventInfo.byCardType + ",报警主类型:" + Integer.toHexString(strACSInfo.dwMajor) + ",报警次类型:" + Integer.toHexString(strACSInfo.dwMinor));
  381. //System.out.println("工号1:" + strACSInfo.struAcsEventInfo.dwEmployeeNo);
  382. info.setDwEmployeeNo(strACSInfo.struAcsEventInfo.dwEmployeeNo);
  383. info.setByCardNo(new String(strACSInfo.struAcsEventInfo.byCardNo).trim());
  384. info.setByCardType(strACSInfo.struAcsEventInfo.byCardType);
  385. info.setDwMajor(Integer.toHexString(strACSInfo.dwMajor));
  386. info.setDwMinor(Integer.toHexString(strACSInfo.dwMinor));
  387. info.setSerialNumber(new String(pAlarmer.sSerialNumber).trim());
  388. info.setSerialNo(strACSInfo.struAcsEventInfo.dwSerialNo);
  389. info.setPicTransType(strACSInfo.byPicTransType);
  390. //温度信息(如果设备支持测温功能,人脸温度信息从NET_DVR_ACS_EVENT_INFO_EXTEND_V20结构体获取)
  391. if (strACSInfo.byAcsEventInfoExtendV20 == 1) {
  392. HCNetSDK.NET_DVR_ACS_EVENT_INFO_EXTEND_V20 strAcsInfoExV20 = new HCNetSDK.NET_DVR_ACS_EVENT_INFO_EXTEND_V20();
  393. strAcsInfoExV20.write();
  394. Pointer pAcsInfoExV20 = strAcsInfoExV20.getPointer();
  395. pAcsInfoExV20.write(0, strACSInfo.pAcsEventInfoExtendV20.getByteArray(0, strAcsInfoExV20.size()), 0, strAcsInfoExV20.size());
  396. strAcsInfoExV20.read();
  397. //System.out.println("实时温度值:" + strAcsInfoExV20.fCurrTemperature);
  398. info.setCurrTemperature(strAcsInfoExV20.fCurrTemperature);
  399. }
  400. //考勤状态
  401. if (strACSInfo.byAcsEventInfoExtend == 1) {
  402. HCNetSDK.NET_DVR_ACS_EVENT_INFO_EXTEND strAcsInfoEx = new HCNetSDK.NET_DVR_ACS_EVENT_INFO_EXTEND();
  403. strAcsInfoEx.write();
  404. Pointer pAcsInfoEx = strAcsInfoEx.getPointer();
  405. pAcsInfoEx.write(0, strACSInfo.pAcsEventInfoExtend.getByteArray(0, strAcsInfoEx.size()), 0, strAcsInfoEx.size());
  406. strAcsInfoEx.read();
  407. //System.out.println("考勤状态:" + strAcsInfoEx.byAttendanceStatus);
  408. //System.out.println("工号2:" + new String(strAcsInfoEx.byEmployeeNo).trim());
  409. info.setByEmployeeNo(new String(strAcsInfoEx.byEmployeeNo).trim());
  410. info.setAttendanceStatus(strAcsInfoEx.byAttendanceStatus);
  411. }
  412. /**
  413. * 报警时间
  414. */
  415. String year = Integer.toString(strACSInfo.struTime.dwYear);
  416. String month = String.format("%02d",strACSInfo.struTime.dwMonth);
  417. String day = String.format("%02d",strACSInfo.struTime.dwDay);
  418. String hour = String.format("%02d",strACSInfo.struTime.dwHour);
  419. String minute = String.format("%02d",strACSInfo.struTime.dwMinute);
  420. String second = String.format("%02d",strACSInfo.struTime.dwSecond);
  421. String SwipeTime = year + month + day + hour + minute + second;
  422. info.setAlarmTime(SwipeTime);
  423. if (strACSInfo.dwPicDataLen > 0) {
  424. //将字节写入文件
  425. long offset = 0;
  426. ByteBuffer buffers = strACSInfo.pPicData.getByteBuffer(offset, strACSInfo.dwPicDataLen);
  427. byte[] bytes = new byte[strACSInfo.dwPicDataLen];
  428. buffers.rewind();
  429. buffers.get(bytes);
  430. info.setPic(bytes);
  431. }
  432. callback.process(info);
  433. break;
  434. case HCNetSDK.COMM_ID_INFO_ALARM: //身份证信息
  435. HCNetSDK.NET_DVR_ID_CARD_INFO_ALARM strIDCardInfo = new HCNetSDK.NET_DVR_ID_CARD_INFO_ALARM();
  436. strIDCardInfo.write();
  437. Pointer pIDCardInfo = strIDCardInfo.getPointer();
  438. pIDCardInfo.write(0, pAlarmInfo.getByteArray(0, strIDCardInfo.size()), 0, strIDCardInfo.size());
  439. strIDCardInfo.read();
  440. //System.out.println("报警主类型:" + Integer.toHexString(strIDCardInfo.dwMajor) + ",报警次类型:" + Integer.toHexString(strIDCardInfo.dwMinor));
  441. /**
  442. * 身份证信息
  443. */
  444. String IDnum = new String(strIDCardInfo.struIDCardCfg.byIDNum).trim();
  445. //System.out.println("【身份证信息】:身份证号码:" + IDnum + ",姓名:" + new String(strIDCardInfo.struIDCardCfg.byName).trim() + ",住址:" + new String(strIDCardInfo.struIDCardCfg.byAddr));
  446. /**
  447. * 报警时间
  448. */
  449. String year1 = Integer.toString(strIDCardInfo.struSwipeTime.wYear);
  450. String SwipeTime1 = year1 + strIDCardInfo.struSwipeTime.byMonth + strIDCardInfo.struSwipeTime.byDay + strIDCardInfo.struSwipeTime.byHour + strIDCardInfo.struSwipeTime.byMinute +
  451. strIDCardInfo.struSwipeTime.bySecond;
  452. /**
  453. * 保存图片
  454. */
  455. //身份证图片
  456. if (strIDCardInfo.dwPicDataLen > 0 || strIDCardInfo.pPicData != null) {
  457. //将字节写入文件
  458. long offset = 0;
  459. ByteBuffer buffers = strIDCardInfo.pPicData.getByteBuffer(offset, strIDCardInfo.dwPicDataLen);
  460. byte[] bytes = new byte[strIDCardInfo.dwPicDataLen];
  461. buffers.rewind();
  462. buffers.get(bytes);
  463. }
  464. if (strIDCardInfo.dwCapturePicDataLen > 0 || strIDCardInfo.pCapturePicData != null) {
  465. /**
  466. * 人脸图片保存路径
  467. */
  468. //将字节写入文件
  469. long offset = 0;
  470. ByteBuffer buffers = strIDCardInfo.pCapturePicData.getByteBuffer(offset, strIDCardInfo.dwCapturePicDataLen);
  471. byte[] bytes = new byte[strIDCardInfo.dwCapturePicDataLen];
  472. buffers.rewind();
  473. buffers.get(bytes);
  474. }
  475. break;
  476. case HCNetSDK.COMM_ALARM_VIDEO_INTERCOM: //可视对讲报警信息
  477. //System.out.println("可视对讲报警触发");
  478. HCNetSDK.NET_DVR_VIDEO_INTERCOM_ALARM strVideoIntercomAlarm = new HCNetSDK.NET_DVR_VIDEO_INTERCOM_ALARM();
  479. strVideoIntercomAlarm.write();
  480. Pointer pVideoIntercomAlarm = strVideoIntercomAlarm.getPointer();
  481. pVideoIntercomAlarm.write(0, pAlarmInfo.getByteArray(0, strVideoIntercomAlarm.size()), 0, strVideoIntercomAlarm.size());
  482. strVideoIntercomAlarm.read();
  483. //System.out.println("byAlarmType:" + strVideoIntercomAlarm.byAlarmType);
  484. if (strVideoIntercomAlarm.byAlarmType == 1) {
  485. strVideoIntercomAlarm.uAlarmInfo.setType(HCNetSDK.NET_DVR_VIDEO_INTERCOM_ALARM_INFO_UNION.class);
  486. strVideoIntercomAlarm.uAlarmInfo.read();
  487. //System.out.println("byZoneType :" + strVideoIntercomAlarm.uAlarmInfo.struZoneAlarm.byZoneType);
  488. }
  489. break;
  490. case HCNetSDK.COMM_UPLOAD_VIDEO_INTERCOM_EVENT: //可视对讲事件记录信息
  491. //System.out.println("可视对讲事件记录报警触发");
  492. HCNetSDK.NET_DVR_VIDEO_INTERCOM_EVENT strVideoIntercomEvent = new HCNetSDK.NET_DVR_VIDEO_INTERCOM_EVENT();
  493. strVideoIntercomEvent.write();
  494. Pointer pVideoIntercomEvent = strVideoIntercomEvent.getPointer();
  495. pVideoIntercomEvent.write(0, pAlarmInfo.getByteArray(0, strVideoIntercomEvent.size()), 0, strVideoIntercomEvent.size());
  496. strVideoIntercomEvent.read();
  497. //System.out.println("byEventType:" + strVideoIntercomEvent.byEventType);
  498. if (strVideoIntercomEvent.byEventType == 1) {
  499. strVideoIntercomEvent.uEventInfo.setType(HCNetSDK.NET_DVR_UNLOCK_RECORD_INFO.class);
  500. strVideoIntercomEvent.uEventInfo.read();
  501. //System.out.println("byUnlockType:" + strVideoIntercomEvent.uEventInfo.struUnlockRecord.byUnlockType + ",byControlSrc:" + new String(strVideoIntercomEvent.uEventInfo.struUnlockRecord.byControlSrc).trim());
  502. }
  503. break;
  504. case HCNetSDK.COMM_UPLOAD_FACESNAP_RESULT: //实时人脸抓拍上传
  505. //System.out.println("UPLOAD_FACESNAP_Alarm");
  506. HCNetSDK.NET_VCA_FACESNAP_RESULT strFaceSnapInfo = new HCNetSDK.NET_VCA_FACESNAP_RESULT();
  507. strFaceSnapInfo.write();
  508. Pointer pFaceSnapInfo = strFaceSnapInfo.getPointer();
  509. pFaceSnapInfo.write(0, pAlarmInfo.getByteArray(0, strFaceSnapInfo.size()), 0, strFaceSnapInfo.size());
  510. strFaceSnapInfo.read();
  511. //事件时间
  512. int dwYear = (strFaceSnapInfo.dwAbsTime >> 26) + 2000;
  513. int dwMonth = (strFaceSnapInfo.dwAbsTime >> 22) & 15;
  514. int dwDay = (strFaceSnapInfo.dwAbsTime >> 17) & 31;
  515. int dwHour = (strFaceSnapInfo.dwAbsTime >> 12) & 31;
  516. int dwMinute = (strFaceSnapInfo.dwAbsTime >> 6) & 63;
  517. int dwSecond = (strFaceSnapInfo.dwAbsTime >> 0) & 63;
  518. String strAbsTime = "" + String.format("%04d", dwYear) +
  519. String.format("%02d", dwMonth) +
  520. String.format("%02d", dwDay) +
  521. String.format("%02d", dwHour) +
  522. String.format("%02d", dwMinute) +
  523. String.format("%02d", dwSecond);
  524. //人脸属性信息
  525. String sFaceAlarmInfo = "Abs时间:" + strAbsTime + ",年龄:" + strFaceSnapInfo.struFeature.byAge +
  526. ",性别:" + strFaceSnapInfo.struFeature.bySex + ",是否戴口罩:" +
  527. strFaceSnapInfo.struFeature.byMask + ",是否微笑:" + strFaceSnapInfo.struFeature.bySmile;
  528. //System.out.println("人脸信息:" + sFaceAlarmInfo);
  529. //人脸测温信息
  530. if (strFaceSnapInfo.byAddInfo == 1) {
  531. HCNetSDK.NET_VCA_FACESNAP_ADDINFO strAddInfo = new HCNetSDK.NET_VCA_FACESNAP_ADDINFO();
  532. strAddInfo.write();
  533. Pointer pAddInfo = strAddInfo.getPointer();
  534. pAddInfo.write(0, strFaceSnapInfo.pAddInfoBuffer.getByteArray(0, strAddInfo.size()), 0, strAddInfo.size());
  535. strAddInfo.read();
  536. String sTemperatureInfo = "测温是否开启:" + strAddInfo.byFaceSnapThermometryEnabled + "人脸温度:" + strAddInfo.fFaceTemperature + "温度是否异常"
  537. + strAddInfo.byIsAbnomalTemperature + "报警温度阈值:" + strAddInfo.fAlarmTemperature;
  538. //System.out.println("人脸温度信息:" + sTemperatureInfo);
  539. }
  540. try {
  541. SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//设置日期格式
  542. String time = df.format(new Date());// new Date()为获取当前系统时间
  543. //人脸图片写文件
  544. FileOutputStream small = new FileOutputStream("../pic/" + time + "small.jpg");
  545. FileOutputStream big = new FileOutputStream("../pic/" + time + "big.jpg");
  546. try {
  547. small.write(strFaceSnapInfo.pBuffer1.getByteArray(0, strFaceSnapInfo.dwFacePicLen), 0, strFaceSnapInfo.dwFacePicLen);
  548. small.close();
  549. } catch (IOException ex) {
  550. ex.printStackTrace();
  551. }
  552. try {
  553. big.write(strFaceSnapInfo.pBuffer2.getByteArray(0, strFaceSnapInfo.dwBackgroundPicLen), 0, strFaceSnapInfo.dwBackgroundPicLen);
  554. big.close();
  555. } catch (IOException ex) {
  556. ex.printStackTrace();
  557. }
  558. } catch (FileNotFoundException ex) {
  559. ex.printStackTrace();
  560. }
  561. break;
  562. case HCNetSDK.COMM_SNAP_MATCH_ALARM: //人脸黑名单比对报警
  563. HCNetSDK.NET_VCA_FACESNAP_MATCH_ALARM strFaceSnapMatch = new HCNetSDK.NET_VCA_FACESNAP_MATCH_ALARM();
  564. strFaceSnapMatch.write();
  565. Pointer pFaceSnapMatch = strFaceSnapMatch.getPointer();
  566. pFaceSnapMatch.write(0, pAlarmInfo.getByteArray(0, strFaceSnapMatch.size()), 0, strFaceSnapMatch.size());
  567. strFaceSnapMatch.read();
  568. //比对结果,0-保留,1-比对成功,2-比对失败
  569. String sFaceSnapMatchInfo = "比对结果:" + strFaceSnapMatch.byContrastStatus + ",相似度:" + strFaceSnapMatch.fSimilarity;
  570. //System.out.println(sFaceSnapMatchInfo);
  571. if (strFaceSnapMatch.struBlockListInfo.dwFDIDLen > 0) {
  572. long offset1 = 0;
  573. ByteBuffer buffers1 = strFaceSnapMatch.struBlockListInfo.pFDID.getByteBuffer(offset1, strFaceSnapMatch.struBlockListInfo.dwFDIDLen);
  574. byte[] bytes1 = new byte[strFaceSnapMatch.struBlockListInfo.dwFDIDLen];
  575. buffers1.get(bytes1);
  576. //System.out.println("人脸库ID:" + new String(bytes1));
  577. }
  578. if (strFaceSnapMatch.struBlockListInfo.dwPIDLen > 0) {
  579. long offset2 = 0;
  580. ByteBuffer buffers2 = strFaceSnapMatch.struBlockListInfo.pPID.getByteBuffer(offset2, strFaceSnapMatch.struBlockListInfo.dwPIDLen);
  581. byte[] bytes2 = new byte[strFaceSnapMatch.struBlockListInfo.dwPIDLen];
  582. buffers2.get(bytes2);
  583. //System.out.println("图片ID:" + new String(bytes2));
  584. }
  585. if (strFaceSnapMatch.struBlockListInfo.struBlockListInfo.dwFCAdditionInfoLen > 0) {
  586. //抓拍库附加信息解析(解析人脸测温温度,人脸温度存放在附件信息的XML报文中,节点: <currTemperature> )
  587. //将字节写入文件
  588. dataBuffer = strFaceSnapMatch.struBlockListInfo.struBlockListInfo.pFCAdditionInfoBuffer.getByteBuffer(0, strFaceSnapMatch.struBlockListInfo.struBlockListInfo.dwFCAdditionInfoLen);
  589. dataByte = new byte[dwBufLen];
  590. dataBuffer.rewind();
  591. dataBuffer.get(dataByte);
  592. }
  593. //人脸比对报警图片保存,图片格式二进制
  594. if ((strFaceSnapMatch.dwSnapPicLen > 0) && (strFaceSnapMatch.byPicTransType == 0)) {
  595. //将字节写入文件
  596. long offset = 0;
  597. ByteBuffer buffers = strFaceSnapMatch.pSnapPicBuffer.getByteBuffer(offset, strFaceSnapMatch.dwSnapPicLen);
  598. byte[] bytes = new byte[strFaceSnapMatch.dwSnapPicLen];
  599. buffers.rewind();
  600. buffers.get(bytes);
  601. }
  602. if ((strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen > 0) && (strFaceSnapMatch.byPicTransType == 0)) {
  603. //将字节写入文件
  604. long offset = 0;
  605. ByteBuffer buffers = strFaceSnapMatch.struSnapInfo.pBuffer1.getByteBuffer(offset, strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen);
  606. byte[] bytes = new byte[strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen];
  607. buffers.rewind();
  608. buffers.get(bytes);
  609. }
  610. if ((strFaceSnapMatch.struBlockListInfo.dwBlockListPicLen > 0) && (strFaceSnapMatch.byPicTransType == 0)) {
  611. //将字节写入文件
  612. long offset = 0;
  613. ByteBuffer buffers = strFaceSnapMatch.struBlockListInfo.pBuffer1.getByteBuffer(offset, strFaceSnapMatch.struBlockListInfo.dwBlockListPicLen);
  614. byte[] bytes = new byte[strFaceSnapMatch.struBlockListInfo.dwBlockListPicLen];
  615. buffers.rewind();
  616. buffers.get(bytes);
  617. }
  618. //人脸比对报警图片保存,图片格式URL格式
  619. if ((strFaceSnapMatch.dwSnapPicLen > 0) && (strFaceSnapMatch.byPicTransType == 1)) {
  620. long offset = 0;
  621. ByteBuffer buffers = strFaceSnapMatch.pSnapPicBuffer.getByteBuffer(offset, strFaceSnapMatch.dwSnapPicLen);
  622. byte[] bytes = new byte[strFaceSnapMatch.dwSnapPicLen];
  623. buffers.rewind();
  624. buffers.get(bytes);
  625. String SnapPicUrl = new String(bytes);
  626. //System.out.println("抓拍图URL:" + SnapPicUrl);
  627. }
  628. if ((strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen > 0) && (strFaceSnapMatch.byPicTransType == 1)) {
  629. long offset = 0;
  630. ByteBuffer buffers = strFaceSnapMatch.struSnapInfo.pBuffer1.getByteBuffer(offset, strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen);
  631. byte[] bytes = new byte[strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen];
  632. buffers.rewind();
  633. buffers.get(bytes);
  634. String SnapPicUrl = new String(bytes);
  635. //System.out.println("抓拍人脸子图URL:" + SnapPicUrl);
  636. }
  637. if ((strFaceSnapMatch.struBlockListInfo.dwBlockListPicLen > 0) && (strFaceSnapMatch.byPicTransType == 1)) {
  638. long offset = 0;
  639. ByteBuffer buffers = strFaceSnapMatch.struBlockListInfo.pBuffer1.getByteBuffer(offset, strFaceSnapMatch.struBlockListInfo.dwBlockListPicLen);
  640. byte[] bytes = new byte[strFaceSnapMatch.struBlockListInfo.dwBlockListPicLen];
  641. buffers.rewind();
  642. buffers.get(bytes);
  643. String SnapPicUrl = new String(bytes);
  644. //System.out.println("人脸库人脸图的URL:" + SnapPicUrl);
  645. }
  646. break;
  647. // 客流量报警信息
  648. case HCNetSDK.COMM_ALARM_PDC:
  649. HCNetSDK.NET_DVR_PDC_ALRAM_INFO strPDCResult = new HCNetSDK.NET_DVR_PDC_ALRAM_INFO();
  650. strPDCResult.write();
  651. Pointer pPDCInfo = strPDCResult.getPointer();
  652. pPDCInfo.write(0, pAlarmInfo.getByteArray(0, strPDCResult.size()), 0, strPDCResult.size());
  653. strPDCResult.read();
  654. // byMode=0-实时统计结果(联合体中struStatFrame有效),
  655. if (strPDCResult.byMode == 0) {
  656. strPDCResult.uStatModeParam.setType(HCNetSDK.NET_DVR_STATFRAME.class);
  657. String sAlarmPDC0Info = "实时客流量统计,进入人数:" + strPDCResult.dwEnterNum + ",离开人数:" + strPDCResult.dwLeaveNum +
  658. ", byMode:" + strPDCResult.byMode + ", dwRelativeTime:" + strPDCResult.uStatModeParam.struStatFrame.dwRelativeTime +
  659. ", dwAbsTime:" + strPDCResult.uStatModeParam.struStatFrame.dwAbsTime;
  660. }
  661. // byMode=1-周期统计结果(联合体中struStatTime有效),
  662. if (strPDCResult.byMode == 1) {
  663. strPDCResult.uStatModeParam.setType(HCNetSDK.NET_DVR_STATTIME.class);
  664. String strtmStart = "" + String.format("%04d", strPDCResult.uStatModeParam.struStatTime.tmStart.dwYear) +
  665. String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmStart.dwMonth) +
  666. String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmStart.dwDay) +
  667. String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmStart.dwHour) +
  668. String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmStart.dwMinute) +
  669. String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmStart.dwSecond);
  670. String strtmEnd = "" + String.format("%04d", strPDCResult.uStatModeParam.struStatTime.tmEnd.dwYear) +
  671. String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmEnd.dwMonth) +
  672. String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmEnd.dwDay) +
  673. String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmEnd.dwHour) +
  674. String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmEnd.dwMinute) +
  675. String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmEnd.dwSecond);
  676. String sAlarmPDC1Info = "周期性客流量统计,进入人数:" + strPDCResult.dwEnterNum + ",离开人数:" + strPDCResult.dwLeaveNum +
  677. ", byMode:" + strPDCResult.byMode + ", tmStart:" + strtmStart + ",tmEnd :" + strtmEnd;
  678. }
  679. break;
  680. case HCNetSDK.COMM_ALARM_V30: //移动侦测、视频丢失、遮挡、IO信号量等报警信息(V3.0以上版本支持的设备)
  681. HCNetSDK.NET_DVR_ALARMINFO_V30 struAlarmInfo = new HCNetSDK.NET_DVR_ALARMINFO_V30();
  682. struAlarmInfo.write();
  683. Pointer pAlarmInfo_V30 = struAlarmInfo.getPointer();
  684. pAlarmInfo_V30.write(0, pAlarmInfo.getByteArray(0, struAlarmInfo.size()), 0, struAlarmInfo.size());
  685. struAlarmInfo.read();
  686. //System.out.println("报警类型:" + struAlarmInfo.dwAlarmType); // 3-移动侦测
  687. break;
  688. case HCNetSDK.COMM_ALARM_V40: //移动侦测、视频丢失、遮挡、IO信号量等报警信息,报警数据为可变长
  689. HCNetSDK.NET_DVR_ALARMINFO_V40 struAlarmInfoV40 = new HCNetSDK.NET_DVR_ALARMINFO_V40();
  690. struAlarmInfoV40.write();
  691. Pointer pAlarmInfoV40 = struAlarmInfoV40.getPointer();
  692. pAlarmInfoV40.write(0, pAlarmInfo.getByteArray(0, struAlarmInfoV40.size()), 0, struAlarmInfoV40.size());
  693. struAlarmInfoV40.read();
  694. //System.out.println("报警类型:" + struAlarmInfoV40.struAlarmFixedHeader.dwAlarmType); //3-移动侦测
  695. break;
  696. case HCNetSDK.COMM_THERMOMETRY_ALARM: //温度报警信息
  697. HCNetSDK.NET_DVR_THERMOMETRY_ALARM struTemInfo = new HCNetSDK.NET_DVR_THERMOMETRY_ALARM();
  698. struTemInfo.write();
  699. Pointer pTemInfo = struTemInfo.getPointer();
  700. pTemInfo.write(0, pAlarmInfo.getByteArray(0, struTemInfo.size()), 0, struTemInfo.size());
  701. struTemInfo.read();
  702. String sThermAlarmInfo = "规则ID:" + struTemInfo.byRuleID + "预置点号:" + struTemInfo.wPresetNo + "报警等级:" + struTemInfo.byAlarmLevel + "报警类型:" +
  703. struTemInfo.byAlarmType + "当前温度:" + struTemInfo.fCurrTemperature;
  704. //System.out.println(sThermAlarmInfo);
  705. //可见光图片保存
  706. if ((struTemInfo.dwPicLen > 0) && (struTemInfo.byPicTransType == 0)) {
  707. //将字节写入文件
  708. long offset = 0;
  709. ByteBuffer buffers = struTemInfo.pPicBuff.getByteBuffer(offset, struTemInfo.dwPicLen);
  710. byte[] bytes = new byte[struTemInfo.dwPicLen];
  711. buffers.rewind();
  712. buffers.get(bytes);
  713. }
  714. if ((struTemInfo.dwThermalPicLen > 0) && (struTemInfo.byPicTransType == 0)) {
  715. //将字节写入文件
  716. long offset = 0;
  717. ByteBuffer buffers = struTemInfo.pThermalPicBuff.getByteBuffer(offset, struTemInfo.dwThermalPicLen);
  718. byte[] bytes = new byte[struTemInfo.dwThermalPicLen];
  719. buffers.rewind();
  720. buffers.get(bytes);
  721. }
  722. break;
  723. case HCNetSDK.COMM_THERMOMETRY_DIFF_ALARM: //温差检测报警
  724. HCNetSDK.NET_DVR_THERMOMETRY_DIFF_ALARM strThermDiffAlarm = new HCNetSDK.NET_DVR_THERMOMETRY_DIFF_ALARM();
  725. strThermDiffAlarm.write();
  726. Pointer pTemDiffInfo = strThermDiffAlarm.getPointer();
  727. pTemDiffInfo.write(0, pAlarmInfo.getByteArray(0, strThermDiffAlarm.size()), 0, strThermDiffAlarm.size());
  728. strThermDiffAlarm.read();
  729. String sThremDiffInfo = "通道号:" + strThermDiffAlarm.dwChannel + ",报警规则:" + strThermDiffAlarm.byAlarmRule + ",当前温差:" + strThermDiffAlarm.fCurTemperatureDiff;
  730. //System.out.println(sThremDiffInfo);
  731. //可见光图片保存
  732. if ((strThermDiffAlarm.dwPicLen > 0) && (strThermDiffAlarm.byPicTransType == 0)) {
  733. //将字节写入文件
  734. long offset = 0;
  735. ByteBuffer buffers = strThermDiffAlarm.pPicBuff.getByteBuffer(offset, strThermDiffAlarm.dwPicLen);
  736. byte[] bytes = new byte[strThermDiffAlarm.dwPicLen];
  737. buffers.rewind();
  738. buffers.get(bytes);
  739. }
  740. //热成像图片保存
  741. if ((strThermDiffAlarm.dwThermalPicLen > 0) && (strThermDiffAlarm.byPicTransType == 0)) {
  742. //将字节写入文件
  743. long offset = 0;
  744. ByteBuffer buffers = strThermDiffAlarm.pThermalPicBuff.getByteBuffer(offset, strThermDiffAlarm.dwThermalPicLen);
  745. byte[] bytes = new byte[strThermDiffAlarm.dwThermalPicLen];
  746. buffers.rewind();
  747. buffers.get(bytes);
  748. }
  749. break;
  750. case HCNetSDK.COMM_ALARM_SHIPSDETECTION: //船只检测报警
  751. HCNetSDK.NET_DVR_SHIPSDETECTION_ALARM struShipAlarm = new HCNetSDK.NET_DVR_SHIPSDETECTION_ALARM();
  752. struShipAlarm.write();
  753. Pointer pShipAlarm = struShipAlarm.getPointer();
  754. pShipAlarm.write(0, pAlarmInfo.getByteArray(0, struShipAlarm.size()), 0, struShipAlarm.size());
  755. struShipAlarm.read();
  756. String sShipAlarm = "绝对时间:" + struShipAlarm.dwAbsTime + ",正跨越检测线的船只数:" + struShipAlarm.byShipsNum + ",船头检测的船只数 :" + struShipAlarm.byShipsNumHead
  757. + ", 船尾检测的船只数 :" + struShipAlarm.byShipsNumEnd;
  758. //System.out.println(sShipAlarm);
  759. //可见光图片保存
  760. if ((struShipAlarm.dwPicLen > 0) && (struShipAlarm.byPicTransType == 0)) {
  761. //将字节写入文件
  762. long offset = 0;
  763. ByteBuffer buffers = struShipAlarm.pPicBuffer.getByteBuffer(offset, struShipAlarm.dwPicLen);
  764. byte[] bytes = new byte[struShipAlarm.dwPicLen];
  765. buffers.rewind();
  766. buffers.get(bytes);
  767. }
  768. //热成像图片保存
  769. if ((struShipAlarm.dwThermalPicLen > 0) && (struShipAlarm.byPicTransType == 0)) {
  770. //将字节写入文件
  771. long offset = 0;
  772. ByteBuffer buffers = struShipAlarm.pThermalPicBuffer.getByteBuffer(offset, struShipAlarm.dwThermalPicLen);
  773. byte[] bytes = new byte[struShipAlarm.dwThermalPicLen];
  774. buffers.rewind();
  775. buffers.get(bytes);
  776. }
  777. break;
  778. case HCNetSDK.COMM_FIREDETECTION_ALARM://烟火检测
  779. HCNetSDK.NET_DVR_FIREDETECTION_ALARM struFireDecAlarm = new HCNetSDK.NET_DVR_FIREDETECTION_ALARM();
  780. struFireDecAlarm.write();
  781. Pointer pFireDecAlarm = struFireDecAlarm.getPointer();
  782. pFireDecAlarm.write(0, pAlarmInfo.getByteArray(0, struFireDecAlarm.size()), 0, struFireDecAlarm.size());
  783. struFireDecAlarm.read();
  784. String sFireDecAlarmInfo = "绝对时间:" + struFireDecAlarm.dwAbsTime + ",报警子类型:" + struFireDecAlarm.byAlarmSubType + ",火点最高温度 :" +
  785. struFireDecAlarm.wFireMaxTemperature + ",火点目标距离:" + struFireDecAlarm.wTargetDistance;
  786. //System.out.println(sFireDecAlarmInfo);
  787. //可见光图片保存
  788. if ((struFireDecAlarm.dwVisiblePicLen > 0) && (struFireDecAlarm.byPicTransType == 0)) {
  789. //将字节写入文件
  790. long offset = 0;
  791. ByteBuffer buffers = struFireDecAlarm.pVisiblePicBuf.getByteBuffer(offset, struFireDecAlarm.dwVisiblePicLen);
  792. byte[] bytes = new byte[struFireDecAlarm.dwVisiblePicLen];
  793. buffers.rewind();
  794. buffers.get(bytes);
  795. }
  796. //热成像图片保存
  797. if ((struFireDecAlarm.dwPicDataLen > 0) && (struFireDecAlarm.byPicTransType == 0)) {
  798. //将字节写入文件
  799. long offset = 0;
  800. ByteBuffer buffers = struFireDecAlarm.pBuffer.getByteBuffer(offset, struFireDecAlarm.dwPicDataLen);
  801. byte[] bytes = new byte[struFireDecAlarm.dwPicDataLen];
  802. buffers.rewind();
  803. buffers.get(bytes);
  804. }
  805. break;
  806. case HCNetSDK.COMM_UPLOAD_AIOP_VIDEO: //AI开放平台接入视频检测报警信息
  807. //System.out.println("AI开放平台接入视频检测报警上传");
  808. HCNetSDK.NET_AIOP_VIDEO_HEAD struAIOPVideo = new HCNetSDK.NET_AIOP_VIDEO_HEAD();
  809. struAIOPVideo.write();
  810. Pointer pAIOPVideo = struAIOPVideo.getPointer();
  811. pAIOPVideo.write(0, pAlarmInfo.getByteArray(0, struAIOPVideo.size()), 0, struAIOPVideo.size());
  812. struAIOPVideo.read();
  813. //System.out.println("视频任务ID" + new String(struAIOPVideo.szTaskID));
  814. //System.out.println("通道号:" + struAIOPVideo.dwChannel);
  815. //System.out.println("检测模型包ID" + new String(struAIOPVideo.szMPID));
  816. String strTime = String.format("%04d", struAIOPVideo.struTime.wYear) +
  817. String.format("%02d", struAIOPVideo.struTime.wMonth) +
  818. String.format("%02d", struAIOPVideo.struTime.wDay) +
  819. String.format("%02d", struAIOPVideo.struTime.wHour) +
  820. String.format("%02d", struAIOPVideo.struTime.wMinute) +
  821. String.format("%02d", struAIOPVideo.struTime.wSecond) +
  822. String.format("%03d", struAIOPVideo.struTime.wMilliSec);
  823. //AIOPData数据
  824. if (struAIOPVideo.dwAIOPDataSize > 0) {
  825. //将字节写入文件
  826. long offset = 0;
  827. ByteBuffer buffers = struAIOPVideo.pBufferAIOPData.getByteBuffer(offset, struAIOPVideo.dwAIOPDataSize);
  828. byte[] bytes = new byte[struAIOPVideo.dwAIOPDataSize];
  829. buffers.rewind();
  830. buffers.get(bytes);
  831. }
  832. //图片数据保存
  833. if (struAIOPVideo.dwPictureSize > 0) {
  834. //将字节写入文件
  835. long offset = 0;
  836. ByteBuffer buffers = struAIOPVideo.pBufferPicture.getByteBuffer(offset, struAIOPVideo.dwPictureSize);
  837. byte[] bytes = new byte[struAIOPVideo.dwPictureSize];
  838. buffers.rewind();
  839. buffers.get(bytes);
  840. }
  841. break;
  842. case HCNetSDK.COMM_UPLOAD_AIOP_PICTURE: //AI开放平台接入图片检测报警信息
  843. //System.out.println("AI开放平台接入图片检测报警上传");
  844. HCNetSDK.NET_AIOP_PICTURE_HEAD struAIOPPic = new HCNetSDK.NET_AIOP_PICTURE_HEAD();
  845. struAIOPPic.write();
  846. Pointer pAIOPPic = struAIOPPic.getPointer();
  847. pAIOPPic.write(0, pAlarmInfo.getByteArray(0, struAIOPPic.size()), 0, struAIOPPic.size());
  848. struAIOPPic.read();
  849. //System.out.println("图片ID:" + new String(struAIOPPic.szPID));
  850. //System.out.println("检测模型包ID:" + new String(struAIOPPic.szMPID));
  851. String strPicTime = "" + String.format("%04d", struAIOPPic.struTime.wYear) +
  852. String.format("%02d", struAIOPPic.struTime.wMonth) +
  853. String.format("%02d", struAIOPPic.struTime.wDay) +
  854. String.format("%02d", struAIOPPic.struTime.wHour) +
  855. String.format("%02d", struAIOPPic.struTime.wMinute) +
  856. String.format("%02d", struAIOPPic.struTime.wSecond) +
  857. String.format("%03d", struAIOPPic.struTime.wMilliSec);
  858. //AIOPData数据
  859. if (struAIOPPic.dwAIOPDataSize > 0) {
  860. //将字节写入文件
  861. long offset = 0;
  862. ByteBuffer buffers = struAIOPPic.pBufferAIOPData.getByteBuffer(offset, struAIOPPic.dwAIOPDataSize);
  863. byte[] bytes = new byte[struAIOPPic.dwAIOPDataSize];
  864. buffers.rewind();
  865. buffers.get(bytes);
  866. }
  867. break;
  868. //AI开放平台接入轮询抓图检测报警信息
  869. case HCNetSDK.COMM_UPLOAD_AIOP_POLLING_SNAP:
  870. //System.out.println("AI开放平台接入轮询抓图检测报警事件上传");
  871. HCNetSDK.NET_AIOP_POLLING_SNAP_HEAD strAiopPollingPic = new HCNetSDK.NET_AIOP_POLLING_SNAP_HEAD();
  872. strAiopPollingPic.write();
  873. Pointer pAiopPollingPic = strAiopPollingPic.getPointer();
  874. pAiopPollingPic.write(0, pAlarmInfo.getByteArray(0, strAiopPollingPic.size()), 0, strAiopPollingPic.size());
  875. strAiopPollingPic.read();
  876. //System.out.println("通道号:" + strAiopPollingPic.dwChannel);
  877. //System.out.println("轮询抓图任务ID:" + new String(strAiopPollingPic.szTaskID));
  878. String strPollingPicTime = "" + String.format("%04d", strAiopPollingPic.struTime.wYear) +
  879. String.format("%02d", strAiopPollingPic.struTime.wMonth) +
  880. String.format("%02d", strAiopPollingPic.struTime.wDay) +
  881. String.format("%02d", strAiopPollingPic.struTime.wHour) +
  882. String.format("%02d", strAiopPollingPic.struTime.wMinute) +
  883. String.format("%02d", strAiopPollingPic.struTime.wSecond) +
  884. String.format("%03d", strAiopPollingPic.struTime.wMilliSec);
  885. //AIOPData数据保存
  886. if (strAiopPollingPic.dwAIOPDataSize > 0) {
  887. //将字节写入文件
  888. long offset = 0;
  889. ByteBuffer buffers = strAiopPollingPic.pBufferAIOPData.getByteBuffer(offset, strAiopPollingPic.dwAIOPDataSize);
  890. byte[] bytes = new byte[strAiopPollingPic.dwAIOPDataSize];
  891. buffers.rewind();
  892. buffers.get(bytes);
  893. }
  894. //轮询抓图图片保存
  895. if (strAiopPollingPic.dwPictureSize > 0) {
  896. //将字节写入文件
  897. long offset = 0;
  898. ByteBuffer buffers = strAiopPollingPic.pBufferPicture.getByteBuffer(offset, strAiopPollingPic.dwPictureSize);
  899. byte[] bytes = new byte[strAiopPollingPic.dwPictureSize];
  900. buffers.rewind();
  901. buffers.get(bytes);
  902. }
  903. break;
  904. //AI开放平台接入轮询视频检测报警信息
  905. case HCNetSDK.COMM_UPLOAD_AIOP_POLLING_VIDEO:
  906. //System.out.println("AI开放平台接入轮询视频检测报警事件上传");
  907. HCNetSDK.NET_AIOP_POLLING_VIDEO_HEAD strAiopPollingVideo = new HCNetSDK.NET_AIOP_POLLING_VIDEO_HEAD();
  908. strAiopPollingVideo.write();
  909. Pointer pAiopPollingVideo = strAiopPollingVideo.getPointer();
  910. pAiopPollingVideo.write(0, pAlarmInfo.getByteArray(0, strAiopPollingVideo.size()), 0, strAiopPollingVideo.size());
  911. strAiopPollingVideo.read();
  912. //System.out.println("通道号:" + strAiopPollingVideo.dwChannel);
  913. //System.out.println("轮询视频任务ID:" + new String(strAiopPollingVideo.szTaskID));
  914. String AiopPollingVideoTime = "" + String.format("%04d", strAiopPollingVideo.struTime.wYear) +
  915. String.format("%02d", strAiopPollingVideo.struTime.wMonth) +
  916. String.format("%02d", strAiopPollingVideo.struTime.wDay) +
  917. String.format("%02d", strAiopPollingVideo.struTime.wHour) +
  918. String.format("%02d", strAiopPollingVideo.struTime.wMinute) +
  919. String.format("%02d", strAiopPollingVideo.struTime.wSecond) +
  920. String.format("%03d", strAiopPollingVideo.struTime.wMilliSec);
  921. //AIOPData数据保存
  922. if (strAiopPollingVideo.dwAIOPDataSize > 0) {
  923. //将字节写入文件
  924. long offset = 0;
  925. ByteBuffer buffers = strAiopPollingVideo.pBufferAIOPData.getByteBuffer(offset, strAiopPollingVideo.dwAIOPDataSize);
  926. byte[] bytes = new byte[strAiopPollingVideo.dwAIOPDataSize];
  927. buffers.rewind();
  928. buffers.get(bytes);
  929. }
  930. //对应分析图片数据
  931. if (strAiopPollingVideo.dwPictureSize > 0) {
  932. //将字节写入文件
  933. long offset = 0;
  934. ByteBuffer buffers = strAiopPollingVideo.pBufferPicture.getByteBuffer(offset, strAiopPollingVideo.dwPictureSize);
  935. byte[] bytes = new byte[strAiopPollingVideo.dwPictureSize];
  936. buffers.rewind();
  937. buffers.get(bytes);
  938. }
  939. break;
  940. default:
  941. //System.out.println("报警类型" + Integer.toHexString(lCommand));
  942. break;
  943. }
  944. }
  945. }