diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/WatchServer.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/WatchServer.java new file mode 100644 index 0000000..5e4dbb2 --- /dev/null +++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/WatchServer.java @@ -0,0 +1,530 @@ +package com.sincere.weigeng; + + +import com.sincere.common.dto.smartCampus.UserDto; +import com.sincere.common.dto.xiaoan.CheckInDto; +import com.sincere.common.dto.xiaoan.CheckOutDto; +import com.sincere.common.dto.xiaoan.PassFailDto; +import com.sincere.common.dto.xiaoan.SendMessageDto; +import com.sincere.common.util.DateUtils; +import com.sincere.weigeng.feign.SmFeign; +import com.sincere.weigeng.feign.XaFeign; +import com.sincere.weigeng.logs.LogName; +import com.sincere.weigeng.logs.LoggerUtils; +import com.sincere.weigeng.utils.WGUtils; +import com.sincere.weigeng.utils.WatchingShortHandler; +import com.sincere.weigeng.utils.WgUdpCommShort; +import org.apache.commons.lang3.StringUtils; +import org.apache.mina.core.session.IoSession; +import org.apache.mina.transport.socket.DatagramSessionConfig; +import org.apache.mina.transport.socket.nio.NioDatagramAcceptor; +import org.slf4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author chen + * @version 1.0 + * @date 2019/10/12 0012 16:57 + */ + +@Component +public class WatchServer implements ApplicationRunner { + + private static final Logger Log_orderSuccess = LoggerUtils.Logger(LogName.orderSuccess); + private static final Logger Log_orderFail = LoggerUtils.Logger(LogName.orderFail); + private static final Logger Log_kaoInfo = LoggerUtils.Logger(LogName.kaoInfo); + private static final Logger Log_heartBeat = LoggerUtils.Logger(LogName.heartBeat); + private static final Logger Log_error = LoggerUtils.Logger(LogName.error); + + private static List snoList = new ArrayList<>(); + private static List indexList = new ArrayList<>(); + private static WatchingShortHandler watchingShortHandler ; + private static Queue queue = new LinkedList<>(); + private static Map sessionMap = new ConcurrentHashMap<>(); + + @Autowired + SmFeign smFeign; + + @Autowired + XaFeign xaFeign; + + private static String ip = "172.16.3.175"; + private static int port = 1200; + + @Override + public void run(ApplicationArguments args) { + //启动服务监听 + this.WatchingServerRunning(ip,port); + } + + // 进入服务器监控状态 + public int WatchingServerRunning(String watchServerIP,int watchServerPort) { + watchingShortHandler = new WatchingShortHandler(queue,sessionMap); + // 创建UDP数据包NIO + NioDatagramAcceptor acceptor = new NioDatagramAcceptor(); + // NIO设置底层IOHandler + acceptor.setHandler(watchingShortHandler); + + // 设置是否重用地址? 也就是每个发过来的udp信息都是一个地址? + DatagramSessionConfig dcfg = acceptor.getSessionConfig(); + dcfg.setReuseAddress(false); + // 绑定端口地址 + try { + acceptor.bind(new InetSocketAddress(watchServerIP, watchServerPort)); + } catch (IOException e) { + Log_orderSuccess.info("绑定接收服务器失败...."); + e.printStackTrace(); + return 0; + } + Log_orderSuccess.info("绑定接收服务器成功...."); + long recordIndex = 0; + while(true) { + if (!queue.isEmpty()) { + byte[] recvBuff; + synchronized (queue) { + recvBuff= queue.poll(); + } + if (recvBuff[1]== 0x20) { + long sn = WgUdpCommShort.getLongByByte(recvBuff, 4, 4); + smFeign.updateLinkTime(sn+""); + Log_heartBeat.info("设备"+sn); + boolean isExist = true ; + long recordIndexGet = WgUdpCommShort.getLongByByte(recvBuff, 8, 4); + if(snoList.indexOf(sn) >= 0){ + int number = snoList.indexOf(sn); + recordIndex = indexList.get(number); + indexList.set(number,recordIndexGet); + }else { + snoList.add(sn); + recordIndex = 0 ; + indexList.add(recordIndexGet); + System.out.println("设备"+sn+"上线"); + isExist = false ; + } + if(isExist){ + if (recordIndex < recordIndexGet || (recordIndexGet - recordIndex) < -5) { + watching(recvBuff); + } + } + }else { + push(recvBuff); + } + } else { + long times = 100; + try { + Thread.sleep(times); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + + private void watching(byte[] recv){ + long res = 0; + //8-11 记录的索引号 + //(=0表示没有记录) 4 0x00000000 + int recordIndex = 0; + recordIndex = WGUtils.byteToInt(recv, 8, 4); + //12 记录类型********************************************** + //0=无记录 + //1=刷卡记录 + //2=门磁,按钮, 设备启动, 远程开门记录 + //3=报警记录 1 + //0xFF=表示指定索引位的记录已被覆盖掉了. 请使用索引0, 取回最早一条记录的索引值 + int recordType = recv[12]; + + //13 有效性(0 表示不通过, 1表示通过) 1 + int recordValid = recv[13]; + + //14 门号(1,2,3,4) 1 业务需要-->1出2进 + int recordDoorNO = recv[14]; + + //15 进门/出门(1表示进门, 2表示出门) 1 0x01 + //int recordInOrOut = recv[15]; + + //16-19 卡号(类型是刷卡记录时) + //或编号(其他类型记录) 4 + String cardNo = WGUtils.getCardNo(recv, 16, 4); + + //20-26 刷卡时间: + //年月日时分秒 (采用BCD码)见设置时间部分的说明 + String recordTime = "2000-01-01 00:00:00"; + recordTime = String.format("%02X%02X-%02X-%02X %02X:%02X:%02X", + recv[20], recv[21], recv[22], recv[23], recv[24], recv[25], recv[26]); + //2012.12.11 10:49:59 7 + //27 记录原因代码(可以查 “刷卡记录说明.xls”文件的ReasonNO) + //处理复杂信息才用 1 + int reason = recv[27]; + if (recordType == 0) { + Log_orderSuccess.info(String.format("索引位={0} 无记录", recordIndex)); + }else if (recordType == 0xff) { + Log_orderSuccess.info("指定索引位的记录已被覆盖掉了,请使用索引0, 取回最早一条记录的索引值"); + } else if (recordType == 1) { + long sno = 0; + sno = WgUdpCommShort.getLongByByte(recv, 4, 4);//解析设备号 + String msg = "索引位=" + recordIndex + + ",卡号=" + cardNo + +"进出=" + (recordDoorNO == 1 ? "出门" : "进门") + + ",有效=" + (recordValid == 1 ? "通过" : "禁止") + + ",时间=" + recordTime + + ",描述=" + WGUtils.getReasonDetailChinese(reason) + ""; + Log_orderSuccess.info("控制器:" + sno + msg); + if(recordValid == 1) { + //有效刷卡调考勤存储过程 + CheckInDto checkIn = new CheckInDto(); + checkIn.setDeviceId(sno+""); + checkIn.setCardNo(cardNo); + checkIn.setFunNo(8); + checkIn.setFlag(recordDoorNO == 1 ? 1 : 0); + checkIn.setCheckTime(recordTime); + CheckOutDto checkOutDto = xaFeign.checkIn(checkIn); + if(checkOutDto.getIsSuccess() == 1){ + //考勤成功 + String nowDate = DateUtils.date2String(new Date(),DateUtils.format2); + Log_kaoInfo.info("考勤成功!,设备:"+sno+"卡号:"+cardNo+"方向:"+(recordDoorNO == 1 ? "出门" : "进门")+"______刷卡时间"+ recordTime+";入库时间:"+nowDate); + }else { + //考勤失败 + Log_orderFail.error("考勤失败!,设备:"+sno+"卡号:"+cardNo + "---"+ checkOutDto.getOut()); + } + }else { + //判断是否请假 + String studentNum = smFeign.checkLeave(cardNo); + if (StringUtils.isNotBlank(studentNum)) { + int outOf = recordDoorNO == 1 ? 1 : 0; + //远程开门 + openDoor(sno,"64",recordDoorNO,cardNo); + Log_orderSuccess.info("请假开门成功"+cardNo); + } else { + //没有请假不做任何处理,则是刷卡异常,入库 + UserDto user = smFeign.selectUserByCardNum(cardNo); + PassFailDto passFail = new PassFailDto(); + passFail.setCardNum(cardNo); + passFail.setDeviceId(sno+""); + passFail.setDirection((recordDoorNO == 1 ? "出门" : "进门")); + passFail.setResultIntro(WGUtils.getReasonDetailChinese(reason)); + passFail.setInTime(DateUtils.string2Date(recordTime, DateUtils.format2)); + passFail.setCreateTime(new Date()); + passFail.setSchoolId(user.getSchoolId()); + xaFeign.insertPassFail(passFail); + } + } + } + } + + private void push(byte[] recv){ + long index = WgUdpCommShort.getXidOfCommand(recv); + long sno = WgUdpCommShort.getLongByByte(recv, 4, 4); + String functionId = WGUtils.byte2Hex(recv[1]); + SendMessageDto sendMessage = xaFeign.selectMessage(sno+"",index,functionId); + if(sendMessage != null){ + if(recv[8] == 1){ + sendMessage.setCorrect(1); + }else { + sendMessage.setCorrect(0); + } + StringBuffer result = new StringBuffer(); + for(byte b : recv){ + result.append(WGUtils.byte2Hex(b)).append("-"); + } + sendMessage.setResult(result.toString().substring(0,result.toString().length()-1)); + xaFeign.updateMessage(sendMessage.getId(),sendMessage.getResult(),sendMessage.getCorrect()); + } + } + + //远程开门 + public long openDoor(long sno , String outsideOrderId,int doorNo , String cardNo){ + WgUdpCommShort pkt = new WgUdpCommShort(); + pkt.iDevSn = sno; + try{ + int doorNO =doorNo; + pkt.Reset(); + pkt.functionID = WGUtils.toFunctionHex(outsideOrderId); + pkt.data[0] =(byte) (doorNO & 0xff); + if(StringUtils.isNotBlank(cardNo)){ + pkt.data[20] = WGUtils.toHex(cardNo.substring(0,2)); + pkt.data[21] = WGUtils.toHex(cardNo.substring(2,4)); + pkt.data[22] = WGUtils.toHex(cardNo.substring(4,6)); + pkt.data[23] = WGUtils.toHex(cardNo.substring(6,8)); + } + byte[] bytes = pkt.toByte(); + long index = WgUdpCommShort.getXidOfCommand(bytes); + long result = insert(sno+"",outsideOrderId,cardNo,index,bytes); + pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes); + return result ; + }catch (Exception e){ + Log_error.error(e.toString()); + } + return 0L; + } + + //重置控制板时间 + public long setTime(long sno , String outsideOrderId){ + WgUdpCommShort pkt = new WgUdpCommShort(); + pkt.iDevSn = sno; + try{ + pkt.Reset(); + pkt.functionID = WGUtils.toFunctionHex(outsideOrderId); + Calendar cal = (Calendar.getInstance()); + pkt.data[0] = WGUtils.toHex(String.valueOf(cal.get(Calendar.YEAR)).substring(0,2)); + pkt.data[1] = WGUtils.toHex(String.valueOf(cal.get(Calendar.YEAR)).substring(2,4)); + pkt.data[2] = WGUtils.toHex(String.valueOf(cal.get(Calendar.MONTH)+1)); + pkt.data[3] = WGUtils.toHex(String.valueOf(cal.get(Calendar.DATE))); + pkt.data[4] =WGUtils.toHex(String.valueOf(cal.get(Calendar.HOUR_OF_DAY))); + pkt.data[5] =WGUtils.toHex(String.valueOf(cal.get(Calendar.MINUTE))); + pkt.data[6] = WGUtils.toHex(String.valueOf(cal.get(Calendar.SECOND))); + byte[] bytes = pkt.toByte(); + long index = WgUdpCommShort.getXidOfCommand(bytes); + long result = insert(sno+"",outsideOrderId,null,index,bytes); + pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes); + return result ; + }catch (Exception e){ + Log_error.error(e.toString()); + } + return 0L; + } + + //设置考勤时段 + public List SetAttendanceTime(long sno ,String outsideOrderId, int shiduan , Date begin ,Date end , + int isMonDay ,int isTuesDay , int isWednesDay ,int isThursDay , int isFriday , + int isSaturDay , int isWeekend , String shiqu){ + List resultList = new ArrayList<>(); + WgUdpCommShort pkt = new WgUdpCommShort(); + pkt.iDevSn = sno; + try{ + pkt.Reset(); + pkt.functionID = WGUtils.toFunctionHex(outsideOrderId); + String[] shiQuArray = shiqu.split(","); + int shiDuanCount = shiQuArray.length / 6 ; + for (int i = 0; i < shiDuanCount; i++){ + if (i == 0) { + pkt.data[0] = WGUtils.toHex(shiduan+""); + } else { + pkt.data[0] = WGUtils.toHex((shiduan+20*i)+""); + } + Calendar c = Calendar.getInstance(); + c.setTime(begin); + //开始时间 20 19 01 01 + pkt.data[1] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(0,2)); + pkt.data[2] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(2,4)); + pkt.data[3] = WGUtils.toHex(String.valueOf(c.get(Calendar.MONTH)+1)); + pkt.data[4] = WGUtils.toHex(String.valueOf(c.get(Calendar.DATE))); + //结束时间 + c.setTime(end); + pkt.data[5] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(0,2)); + pkt.data[6] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(2,4)); + pkt.data[7] = WGUtils.toHex(String.valueOf(c.get(Calendar.MONTH)+1)); + pkt.data[8] = WGUtils.toHex(String.valueOf(c.get(Calendar.DATE))); + //星期几 有效 + pkt.data[9] = WGUtils.toHex(String.valueOf(isMonDay)); + pkt.data[10] = WGUtils.toHex(String.valueOf(isTuesDay)); + pkt.data[11] = WGUtils.toHex(String.valueOf(isWednesDay)); + pkt.data[12] = WGUtils.toHex(String.valueOf(isThursDay)); + pkt.data[13] = WGUtils.toHex(String.valueOf(isFriday)); + pkt.data[14] = WGUtils.toHex(String.valueOf(isSaturDay)); + pkt.data[15] = WGUtils.toHex(String.valueOf(isWeekend)); + //有效时区 + pkt.data[16] = WGUtils.toHex(shiQuArray[i * 6 + 0].substring(0, 2)); + pkt.data[17] = WGUtils.toHex(shiQuArray[i * 6 + 0].substring(3, 5)); + + pkt.data[18] = WGUtils.toHex(shiQuArray[i * 6 + 1].substring(0, 2)); + pkt.data[19] = WGUtils.toHex(shiQuArray[i * 6 + 1].substring(3, 5)); + + pkt.data[20] = WGUtils.toHex(shiQuArray[i * 6 + 2].substring(0, 2)); + pkt.data[21] = WGUtils.toHex(shiQuArray[i * 6 + 2].substring(3, 5)); + + pkt.data[22] = WGUtils.toHex(shiQuArray[i * 6 + 3].substring(0, 2)); + pkt.data[23] = WGUtils.toHex(shiQuArray[i * 6 + 3].substring(3, 5)); + + pkt.data[24] = WGUtils.toHex(shiQuArray[i * 6 + 4].substring(0, 2)); + pkt.data[25] = WGUtils.toHex(shiQuArray[i * 6 + 4].substring(3, 5)); + + pkt.data[26] = WGUtils.toHex(shiQuArray[i * 6 + 5].substring(0, 2)); + pkt.data[27] = WGUtils.toHex(shiQuArray[i * 6 + 5].substring(3, 5)); + if (shiDuanCount != 1) { + //需要链接时段 + if (i != shiDuanCount - 1) { + //只要不是最后一个时段 + pkt.data[28] = WGUtils.toHex((shiduan+20*(i+1)+"")); + } else { + pkt.data[28] = 0; + } + } else { + pkt.data[28] = 0; + } + byte[] bytes = pkt.toByte(); + long index = WgUdpCommShort.getXidOfCommand(bytes); + long result = insert(sno+"",outsideOrderId,null,index,bytes); + pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes); + resultList.add(result); + } + return resultList ; + }catch (Exception e){ + Log_error.error(e.toString()); + } + return resultList; + } + + //设置权限 + public long SetSignalCardInfo(long sno , String outsideOrderId, String cardNo , int shiduan , Date begin , Date end){ + WgUdpCommShort pkt = new WgUdpCommShort(); + pkt.iDevSn = sno; + try{ + pkt.Reset(); + pkt.functionID = WGUtils.toFunctionHex(outsideOrderId); + pkt.iDevSn = sno; + //0D D7 37 00 + pkt.data[0] = WGUtils.toHex(cardNo.substring(0,2)); + pkt.data[1] = WGUtils.toHex(cardNo.substring(2,4)); + pkt.data[2] = WGUtils.toHex(cardNo.substring(4,6)); + pkt.data[3] = WGUtils.toHex(cardNo.substring(6,8)); + + //20 10 01 01 起始日期: 2010年01月01日 (必须大于2001年) + Calendar c = Calendar.getInstance(); + c.setTime(begin); + pkt.data[4] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(0,2)); + pkt.data[5] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(2,4)); + pkt.data[6] = WGUtils.toHex(String.valueOf(c.get(Calendar.MONTH)+1)); + pkt.data[7] = WGUtils.toHex(String.valueOf(c.get(Calendar.DATE))); + //20 29 12 31 截止日期: 2029年12月31日 + c.setTime(end); + pkt.data[8] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(0,2)); + pkt.data[9] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(2,4)); + pkt.data[10] = WGUtils.toHex(String.valueOf(c.get(Calendar.MONTH)+1)); + pkt.data[11] = WGUtils.toHex(String.valueOf(c.get(Calendar.DATE))); + //01 允许通过 一号门 [对单门, 双门, 四门控制器有效] + pkt.data[12] = WGUtils.toHex(shiduan+""); + //01 允许通过 二号门 [对双门, 四门控制器有效] + pkt.data[13] = WGUtils.toHex(shiduan+""); + //01 允许通过 三号门 [对四门控制器有效] + pkt.data[14] = WGUtils.toHex(shiduan+""); + //01 允许通过 四号门 [对四门控制器有效] + pkt.data[15] = WGUtils.toHex(shiduan+""); + byte[] bytes = pkt.toByte(); + long index = WgUdpCommShort.getXidOfCommand(bytes); + long result = insert(sno+"",outsideOrderId,cardNo,index,bytes); + pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes); + return result ; + }catch (Exception e){ + Log_error.error(e.toString()); + } + return 0l; + } + + //删除单张卡权限 + public long clearSinglePower(long sno ,String outsideOrderId, String cardNo){ + WgUdpCommShort pkt = new WgUdpCommShort(); + pkt.iDevSn = sno; + try{ + pkt.Reset(); + pkt.functionID = WGUtils.toFunctionHex(outsideOrderId); + pkt.iDevSn = sno; + pkt.data[0] = WGUtils.toHex(cardNo.substring(0,2)); + pkt.data[1] = WGUtils.toHex(cardNo.substring(2,4)); + pkt.data[2] = WGUtils.toHex(cardNo.substring(4,6)); + pkt.data[3] = WGUtils.toHex(cardNo.substring(6,8)); + byte[] bytes = pkt.toByte(); + long index = WgUdpCommShort.getXidOfCommand(bytes); + long result = insert(sno+"",outsideOrderId,cardNo,index,bytes); + pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes); + return result ; + }catch (Exception e){ + Log_error.error(e.toString()); + } + return 0l; + } + + //删除全部权限 + public long clearAllPower(long sno ,String outsideOrderId){ + WgUdpCommShort pkt = new WgUdpCommShort(); + pkt.iDevSn = sno; + try{ + pkt.Reset(); + pkt.functionID = WGUtils.toFunctionHex(outsideOrderId); + pkt.iDevSn = sno; + pkt.data[0] = (byte) 0x55 ; + pkt.data[1] = (byte) 0xAA ; + pkt.data[2] = (byte) 0xAA ; + pkt.data[3] = (byte) 0x55 ; + byte[] bytes = pkt.toByte(); + long index = WgUdpCommShort.getXidOfCommand(bytes); + long result = insert(sno+"",outsideOrderId,null,index,bytes); + pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes); + return result ; + }catch (Exception e){ + Log_error.error(e.toString()); + } + return 0l; + } + + //查询卡权限 + public long searchPower(long sno ,String outsideOrderId, String cardNo){ + WgUdpCommShort pkt = new WgUdpCommShort(); + pkt.iDevSn = sno; + try{ + pkt.Reset(); + pkt.functionID = WGUtils.toFunctionHex(outsideOrderId); + pkt.iDevSn = sno; + pkt.data[0] = WGUtils.toHex(cardNo.substring(0,2)); + pkt.data[1] = WGUtils.toHex(cardNo.substring(2,4)); + pkt.data[2] = WGUtils.toHex(cardNo.substring(4,6)); + pkt.data[3] = WGUtils.toHex(cardNo.substring(6,8)); + byte[] bytes = pkt.toByte(); + long index = WgUdpCommShort.getXidOfCommand(bytes); + long result = insert(sno+"",outsideOrderId,cardNo,index,bytes); + pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes); + return result ; + }catch (Exception e){ + Log_error.error(e.toString()); + } + return 0l; + } + + //删除时段 + public long clearShiDuan(long sno , String outsideOrderId){ + WgUdpCommShort pkt = new WgUdpCommShort(); + pkt.iDevSn = sno; + try{ + pkt.Reset(); + pkt.functionID = WGUtils.toFunctionHex(outsideOrderId); + pkt.iDevSn = sno; + pkt.data[0] = (byte) 0x55 ; + pkt.data[1] = (byte) 0xAA ; + pkt.data[2] = (byte) 0xAA ; + pkt.data[3] = (byte) 0x55 ; + byte[] bytes = pkt.toByte(); + long index = WgUdpCommShort.getXidOfCommand(bytes); + long result = insert(sno+"",outsideOrderId,null,index,bytes); + pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes); + return result ; + }catch (Exception e){ + Log_error.error(e.toString()); + } + return 0l; + } + + private long insert(String sn ,String functionId , String cardNo , long index , byte[] recv){ + + StringBuffer send = new StringBuffer(); + for(byte b : recv){ + send.append(WGUtils.byte2Hex(b)).append("-"); + } + SendMessageDto sendMessage = new SendMessageDto(); + sendMessage.setDeviceId(sn); + sendMessage.setFunctionId(Integer.toHexString(Integer.valueOf(functionId))); + sendMessage.setIndex(index); + sendMessage.setCardNo(cardNo); + sendMessage.setCreateTime(new Date()); + sendMessage.setSend(send.toString().substring(0,send.toString().length()-1)); + xaFeign.insertMessage(sendMessage); + return sendMessage.getId(); + } +} diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/WeigengApplication.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/WeigengApplication.java index d831577..62703d8 100644 --- a/cloud/weigeng/src/main/java/com/sincere/weigeng/WeigengApplication.java +++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/WeigengApplication.java @@ -1,6 +1,5 @@ package com.sincere.weigeng; -import com.sincere.weigeng.utils.WatchServer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/controller/WgController.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/controller/WgController.java index 6386ddc..e2dc648 100644 --- a/cloud/weigeng/src/main/java/com/sincere/weigeng/controller/WgController.java +++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/controller/WgController.java @@ -11,7 +11,7 @@ import com.sincere.weigeng.feign.SmFeign; import com.sincere.weigeng.feign.XaFeign; import com.sincere.weigeng.logs.LogName; import com.sincere.weigeng.logs.LoggerUtils; -import com.sincere.weigeng.utils.WatchServer; +import com.sincere.weigeng.WatchServer; import com.sincere.weigeng.vo.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -42,24 +42,20 @@ public class WgController { @Autowired XaFeign xaFeign; - private static String ip = "172.16.3.175"; - private static int port = 1200; + @Autowired + WatchServer watchServer; - @RequestMapping(value = "watching" , method = RequestMethod.GET) - public void watching(){ - WatchServer.WatchingServerRunning(ip,port,smFeign,xaFeign); - } @RequestMapping(value = "setTime" , method = RequestMethod.GET) public void setTime(long sn){ - WatchServer.setTime(xaFeign,sn,"48"); + watchServer.setTime(sn,"48"); } @ApiOperation("远程开门") @RequestMapping(value = "openDoor" , method = RequestMethod.POST) public boolean openDoor(@RequestBody OpenDoorVo openDoorVo) { String functionId = smFeign.selectOutOrderId(openDoorVo.getType(),openDoorVo.getId()); - long messageId = WatchServer.openDoor(xaFeign,openDoorVo.getSn(),functionId,openDoorVo.getDoorNo(),null); + long messageId = watchServer.openDoor(openDoorVo.getSn(),functionId,openDoorVo.getDoorNo(),null); SendMessageDto message = getResult(messageId); if(message.getCorrect() == 1){ Log_orderSuccess.info("web端远程开门成功!"); @@ -74,7 +70,7 @@ public class WgController { @RequestMapping(value = "setAttendanceTime" , method = RequestMethod.POST) public boolean setAttendanceTime(@RequestBody AttendanceTimeVo attendanceTimeVo){ String functionId = smFeign.selectOutOrderId(attendanceTimeVo.getType(),attendanceTimeVo.getId()); - List result = WatchServer.SetAttendanceTime(xaFeign,attendanceTimeVo.getSn(),functionId,attendanceTimeVo.getShiduan(), + List result = watchServer.SetAttendanceTime(attendanceTimeVo.getSn(),functionId,attendanceTimeVo.getShiduan(), attendanceTimeVo.getStart(),attendanceTimeVo.getEnd(),attendanceTimeVo.getIsMonday(),attendanceTimeVo.getIsTuesday(), attendanceTimeVo.getIsWednesday(),attendanceTimeVo.getIsThursday(),attendanceTimeVo.getIsFriday(), attendanceTimeVo.getIsSaturday(),attendanceTimeVo.getIsWeekend(),attendanceTimeVo.getShiqu()); @@ -97,7 +93,7 @@ public class WgController { public boolean setSignalCardInfo(@RequestBody SignalCardInfoVo signalCardInfoVo){ String functionId = smFeign.selectOutOrderId(signalCardInfoVo.getType(),signalCardInfoVo.getId()); String cardNo = initCardNo(signalCardInfoVo.getCardNo()); - long messageId = WatchServer.SetSignalCardInfo(xaFeign,signalCardInfoVo.getSn(),functionId,cardNo, + long messageId = watchServer.SetSignalCardInfo(signalCardInfoVo.getSn(),functionId,cardNo, signalCardInfoVo.getShiduan(),signalCardInfoVo.getStartTime(),signalCardInfoVo.getEndTime()); SendMessageDto message = getResult(messageId); UserDto user = smFeign.selectUserByCardNum(cardNo); @@ -136,7 +132,7 @@ public class WgController { public boolean clearSinglePower(@RequestBody CardInfo cardInfo){ String functionId = smFeign.selectOutOrderId(cardInfo.getType(),cardInfo.getId()); String cardNo = initCardNo(cardInfo.getCardNo()); - long messageId = WatchServer.clearSinglePower(xaFeign,cardInfo.getSn(),functionId,cardNo); + long messageId = watchServer.clearSinglePower(cardInfo.getSn(),functionId,cardNo); SendMessageDto message = getResult(messageId); if(message.getCorrect() == 1){ Log_orderSuccess.info("卡号"+cardNo+"清除权限成功"); @@ -154,7 +150,7 @@ public class WgController { @RequestMapping(value = "clearAllPower" , method = RequestMethod.POST) public boolean clearAllPower(@RequestBody CleanShiDuanVo cleanShiDuanVo){ String functionId = smFeign.selectOutOrderId(cleanShiDuanVo.getType(),cleanShiDuanVo.getId()); - long messageId = WatchServer.clearAllPower(xaFeign,cleanShiDuanVo.getSn(),functionId); + long messageId = watchServer.clearAllPower(cleanShiDuanVo.getSn(),functionId); SendMessageDto message = getResult(messageId); if(message.getCorrect() == 1){ Log_orderSuccess.info("设备"+cleanShiDuanVo.getSn()+"清除权限成功"); @@ -172,7 +168,7 @@ public class WgController { @RequestMapping(value = "clearShiDuan" , method = RequestMethod.POST) public boolean clearShiDuan(@RequestBody CleanShiDuanVo cleanShiDuanVo){ String functionId = smFeign.selectOutOrderId(cleanShiDuanVo.getType(),cleanShiDuanVo.getId()); - long messageId = WatchServer.clearShiDuan(xaFeign,cleanShiDuanVo.getSn(),functionId); + long messageId = watchServer.clearShiDuan(cleanShiDuanVo.getSn(),functionId); SendMessageDto sendMessage = getResult(messageId); if(sendMessage.getCorrect() == 1){ Log_orderSuccess.info("设备"+cleanShiDuanVo.getSn()+"时段清除成功"); @@ -187,7 +183,7 @@ public class WgController { public boolean searchPower(@RequestBody CardInfo cardInfo){ String functionId = smFeign.selectOutOrderId(cardInfo.getType(),cardInfo.getId()); String cardNo = initCardNo(cardInfo.getCardNo()); - long messageId = WatchServer.searchPower(xaFeign,cardInfo.getSn(),functionId,cardNo); + long messageId = watchServer.searchPower(cardInfo.getSn(),functionId,cardNo); SendMessageDto sendMessage = getResult(messageId); if(sendMessage.getCorrect() == 1){ Log_orderSuccess.info("设备"+cardInfo.getSn()+"卡号"+cardNo+"查询权限成功"); diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchServer.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchServer.java deleted file mode 100644 index b358ad3..0000000 --- a/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchServer.java +++ /dev/null @@ -1,509 +0,0 @@ -package com.sincere.weigeng.utils; - - -import com.sincere.common.dto.smartCampus.UserDto; -import com.sincere.common.dto.xiaoan.CheckInDto; -import com.sincere.common.dto.xiaoan.CheckOutDto; -import com.sincere.common.dto.xiaoan.PassFailDto; -import com.sincere.common.dto.xiaoan.SendMessageDto; -import com.sincere.common.util.DateUtils; -import com.sincere.weigeng.feign.SmFeign; -import com.sincere.weigeng.feign.XaFeign; -import com.sincere.weigeng.logs.LogName; -import com.sincere.weigeng.logs.LoggerUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.mina.core.session.IoSession; -import org.apache.mina.transport.socket.DatagramSessionConfig; -import org.apache.mina.transport.socket.nio.NioDatagramAcceptor; -import org.slf4j.Logger; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @author chen - * @version 1.0 - * @date 2019/10/12 0012 16:57 - */ -public class WatchServer { - - private static final Logger Log_orderSuccess = LoggerUtils.Logger(LogName.orderSuccess); - private static final Logger Log_orderFail = LoggerUtils.Logger(LogName.orderFail); - private static final Logger Log_kaoInfo = LoggerUtils.Logger(LogName.kaoInfo); - private static final Logger Log_heartBeat = LoggerUtils.Logger(LogName.heartBeat); - private static final Logger Log_error = LoggerUtils.Logger(LogName.error); - - private static List snoList = new ArrayList<>(); - private static List indexList = new ArrayList<>(); - private static WatchingShortHandler watchingShortHandler ; - private static Queue queue = new LinkedList<>(); - private static Map sessionMap = new ConcurrentHashMap<>(); - - // 进入服务器监控状态 - public static int WatchingServerRunning(String watchServerIP,int watchServerPort, - SmFeign smFeign ,XaFeign xaFeign) { - watchingShortHandler = new WatchingShortHandler(queue,sessionMap); - // 创建UDP数据包NIO - NioDatagramAcceptor acceptor = new NioDatagramAcceptor(); - // NIO设置底层IOHandler - acceptor.setHandler(watchingShortHandler); - - // 设置是否重用地址? 也就是每个发过来的udp信息都是一个地址? - DatagramSessionConfig dcfg = acceptor.getSessionConfig(); - dcfg.setReuseAddress(false); - // 绑定端口地址 - try { - acceptor.bind(new InetSocketAddress(watchServerIP, watchServerPort)); - } catch (IOException e) { - Log_orderSuccess.info("绑定接收服务器失败...."); - e.printStackTrace(); - return 0; - } - Log_orderSuccess.info("绑定接收服务器成功...."); - long recordIndex = 0; - while(true) { - if (!queue.isEmpty()) { - byte[] recvBuff; - synchronized (queue) { - recvBuff= queue.poll(); - } - if (recvBuff[1]== 0x20) { - long sn = WgUdpCommShort.getLongByByte(recvBuff, 4, 4); - smFeign.updateLinkTime(sn+""); - Log_heartBeat.info("设备"+sn); - boolean isExist = true ; - long recordIndexGet = WgUdpCommShort.getLongByByte(recvBuff, 8, 4); - if(snoList.indexOf(sn) >= 0){ - int number = snoList.indexOf(sn); - recordIndex = indexList.get(number); - indexList.set(number,recordIndexGet); - }else { - snoList.add(sn); - recordIndex = 0 ; - indexList.add(recordIndexGet); - System.out.println("设备"+sn+"上线"); - isExist = false ; - } - if(isExist){ - if (recordIndex < recordIndexGet || (recordIndexGet - recordIndex) < -5) { - watching(recvBuff,smFeign,xaFeign); - } - } - }else { - push(recvBuff,xaFeign); - } - } else { - long times = 100; - try { - Thread.sleep(times); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - } - - private static void watching(byte[] recv,SmFeign smFeign ,XaFeign xaFeign){ - long res = 0; - //8-11 记录的索引号 - //(=0表示没有记录) 4 0x00000000 - int recordIndex = 0; - recordIndex = WGUtils.byteToInt(recv, 8, 4); - //12 记录类型********************************************** - //0=无记录 - //1=刷卡记录 - //2=门磁,按钮, 设备启动, 远程开门记录 - //3=报警记录 1 - //0xFF=表示指定索引位的记录已被覆盖掉了. 请使用索引0, 取回最早一条记录的索引值 - int recordType = recv[12]; - - //13 有效性(0 表示不通过, 1表示通过) 1 - int recordValid = recv[13]; - - //14 门号(1,2,3,4) 1 业务需要-->1出2进 - int recordDoorNO = recv[14]; - - //15 进门/出门(1表示进门, 2表示出门) 1 0x01 - //int recordInOrOut = recv[15]; - - //16-19 卡号(类型是刷卡记录时) - //或编号(其他类型记录) 4 - String cardNo = WGUtils.getCardNo(recv, 16, 4); - - //20-26 刷卡时间: - //年月日时分秒 (采用BCD码)见设置时间部分的说明 - String recordTime = "2000-01-01 00:00:00"; - recordTime = String.format("%02X%02X-%02X-%02X %02X:%02X:%02X", - recv[20], recv[21], recv[22], recv[23], recv[24], recv[25], recv[26]); - //2012.12.11 10:49:59 7 - //27 记录原因代码(可以查 “刷卡记录说明.xls”文件的ReasonNO) - //处理复杂信息才用 1 - int reason = recv[27]; - if (recordType == 0) { - Log_orderSuccess.info(String.format("索引位={0} 无记录", recordIndex)); - }else if (recordType == 0xff) { - Log_orderSuccess.info("指定索引位的记录已被覆盖掉了,请使用索引0, 取回最早一条记录的索引值"); - } else if (recordType == 1) { - long sno = 0; - sno = WgUdpCommShort.getLongByByte(recv, 4, 4);//解析设备号 - String msg = "索引位=" + recordIndex - + ",卡号=" + cardNo - +"进出=" + (recordDoorNO == 1 ? "出门" : "进门") - + ",有效=" + (recordValid == 1 ? "通过" : "禁止") - + ",时间=" + recordTime - + ",描述=" + WGUtils.getReasonDetailChinese(reason) + ""; - Log_orderSuccess.info("控制器:" + sno + msg); - if(recordValid == 1) { - //有效刷卡调考勤存储过程 - CheckInDto checkIn = new CheckInDto(); - checkIn.setDeviceId(sno+""); - checkIn.setCardNo(cardNo); - checkIn.setFunNo(8); - checkIn.setFlag(recordDoorNO == 1 ? 1 : 0); - checkIn.setCheckTime(recordTime); - CheckOutDto checkOutDto = xaFeign.checkIn(checkIn); - if(checkOutDto.getIsSuccess() == 1){ - //考勤成功 - Log_kaoInfo.info("考勤成功!,设备:"+sno+"卡号:"+cardNo+"方向:"+(recordDoorNO == 1 ? "出门" : "进门")+"______"+ recordTime); - }else { - //考勤失败 - Log_orderFail.error("考勤失败!,设备:"+sno+"卡号:"+cardNo + "---"+ checkOutDto.getOut()); - } - }else { - //判断是否请假 - String studentNum = smFeign.checkLeave(cardNo); - if (StringUtils.isNotBlank(studentNum)) { - int outOf = recordDoorNO == 1 ? 1 : 0; - //远程开门 - openDoor(xaFeign,sno,"64",recordDoorNO,cardNo); - Log_orderSuccess.info("请假开门成功"+cardNo); - } else { - //没有请假不做任何处理,则是刷卡异常,入库 - UserDto user = smFeign.selectUserByCardNum(cardNo); - PassFailDto passFail = new PassFailDto(); - passFail.setCardNum(cardNo); - passFail.setDeviceId(sno+""); - passFail.setDirection((recordDoorNO == 1 ? "出门" : "进门")); - passFail.setResultIntro(WGUtils.getReasonDetailChinese(reason)); - passFail.setInTime(DateUtils.string2Date(recordTime, DateUtils.format2)); - passFail.setCreateTime(new Date()); - passFail.setSchoolId(user.getSchoolId()); - xaFeign.insertPassFail(passFail); - } - } - } - } - - private static void push(byte[] recv,XaFeign xaFeign){ - long index = WgUdpCommShort.getXidOfCommand(recv); - long sno = WgUdpCommShort.getLongByByte(recv, 4, 4); - String functionId = WGUtils.byte2Hex(recv[1]); - SendMessageDto sendMessage = xaFeign.selectMessage(sno+"",index,functionId); - if(sendMessage != null){ - if(recv[8] == 1){ - sendMessage.setCorrect(1); - }else { - sendMessage.setCorrect(0); - } - StringBuffer result = new StringBuffer(); - for(byte b : recv){ - result.append(WGUtils.byte2Hex(b)).append("-"); - } - sendMessage.setResult(result.toString().substring(0,result.toString().length()-1)); - xaFeign.updateMessage(sendMessage.getId(),sendMessage.getResult(),sendMessage.getCorrect()); - } - } - - //远程开门 - public static long openDoor(XaFeign xaFeign,long sno , String outsideOrderId,int doorNo , String cardNo){ - WgUdpCommShort pkt = new WgUdpCommShort(); - pkt.iDevSn = sno; - try{ - int doorNO =doorNo; - pkt.Reset(); - pkt.functionID = WGUtils.toFunctionHex(outsideOrderId); - pkt.data[0] =(byte) (doorNO & 0xff); - if(StringUtils.isNotBlank(cardNo)){ - pkt.data[20] = WGUtils.toHex(cardNo.substring(0,2)); - pkt.data[21] = WGUtils.toHex(cardNo.substring(2,4)); - pkt.data[22] = WGUtils.toHex(cardNo.substring(4,6)); - pkt.data[23] = WGUtils.toHex(cardNo.substring(6,8)); - } - byte[] bytes = pkt.toByte(); - long index = WgUdpCommShort.getXidOfCommand(bytes); - long result = insert(xaFeign,sno+"",outsideOrderId,cardNo,index,bytes); - pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes); - return result ; - }catch (Exception e){ - Log_error.error(e.toString()); - } - return 0L; - } - - //重置控制板时间 - public static long setTime(XaFeign xaFeign,long sno , String outsideOrderId){ - WgUdpCommShort pkt = new WgUdpCommShort(); - pkt.iDevSn = sno; - try{ - pkt.Reset(); - pkt.functionID = WGUtils.toFunctionHex(outsideOrderId); - Calendar cal = (Calendar.getInstance()); - pkt.data[0] = WGUtils.toHex(String.valueOf(cal.get(Calendar.YEAR)).substring(0,2)); - pkt.data[1] = WGUtils.toHex(String.valueOf(cal.get(Calendar.YEAR)).substring(2,4)); - pkt.data[2] = WGUtils.toHex(String.valueOf(cal.get(Calendar.MONTH)+1)); - pkt.data[3] = WGUtils.toHex(String.valueOf(cal.get(Calendar.DATE))); - pkt.data[4] =WGUtils.toHex(String.valueOf(cal.get(Calendar.HOUR_OF_DAY))); - pkt.data[5] =WGUtils.toHex(String.valueOf(cal.get(Calendar.MINUTE))); - pkt.data[6] = WGUtils.toHex(String.valueOf(cal.get(Calendar.SECOND))); - byte[] bytes = pkt.toByte(); - long index = WgUdpCommShort.getXidOfCommand(bytes); - long result = insert(xaFeign,sno+"",outsideOrderId,null,index,bytes); - pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes); - return result ; - }catch (Exception e){ - Log_error.error(e.toString()); - } - return 0L; - } - - - - //设置考勤时段 - public static List SetAttendanceTime(XaFeign xaFeign,long sno ,String outsideOrderId, int shiduan , Date begin ,Date end , - int isMonDay ,int isTuesDay , int isWednesDay ,int isThursDay , int isFriday , - int isSaturDay , int isWeekend , String shiqu){ - List resultList = new ArrayList<>(); - WgUdpCommShort pkt = new WgUdpCommShort(); - pkt.iDevSn = sno; - try{ - pkt.Reset(); - pkt.functionID = WGUtils.toFunctionHex(outsideOrderId); - String[] shiQuArray = shiqu.split(","); - int shiDuanCount = shiQuArray.length / 6 ; - for (int i = 0; i < shiDuanCount; i++){ - if (i == 0) { - pkt.data[0] = WGUtils.toHex(shiduan+""); - } else { - pkt.data[0] = WGUtils.toHex((shiduan+20*i)+""); - } - Calendar c = Calendar.getInstance(); - c.setTime(begin); - //开始时间 20 19 01 01 - pkt.data[1] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(0,2)); - pkt.data[2] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(2,4)); - pkt.data[3] = WGUtils.toHex(String.valueOf(c.get(Calendar.MONTH)+1)); - pkt.data[4] = WGUtils.toHex(String.valueOf(c.get(Calendar.DATE))); - //结束时间 - c.setTime(end); - pkt.data[5] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(0,2)); - pkt.data[6] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(2,4)); - pkt.data[7] = WGUtils.toHex(String.valueOf(c.get(Calendar.MONTH)+1)); - pkt.data[8] = WGUtils.toHex(String.valueOf(c.get(Calendar.DATE))); - //星期几 有效 - pkt.data[9] = WGUtils.toHex(String.valueOf(isMonDay)); - pkt.data[10] = WGUtils.toHex(String.valueOf(isTuesDay)); - pkt.data[11] = WGUtils.toHex(String.valueOf(isWednesDay)); - pkt.data[12] = WGUtils.toHex(String.valueOf(isThursDay)); - pkt.data[13] = WGUtils.toHex(String.valueOf(isFriday)); - pkt.data[14] = WGUtils.toHex(String.valueOf(isSaturDay)); - pkt.data[15] = WGUtils.toHex(String.valueOf(isWeekend)); - //有效时区 - pkt.data[16] = WGUtils.toHex(shiQuArray[i * 6 + 0].substring(0, 2)); - pkt.data[17] = WGUtils.toHex(shiQuArray[i * 6 + 0].substring(3, 5)); - - pkt.data[18] = WGUtils.toHex(shiQuArray[i * 6 + 1].substring(0, 2)); - pkt.data[19] = WGUtils.toHex(shiQuArray[i * 6 + 1].substring(3, 5)); - - pkt.data[20] = WGUtils.toHex(shiQuArray[i * 6 + 2].substring(0, 2)); - pkt.data[21] = WGUtils.toHex(shiQuArray[i * 6 + 2].substring(3, 5)); - - pkt.data[22] = WGUtils.toHex(shiQuArray[i * 6 + 3].substring(0, 2)); - pkt.data[23] = WGUtils.toHex(shiQuArray[i * 6 + 3].substring(3, 5)); - - pkt.data[24] = WGUtils.toHex(shiQuArray[i * 6 + 4].substring(0, 2)); - pkt.data[25] = WGUtils.toHex(shiQuArray[i * 6 + 4].substring(3, 5)); - - pkt.data[26] = WGUtils.toHex(shiQuArray[i * 6 + 5].substring(0, 2)); - pkt.data[27] = WGUtils.toHex(shiQuArray[i * 6 + 5].substring(3, 5)); - if (shiDuanCount != 1) { - //需要链接时段 - if (i != shiDuanCount - 1) { - //只要不是最后一个时段 - pkt.data[28] = WGUtils.toHex((shiduan+20*(i+1)+"")); - } else { - pkt.data[28] = 0; - } - } else { - pkt.data[28] = 0; - } - byte[] bytes = pkt.toByte(); - long index = WgUdpCommShort.getXidOfCommand(bytes); - long result = insert(xaFeign,sno+"",outsideOrderId,null,index,bytes); - pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes); - resultList.add(result); - } - return resultList ; - }catch (Exception e){ - Log_error.error(e.toString()); - } - return resultList; - } - - - //设置权限 - public static long SetSignalCardInfo(XaFeign xaFeign,long sno , String outsideOrderId, String cardNo , int shiduan , Date begin , Date end){ - WgUdpCommShort pkt = new WgUdpCommShort(); - pkt.iDevSn = sno; - try{ - pkt.Reset(); - pkt.functionID = WGUtils.toFunctionHex(outsideOrderId); - pkt.iDevSn = sno; - //0D D7 37 00 - pkt.data[0] = WGUtils.toHex(cardNo.substring(0,2)); - pkt.data[1] = WGUtils.toHex(cardNo.substring(2,4)); - pkt.data[2] = WGUtils.toHex(cardNo.substring(4,6)); - pkt.data[3] = WGUtils.toHex(cardNo.substring(6,8)); - - //20 10 01 01 起始日期: 2010年01月01日 (必须大于2001年) - Calendar c = Calendar.getInstance(); - c.setTime(begin); - pkt.data[4] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(0,2)); - pkt.data[5] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(2,4)); - pkt.data[6] = WGUtils.toHex(String.valueOf(c.get(Calendar.MONTH)+1)); - pkt.data[7] = WGUtils.toHex(String.valueOf(c.get(Calendar.DATE))); - //20 29 12 31 截止日期: 2029年12月31日 - c.setTime(end); - pkt.data[8] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(0,2)); - pkt.data[9] = WGUtils.toHex(String.valueOf(c.get(Calendar.YEAR)).substring(2,4)); - pkt.data[10] = WGUtils.toHex(String.valueOf(c.get(Calendar.MONTH)+1)); - pkt.data[11] = WGUtils.toHex(String.valueOf(c.get(Calendar.DATE))); - //01 允许通过 一号门 [对单门, 双门, 四门控制器有效] - pkt.data[12] = WGUtils.toHex(shiduan+""); - //01 允许通过 二号门 [对双门, 四门控制器有效] - pkt.data[13] = WGUtils.toHex(shiduan+""); - //01 允许通过 三号门 [对四门控制器有效] - pkt.data[14] = WGUtils.toHex(shiduan+""); - //01 允许通过 四号门 [对四门控制器有效] - pkt.data[15] = WGUtils.toHex(shiduan+""); - byte[] bytes = pkt.toByte(); - long index = WgUdpCommShort.getXidOfCommand(bytes); - long result = insert(xaFeign,sno+"",outsideOrderId,cardNo,index,bytes); - pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes); - return result ; - }catch (Exception e){ - Log_error.error(e.toString()); - } - return 0l; - } - - //删除单张卡权限 - public static long clearSinglePower(XaFeign xaFeign,long sno ,String outsideOrderId, String cardNo){ - WgUdpCommShort pkt = new WgUdpCommShort(); - pkt.iDevSn = sno; - try{ - pkt.Reset(); - pkt.functionID = WGUtils.toFunctionHex(outsideOrderId); - pkt.iDevSn = sno; - pkt.data[0] = WGUtils.toHex(cardNo.substring(0,2)); - pkt.data[1] = WGUtils.toHex(cardNo.substring(2,4)); - pkt.data[2] = WGUtils.toHex(cardNo.substring(4,6)); - pkt.data[3] = WGUtils.toHex(cardNo.substring(6,8)); - byte[] bytes = pkt.toByte(); - long index = WgUdpCommShort.getXidOfCommand(bytes); - long result = insert(xaFeign,sno+"",outsideOrderId,cardNo,index,bytes); - pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes); - return result ; - }catch (Exception e){ - Log_error.error(e.toString()); - } - return 0l; - } - - //删除全部权限 - public static long clearAllPower(XaFeign xaFeign,long sno ,String outsideOrderId){ - WgUdpCommShort pkt = new WgUdpCommShort(); - pkt.iDevSn = sno; - try{ - pkt.Reset(); - pkt.functionID = WGUtils.toFunctionHex(outsideOrderId); - pkt.iDevSn = sno; - pkt.data[0] = (byte) 0x55 ; - pkt.data[1] = (byte) 0xAA ; - pkt.data[2] = (byte) 0xAA ; - pkt.data[3] = (byte) 0x55 ; - byte[] bytes = pkt.toByte(); - long index = WgUdpCommShort.getXidOfCommand(bytes); - long result = insert(xaFeign,sno+"",outsideOrderId,null,index,bytes); - pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes); - return result ; - }catch (Exception e){ - Log_error.error(e.toString()); - } - return 0l; - } - - //查询卡权限 - public static long searchPower(XaFeign xaFeign,long sno ,String outsideOrderId, String cardNo){ - WgUdpCommShort pkt = new WgUdpCommShort(); - pkt.iDevSn = sno; - try{ - pkt.Reset(); - pkt.functionID = WGUtils.toFunctionHex(outsideOrderId); - pkt.iDevSn = sno; - pkt.data[0] = WGUtils.toHex(cardNo.substring(0,2)); - pkt.data[1] = WGUtils.toHex(cardNo.substring(2,4)); - pkt.data[2] = WGUtils.toHex(cardNo.substring(4,6)); - pkt.data[3] = WGUtils.toHex(cardNo.substring(6,8)); - byte[] bytes = pkt.toByte(); - long index = WgUdpCommShort.getXidOfCommand(bytes); - long result = insert(xaFeign,sno+"",outsideOrderId,cardNo,index,bytes); - pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes); - return result ; - }catch (Exception e){ - Log_error.error(e.toString()); - } - return 0l; - } - - //删除时段 - public static long clearShiDuan(XaFeign xaFeign,long sno , String outsideOrderId){ - WgUdpCommShort pkt = new WgUdpCommShort(); - pkt.iDevSn = sno; - try{ - pkt.Reset(); - pkt.functionID = WGUtils.toFunctionHex(outsideOrderId); - pkt.iDevSn = sno; - pkt.data[0] = (byte) 0x55 ; - pkt.data[1] = (byte) 0xAA ; - pkt.data[2] = (byte) 0xAA ; - pkt.data[3] = (byte) 0x55 ; - byte[] bytes = pkt.toByte(); - long index = WgUdpCommShort.getXidOfCommand(bytes); - long result = insert(xaFeign,sno+"",outsideOrderId,null,index,bytes); - pkt.run(watchingShortHandler.getSessionMap().get(sno),bytes); - return result ; - }catch (Exception e){ - Log_error.error(e.toString()); - } - return 0l; - } - - private static long insert(XaFeign xaFeign ,String sn ,String functionId , String cardNo , long index , byte[] recv){ - - StringBuffer send = new StringBuffer(); - for(byte b : recv){ - send.append(WGUtils.byte2Hex(b)).append("-"); - } - SendMessageDto sendMessage = new SendMessageDto(); - sendMessage.setDeviceId(sn); - sendMessage.setFunctionId(Integer.toHexString(Integer.valueOf(functionId))); - sendMessage.setIndex(index); - sendMessage.setCardNo(cardNo); - sendMessage.setCreateTime(new Date()); - sendMessage.setSend(send.toString().substring(0,send.toString().length()-1)); - xaFeign.insertMessage(sendMessage); - return sendMessage.getId(); - } -} diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WgUdpCommShort.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WgUdpCommShort.java index 30234cf..35d9fdd 100644 --- a/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WgUdpCommShort.java +++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WgUdpCommShort.java @@ -61,7 +61,7 @@ public class WgUdpCommShort { //短报文协议 _Global_xid++; _xid = _Global_xid; //新的值 } - static long getXidOfCommand(byte[] cmd) //获取指令中的xid + public static long getXidOfCommand(byte[] cmd) //获取指令中的xid { long ret = -1; if (cmd.length >= WGPacketSize) -- libgit2 0.21.0