ew = new QueryWrapper<>();
+ if (ObjectUtil.isNotEmpty(monitorId))
+ ew.eq("MONITOR_ID", monitorId);
+ if (ObjectUtil.isNotEmpty(startTime))
+ ew.ge("ALARM_TIME", startTime);
+ if (ObjectUtil.isNotEmpty(endTime))
+ ew.le("ALARM_TIME", endTime);
+ if (ObjectUtil.isNotEmpty(status))
+ ew.eq("ALARM_STATUS", status);
+ return this.list(ew).size() > 0 ? true : false;
+ }
+
+ @Override
+ public void clearByMonitorTime(Long monitorId, String startTime, String endTime) {
+ this.baseMapper.clearByMonitorTime(monitorId, startTime, endTime);
+ CommDoorUtil.cancelPTZ(monitorId + "");
+ }
+
+
+ @Override
+ public int clearByMonitor(Long monitorId, Double alarmDirection, Double alarmPitch) {
+ return this.baseMapper.clearByMonitor(monitorId, alarmDirection, alarmPitch);
+
+ }
+
}
diff --git a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmRuleServiceImpl.java b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmRuleServiceImpl.java
index df86e39..661c5d3 100644
--- a/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmRuleServiceImpl.java
+++ b/casic-data/src/main/java/com/casic/missiles/modular/system/service/impl/AlarmRuleServiceImpl.java
@@ -1,15 +1,17 @@
package com.casic.missiles.modular.system.service.impl;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.casic.missiles.enums.BusinessExceptionEnum;
import com.casic.missiles.exception.BusinessException;
import com.casic.missiles.model.response.ResponseData;
-import com.casic.missiles.modular.system.dto.AlarmConfigDTO;
-import com.casic.missiles.modular.system.model.AlarmRule;
import com.casic.missiles.modular.system.dao.AlarmRuleMapper;
+import com.casic.missiles.modular.system.model.AlarmRule;
import com.casic.missiles.modular.system.service.IAlarmRuleService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
+import java.util.Date;
+
/**
*
* 规则设置 服务实现类
@@ -30,4 +32,57 @@
throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED);
}
+ @Override
+ public void resetAlarmRule(Long monitorId, Double high) {
+ AlarmRule alarmRule = getById(monitorId);
+ if (ObjectUtil.isNotEmpty(alarmRule)) {
+ alarmRule.setHigh(high);
+ updateById(alarmRule);
+ } else {
+ AlarmRule newAlarmRule = new AlarmRule();
+ newAlarmRule.setMonitorId(monitorId);
+ newAlarmRule.setHigh(high);
+ newAlarmRule.setTs(new Date());
+ save(newAlarmRule);
+ }
+ }
+
+ @Override
+ public void resetAlarmRule(Long monitorId, Double high, Integer stopTime, Integer speed, Integer angle) {
+ AlarmRule alarmRule = getById(monitorId);
+ if (ObjectUtil.isNotEmpty(alarmRule)) {
+ if (ObjectUtil.isNotEmpty(high))
+ alarmRule.setHigh(high);
+ if (ObjectUtil.isNotEmpty(stopTime))
+ alarmRule.setStopTime(stopTime);
+ if (ObjectUtil.isNotEmpty(angle))
+ alarmRule.setAngle(angle);
+ if (ObjectUtil.isNotEmpty(speed))
+ alarmRule.setSpeed(speed);
+ if (ObjectUtil.isEmpty(high) && ObjectUtil.isEmpty(stopTime) &&
+ ObjectUtil.isEmpty(speed) && ObjectUtil.isEmpty(angle)) {
+ alarmRule.setHigh(null);
+ alarmRule.setStopTime(null);
+ alarmRule.setAngle(null);
+ alarmRule.setSpeed(null);
+ }
+ updateById(alarmRule);
+ } else {
+ AlarmRule newAlarmRule = new AlarmRule();
+ newAlarmRule.setMonitorId(monitorId);
+ newAlarmRule.setHigh(high);
+ newAlarmRule.setStopTime(stopTime);
+ newAlarmRule.setAngle(angle);
+ newAlarmRule.setSpeed(speed);
+ newAlarmRule.setTs(new Date());
+ save(newAlarmRule);
+ }
+ }
+
+
+ @Override
+ public AlarmRule selectByMonitor(Long monitorId) {
+ return this.getById(monitorId);
+ }
+
}
diff --git a/casic-common/pom.xml b/casic-common/pom.xml
index 5190667..27e6a55 100644
--- a/casic-common/pom.xml
+++ b/casic-common/pom.xml
@@ -41,6 +41,11 @@
provided
+
+ org.apache.mina
+ mina-core
+ 2.0.4
+
diff --git a/casic-common/src/main/java/com/casic/missiles/weigeng/CommDoorUtil.java b/casic-common/src/main/java/com/casic/missiles/weigeng/CommDoorUtil.java
new file mode 100644
index 0000000..bed1361
--- /dev/null
+++ b/casic-common/src/main/java/com/casic/missiles/weigeng/CommDoorUtil.java
@@ -0,0 +1,156 @@
+package com.casic.missiles.weigeng;
+
+
+import cn.hutool.core.util.ObjectUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class CommDoorUtil implements ApplicationRunner {
+ @Value("${casic.doorips}")
+ private String doorips;
+ @Value("${casic.doorsns}")
+ private String doorsns;
+ @Value("${casic.monitorids}")
+ private String monitorids;
+ @Value("${casic.restartTime}")
+ private int restartTime;
+ public final static Map map = new HashMap();
+ public static Map flagMap = new HashMap();
+
+ @Override
+ public void run(ApplicationArguments args) throws Exception {
+ if (ObjectUtil.isNotEmpty(doorips)) {
+ String[] dooripsArr = doorips.split(",");
+ String[] doorsnsArr = doorsns.split(",");
+ String[] monitoridsArr = monitorids.split(",");
+ for (int i = 0; i < dooripsArr.length; i++) {
+ map.put(monitoridsArr[i], doorsnsArr[i] + "," + dooripsArr[i]);
+ flagMap.put(monitoridsArr[i], false);
+ }
+ map.put("time", restartTime);
+ }
+ }
+
+
+ //取消防爆箱控制器报警
+ public static void cancelControl() {
+ try {
+ if (flagMap.get("control")) {
+ boolean controlFlag = false;
+ for (Map.Entry entry : flagMap.entrySet()) {
+ if (entry.getKey().equals("control")) continue;
+ controlFlag = controlFlag || entry.getValue();
+ }
+ //若所有云台防爆箱都不报警 则控制箱取消报警
+// if (!controlFlag) {
+// String controlStr = map.get("control").toString();
+// if (DoorShortUtil.remoteControl(controlStr.split(",")[1], Long.valueOf(controlStr.split(",")[0]), 1, 2)) {
+// flagMap.put("control", false);
+// }
+// }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+
+
+ //控制云台报警
+ public static void controlPTZ(String monitorId) {
+ try {
+ if (ObjectUtil.isNotEmpty(flagMap.get(monitorId)) &&
+ (!flagMap.get(monitorId))) {
+ String doors = ObjectUtil.isNotEmpty(map.get(monitorId)) ? map.get(monitorId).toString() : "";
+ if (ObjectUtil.isNotEmpty(doors)) {
+ if (DoorShortUtil.remoteControl(doors.split(",")[1], Long.valueOf(doors.split(",")[0]), 1, 1)) {
+ flagMap.put(monitorId, true);
+// if (!flagMap.get("control")) {
+// String controlStr = map.get("control").toString();
+// if (DoorShortUtil.remoteControl(controlStr.split(",")[1], Long.valueOf(controlStr.split(",")[0]), 1, 1)) {
+// flagMap.put("control", true);
+// }
+// }
+ }
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ //取消云台报警
+ public static void cancelPTZ(String monitorId) {
+ try {
+ if (ObjectUtil.isNotEmpty(flagMap.get(monitorId)) &&
+ flagMap.get(monitorId)) {
+ String doors = ObjectUtil.isNotEmpty(map.get(monitorId)) ? map.get(monitorId).toString() : "";
+ if (ObjectUtil.isNotEmpty(doors))
+ if (DoorShortUtil.remoteControl(doors.split(",")[1], Long.valueOf(doors.split(",")[0]), 1, 2)) {
+ flagMap.put(monitorId, false);
+ //判断是否取消控制箱报警
+// CommDoorUtil.cancelControl();
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ //重置所有告警
+ public static void cancelAllPTZ() {
+ try {
+ for (Map.Entry entry : map.entrySet()) {
+ String controlStr = entry.getValue().toString();
+ if (DoorShortUtil.remoteControl(controlStr.split(",")[1], Long.valueOf(controlStr.split(",")[0]), 1, 2)) {
+ flagMap.put(entry.getKey(), false);
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ //重启设备
+ public static boolean restart(String monitorId) {
+ try {
+ String doors = ObjectUtil.isNotEmpty(map.get(monitorId)) ? map.get(monitorId).toString() : "";
+ if (ObjectUtil.isNotEmpty(doors))
+ if (DoorShortUtil.remoteControl(doors.split(",")[1], Long.valueOf(doors.split(",")[0]), 2, 1)) {
+ //重新上电需要间隔20秒
+ Thread.sleep(Integer.valueOf(map.get("time").toString()) * 1000);
+ //重新关闭开关上电
+ return DoorShortUtil.remoteControl(doors.split(",")[1], Long.valueOf(doors.split(",")[0]), 2, 2);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+ //重启设备
+ public static boolean interruptStart(String monitorId) {
+ try {
+ String doors = ObjectUtil.isNotEmpty(map.get(monitorId)) ? map.get(monitorId).toString() : "";
+ if (ObjectUtil.isNotEmpty(doors))
+ if (DoorShortUtil.remoteControl(doors.split(",")[1], Long.valueOf(doors.split(",")[0]), 2, 1)) {
+ //重新上电需要间隔20秒
+ Thread.sleep(Integer.valueOf(map.get("time").toString()) * 1000);
+ //重新关闭开关上电
+ DoorShortUtil.remoteControl(doors.split(",")[1], Long.valueOf(doors.split(",")[0]), 2, 2);
+
+ Thread.sleep(2 * 60 * 1000);
+ return true;
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+}
diff --git a/casic-common/src/main/java/com/casic/missiles/weigeng/DoorShortUtil.java b/casic-common/src/main/java/com/casic/missiles/weigeng/DoorShortUtil.java
new file mode 100644
index 0000000..13b32e0
--- /dev/null
+++ b/casic-common/src/main/java/com/casic/missiles/weigeng/DoorShortUtil.java
@@ -0,0 +1,859 @@
+package com.casic.missiles.weigeng;
+
+import cn.hutool.core.util.ObjectUtil;
+import org.springframework.scheduling.annotation.Async;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Async
+public class DoorShortUtil {
+
+
+ //单个增加授权
+ public static boolean addSingleAcs(String controllerIP, long controllerSN,
+ long cardNOOfPrivilege, String type) {
+ byte[] recvBuff;
+ boolean success = false;
+ WgUdpCommShort pkt = new WgUdpCommShort();
+ pkt.iDevSn = controllerSN;
+ log(String.format("控制器SN = %d \r\n", controllerSN));
+
+ //打开udp连接
+ pkt.CommOpen(controllerIP);
+ //1.11 权限添加或修改[功能号: 0x50] **********************************************************************************
+ //增加卡号0D D7 37 00, 通过当前控制器的所有门
+ pkt.Reset();
+ pkt.functionID = (byte) 0x50;
+ pkt.iDevSn = controllerSN;
+ System.arraycopy(WgUdpCommShort.longToByte(cardNOOfPrivilege), 0, pkt.data, 0, 4);
+ //20 10 01 01 起始日期: 2010年01月01日 (必须大于2001年)
+ pkt.data[4] = 0x20;
+ pkt.data[5] = 0x10;
+ pkt.data[6] = 0x01;
+ pkt.data[7] = 0x01;
+ //20 29 12 31 截止日期: 2029年12月31日
+ pkt.data[8] = 0x20;
+ pkt.data[9] = 0x59;
+ pkt.data[10] = 0x12;
+ pkt.data[11] = 0x31;
+ //01 允许通过 一号门 [对单门, 双门, 四门控制器有效]
+ pkt.data[12] = 0x01;
+ //01 允许通过 二号门 [对双门, 四门控制器有效]
+ pkt.data[13] = 0x01; //如果禁止2号门, 则只要设为 0x00
+ //01 允许通过 三号门 [对四门控制器有效]
+ pkt.data[14] = 0x01;
+ //01 允许通过 四号门 [对四门控制器有效]
+ pkt.data[15] = 0x01;
+
+ recvBuff = pkt.run();
+
+ if (recvBuff != null) {
+ if (WgUdpCommShort.getIntByByte(recvBuff[8]) == 1) {
+ //这时 刷卡号为= 0x0037D70D = 3659533 (十进制)的卡, 1号门继电器动作.
+ log("1.11 权限添加或修改 成功...");
+ success = true;
+ }
+ }
+ //关闭udp连接
+ pkt.CommClose();
+ return success;
+ }
+
+ //单个增加起止时间设置授权
+ public static boolean addSingleTimeAcs(String controllerIP, long controllerSN,
+ long cardNOOfPrivilege, String beginDate,
+ String endDate, String startTime, String endTime) {
+ byte[] recvBuff;
+ boolean success = false;
+ WgUdpCommShort pkt = new WgUdpCommShort();
+ pkt.iDevSn = controllerSN;
+ log(String.format("控制器SN = %d \r\n", controllerSN));
+
+ //打开udp连接
+ pkt.CommOpen(controllerIP);
+ //1.11 权限添加或修改[功能号: 0x50] **********************************************************************************
+ //增加卡号0D D7 37 00, 通过当前控制器的所有门
+ pkt.Reset();
+ pkt.functionID = (byte) 0x50;
+ pkt.iDevSn = controllerSN;
+ System.arraycopy(WgUdpCommShort.longToByte(cardNOOfPrivilege), 0, pkt.data, 0, 4);
+ //20 10 01 01 起始日期: 2010年01月01日 (必须大于2001年)
+ pkt.data[4] = 0x20;
+ pkt.data[5] = 0x10;
+ pkt.data[6] = 0x01;
+ pkt.data[7] = 0x01;
+ if (ObjectUtil.isNotEmpty(beginDate)) {
+ pkt.data[4] = GetHex(Integer.valueOf(beginDate.substring(0, 2)));
+ pkt.data[5] = GetHex(Integer.valueOf(beginDate.substring(2, 4)));
+ pkt.data[6] = GetHex(Integer.valueOf(beginDate.substring(5, 7)));
+ pkt.data[7] = GetHex(Integer.valueOf(beginDate.substring(8, 10)));
+ }
+ //20 29 12 31 截止日期: 2059年12月31日
+ pkt.data[8] = 0x20;
+ pkt.data[9] = 0x59;
+ pkt.data[10] = 0x12;
+ pkt.data[11] = 0x31;
+ if (ObjectUtil.isNotEmpty(endDate)) {
+ pkt.data[8] = GetHex(Integer.valueOf(endDate.substring(0, 2)));
+ pkt.data[9] = GetHex(Integer.valueOf(endDate.substring(2, 4)));
+ pkt.data[10] = GetHex(Integer.valueOf(endDate.substring(5, 7)));
+ pkt.data[11] = GetHex(Integer.valueOf(endDate.substring(8, 10)));
+ }
+ //01 允许通过 一号门 [对单门, 双门, 四门控制器有效]
+ pkt.data[12] = 0x01;
+ //01 允许通过 二号门 [对双门, 四门控制器有效]
+ pkt.data[13] = 0x01; //如果禁止2号门, 则只要设为 0x00
+ if (ObjectUtil.isNotEmpty(endTime)) {
+ pkt.data[30] = GetHex(Integer.valueOf(endTime.substring(0, 2)));
+ pkt.data[31] = GetHex(Integer.valueOf(endTime.substring(3, 5)));
+ pkt.data[41] = GetHex(Integer.valueOf(endTime.substring(6, 8)));
+ }
+ if (ObjectUtil.isNotEmpty(startTime)) {
+ pkt.data[42] = GetHex(Integer.valueOf(startTime.substring(0, 2)));
+ pkt.data[43] = GetHex(Integer.valueOf(startTime.substring(3, 5)));
+ pkt.data[44] = GetHex(Integer.valueOf(startTime.substring(6, 8)));
+ }
+ recvBuff = pkt.run();
+ if (recvBuff != null) {
+ if (WgUdpCommShort.getIntByByte(recvBuff[8]) == 1) {
+ //这时 刷卡号为= 0x0037D70D = 3659533 (十进制)的卡, 1号门继电器动作.
+ log("1.11 时间段卡授权 成功...");
+ success = true;
+ }
+ }
+ //关闭udp连接
+ pkt.CommClose();
+ return success;
+ }
+
+ //单个增加时间设置授权
+ public static boolean addsetSingleAcs(String controllerIP, long controllerSN,
+ long cardNOOfPrivilege, int type) {
+ byte[] recvBuff;
+ boolean success = false;
+ WgUdpCommShort pkt = new WgUdpCommShort();
+ pkt.iDevSn = controllerSN;
+ log(String.format("控制器SN = %d \r\n", controllerSN));
+
+ //打开udp连接
+ pkt.CommOpen(controllerIP);
+ //1.11 权限添加或修改[功能号: 0x50] **********************************************************************************
+ //增加卡号0D D7 37 00, 通过当前控制器的所有门
+ pkt.Reset();
+ pkt.functionID = (byte) 0x50;
+ pkt.iDevSn = controllerSN;
+ System.arraycopy(WgUdpCommShort.longToByte(cardNOOfPrivilege), 0, pkt.data, 0, 4);
+ //20 10 01 01 起始日期: 2010年01月01日 (必须大于2001年)
+ pkt.data[4] = 0x20;
+ pkt.data[5] = 0x10;
+ pkt.data[6] = 0x01;
+ pkt.data[7] = 0x01;
+ //20 29 12 31 截止日期: 2059年12月31日
+ pkt.data[8] = 0x20;
+ pkt.data[9] = 0x59;
+ pkt.data[10] = 0x12;
+ pkt.data[11] = 0x31;
+ //01 允许通过 一号门 [对单门, 双门, 四门控制器有效]
+ pkt.data[12] = 0x01;
+ //01 允许通过 二号门 [对双门, 四门控制器有效]
+ pkt.data[13] = 0x01; //如果禁止2号门, 则只要设为 0x00
+ //01 允许通过 三号门 [对四门控制器有效]
+ pkt.data[14] = 0x01;
+ //01 允许通过 四号门 [对四门控制器有效]
+ pkt.data[15] = 0x01;
+ if (type > 1) {
+ pkt.data[12] = GetHex(type);
+ //01 允许通过 二号门 [对双门, 四门控制器有效]
+ pkt.data[13] = GetHex(type); //如果禁止2号门, 则只要设为 0x00
+ //01 允许通过 三号门 [对四门控制器有效]
+ pkt.data[14] = GetHex(type);
+ //01 允许通过 四号门 [对四门控制器有效]
+ pkt.data[15] = GetHex(type);
+ }
+ recvBuff = pkt.run();
+ if (recvBuff != null) {
+ if (WgUdpCommShort.getIntByByte(recvBuff[8]) == 1) {
+ //这时 刷卡号为= 0x0037D70D = 3659533 (十进制)的卡, 1号门继电器动作.
+ log("1.11 策略权限添加或修改 成功...");
+ success = true;
+ }
+ }
+ //关闭udp连接
+ pkt.CommClose();
+ return success;
+ }
+
+
+ //单个删除授权
+ public static boolean deleteSingleAcs(String controllerIP, long controllerSN,
+ long cardNOOfPrivilege, String type) {
+
+ byte[] recvBuff;
+ boolean success = false;
+ WgUdpCommShort pkt = new WgUdpCommShort();
+ pkt.iDevSn = controllerSN;
+
+
+ log(String.format("控制器SN = %d \r\n", controllerSN));
+
+ //打开udp连接
+ pkt.CommOpen(controllerIP);
+ //1.12 权限删除(单个删除)[功能号: 0x52] **********************************************************************************
+ pkt.Reset();
+ pkt.functionID = (byte) 0x52;
+ pkt.iDevSn = controllerSN;
+ long cardNOOfPrivilegeToDelete = cardNOOfPrivilege;
+ System.arraycopy(WgUdpCommShort.longToByte(cardNOOfPrivilegeToDelete), 0, pkt.data, 0, 4);
+
+ recvBuff = pkt.run();
+ success = false;
+ if (recvBuff != null) {
+ if (WgUdpCommShort.getIntByByte(recvBuff[8]) == 1) {
+ //这时 刷卡号为= 0x0037D70D = 3659533 (十进制)的卡, 1号门继电器不会动作.
+ log("1.12 权限删除(单个删除) 成功...");
+ success = true;
+ }
+ }
+ //关闭udp连接
+ pkt.CommClose();
+ return success;
+ }
+
+ //批量删除授权
+ public static boolean deleteSelectedAcs(String controllerIP, long controllerSN,
+ List cardNOOfPrivileges, String type) {
+
+ byte[] recvBuff;
+ boolean success = false;
+ WgUdpCommShort pkt = new WgUdpCommShort();
+ pkt.iDevSn = controllerSN;
+
+ log(String.format("控制器SN = %d \r\n", controllerSN));
+ //打开udp连接
+ pkt.CommOpen(controllerIP);
+ for (Long cardNOOfPrivilege : cardNOOfPrivileges) {
+ pkt.Reset();
+ pkt.functionID = (byte) 0x52;
+ pkt.iDevSn = controllerSN;
+ System.arraycopy(WgUdpCommShort.longToByte(cardNOOfPrivilege), 0, pkt.data, 0, 4);
+
+ recvBuff = pkt.run();
+ success = false;
+ if (recvBuff != null) {
+ if (WgUdpCommShort.getIntByByte(recvBuff[8]) == 1) {
+ //这时 刷卡号为= 0x0037D70D = 3659533 (十进制)的卡, 1号门继电器不会动作.
+ log("1.12 权限删除(单个删除) 成功...");
+ success = true;
+ }
+ }
+ }
+
+ //关闭udp连接
+ pkt.CommClose();
+ return success;
+ }
+
+ //批量删除授权
+ public static boolean deleteBatchAcs(String controllerIP, long controllerSN) {
+ byte[] recvBuff;
+ boolean success = false;
+ WgUdpCommShort pkt = new WgUdpCommShort();
+ pkt.iDevSn = controllerSN;
+
+
+ log(String.format("控制器SN = %d \r\n", controllerSN));
+
+ //打开udp连接
+ pkt.CommOpen(controllerIP);
+ //1.13 权限清空(全部清掉)[功能号: 0x54] **********************************************************************************
+ pkt.Reset();
+ pkt.functionID = (byte) 0x54;
+ pkt.iDevSn = controllerSN;
+ //12 标识(防止误设置) 1 0x55 [固定]
+ System.arraycopy(WgUdpCommShort.longToByte(WgUdpCommShort.SpecialFlag), 0, pkt.data, 0, 4);
+
+ recvBuff = pkt.run();
+ success = false;
+ if (recvBuff != null) {
+ if (WgUdpCommShort.getIntByByte(recvBuff[8]) == 1) {
+ //这时清空成功
+ log("1.13 权限清空(全部清掉) 成功...");
+ success = true;
+ }
+ }
+ //关闭udp连接
+ pkt.CommClose();
+ return success;
+ }
+
+
+ //批量授权
+ public static boolean addBatchAcs(String controllerIP, long controllerSN, List cardCodeList) {
+
+ byte[] recvBuff;
+ boolean success = false;
+ WgUdpCommShort pkt = new WgUdpCommShort();
+ pkt.iDevSn = controllerSN;
+ log(String.format("控制器SN = %d \r\n", controllerSN));
+ //打开udp连接
+ pkt.CommOpen(controllerIP);
+ log("1.21 权限按从小到大顺序添加[功能号: 0x56] 开始...");
+ int cardCount = cardCodeList.size();
+ for (int i = 0; i < cardCount; i++) {
+ pkt.Reset();
+ pkt.functionID = (byte) 0x56;
+ pkt.iDevSn = controllerSN;
+
+ System.arraycopy(WgUdpCommShort.longToByte(cardCodeList.get(i)), 0, pkt.data, 0, 4);
+ //20 10 01 01 起始日期: 2010年01月01日 (必须大于2001年)
+ pkt.data[4] = 0x20;
+ pkt.data[5] = 0x10;
+ pkt.data[6] = 0x01;
+ pkt.data[7] = 0x01;
+ //20 59 12 31 截止日期: 2059年12月31日
+ pkt.data[8] = 0x20;
+ pkt.data[9] = 0x59;
+ pkt.data[10] = 0x12;
+ pkt.data[11] = 0x31;
+ //01 允许通过 一号门 [对单门, 双门, 四门控制器有效]
+ pkt.data[12] = 0x01;
+ //01 允许通过 二号门 [对双门, 四门控制器有效]
+ pkt.data[13] = 0x01; //如果禁止2号门, 则只要设为 0x00
+ //01 允许通过 三号门 [对四门控制器有效]
+ pkt.data[14] = 0x01;
+ //01 允许通过 四号门 [对四门控制器有效]
+ pkt.data[15] = 0x01;
+
+
+ System.arraycopy(WgUdpCommShort.longToByte(cardCount), 0, pkt.data, 32 - 8, 4);//总的权限数
+ int i2 = i + 1;
+ System.arraycopy(WgUdpCommShort.longToByte(i2), 0, pkt.data, 35 - 8, 4);//当前权限的索引位(从1开始)
+
+ recvBuff = pkt.run();
+ if (recvBuff != null) {
+ if (WgUdpCommShort.getIntByByte(recvBuff[8]) == 1) {
+ success = true;
+ }
+ if (WgUdpCommShort.getIntByByte(recvBuff[8]) == 0xE1) {
+ log("1.21 权限按从小到大顺序添加[功能号: 0x56] =0xE1 表示卡号没有从小到大排序");
+ success = false;
+ break;
+ }
+ } else {
+ success = false;
+ break;
+ }
+ }
+ if (success == true) {
+ log("1.21 权限按从小到大顺序添加[功能号: 0x56] 成功...");
+ } else {
+ log("1.21 权限按从小到大顺序添加[功能号: 0x56] 失败...");
+ }
+
+ //关闭udp连接
+ pkt.CommClose();
+ return success;
+ }
+
+
+ //远程开门
+ public static boolean remoteControllAcs(String controllerIP, long controllerSN) {
+
+ byte[] recvBuff;
+ boolean success = false;
+ WgUdpCommShort pkt = new WgUdpCommShort();
+ pkt.iDevSn = controllerSN;
+
+
+ log(String.format("控制器SN = %d \r\n", controllerSN));
+
+ //打开udp连接
+ pkt.CommOpen(controllerIP);
+ //1.10 远程开门[功能号: 0x40] **********************************************************************************
+ int doorNO = 1;
+ pkt.Reset();
+ pkt.functionID = (byte) 0x40;
+ pkt.iDevSn = controllerSN;
+ pkt.data[0] = (byte) (doorNO & 0xff); //2013-11-03 20:56:33
+ recvBuff = pkt.run();
+ if (recvBuff != null) {
+ if (WgUdpCommShort.getIntByByte(recvBuff[8]) == 1) {
+ //有效开门.....
+ log("1.10 远程开门 成功...");
+ success = true;
+ }
+ }
+ //关闭udp连接
+ pkt.CommClose();
+ return success;
+ }
+
+ //提取刷卡记录
+ public static Map getCardRecords(String controllerIP, long controllerSN) {
+
+ //1.9 提取记录操作
+ //1. 通过 0xB4指令 获取已读取过的记录索引号 recordIndex
+ //2. 通过 0xB0指令 获取指定索引号的记录 从recordIndex + 1开始提取记录, 直到记录为空为止
+ //3. 通过 0xB2指令 设置已读取过的记录索引号 设置的值为最后读取到的刷卡记录索引号
+ //经过上面三个步骤, 整个提取记录的操作完成
+ List