From b537495df3c9a98a45847d5573a41cb86c3354ab Mon Sep 17 00:00:00 2001 From: 陈杰 <504987307@qq.com> Date: Wed, 27 Nov 2019 10:43:14 +0800 Subject: [PATCH] 微耕 --- cloud/weigeng/pom.xml | 82 +++++----------------------------------------------------------------------------- cloud/weigeng/src/main/java/com/sincere/weigeng/Swagger2.java | 38 ++++++++++++++++++++++++++++++++++++++ cloud/weigeng/src/main/java/com/sincere/weigeng/WeigengApplication.java | 5 +++++ cloud/weigeng/src/main/java/com/sincere/weigeng/controller/WgController.java | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/weigeng/src/main/java/com/sincere/weigeng/feign/SmFeign.java | 40 ++++++++++++++++++++++++++++++++++++++++ cloud/weigeng/src/main/java/com/sincere/weigeng/feign/XaFeign.java | 47 +++++++++++++++++++++++++++++++++++++++++++++++ cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LogName.java | 39 +++++++++++++++++++++++++++++++++++++++ cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LoggerUtils.java | 27 +++++++++++++++++++++++++++ cloud/weigeng/src/main/java/com/sincere/weigeng/logs/MyTimeBasedFileNamingAndTriggeringPolicy.java | 32 ++++++++++++++++++++++++++++++++ cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WGUtils.java | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchServer.java | 509 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchingShortHandler.java | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WgUdpCommShort.java | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/weigeng/src/main/java/com/sincere/weigeng/vo/AttendanceTimeVo.java | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/weigeng/src/main/java/com/sincere/weigeng/vo/CardInfo.java | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/weigeng/src/main/java/com/sincere/weigeng/vo/CleanShiDuanVo.java | 44 ++++++++++++++++++++++++++++++++++++++++++++ cloud/weigeng/src/main/java/com/sincere/weigeng/vo/OpenDoorVo.java | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/weigeng/src/main/java/com/sincere/weigeng/vo/SignalCardInfoVo.java | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/weigeng/src/main/resources/application.yaml | 20 ++++++++++++++++++++ cloud/weigeng/src/main/resources/logback.xml | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 20 files changed, 1845 insertions(+), 77 deletions(-) create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/Swagger2.java create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/controller/WgController.java create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/feign/SmFeign.java create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/feign/XaFeign.java create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LogName.java create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LoggerUtils.java create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/logs/MyTimeBasedFileNamingAndTriggeringPolicy.java create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WGUtils.java create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchServer.java create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchingShortHandler.java create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WgUdpCommShort.java create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/vo/AttendanceTimeVo.java create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/vo/CardInfo.java create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/vo/CleanShiDuanVo.java create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/vo/OpenDoorVo.java create mode 100644 cloud/weigeng/src/main/java/com/sincere/weigeng/vo/SignalCardInfoVo.java create mode 100644 cloud/weigeng/src/main/resources/application.yaml create mode 100644 cloud/weigeng/src/main/resources/logback.xml diff --git a/cloud/weigeng/pom.xml b/cloud/weigeng/pom.xml index cc3ccb3..74c6112 100644 --- a/cloud/weigeng/pom.xml +++ b/cloud/weigeng/pom.xml @@ -22,7 +22,7 @@ com.sincere common - 1.0.0 + 0.0.1-SNAPSHOT org.apache.mina @@ -81,87 +81,15 @@ - - weigeng - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 + org.springframework.boot + spring-boot-maven-plugin - 1.8 - 1.8 - UTF-8 + true - - - - org.apache.maven.plugins - maven-jar-plugin - - - - com.com.sincere.weigeng.WeigengApplication - true - lib/ - - - ./config/ - - - - config/** - - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy - package - - copy-dependencies - - - - ${project.build.directory}/lib - - - - - - - - org.apache.maven.plugins - maven-resources-plugin - 2.5 - - UTF-8 - - - - - maven-source-plugin - 2.2 - - true - - - - compile - - jar - - - - + diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/Swagger2.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/Swagger2.java new file mode 100644 index 0000000..03089f0 --- /dev/null +++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/Swagger2.java @@ -0,0 +1,38 @@ +package com.sincere.weigeng; + +import io.swagger.annotations.ApiOperation; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@EnableSwagger2 +@Configuration //让Spring来加载该类配置 +public class Swagger2 { + + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .enableUrlTemplating(true) + .select() + // 扫描所有有注解的api,用这种方式更灵活 + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + .paths(PathSelectors.any()) + .build(); + + } + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("Spring Boot中使用Swagger2构建RESTful APIs") + .description("接口文档") + .termsOfServiceUrl("") + .version("1.0") + .build(); + } +} 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 1539ad5..d831577 100644 --- a/cloud/weigeng/src/main/java/com/sincere/weigeng/WeigengApplication.java +++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/WeigengApplication.java @@ -1,5 +1,6 @@ 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; @@ -10,8 +11,12 @@ import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication public class WeigengApplication { + private static String ip = "172.16.3.175"; + private static int port = 1200; + public static void main(String[] args) { SpringApplication.run(WeigengApplication.class, args); + //WatchServer.WatchingServerRunning(ip,port); } } 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 new file mode 100644 index 0000000..6386ddc --- /dev/null +++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/controller/WgController.java @@ -0,0 +1,220 @@ +package com.sincere.weigeng.controller; + +import com.sincere.common.dto.smartCampus.SchoolDto; +import com.sincere.common.dto.smartCampus.StudentCardDto; +import com.sincere.common.dto.smartCampus.UpdateCardDto; +import com.sincere.common.dto.smartCampus.UserDto; +import com.sincere.common.dto.xiaoan.SendFailDto; +import com.sincere.common.dto.xiaoan.SendMessageDto; +import com.sincere.common.dto.xiaoan.SendSuccessDto; +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.vo.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author chen + * @version 1.0 + * @date 2019/10/14 0014 9:12 + */ +@RestController +@Api(value = "微耕") +public class WgController { + + private static final Logger Log_orderSuccess = LoggerUtils.Logger(LogName.orderSuccess); + private static final Logger Log_orderFail = LoggerUtils.Logger(LogName.orderFail); + + @Autowired + SmFeign smFeign; + + @Autowired + XaFeign xaFeign; + + private static String ip = "172.16.3.175"; + private static int port = 1200; + + @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"); + } + + @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); + SendMessageDto message = getResult(messageId); + if(message.getCorrect() == 1){ + Log_orderSuccess.info("web端远程开门成功!"); + }else { + Log_orderFail.info("远程开门失败"); + } + return message.getCorrect() == 1 ; + } + + + @ApiOperation("设置考勤时段") + @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(), + attendanceTimeVo.getStart(),attendanceTimeVo.getEnd(),attendanceTimeVo.getIsMonday(),attendanceTimeVo.getIsTuesday(), + attendanceTimeVo.getIsWednesday(),attendanceTimeVo.getIsThursday(),attendanceTimeVo.getIsFriday(), + attendanceTimeVo.getIsSaturday(),attendanceTimeVo.getIsWeekend(),attendanceTimeVo.getShiqu()); + boolean isSuccess = true ; + for(Long messageId : result){ + SendMessageDto message = getResult(messageId); + if(message.getCorrect() == 1){ + Log_orderSuccess.info("设备"+attendanceTimeVo.getSn()+"时段"+attendanceTimeVo.getShiduan()+"!!设置成功"); + }else { + Log_orderFail.info("设备"+attendanceTimeVo.getSn()+"时段"+attendanceTimeVo.getShiduan()+"!!设置失败"); + isSuccess = false ; + } + } + return isSuccess; + } + + + @ApiOperation("单个卡号的权限添加或修改") + @RequestMapping(value = "setSignalCardInfo" , method = RequestMethod.POST) + 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, + signalCardInfoVo.getShiduan(),signalCardInfoVo.getStartTime(),signalCardInfoVo.getEndTime()); + SendMessageDto message = getResult(messageId); + UserDto user = smFeign.selectUserByCardNum(cardNo); + StudentCardDto studentCard = smFeign.selectStudentCard(cardNo); + SchoolDto school = smFeign.selectSchoolBySchoolId(user.getSchoolId()); + UpdateCardDto updateCard = smFeign.selectUpdateCardByUpdateId(signalCardInfoVo.getUpdateId()); + if(message.getCorrect() == 1){ + Log_orderSuccess.info("设备"+signalCardInfoVo.getSn()+"时段"+signalCardInfoVo.getShiduan()+"卡号"+cardNo+"!!设置成功"); + SendSuccessDto sendSuccess = new SendSuccessDto(user,school,studentCard,updateCard); + sendSuccess.setDeviceId(signalCardInfoVo.getSn()+""); + sendSuccess.setShiduan(signalCardInfoVo.getShiduan()); + sendSuccess.setCardNum(cardNo); + sendSuccess.setUpdateId(signalCardInfoVo.getUpdateId()); + sendSuccess.setOpenFlag(1); + sendSuccess.setStatus(1); + xaFeign.insertSendSuccess(sendSuccess); + }else { + Log_orderFail.info("设备"+signalCardInfoVo.getSn()+"时段"+signalCardInfoVo.getShiduan()+"卡号"+cardNo+"!!设置失败"); + SendFailDto sendFail = new SendFailDto(user,school,studentCard,updateCard); + sendFail.setDeviceId(signalCardInfoVo.getSn()+""); + sendFail.setShiduan(signalCardInfoVo.getShiduan()); + sendFail.setCardNum(cardNo); + sendFail.setUpdateId(signalCardInfoVo.getUpdateId()); + sendFail.setOpenFlag(1); + sendFail.setStatus(1); + sendFail.setFailType(2); + sendFail.setFailContent("其他"); + xaFeign.insertSendFail(sendFail); + } + return message.getCorrect() == 1; + } + + + @ApiOperation("清除单个卡号权限") + @RequestMapping(value = "clearSinglePower" , method = RequestMethod.POST) + 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); + SendMessageDto message = getResult(messageId); + if(message.getCorrect() == 1){ + Log_orderSuccess.info("卡号"+cardNo+"清除权限成功"); + SendSuccessDto sendSuccess = new SendSuccessDto(); + sendSuccess.setCardNum(cardNo); + sendSuccess.setDeviceId(cardInfo.getSn()+""); + xaFeign.updateSendSuccess(sendSuccess); + }else { + Log_orderFail.info("卡号"+cardNo+"清除权限失败"); + } + return message.getCorrect() == 1 ; + } + + @ApiOperation("清除全部权限") + @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); + SendMessageDto message = getResult(messageId); + if(message.getCorrect() == 1){ + Log_orderSuccess.info("设备"+cleanShiDuanVo.getSn()+"清除权限成功"); + SendSuccessDto sendSuccess = new SendSuccessDto(); + sendSuccess.setDeviceId(cleanShiDuanVo.getSn()+""); + xaFeign.updateSendSuccess(sendSuccess); + }else { + Log_orderFail.info("设备"+cleanShiDuanVo.getSn()+"清除权限失败"); + } + return message.getCorrect() == 1 ; + } + + + @ApiOperation("清除时段") + @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); + SendMessageDto sendMessage = getResult(messageId); + if(sendMessage.getCorrect() == 1){ + Log_orderSuccess.info("设备"+cleanShiDuanVo.getSn()+"时段清除成功"); + }else { + Log_orderFail.info("设备"+cleanShiDuanVo.getSn()+"时段清除失败"); + } + return sendMessage.getCorrect() == 1; + } + + @ApiOperation("查询单个卡号 权限") + @RequestMapping(value = "searchPower" , method = RequestMethod.POST) + 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); + SendMessageDto sendMessage = getResult(messageId); + if(sendMessage.getCorrect() == 1){ + Log_orderSuccess.info("设备"+cardInfo.getSn()+"卡号"+cardNo+"查询权限成功"); + }else { + Log_orderFail.info("设备"+cardInfo.getSn()+"卡号"+cardNo+"查询权限失败"); + } + return sendMessage.getCorrect() == 1; + } + + @RequestMapping(value = "watch" , method = RequestMethod.GET) + public int watch(){ + return 1 ; + } + + private SendMessageDto getResult(long messageId){ + try{ + Thread.sleep(300); + }catch (Exception e){ + + } + return xaFeign.selectById(messageId); + } + + private String initCardNo(String cardNo){ + while (cardNo.length() < 8){ + cardNo = "0" + cardNo ; + } + return cardNo ; + } +} diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/feign/SmFeign.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/feign/SmFeign.java new file mode 100644 index 0000000..3bd6bb0 --- /dev/null +++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/feign/SmFeign.java @@ -0,0 +1,40 @@ +package com.sincere.weigeng.feign; + +import com.sincere.common.dto.smartCampus.SchoolDto; +import com.sincere.common.dto.smartCampus.StudentCardDto; +import com.sincere.common.dto.smartCampus.UpdateCardDto; +import com.sincere.common.dto.smartCampus.UserDto; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * @author chen + * @version 1.0 + * @date 2019/11/12 0012 11:08 + */ +@FeignClient("smartCampusSearch") +public interface SmFeign { + + @RequestMapping(value = "/sm/wg/updateLinkTime",method = RequestMethod.GET) + int updateLinkTime(@RequestParam("sno") String sno); + + @RequestMapping(value = "/sm/wg/selectOutOrderId",method = RequestMethod.GET) + String selectOutOrderId(@RequestParam("type") int type, @RequestParam("insideOrderId") int insideOrderId); + + @RequestMapping(value = "/sm/wg/checkLeave",method = RequestMethod.GET) + String checkLeave(@RequestParam("cardNo") String cardNo); + + @RequestMapping(value = "/sm/wg/selectSchoolBySchoolId",method = RequestMethod.GET) + SchoolDto selectSchoolBySchoolId(@RequestParam("schoolId") int schoolId); + + @RequestMapping(value = "/sm/wg/selectUserByCardNum",method = RequestMethod.GET) + UserDto selectUserByCardNum(@RequestParam("cardNum") String cardNum); + + @RequestMapping(value = "/sm/wg/selectUpdateCardByUpdateId",method = RequestMethod.GET) + UpdateCardDto selectUpdateCardByUpdateId(@RequestParam("updateId") int updateId); + + @RequestMapping(value = "/sm/wg/selectStudentCard",method = RequestMethod.GET) + StudentCardDto selectStudentCard(@RequestParam("cardNum") String cardNum); +} diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/feign/XaFeign.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/feign/XaFeign.java new file mode 100644 index 0000000..eb9836c --- /dev/null +++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/feign/XaFeign.java @@ -0,0 +1,47 @@ +package com.sincere.weigeng.feign; + +import com.sincere.common.dto.xiaoan.*; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * @author chen + * @version 1.0 + * @date 2019/11/12 0012 11:12 + */ +@FeignClient("xiaoanSearch") +public interface XaFeign { + + @RequestMapping(value = "/xa/wg/checkIn",method = RequestMethod.POST) + CheckOutDto checkIn(@RequestBody CheckInDto checkInDto); + + @RequestMapping(value = "/xa/wg/insertMessage",method = RequestMethod.POST) + long insertMessage(@RequestBody SendMessageDto sendMessageDto); + + @RequestMapping(value = "/xa/wg/selectById",method = RequestMethod.GET) + SendMessageDto selectById(@RequestParam("id") long id); + + @RequestMapping(value = "/xa/wg/selectMessage",method = RequestMethod.GET) + SendMessageDto selectMessage(@RequestParam("deviceId") String deviceId, @RequestParam("index") long index,@RequestParam("functionId") String functionId); + + @RequestMapping(value = "/xa/wg/updateMessage",method = RequestMethod.GET) + int updateMessage(@RequestParam("id") long id, @RequestParam("result") String result, @RequestParam("correct") int correct); + + @RequestMapping(value = "/xa/wg/insertPassFail",method = RequestMethod.POST) + int insertPassFail(@RequestBody PassFailDto passFailDto); + + @RequestMapping(value = "/xa/wg/insertSendSuccess",method = RequestMethod.POST) + int insertSendSuccess(@RequestBody SendSuccessDto sendSuccessDto); + + @RequestMapping(value = "/xa/wg/insertSendFail",method = RequestMethod.POST) + int insertSendFail(@RequestBody SendFailDto sendFailDto); + + @RequestMapping(value = "/xa/wg/deleteSendFail",method = RequestMethod.POST) + int deleteSendFail(@RequestBody SendFailDto sendFailDto); + + @RequestMapping(value = "/xa/wg/deleteSendFail",method = RequestMethod.POST) + int updateSendSuccess(@RequestBody SendSuccessDto sendSuccessDto); +} diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LogName.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LogName.java new file mode 100644 index 0000000..a3d2a0b --- /dev/null +++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LogName.java @@ -0,0 +1,39 @@ +package com.sincere.weigeng.logs; + +/** + * @author chen + * @version 1.0 + * @date 2019/10/12 0012 16:18 + */ +public enum LogName { + orderSuccess("orderSuccess"), + orderFail("orderFail"), + kaoInfo("kaoInfo"), + heartBeat("heartBeat"), + error("error"); + + private String logFileName; + + LogName(String fileName) { + this.logFileName = fileName; + } + + public String getLogFileName() { + return logFileName; + } + + public void setLogFileName(String logFileName) { + this.logFileName = logFileName; + } + + public static LogName getAwardTypeEnum(String value) { + LogName[] arr = values(); + for (LogName item : arr) { + if (null != item && !item.logFileName.equals("")) { + return item; + } + } + return null; + } +} + diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LoggerUtils.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LoggerUtils.java new file mode 100644 index 0000000..4cc38fc --- /dev/null +++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/logs/LoggerUtils.java @@ -0,0 +1,27 @@ +package com.sincere.weigeng.logs; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author chen + * @version 1.0 + * @date 2019/10/12 0012 16:19 + */ +public class LoggerUtils { + + public static Logger Logger(Class clazz) { + return LoggerFactory.getLogger(clazz); + } + + /** + * 打印到指定的文件下 + * + * @param desc 日志文件名称 + * @return + */ + public static Logger Logger(LogName desc) { + return LoggerFactory.getLogger(desc.getLogFileName()); + } + +} diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/logs/MyTimeBasedFileNamingAndTriggeringPolicy.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/logs/MyTimeBasedFileNamingAndTriggeringPolicy.java new file mode 100644 index 0000000..10ce6b5 --- /dev/null +++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/logs/MyTimeBasedFileNamingAndTriggeringPolicy.java @@ -0,0 +1,32 @@ +package com.sincere.weigeng.logs; + +import ch.qos.logback.core.joran.spi.NoAutoStart; +import ch.qos.logback.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy; + +/** + * @author chen + * @version 1.0 + * @date 2019/10/31 0031 13:42 + */ +@NoAutoStart +public class MyTimeBasedFileNamingAndTriggeringPolicy extends DefaultTimeBasedFileNamingAndTriggeringPolicy { + + //这个用来指定时间间隔 + private Integer multiple = 1; + + @Override + protected void computeNextCheck() { + nextCheck = rc.getEndOfNextNthPeriod(dateInCurrentPeriod, multiple).getTime(); + } + + public Integer getMultiple() { + return multiple; + } + + public void setMultiple(Integer multiple) { + if (multiple > 1) { + this.multiple = multiple; + } + } + +} diff --git a/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WGUtils.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WGUtils.java new file mode 100644 index 0000000..7202b66 --- /dev/null +++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WGUtils.java @@ -0,0 +1,133 @@ +package com.sincere.weigeng.utils; + +/** + * @author chen + * @version 1.0 + * @date 2019/10/14 0014 11:03 + */ +public class WGUtils { + + //指令转换 message 10进制 要先转16 在转byte + public static Byte toFunctionHex(String message){ + Integer i = Integer.valueOf(message) ; + if(i > 127){ + i = i-256 ; + } + return Byte.valueOf(i+""); + } + + //短报文 转化 message 16进制 要先转16 在转byte + public static Byte toHex(String message){ + Integer i = Integer.valueOf(message,16) ; + if(i > 127){ + i = i-256 ; + } + return Byte.valueOf(i+""); + } + + public static String getCardNo(byte[] buff, int start, int len){ + String cardNo = "" ; + for(int i = start ; i < start+len ; i++){ + cardNo += byte2Hex(buff[i]); + } + return cardNo; + } + + public static String byte2Hex(byte b){ + int i = b ; + if( b < 0){ + i = b + 256 ; + } + String result = Integer.toHexString(i).toUpperCase() ; + if(result.length() == 1){ + result = "0"+result; + } + return result; + } + + //4字节转成整型数(低位前, 高位后) + public static int byteToInt(byte[] buff, int start, int len) { + int val = 0; + for (int i = 0; i < len && i < 4; i++) + { + long lng = buff[i + start]; + val += (lng << (8 * i)); + } + return val; + } + + //4字节转成整型数(低位前, 高位后) + public static long byteToLong(byte[] buff, int start, int len) { + long val = 0; + for (int i = 0; i < len && i < 4; i++) + { + long lng = buff[i + start]; + val += (lng << (8 * i)); + } + return val; + } + + //获取Hex值, 主要用于日期时间格式 + public static byte getHex(int val) { + return (byte)((val % 10) + (((val -(val % 10)) / 10)%10) *16); + } + + + public static String getReasonDetailChinese(int Reason){ + if (Reason > 45) { + return ""; + } + if (Reason <= 0) { + return ""; + } + return RecordDetails[(Reason - 1) * 4 + 3]; //中文信息 + } + + public static String RecordDetails[] = { + "1","SwipePass","Swipe","刷卡开门", + "2","SwipePass","Swipe Close","刷卡关", + "3","SwipePass","Swipe Open","刷卡开", + "4","SwipePass","Swipe Limited Times","刷卡开门(带限次)", + "5","SwipeNOPass","Denied Access: PC Control","刷卡禁止通过: 电脑控制", + "6","SwipeNOPass","Denied Access: No PRIVILEGE","刷卡禁止通过: 没有权限", + "7","SwipeNOPass","Denied Access: Wrong PASSWORD","刷卡禁止通过: 密码不对", + "8","SwipeNOPass","Denied Access: AntiBack","刷卡禁止通过: 反潜回", + "9","SwipeNOPass","Denied Access: More Cards","刷卡禁止通过: 多卡", + "10","SwipeNOPass","Denied Access: First Card Open","刷卡禁止通过: 首卡", + "11","SwipeNOPass","Denied Access: Door Set NC","刷卡禁止通过: 门为常闭", + "12","SwipeNOPass","Denied Access: InterLock","刷卡禁止通过: 互锁", + "13","SwipeNOPass","Denied Access: Limited Times","刷卡禁止通过: 受刷卡次数限制", + "14","SwipeNOPass","Denied Access: Limited Person Indoor","刷卡禁止通过: 门内人数限制", + "15","SwipeNOPass","Denied Access: Invalid Timezone","刷卡禁止通过: 卡过期或不在有效时段", + "16","SwipeNOPass","Denied Access: In Order","刷卡禁止通过: 按顺序进出限制", + "17","SwipeNOPass","Denied Access: SWIPE GAP LIMIT","刷卡禁止通过: 刷卡间隔约束", + "18","SwipeNOPass","Denied Access","刷卡禁止通过: 原因不明", + "19","SwipeNOPass","Denied Access: Limited Times","刷卡禁止通过: 刷卡次数限制", + "20","ValidEvent","Push Button","按钮开门", + "21","ValidEvent","Push Button Open","按钮开", + "22","ValidEvent","Push Button Close","按钮关", + "23","ValidEvent","Door Open","门打开[门磁信号]", + "24","ValidEvent","Door Closed","门关闭[门磁信号]", + "25","ValidEvent","Super Password Open Door","超级密码开门", + "26","ValidEvent","Super Password Open","超级密码开", + "27","ValidEvent","Super Password Close","超级密码关", + "28","Warn","Controller Power On","控制器上电", + "29","Warn","Controller Reset","控制器复位", + "30","Warn","Push Button Invalid: Disable","按钮不开门: 按钮禁用", + "31","Warn","Push Button Invalid: Forced Lock","按钮不开门: 强制关门", + "32","Warn","Push Button Invalid: Not On Line","按钮不开门: 门不在线", + "33","Warn","Push Button Invalid: InterLock","按钮不开门: 互锁", + "34","Warn","Threat","胁迫报警", + "35","Warn","Threat Open","胁迫报警开", + "36","Warn","Threat Close","胁迫报警关", + "37","Warn","Open too long","门长时间未关报警[合法开门后]", + "38","Warn","Forced Open","强行闯入报警", + "39","Warn","Fire","火警", + "40","Warn","Forced Close","强制关门", + "41","Warn","Guard Against Theft","防盗报警", + "42","Warn","7*24Hour Zone","烟雾煤气温度报警", + "43","Warn","Emergency Call","紧急呼救报警", + "44","RemoteOpen","Remote Open Door","操作员远程开门", + "45","RemoteOpen","Remote Open Door By USB Reader","发卡器确定发出的远程开门" + }; +} 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 new file mode 100644 index 0000000..b358ad3 --- /dev/null +++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchServer.java @@ -0,0 +1,509 @@ +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/WatchingShortHandler.java b/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchingShortHandler.java new file mode 100644 index 0000000..32fcea8 --- /dev/null +++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WatchingShortHandler.java @@ -0,0 +1,90 @@ +package com.sincere.weigeng.utils; + +import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.service.IoHandlerAdapter; +import org.apache.mina.core.session.IdleStatus; +import org.apache.mina.core.session.IoSession; + +import java.util.Map; +import java.util.Queue; + + +/** + * Class the extends IoHandlerAdapter in order to properly handle + * connections and the data the connections send + * + * @author Apache MINA Project + */ +public class WatchingShortHandler extends IoHandlerAdapter { + + private Queue queue; + private Map sessionMap ; + public WatchingShortHandler(Queue queue , Map sessionMap) { + super(); + this.queue = queue; + this.sessionMap = sessionMap; + } + + /** + * 异常来关闭session + */ + @Override + public void exceptionCaught(IoSession session, Throwable cause) + throws Exception { + cause.printStackTrace(); + session.close(true); + } + + /** + * 服务器端收到一个消息 + */ + @Override + public void messageReceived(IoSession session, Object message) throws Exception { + IoBuffer io = (IoBuffer) message; + if (io.hasRemaining()) { + byte[] validBytes = new byte[io.remaining()]; + io.get(validBytes,0,io.remaining()); + if (validBytes.length == WgUdpCommShort.WGPacketSize) { + synchronized (queue) { + long sn = WgUdpCommShort.getLongByByte(validBytes, 4, 4); + sessionMap.put(sn,session); + queue.offer(validBytes); + } + } else { + } + } + } + + @Override + public void sessionClosed(IoSession session) throws Exception { + } + + @Override + public void sessionCreated(IoSession session) throws Exception { + } + + @Override + public void sessionIdle(IoSession session, IdleStatus status) + throws Exception { + } + + @Override + public void sessionOpened(IoSession session) throws Exception { + } + + public Queue getQueue() { + return queue; + } + + public void setQueue(Queue queue) { + this.queue = queue; + } + + public Map getSessionMap() { + return sessionMap; + } + + public void setSessionMap(Map sessionMap) { + this.sessionMap = sessionMap; + } +} 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 new file mode 100644 index 0000000..30234cf --- /dev/null +++ b/cloud/weigeng/src/main/java/com/sincere/weigeng/utils/WgUdpCommShort.java @@ -0,0 +1,120 @@ +package com.sincere.weigeng.utils; + +import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.session.IoSession; + +public class WgUdpCommShort { //短报文协议 + + public static final int WGPacketSize = 64; //报文长度 + public static final byte Type = 0x17; //2015-04-30 08:50:29 0x19; //类型 + public static final int ControllerPort = 60000; //控制器端口 + public static final long SpecialFlag = 0x55AAAA55; //特殊标识 防止误操作 + + public static byte[] longToByte(long number) { + byte[] b = new byte[8]; + for (int i = 0; i < 8; i++) { + b[i] = (byte) (number % 256); + number >>= 8; + } + return b; + } + + //从字节转换为 long型数据, 最大长度为8字节 低位在前, 高位在后... + //bytlen (1--8), 不在此范围则返回 -1 + public static long getLongByByte(byte[] data,int startIndex,int bytlen) + { + long ret =-1; + if ((bytlen >=1) && (bytlen <=8)) + { + ret = getIntByByte(data[startIndex + bytlen-1]); + for (int i=1; i= WGPacketSize) + { + ret = getLongByByte(cmd, 40, 4); + } + return ret; + } + + public WgUdpCommShort() + { + Reset(); + } + public void Reset() //数据复位 + { + for(int i=0; i + + + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n + + + + + + %d{yyyy-MM-dd HH:mm:ss} -%msg%n + + + + 1 + + + ${logPath}/info/orderSuccess/%d{yyyy-MM-dd HH}.log + ${maxHistory} + + + + + %d{yyyy-MM-dd HH:mm:ss} -%msg%n + + + + 1 + + + ${logPath}/info/orderFail/%d{yyyy-MM-dd HH}.log + ${maxHistory} + + + + + %d{yyyy-MM-dd HH:mm:ss} -%msg%n + + + + 1 + + + ${logPath}/info/heartBeat/%d{yyyy-MM-dd HH}.log + ${maxHistory} + + + + + %d{yyyy-MM-dd HH:mm:ss} -%msg%n + + + + 1 + + + ${logPath}/info/kaoInfo/%d{yyyy-MM-dd HH}.log + ${maxHistory} + + + + + + + + + ERROR + + + %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n + + + + 1 + + ${logPath}/infoError/${PROJECT_NAME}.%d{yyyy-MM-dd}.log + + ${maxHistory} + + + + + + + + + + + + + + + + + + + + + +        + + + + + + + + + + \ No newline at end of file -- libgit2 0.21.0