From 23ff537a224d8e82331baab45a2d0a59ebf082fc Mon Sep 17 00:00:00 2001 From: litao Date: Fri, 27 Oct 2023 13:27:42 +0800 Subject: [PATCH] =?UTF-8?q?2023=E5=B9=B410=E6=9C=8827=E6=97=A513:27:20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 21 +- .../common/config/BladeConfiguration.java | 1 + .../common/constant/CommonConstant.java | 2 +- .../hospital/agent/hik/utils/HikClient.java | 9 +- .../agent/service/HikAgentService.java | 50 ++- .../hospital/agent/utils/DataTrans.java | 9 + .../hospital/agent/utils/QueueUtils.java | 2 +- .../hospital/controller/AIoTRequestDemo.java | 7 +- .../AlarmInformationController.java | 93 +++- .../controller/AppDataController.java | 213 +++++++-- .../hospital/entity/AlarmInformation.java | 10 + .../springblade/hospital/entity/CornJob.java | 5 + .../hospital/hik/ArtemisPostTest.java | 119 +++++ .../springblade/hospital/hik/alarm/Alarm.java | 412 ++++++++++++------ .../hospital/hik/alarm/AlarmDataParse.java | 43 +- .../hospital/hik/alarm/FMSGCallBack.java | 94 ---- .../communicationCom/HTTPClientUtil.java | 352 +++++++++++++++ .../service/impl/AppDataServiceImpl.java | 16 +- .../service/impl/CornJobServiceImpl.java | 13 +- .../hospital/utils/CornJobUtil.java | 125 +++--- .../hospital/utils/ExternalUtils.java | 225 ++++++---- .../hospital/utils/UploadFileUtil.java | 3 +- .../system/controller/DictBizController.java | 19 +- src/main/resources/application-dev.yml | 2 + src/main/resources/application.yml | 11 +- 25 files changed, 1388 insertions(+), 468 deletions(-) create mode 100644 src/main/java/org/springblade/hospital/hik/ArtemisPostTest.java create mode 100644 src/main/java/org/springblade/hospital/newalarm/communicationCom/HTTPClientUtil.java diff --git a/pom.xml b/pom.xml index 39c524c..1e5f0e0 100644 --- a/pom.xml +++ b/pom.xml @@ -225,11 +225,11 @@ - - com.baidubce - artemis-http-client - 1.2 - + + + + + @@ -260,7 +260,16 @@ hik-java-sdk 0.10.21 - + + com.hikvision.ga + artemis-http-client + 1.1.8 + + + com.hikvision + isapi-http + 1.1.1 + diff --git a/src/main/java/org/springblade/common/config/BladeConfiguration.java b/src/main/java/org/springblade/common/config/BladeConfiguration.java index badd1bb..2af5d4f 100644 --- a/src/main/java/org/springblade/common/config/BladeConfiguration.java +++ b/src/main/java/org/springblade/common/config/BladeConfiguration.java @@ -48,6 +48,7 @@ public class BladeConfiguration implements WebMvcConfigurer { secureRegistry.excludePathPatterns("/blade-flow/manager/check-upload"); secureRegistry.excludePathPatterns("/doc.html"); secureRegistry.excludePathPatterns("/js/**"); + secureRegistry.excludePathPatterns("/blade-resource/oss/endpoint/remove-file"); secureRegistry.excludePathPatterns("/webjars/**"); secureRegistry.excludePathPatterns("/swagger-resources/**"); secureRegistry.excludePathPatterns("/druid/**"); diff --git a/src/main/java/org/springblade/common/constant/CommonConstant.java b/src/main/java/org/springblade/common/constant/CommonConstant.java index 19dd128..e466151 100644 --- a/src/main/java/org/springblade/common/constant/CommonConstant.java +++ b/src/main/java/org/springblade/common/constant/CommonConstant.java @@ -80,5 +80,5 @@ public interface CommonConstant { */ Integer API_SCOPE_CATEGORY = 2; - + String IOT_PLATFORM_URL = "iot_platform_url"; } diff --git a/src/main/java/org/springblade/hospital/agent/hik/utils/HikClient.java b/src/main/java/org/springblade/hospital/agent/hik/utils/HikClient.java index b89fbbf..a446880 100644 --- a/src/main/java/org/springblade/hospital/agent/hik/utils/HikClient.java +++ b/src/main/java/org/springblade/hospital/agent/hik/utils/HikClient.java @@ -113,9 +113,9 @@ public class HikClient { @PostConstruct public void init() { - ArtemisConfig.host = hikHost; - ArtemisConfig.appKey = hikAppKey; - ArtemisConfig.appSecret = hikAppSecret; +// ArtemisConfig.host = hikHost; +// ArtemisConfig.appKey = hikAppKey; +// ArtemisConfig.appSecret = hikAppSecret; log.info("init :::{}{}{}", hikHost, hikAppKey, hikAppSecret); } @@ -476,7 +476,8 @@ public class HikClient { try { //ArtemisConfig artemisConfig = new ArtemisConfig(hikHost, hikAppKey, hikAppSecret); - String resp = ArtemisHttpUtil.doPostStringArtemis(path, bodyText, (Map) null, (String) null, contentType.getMimeType(), headers); +// String resp = ArtemisHttpUtil.doPostStringArtemis(path, bodyText, (Map) null, (String) null, contentType.getMimeType(), headers); + String resp = ""; log.info("Got response from HIK " + resp); if (StringUtils.isNotEmpty(resp)) { JSONObject responseResultJSON = JSONObject.parseObject(resp); diff --git a/src/main/java/org/springblade/hospital/agent/service/HikAgentService.java b/src/main/java/org/springblade/hospital/agent/service/HikAgentService.java index f458dd1..e56a867 100644 --- a/src/main/java/org/springblade/hospital/agent/service/HikAgentService.java +++ b/src/main/java/org/springblade/hospital/agent/service/HikAgentService.java @@ -95,13 +95,12 @@ public class HikAgentService extends AgentGrpc.AgentImplBase { @Override public void run() { log.info("init 去执行execGetDataFromDevice 当前线程:" + Thread.currentThread().getId()); -// execGetDataFromDevice(); + execGetDataFromDevice(); } }); } methodInitFlag.set(true); - } private void sendHeartBeat(int agentId) { @@ -194,7 +193,7 @@ public class HikAgentService extends AgentGrpc.AgentImplBase { String s = JSON.toJSONString(map.get("tags")).replace("\\", ""); s = s.substring(1, s.length() - 1); Map tagsMap = JSONObject.parseObject(s, Map.class); - String macId = tagsMap.get("mac").toString(); + String macId = tagsMap.get("pmac").toString(); Item item = Item.newBuilder().setId(macId).setName(map.get("name").toString()) .putAllExtField(new HashMap<>()).build(); @@ -346,12 +345,14 @@ public class HikAgentService extends AgentGrpc.AgentImplBase { @Override public void command(CommandRequest request, StreamObserver responseObserver) { //根据具体指令下发到具体设备 - log.info("HikAgentService_command来到了grpc服务端{}", request); +// responseObserver.onNext(CommonResult.newBuilder().setCode(0).build()); +// responseObserver.onCompleted(); +// System.out.println("zhixingwancgenfg............."); try { ByteString data = request.getPoint().getData(); - int value = DataTrans.bytesToIntBigEndian(data.toByteArray()); + int value = DataTrans.bytesToShortBigEndian(data.toByteArray()); int pntType = request.getPoint().getPntType(); String roadwaySyscode = request.getPoint().getId(); String[] spId = roadwaySyscode.split("_"); @@ -363,25 +364,25 @@ public class HikAgentService extends AgentGrpc.AgentImplBase { // 防区控制 if (pntType == 8) { - // 布防 - if (value == 1) { - System.out.println("shebeikongzhi:fqbf"); - result = Alarm.fqbf(spId[0], Integer.parseInt(spId[spId.length - 1]) - 1); - } - // 撤防 - else if (value == 0) { - System.out.println("shebeikongzhi:fqcf"); - result = Alarm.fqcf(spId[0], Integer.parseInt(spId[spId.length - 1]) - 1); - } +// // 布防 +// if (value == 1) { +// System.out.println("shebeikongzhi:fqbf"); +// result = Alarm.fqbf(spId[0], Integer.parseInt(spId[spId.length - 1]) - 1); +// } +// // 撤防 +// else if (value == 0) { +// System.out.println("shebeikongzhi:fqcf"); +// result = Alarm.fqcf(spId[0], Integer.parseInt(spId[spId.length - 1]) - 1); +// } // 旁路 - else if (value == 2) { + if (value == 1) { System.out.println("shebeikongzhi:fqpl"); - result = Alarm.fqpl(spId[0], Integer.parseInt(spId[spId.length - 1]) - 1); + result = Alarm.fqpl(Alarm.macMap.get(spId[0]), Integer.parseInt(spId[spId.length - 1]) - 1); } // 撤销旁路 - else if (value == 3) { + else if (value == 0) { System.out.println("shebeikongzhi:fqqxpl"); - result = Alarm.fqcxpl(spId[0], Integer.parseInt(spId[spId.length - 1]) - 1); + result = Alarm.fqcxpl(Alarm.macMap.get(spId[0]), Integer.parseInt(spId[spId.length - 1]) - 1); } } // 子系统控制 @@ -389,25 +390,26 @@ public class HikAgentService extends AgentGrpc.AgentImplBase { // 布防 if (value == 1) { System.out.println("shebeikongzhi:zxtbf"); - result = Alarm.zibufang(spId[0], Integer.parseInt(spId[spId.length - 1])); + result = Alarm.zibufang(Alarm.macMap.get(spId[0]), Integer.parseInt(spId[spId.length - 1])); } // 撤防 else if (value == 0) { System.out.println("shebeikongzhi:zxtcf"); - result = Alarm.zichefang(spId[0], Integer.parseInt(spId[spId.length - 1])); + result = Alarm.zichefang(Alarm.macMap.get(spId[0]), Integer.parseInt(spId[spId.length - 1])); } } else if (pntType == 11) { // 消警 if (value == 1) { System.out.println("shebeikongzhi:zxtxj"); - result = Alarm.xiaojing(spId[0], Integer.parseInt(spId[spId.length - 1])); + result = Alarm.xiaojing(Alarm.macMap.get(spId[0]), Integer.parseInt(spId[spId.length - 1])); } } System.out.println("result:" + result); - responseObserver.onNext(CommonResult.newBuilder().setCode(result ? 0 : 1).build()); + responseObserver.onNext(CommonResult.newBuilder().setCode(0).build()); } catch (Exception e) { e.printStackTrace(); - responseObserver.onNext(CommonResult.newBuilder().setCode(1).build()); + System.out.println("zhixingle........."); + responseObserver.onNext(CommonResult.newBuilder().setCode(0).build()); } responseObserver.onCompleted(); diff --git a/src/main/java/org/springblade/hospital/agent/utils/DataTrans.java b/src/main/java/org/springblade/hospital/agent/utils/DataTrans.java index 0975593..df4ab88 100644 --- a/src/main/java/org/springblade/hospital/agent/utils/DataTrans.java +++ b/src/main/java/org/springblade/hospital/agent/utils/DataTrans.java @@ -66,6 +66,15 @@ byte数据顺序与内存地址高低的关系 return bytes; } + public static byte[] shortToBytesBigEndian(short value) { + byte[] bytes = new byte[Short.BYTES]; + bytes[1] = (byte) (value & 0xff); + bytes[0] = (byte) ((value >> Byte.SIZE) & 0xff); + return bytes; + } + public static short bytesToShortBigEndian(byte[] bytes) { + return (short) (bytes[1] & 0xFF | (bytes[0] & 0xFF) << 8); + } } diff --git a/src/main/java/org/springblade/hospital/agent/utils/QueueUtils.java b/src/main/java/org/springblade/hospital/agent/utils/QueueUtils.java index 4a08933..ef23518 100644 --- a/src/main/java/org/springblade/hospital/agent/utils/QueueUtils.java +++ b/src/main/java/org/springblade/hospital/agent/utils/QueueUtils.java @@ -71,7 +71,7 @@ public class QueueUtils { Point point = blockingQueue_alarm.take(); // Point point = ItcAgentService.POINT_MAP.get("123456789"); // Integer t = point.getData(); - byte[] byteValue= DataTrans.intToBytesBigEndian(1); + byte[] byteValue= DataTrans.shortToBytesBigEndian((short) 1); ByteString byteString=ByteString.copyFrom(byteValue); List list = Arrays.asList(Point.newBuilder().setData(point.getData()) .setDataType(point.getDataType()) diff --git a/src/main/java/org/springblade/hospital/controller/AIoTRequestDemo.java b/src/main/java/org/springblade/hospital/controller/AIoTRequestDemo.java index b4bcc9f..23d1df1 100644 --- a/src/main/java/org/springblade/hospital/controller/AIoTRequestDemo.java +++ b/src/main/java/org/springblade/hospital/controller/AIoTRequestDemo.java @@ -74,8 +74,8 @@ public class AIoTRequestDemo { return signature(uri, parameters, nonce, timestamp, requestBody, appKey, appSecret); } - private static String signature(String requestURI, LinkedHashMap> parameters, String - nonce, long timestamp, String requestBody, String appKey, String appSecret) throws NoSuchAlgorithmException, + private static String signature(String requestURI, LinkedHashMap> parameters, String nonce, + long timestamp, String requestBody, String appKey, String appSecret) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException { parameters = parametersRank(parameters); StringBuilder builder = new StringBuilder(requestURI); @@ -105,8 +105,7 @@ public class AIoTRequestDemo { return sign; } - private static LinkedHashMap> parametersRank(LinkedHashMap> - parameters) { + private static LinkedHashMap> parametersRank(LinkedHashMap> parameters) { LinkedHashMap> rankedParameters = new LinkedHashMap<>(parameters.size()); if (parameters.size() != 0) { List keys = new ArrayList<>(parameters.keySet()); diff --git a/src/main/java/org/springblade/hospital/controller/AlarmInformationController.java b/src/main/java/org/springblade/hospital/controller/AlarmInformationController.java index 20a8f99..2f2cf15 100644 --- a/src/main/java/org/springblade/hospital/controller/AlarmInformationController.java +++ b/src/main/java/org/springblade/hospital/controller/AlarmInformationController.java @@ -17,6 +17,7 @@ package org.springblade.hospital.controller; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -24,6 +25,8 @@ import com.google.gson.Gson; import com.google.protobuf.ByteString; import com.hisense.device.agent.grpc.Point; import lombok.AllArgsConstructor; +import org.json.JSONException; +import org.springblade.common.cache.DictBizCache; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.excel.util.ExcelUtil; import org.springblade.core.mp.support.Condition; @@ -35,15 +38,16 @@ import org.springblade.hospital.agent.utils.DataTrans; import org.springblade.hospital.agent.utils.QueueUtils; import org.springblade.hospital.entity.AlarmInformation; import org.springblade.hospital.excel.AlarmInformationExcel; +import org.springblade.hospital.hik.ArtemisPostTest; import org.springblade.hospital.hik.alarm.Alarm; import org.springblade.hospital.service.IAlarmInformationService; +import org.springblade.hospital.websocket.WebSocketServer; +import org.springframework.http.*; import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestTemplate; import javax.servlet.http.HttpServletResponse; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; /** * 接口权限控制器 @@ -68,7 +72,7 @@ public class AlarmInformationController extends BladeController { // Point point = new Gson().fromJson(JSON.toJSONString(params), Point.class); int status = Integer.parseInt(String.valueOf(params.get("pntTypeValue_"))); - byte[] byteValue = DataTrans.intToBytesBigEndian(status); + byte[] byteValue = DataTrans.shortToBytesBigEndian((short)status); ByteString byteString = ByteString.copyFrom(byteValue); Point point = Point.newBuilder() .setData(byteString) @@ -137,4 +141,83 @@ public class AlarmInformationController extends BladeController { return R.status(alarmInformationService.updateById(alarmInformation)); } + /** + * 实时监控 + */ + @GetMapping("/preview") + public R preview(String cameraIndexCode) throws Exception { + String result = ArtemisPostTest.callPostApiGetOrgList(cameraIndexCode); + Map map = JSON.parseObject(result, Map.class); + if ("0".equals(map.get("code"))) { + Map url = (Map) map.get("data"); + return R.data(url.get("url")); + } + return R.data(""); + } + + /** + * 回放 + */ + @GetMapping("/playback") + public R playback(String cameraIndexCode, String beginTime, String endTime) throws Exception { + String result = ArtemisPostTest.callPostApiGetRegions(cameraIndexCode, beginTime, endTime); + System.out.println("res:" + result); + Map map = JSON.parseObject(result, Map.class); + if ("0".equals(map.get("code"))) { + Map url = (Map) map.get("data"); + return R.data(url.get("url")); + } + return R.data(""); + } + + /** + * 物联网报警信息订阅 + */ + @PostMapping("/alarm") + public void alarm(@RequestBody JSONObject json) { +// System.out.println("接收到的数据:" + json); + Map map = JSON.parseObject(json.toString(), Map.class); + + Map map2 = JSON.parseObject(map.get("data").toString(), Map.class); + + if (map2.get("type") != null && "device_event".equals(map2.get("type").toString())) { + Map map3 = JSON.parseObject(map2.get("data").toString(), Map.class); + System.out.println("map3:" + map3); + + // 报警信息数据过滤 + if (map3.get("eventList") != null) { + List eventList = JSON.parseObject(map3.get("eventList").toString(), List.class); + if ("manualAlarm".equals(eventList.get(0))) { + System.out.println("ruku:--------------"); + AlarmInformation alarmInformation = new AlarmInformation(); + alarmInformation.setType("device_event"); + alarmInformation.setReportTime(new Date(Long.parseLong(map.get("time").toString()))); + alarmInformation.setContent("测试工卡报警"); + alarmInformation.setHostSerialNumber(map3.get("sn").toString()); + alarmInformation.setDeviceId(map3.get("mac").toString()); + alarmInformation.setAlarmType(2); + alarmInformation.setDeviceName("product"); + alarmInformationService.save(alarmInformation); + + RestTemplate restTemplate = new RestTemplate(); + String url = "http://171.16.8.58:8080/prod-api/api/safeCare/callBack/getDeviceCamera?sn=" + map3.get("sn").toString(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8")); + HttpEntity request = new HttpEntity(headers); + // 发送get请求,并输出结果 + ResponseEntity exchange = restTemplate.exchange(url, HttpMethod.GET, request, String.class); + // 返回数据 + Map cameraMap = JSONObject.parseObject(exchange.getBody(), Map.class); + + // websocket推送报警信息 + JSONObject jsonObject = new JSONObject(); + alarmInformation.setBuildId("22"); + alarmInformation.setFloorNo("11"); + jsonObject.put("message", JSONObject.toJSONString(alarmInformation)); + WebSocketServer.sendInfo(jsonObject); + } + } + } + } + } diff --git a/src/main/java/org/springblade/hospital/controller/AppDataController.java b/src/main/java/org/springblade/hospital/controller/AppDataController.java index e38ad4c..dccfe86 100644 --- a/src/main/java/org/springblade/hospital/controller/AppDataController.java +++ b/src/main/java/org/springblade/hospital/controller/AppDataController.java @@ -16,16 +16,14 @@ */ package org.springblade.hospital.controller; -import com.alibaba.druid.support.json.JSONUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.IdWorker; -import com.google.common.collect.Lists; import lombok.AllArgsConstructor; -import lombok.SneakyThrows; import org.apache.commons.codec.binary.Base64; +import org.apache.commons.httpclient.HttpClient; import org.apache.commons.lang3.RandomStringUtils; +import org.springblade.common.cache.ParamCache; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.cache.utils.CacheUtil; import org.springblade.core.mp.support.Condition; @@ -33,26 +31,32 @@ import org.springblade.core.mp.support.Query; import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; import org.springblade.hospital.entity.*; -import org.springblade.hospital.hik.NetSDKDemo.HCNetSDK; import org.springblade.hospital.hik.alarm.Alarm; +import org.springblade.hospital.newalarm.communicationCom.HTTPClientUtil; import org.springblade.hospital.service.IAppDataService; import org.springblade.hospital.utils.ExternalUtils; import org.springblade.hospital.websocket.WebSocketServer; import org.springblade.modules.system.service.IParamService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.multipart.commons.CommonsMultipartResolver; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.StringReader; import java.util.*; +import static org.springblade.common.constant.CommonConstant.IOT_PLATFORM_URL; import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE; /** @@ -70,9 +74,11 @@ public class AppDataController extends BladeController { private final RestTemplate restTemplate; + @Autowired + ExternalUtils externalUtils; + @GetMapping("/list") public R> list(AppData appData, Query query) { - return R.data(appDataService.getPage(Condition.getPage(query), appData)); } @@ -83,7 +89,6 @@ public class AppDataController extends BladeController { @PostMapping("/putFile") public R putFile(AppData appData, HttpServletRequest request) { List resultList = new ArrayList<>(); - CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); commonsMultipartResolver.setDefaultEncoding("utf-8"); if (commonsMultipartResolver.isMultipart(request)) { @@ -103,7 +108,7 @@ public class AppDataController extends BladeController { */ @CrossOrigin @PostMapping("/escalation") - public R escalation(@RequestBody Map alarm) { + public R escalation(@RequestBody Map alarm) { String uuid = UUID.randomUUID().toString(); alarm.put("regionId", uuid); alarm.put("sourceId", uuid); @@ -158,8 +163,6 @@ public class AppDataController extends BladeController { System.out.println("signature:" + signature); System.out.println("fhxx:" + response); return R.data(response); -// AlarmInformation result = restTemplate.postForObject(url, alarmInformation, AlarmInformation.class); -// System.out.println(result); } catch (Exception e) { e.printStackTrace(); } @@ -170,7 +173,7 @@ public class AppDataController extends BladeController { * 获取物联网平台token */ private String getToken(String appKey, String appSecret) { - String url = "http://182.139.182.190:60032/prod-api/api/Login"; + String url = ParamCache.getValue(IOT_PLATFORM_URL) + "Login"; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8")); @@ -217,8 +220,7 @@ public class AppDataController extends BladeController { } private Map getMap(String token) { - - String url = "http://182.139.182.190:60032/prod-api/api/bizDevice/list?name=a"; + String url = ParamCache.getValue(IOT_PLATFORM_URL) + "bizDevice/list?name=a"; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8")); @@ -238,7 +240,18 @@ public class AppDataController extends BladeController { */ @PostMapping("/setup") public R setup(@RequestParam String hostSerialNumber, @RequestParam String num) { - return R.status(Alarm.zibufang(hostSerialNumber, Integer.parseInt(num))); + String[] splitHost = hostSerialNumber.split(","); + String[] splitNum = num.split(","); + String status = ""; + for (int i = 0; i < splitHost.length; i++) { + String[] split = splitNum[i].split("_"); + if (Alarm.zibufang(splitHost[i], Integer.parseInt(split[split.length - 1]))) { + status += "主机:" + splitHost[i] + "的子系统" + num + "布防成功!"; + } else { + status += "主机:" + splitHost[i] + "的子系统" + num + "布防失败!"; + } + } + return R.success(status); } /** @@ -246,7 +259,18 @@ public class AppDataController extends BladeController { */ @PostMapping("/close") public R close(@RequestParam String hostSerialNumber, @RequestParam String num) { - return R.status(Alarm.zichefang(hostSerialNumber, Integer.parseInt(num))); + String[] splitHost = hostSerialNumber.split(","); + String[] splitNum = num.split(","); + String status = ""; + for (int i = 0; i < splitHost.length; i++) { + String[] split = splitNum[i].split("_"); + if (Alarm.zichefang(splitHost[i], Integer.parseInt(split[split.length - 1]))) { + status += "主机:" + splitHost[i] + "的子系统" + num + "撤防成功!"; + } else { + status += "主机:" + splitHost[i] + "的子系统" + num + "撤防失败!"; + } + } + return R.success(status); } /** @@ -279,23 +303,158 @@ public class AppDataController extends BladeController { @PostMapping("/unBypass") public R unBypass(@RequestParam String hostSerialNumber, @RequestParam String num) { return R.status(Alarm.fqcxpl(hostSerialNumber, Integer.parseInt(num) - 1)); - } - - @GetMapping("/test") - public R test() { -// HCNetSDK.NET_DVR_ALARMHOST_MAIN_STATUS_V40 status = Alarm.getStatus(); -// externalUtils.updateStatus(); - WebSocketServer.test(); - return R.data(0); +// return R.status(Alarm.xiaojing(hostSerialNumber, Integer.parseInt(num) - 1)); } @GetMapping("/coordinateToWGS84") public R coordinateToWGS84_2D(int x, int y, double minX, double maxY) { - double mX = minX + (double)x / 1000.0; - double mY = maxY - (double)y / 1000.0; + double mX = minX + (double) x / 1000.0; + double mY = maxY - (double) y / 1000.0; double lng = mX / 2.003750834E7 * 180.0; double lat = mY / 2.003750834E7 * 180.0; lat = 57.29577951308232 * (2.0 * Math.atan(Math.exp(lat * Math.PI / 180.0)) - 1.5707963267948966); return R.data(new JoysuchCoordinate((double) x, (double) y, lng, lat)); } + + @GetMapping("/test") + public R test(String number) { +// HCNetSDK.NET_DVR_ALARMHOST_MAIN_STATUS_V40 status = Alarm.getStatus(number); +// +// Alarm.xiaojing(number, 0); + + externalUtils.updateStatus(); + +// JSONObject jsonObject = new JSONObject(); +// AlarmInformation alarmInformation = new AlarmInformation(); +// alarmInformation.setReportTime(new Date()); +// alarmInformation.setBuildId("111222333"); +// alarmInformation.setFloorNo("11"); +// alarmInformation.setContent("22"); +// jsonObject.put("message", JSONObject.toJSONString(alarmInformation)); +// WebSocketServer.sendInfo(jsonObject); +// WebSocketServer.test(); + return R.data(0); + } + + @GetMapping("/test001") + public void test001() { +// JSONObject jsonObject = new JSONObject(); +// AlarmInformation alarmInformation = new AlarmInformation(); +// alarmInformation.setReportTime(new Date()); +// alarmInformation.setBuildId("111222333"); +// alarmInformation.setFloorNo("11"); +// alarmInformation.setContent("22"); +// alarmInformation.setCameraCode("a639bb55c237414f8c487c409d5789c7-e99031e13c754bee900f50245488896a"); +// jsonObject.put("message", JSONObject.toJSONString(alarmInformation)); +// WebSocketServer.sendInfo(jsonObject); + WebSocketServer.test(); + } + + @GetMapping("/test1") + public void test1(String number) { + + try { + HttpClient client = new HttpClient(); + String ip = "171.16.206.139"; + String port = "80"; + // 登录认证 + String rzUrl = "http://" + ip + ":" + port + "/ISAPI/System/deviceInfo"; + System.out.println("shuchu:" + HTTPClientUtil.renzheng(rzUrl, client)); + + // 获取设备系统能力集 + String jtUrl = "http://" + ip + ":" + port + "/ISAPI/System/capabilities"; + System.out.println("jt:" + HTTPClientUtil.doGet(jtUrl, client)); + + // 获取布防订阅能力 + String strUrl = "http://" + ip + ":" + port + "/ISAPI/Event/notification/subscribeEventCap"; + System.out.println("shuchu:" + HTTPClientUtil.doGet(strUrl, client)); + + // 建立布防订阅连接 + String jlUrl = "http://" + ip + ":" + port + "/ISAPI/Event/notification/subscribeEvent?deployID=1"; + String xml = "\n" + + "\n" + + "\n" + + " 1\n" + + " all\n" + + ""; +// System.out.println("jl:" + HTTPClientUtil.doPost(jlUrl, xml, number, client)); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + // + public static void main(String[] args) { + try { + RestTemplate restTemplate = new RestTemplate(); + String url = "http://171.16.8.58:8080/prod-api/api/safeCare/callBack/getDeviceCamera?sn=1918FC32532E"; + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8")); + HttpEntity request = new HttpEntity(headers); + // 发送get请求,并输出结果 + ResponseEntity exchange = restTemplate.exchange(url, HttpMethod.GET, request, String.class); + // 返回数据 + Map cameraMap = JSONObject.parseObject(exchange.getBody(), Map.class); + +// String rzUrl = "http://" + HTTPClientUtil.strIP + ":" + HTTPClientUtil.iPort + "/ISAPI/System/deviceInfo"; +// String renzheng = HTTPClientUtil.renzheng(rzUrl, HTTPClientUtil.client); +// System.out.println(renzheng.contains("DS-PWA32-H20230524AACHQ25788522WU1")); + +// System.out.println("shuchu:" + HTTPClientUtil.renzheng(rzUrl, HTTPClientUtil.client)); + +// String jtUrl = "http://" + HTTPClientUtil.strIP + ":" + HTTPClientUtil.iPort + "/ISAPI/System/capabilities"; +// System.out.println("jt:" + HTTPClientUtil.doGet(jtUrl, HTTPClientUtil.client)); +// +// String strUrl = "http://" + HTTPClientUtil.strIP + ":" + HTTPClientUtil.iPort + "/ISAPI/Event/notification/subscribeEventCap"; +// System.out.println("shuchu:" + HTTPClientUtil.doGet(strUrl, HTTPClientUtil.client)); +// +// String jlUrl = "http://" + HTTPClientUtil.strIP + ":" + HTTPClientUtil.iPort + "/ISAPI/Event/notification/subscribeEvent?deployID=1"; +// String xml = "\n" + +// "\n" + +// "\n" + +// " 1\n" + +// " all\n" + +// ""; +// System.out.println("jl:" + HTTPClientUtil.doPost(jlUrl, xml)); + +// String bfUrl = "http://" + HTTPClientUtil.strIP + ":" + HTTPClientUtil.iPort + "/ISAPI/SecurityCP/control/arm/1?ways=away&format=json"; +// System.out.println("xj:" + HTTPClientUtil.doPut(bfUrl, "", HTTPClientUtil.client)); + +// String cfUrl = "http://" + HTTPClientUtil.strIP + ":" + HTTPClientUtil.iPort + "/ISAPI/SecurityCP/control/disarm/1"; +// System.out.println("xj:" + HTTPClientUtil.doPut(cfUrl, "", HTTPClientUtil.client)); + +// String xjUrl = "http://" + HTTPClientUtil.strIP + ":" + HTTPClientUtil.iPort + "/ISAPI/SecurityCP/control/clearAlarm/1"; +// System.out.println("xj:" + HTTPClientUtil.doPut(xjUrl, "", HTTPClientUtil.client)); + +// String plUrl = "http://" + HTTPClientUtil.strIP + ":" + HTTPClientUtil.iPort + "/ISAPI/SecurityCP/control/bypass/1"; +// System.out.println("xj:" + HTTPClientUtil.doPut(plUrl, "", HTTPClientUtil.client)); + +// String qxplUrl = "http://" + HTTPClientUtil.strIP + ":" + HTTPClientUtil.iPort + "/ISAPI/SecurityCP/control/bypassRecover/1"; +// System.out.println("xj:" + HTTPClientUtil.doPut(qxplUrl, "", HTTPClientUtil.client)); + +// String status = "http://" + HTTPClientUtil.strIP + ":" + HTTPClientUtil.iPort + "/ISAPI/SecurityCP/status/communication?format=json"; +// System.out.println("防区状态:" + HTTPClientUtil.doGet(status, HTTPClientUtil.client)); + +// String status = "http://" + HTTPClientUtil.strIP + ":" + HTTPClientUtil.iPort + "/ISAPI/SecurityCP/status/host?format=json"; +// String statusData = HTTPClientUtil.doGet(status, HTTPClientUtil.client); +// +// Map tagsMap = JSONObject.parseObject(statusData, Map.class); +// Map alarmHostStatus = JSONObject.parseObject(tagsMap.get("AlarmHostStatus").toString(), Map.class); +// Map CommuniStatus = JSONObject.parseObject(alarmHostStatus.get("CommuniStatus").toString(), Map.class); +//// System.out.println("CommuniStatus" + CommuniStatus); +// List ZoneList = JSONObject.parseObject(alarmHostStatus.get("ZoneList").toString(), List.class); +// System.out.println("ZoneList" + ZoneList); +// for (Map map : ZoneList) { +// Map zone = JSONObject.parseObject(map.get("Zone").toString(), Map.class); +// boolean isArming = (boolean) zone.get("isArming"); +// System.out.println(isArming); +// } +// +// List SubSysList = JSONObject.parseObject(alarmHostStatus.get("SubSysList").toString(), List.class); +// System.out.println("SubSysList" + SubSysList); + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/src/main/java/org/springblade/hospital/entity/AlarmInformation.java b/src/main/java/org/springblade/hospital/entity/AlarmInformation.java index 40bea04..1c20761 100644 --- a/src/main/java/org/springblade/hospital/entity/AlarmInformation.java +++ b/src/main/java/org/springblade/hospital/entity/AlarmInformation.java @@ -145,6 +145,16 @@ public class AlarmInformation extends BaseEntity { */ private String hostIp; + /** + * 报警类型 + */ + private Integer alarmType; + + /** + * 摄像头编号 + */ + private String cameraCode; + // @TableField(exist = false) // private List statusDetailList; diff --git a/src/main/java/org/springblade/hospital/entity/CornJob.java b/src/main/java/org/springblade/hospital/entity/CornJob.java index 0046805..7c7ae1a 100644 --- a/src/main/java/org/springblade/hospital/entity/CornJob.java +++ b/src/main/java/org/springblade/hospital/entity/CornJob.java @@ -79,4 +79,9 @@ public class CornJob extends BaseEntity { * 报警主机IP */ private String hostIp; + + /** + * 是否定时布/撤防(0一键布撤防 1定时布撤防) + */ + private Integer isRegular; } diff --git a/src/main/java/org/springblade/hospital/hik/ArtemisPostTest.java b/src/main/java/org/springblade/hospital/hik/ArtemisPostTest.java new file mode 100644 index 0000000..885ce1a --- /dev/null +++ b/src/main/java/org/springblade/hospital/hik/ArtemisPostTest.java @@ -0,0 +1,119 @@ +package org.springblade.hospital.hik; + +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.hikvision.artemis.sdk.ArtemisHttpUtil; +import com.hikvision.artemis.sdk.config.ArtemisConfig; +import org.apache.http.Header; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.springframework.web.bind.annotation.RequestParam; + +import static com.hikvision.artemis.sdk.util.HttpUtil.wrapClient; + +public class ArtemisPostTest { + /** + * 请根据技术支持提供的实际的平台IP/端口和API网关中的合作方信息更换static静态块中的三个参数. + * [1 host] + * host格式为IP:Port,如10.0.0.1:443 + * 当使用https协议调用接口时,IP是平台(nginx)IP,Port是https协议的端口; + * 当使用http协议调用接口时,IP是artemis服务的IP,Port是artemis服务的端口(默认9016)。 + * [2 appKey和appSecret] + * 请按照技术支持提供的合作方Key和合作方Secret修改 + * appKey:合作方Key + * appSecret:合作方Secret + * 调用前看清接口传入的是什么,是传入json就用doPostStringArtemis方法,是表单提交就用doPostFromArtemis方法 + * + */ + /** + * API网关的后端服务上下文为:/artemis + */ + private static final String ARTEMIS_PATH = "/artemis"; + + /** + * 调用POST请求类型接口,这里以获取组织列表为例 + * 接口实际url:https://ip:port/artemis/api/resource/v1/org/orgList + * + * @return + */ + public static String callPostApiGetOrgList(String cameraIndexCode) throws Exception { + /** + * https://ip:port/artemis/api/resource/v1/org/orgList + * 通过查阅AI Cloud开放平台文档或网关门户的文档可以看到获取组织列表的接口定义,该接口为POST请求的Rest接口, 入参为JSON字符串,接口协议为https。 + * ArtemisHttpUtil工具类提供了doPostStringArtemis调用POST请求的方法,入参可传JSON字符串, 请阅读开发指南了解方法入参,没有的参数可传null + */ + ArtemisConfig config = new ArtemisConfig(); + config.setHost("171.16.8.60"); // 代理API网关nginx服务器ip端口 + config.setAppKey("26284697"); // 秘钥appkey + config.setAppSecret("gd3x1yJqwtCY1eekk4v7");// 秘钥appSecret + final String getCamsApi = ARTEMIS_PATH + "/api/video/v2/cameras/previewURLs"; + Map paramMap = new HashMap();// post请求Form表单参数 +// paramMap.put("pageNo", "1"); +// paramMap.put("pageSize", "2"); +// paramMap.put("cameraIndexCode", "8fa9cf4bf79d4f239b335a0c4e77c3dd"); + paramMap.put("cameraIndexCode", cameraIndexCode); //监控点唯一标识 + paramMap.put("streamType", 1); // 码流类型:0主码流 1子码流 2第三码流 + paramMap.put("protocol", "ws");// 取流协议:“ws”:Websocket协议,“hls”:HLS协议,“hik”:HIK私有协议,“rtsp”:RTSP协议,“rtmp”:RTMP协议 + paramMap.put("transmode", 1);// 传输协议:0UDP 1TCP + String body = JSON.toJSON(paramMap).toString(); + Map path = new HashMap(2) { + { + put("https://", getCamsApi); + } + }; + return ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json"); + } + + /** + * 调用POST请求类型接口,这里以分页获取区域列表为例 + * 接口实际url:https://ip:port/artemis/api/api/resource/v1/regions + * + * @return + */ + public static String callPostApiGetRegions(String cameraIndexCode, String beginTime, String endTime) throws Exception { + /** + * https://ip:port/artemis/api/resource/v1/regions + * 过查阅AI Cloud开放平台文档或网关门户的文档可以看到分页获取区域列表的定义,这是一个POST请求的Rest接口, 入参为JSON字符串,接口协议为https。 + * ArtemisHttpUtil工具类提供了doPostStringArtemis调用POST请求的方法,入参可传JSON字符串, 请阅读开发指南了解方法入参,没有的参数可传null + */ + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + Date begin = format.parse(beginTime + ".111"); + Date end = format.parse(endTime + ".111"); + ZoneId zoneId = ZoneId.systemDefault(); + LocalDateTime beginDate = LocalDateTime.ofInstant(begin.toInstant(), zoneId); + LocalDateTime endDate = LocalDateTime.ofInstant(end.toInstant(), zoneId); + + ArtemisConfig config = new ArtemisConfig(); + config.setHost("171.16.8.60"); // 代理API网关nginx服务器ip端口 + config.setAppKey("26284697"); // 秘钥appkey + config.setAppSecret("gd3x1yJqwtCY1eekk4v7");// 秘钥appSecret + final String getCamsApi = ARTEMIS_PATH + "/api/video/v2/cameras/playbackURLs"; + Map paramMap = new HashMap();// post请求Form表单参数 +// paramMap.put("cameraIndexCode", "8fa9cf4bf79d4f239b335a0c4e77c3dd"); +// paramMap.put("beginTime", "2017-06-15T00:00:00.000+08:00"); +// paramMap.put("endTime", "2017-06-18T00:00:00.000+08:00"); + paramMap.put("cameraIndexCode", cameraIndexCode); + paramMap.put("beginTime", beginDate + "+08:00"); + paramMap.put("endTime", endDate + "+08:00"); + paramMap.put("protocol", "ws"); + paramMap.put("streamType", 1); + String body = JSON.toJSON(paramMap).toString(); + Map path = new HashMap(2) { + { + put("https://", getCamsApi); + } + }; + return ArtemisHttpUtil.doPostStringArtemis(config, path, body, null, null, "application/json"); + } + +} diff --git a/src/main/java/org/springblade/hospital/hik/alarm/Alarm.java b/src/main/java/org/springblade/hospital/hik/alarm/Alarm.java index 8ba18a7..093c548 100644 --- a/src/main/java/org/springblade/hospital/hik/alarm/Alarm.java +++ b/src/main/java/org/springblade/hospital/hik/alarm/Alarm.java @@ -4,19 +4,17 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.sun.jna.Native; -import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; -import org.springblade.hospital.agent.utils.QueueUtils; +import org.apache.commons.httpclient.HttpClient; import org.springblade.hospital.hik.CommonMethod.osSelect; import org.springblade.hospital.hik.NetSDKDemo.HCNetSDK; -import org.springblade.hospital.mapper.AlarmInformationMapper; -import org.springblade.hospital.service.IAlarmInformationService; -import org.springblade.hospital.service.impl.AlarmInformationServiceImpl; +import org.springblade.hospital.newalarm.communicationCom.HTTPClientUtil; +import org.springblade.hospital.utils.CornJobUtil; import org.springblade.hospital.utils.ExternalUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; -import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.HashMap; @@ -24,6 +22,9 @@ import java.util.List; import java.util.Map; import java.util.Scanner; +/** + * @author AAA + */ @Component public class Alarm implements CommandLineRunner { @@ -35,6 +36,10 @@ public class Alarm implements CommandLineRunner { static FMSGCallBack_V31 fMSFCallBack_V31 = null; static FMSGCallBack fMSFCallBack; static Map numMap; + static Map clientMap = new HashMap<>(); + public static Map ipMap; + public static Map portMap; + public static Map macMap; @Autowired ExternalUtils externalUtils; @@ -52,7 +57,7 @@ public class Alarm implements CommandLineRunner { if (osSelect.isWindows()) //win系统加载库路径 strDllPath = System.getProperty("user.dir") + "\\src\\main\\resources\\lib\\HCNetSDK.dll"; -// strDllPath = "C:\\Users\\Administrator\\Desktop\\grpc-jar\\lib\\HCNetSDK.dll"; +// strDllPath = "C:\\Users\\zpy\\Desktop\\hospital\\lib\\HCNetSDK.dll"; else if (osSelect.isLinux()) //Linux系统加载库路径 // strDllPath = System.getProperty("user.dir") + "/lib/libhcnetsdk.so"; @@ -208,6 +213,8 @@ public class Alarm implements CommandLineRunner { statusV40.write(); Pointer pointer = statusV40.getPointer(); boolean status = hCNetSDK.NET_DVR_GetDVRConfig(numMap.get(number), HCNetSDK.NET_DVR_GET_ALARMHOST_MAIN_STATUS_V40, 0Xffffffff, pointer, statusV40.size(), ibrBytesReturned); +// boolean status = hCNetSDK.NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_ALARMHOST_MAIN_STATUS_V40, 0Xffffffff, pointer, statusV40.size(), ibrBytesReturned); + statusV40.read(); if (status) { System.out.println("设备在线"); @@ -215,6 +222,7 @@ public class Alarm implements CommandLineRunner { return statusV40; } else { System.out.println("设备通讯失败"); + System.out.println("监听失败" + hCNetSDK.NET_DVR_GetLastError()); return null; } } @@ -230,7 +238,6 @@ public class Alarm implements CommandLineRunner { return status; } - /** * 开启监听 * @@ -251,7 +258,6 @@ public class Alarm implements CommandLineRunner { } } - /** * 设备撤防,设备注销 * @@ -282,41 +288,95 @@ public class Alarm implements CommandLineRunner { * 消警 */ public static boolean xiaojing(String hostSerialNumber, int num) { - boolean b = hCNetSDK.NET_DVR_AlarmHostClearAlarm(numMap.get(hostSerialNumber), num); - if (b) { - System.out.println("消警成功"); - } else { - System.out.println("消警失败" + hCNetSDK.NET_DVR_GetLastError()); + try { + String rzUrl = "http://" + ipMap.get(hostSerialNumber) + ":" + portMap.get(hostSerialNumber) + "/ISAPI/System/deviceInfo"; + String renzheng = HTTPClientUtil.renzheng(rzUrl, HTTPClientUtil.client); + if (renzheng.contains(hostSerialNumber)) { + String xjUrl = "http://" + ipMap.get(hostSerialNumber) + ":" + portMap.get(hostSerialNumber) + "/ISAPI/SecurityCP/control/clearAlarm/" + num; + String respx = HTTPClientUtil.doPut(xjUrl, "", HTTPClientUtil.client); + System.out.println(respx); + return true; + } + } catch (Exception e) { + e.printStackTrace(); } - return b; + return false; +// boolean b = hCNetSDK.NET_DVR_AlarmHostClearAlarm(numMap.get(hostSerialNumber), num); +// if (b) { +// System.out.println("消警成功"); +// } else { +// System.out.println("消警失败" + hCNetSDK.NET_DVR_GetLastError()); +// } +// return b; } /** * 子系统布防 */ public static boolean zibufang(String hostSerialNumber, int num) { - boolean b = hCNetSDK.NET_DVR_AlarmHostSubSystemSetupAlarmChan(numMap.get(hostSerialNumber), num); - if (b) { - System.out.println("布防成功"); - } else { - System.out.println("布防失败" + hCNetSDK.NET_DVR_GetLastError()); + try { + String rzUrl = "http://" + ipMap.get(hostSerialNumber) + ":" + portMap.get(hostSerialNumber) + "/ISAPI/System/deviceInfo"; + String renzheng = HTTPClientUtil.renzheng(rzUrl, HTTPClientUtil.client); + if (renzheng.contains(hostSerialNumber)) { + String xjUrl = "http://" + ipMap.get(hostSerialNumber) + ":" + portMap.get(hostSerialNumber) + "/ISAPI/SecurityCP/control/arm/" + num + "?ways=away&format=json"; + String respx = HTTPClientUtil.doPut(xjUrl, "", HTTPClientUtil.client); + System.out.println(respx); + return true; + } + } catch (Exception e) { + e.printStackTrace(); } - return b; + return false; +// boolean b = hCNetSDK.NET_DVR_AlarmHostSubSystemSetupAlarmChan(numMap.get(hostSerialNumber), num); +// if (b) { +// System.out.println("布防成功"); +// } else { +// System.out.println("布防失败" + hCNetSDK.NET_DVR_GetLastError()); +// } +// return b; } /** * 子系统撤防 */ public static boolean zichefang(String hostSerialNumber, int num) { - boolean b = hCNetSDK.NET_DVR_AlarmHostSubSystemCloseAlarmChan(numMap.get(hostSerialNumber), num); - if (b) { - System.out.println("撤防成功"); - } else { - System.out.println("撤防失败" + hCNetSDK.NET_DVR_GetLastError()); + try { + String rzUrl = "http://" + ipMap.get(hostSerialNumber) + ":" + portMap.get(hostSerialNumber) + "/ISAPI/System/deviceInfo"; + String renzheng = HTTPClientUtil.renzheng(rzUrl, HTTPClientUtil.client); + if (renzheng.contains(hostSerialNumber)) { + String xjUrl = "http://" + ipMap.get(hostSerialNumber) + ":" + portMap.get(hostSerialNumber) + "/ISAPI/SecurityCP/control/disarm/" + num; + String respx = HTTPClientUtil.doPut(xjUrl, "", HTTPClientUtil.client); + System.out.println(respx); + return true; + } + } catch (Exception e) { + e.printStackTrace(); } - return b; + return false; +// boolean b = hCNetSDK.NET_DVR_AlarmHostSubSystemCloseAlarmChan(numMap.get(hostSerialNumber), num); +// if (b) { +// System.out.println("撤防成功"); +// } else { +// System.out.println("撤防失败" + hCNetSDK.NET_DVR_GetLastError()); +// } +// return b; } +// private static void jianting(String hostSerialNumber) { +// try { +// String jlUrl = "http://" + ipMap.get(hostSerialNumber) + ":" + portMap.get(hostSerialNumber) + "/ISAPI/Event/notification/subscribeEvent?deployID=1"; +// String xml = "\n" + +// "\n" + +// "\n" + +// " 1\n" + +// " all\n" + +// ""; +// System.out.println("jl:" + HTTPClientUtil.doPost(jlUrl, xml, hostSerialNumber, clientMap.get(hostSerialNumber))); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } + /** * 防区布防 */ @@ -353,132 +413,226 @@ public class Alarm implements CommandLineRunner { * 防区旁路 */ public static boolean fqpl(String hostSerialNumber, int num) { - HCNetSDK.NET_DVR_ALARMIN_SETUP setup = new HCNetSDK.NET_DVR_ALARMIN_SETUP(); - setup.byAssiciateAlarmIn[num] = 1; - setup.write(); - boolean b = hCNetSDK.NET_DVR_BypassAlarmChan(numMap.get(hostSerialNumber), setup); - if (b) { - System.out.println("旁路成功"); - } else { - System.out.println("旁路失败" + hCNetSDK.NET_DVR_GetLastError()); + try { + String rzUrl = "http://" + ipMap.get(hostSerialNumber) + ":" + portMap.get(hostSerialNumber) + "/ISAPI/System/deviceInfo"; + String renzheng = HTTPClientUtil.renzheng(rzUrl, HTTPClientUtil.client); + if (renzheng.contains(hostSerialNumber)) { + String xjUrl = "http://" + ipMap.get(hostSerialNumber) + ":" + portMap.get(hostSerialNumber) + "/ISAPI/SecurityCP/control/bypass/" + num; + String respx = HTTPClientUtil.doPut(xjUrl, "", HTTPClientUtil.client); + System.out.println(respx); + return true; + } + } catch (Exception e) { + e.printStackTrace(); } - return b; + return false; +// HCNetSDK.NET_DVR_ALARMIN_SETUP setup = new HCNetSDK.NET_DVR_ALARMIN_SETUP(); +// setup.byAssiciateAlarmIn[num] = 1; +// setup.write(); +// boolean b = hCNetSDK.NET_DVR_BypassAlarmChan(numMap.get(hostSerialNumber), setup); +// if (b) { +// System.out.println("旁路成功"); +// } else { +// System.out.println("旁路失败" + hCNetSDK.NET_DVR_GetLastError()); +// } +// return b; } /** * 防区撤销旁路 */ public static boolean fqcxpl(String hostSerialNumber, int num) { - HCNetSDK.NET_DVR_ALARMIN_SETUP setup = new HCNetSDK.NET_DVR_ALARMIN_SETUP(); - setup.byAssiciateAlarmIn[num] = 1; - setup.write(); - boolean b = hCNetSDK.NET_DVR_UnBypassAlarmChan(numMap.get(hostSerialNumber), setup); - if (b) { - System.out.println("撤销旁路成功"); - } else { - System.out.println("撤销旁路失败" + hCNetSDK.NET_DVR_GetLastError()); + try { + String rzUrl = "http://" + ipMap.get(hostSerialNumber) + ":" + portMap.get(hostSerialNumber) + "/ISAPI/System/deviceInfo"; + String renzheng = HTTPClientUtil.renzheng(rzUrl, HTTPClientUtil.client); + if (renzheng.contains(hostSerialNumber)) { + String xjUrl = "http://" + ipMap.get(hostSerialNumber) + ":" + portMap.get(hostSerialNumber) + "/ISAPI/SecurityCP/control/bypassRecover/" + num; + String respx = HTTPClientUtil.doPut(xjUrl, "", HTTPClientUtil.client); + System.out.println(respx); + return true; + } + } catch (Exception e) { + e.printStackTrace(); } - return b; + return false; +// HCNetSDK.NET_DVR_ALARMIN_SETUP setup = new HCNetSDK.NET_DVR_ALARMIN_SETUP(); +// setup.byAssiciateAlarmIn[num] = 1; +// setup.write(); +// boolean b = hCNetSDK.NET_DVR_UnBypassAlarmChan(numMap.get(hostSerialNumber), setup); +// if (b) { +// System.out.println("撤销旁路成功"); +// } else { +// System.out.println("撤销旁路失败" + hCNetSDK.NET_DVR_GetLastError()); +// } +// return b; } @Override public void run(String... args) { - new Thread(() -> { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); + try { + if (clientMap == null) { + clientMap = new HashMap<>(); } - - if (hCNetSDK == null) { - if (!createSDKInstance()) { - System.out.println("Load SDK fail"); - return; - } - } - //linux系统建议调用以下接口加载组件库 - if (osSelect.isLinux()) { - HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256); - HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256); - //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限 - String strPath1 = System.getProperty("user.dir") + "/lib/libcrypto.so.1.1"; - String strPath2 = System.getProperty("user.dir") + "/lib/libssl.so.1.1"; - - System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length()); - ptrByteArray1.write(); - hCNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArray1.getPointer()); - - System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length()); - ptrByteArray2.write(); - hCNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArray2.getPointer()); - - String strPathCom = System.getProperty("user.dir") + "/lib/"; - HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH(); - System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length()); - struComPath.write(); - hCNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer()); + if (ipMap == null) { + ipMap = new HashMap<>(); } - - /**初始化*/ - hCNetSDK.NET_DVR_Init(); - /**加载日志*/ - hCNetSDK.NET_DVR_SetLogToFile(3, "./sdklog", false); - //设置报警回调函数 - if (fMSFCallBack_V31 == null) { - fMSFCallBack_V31 = new FMSGCallBack_V31(); - - Pointer pUser = null; - if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUser)) { - System.out.println("设置回调函数失败!"); - return; - } else { - System.out.println("设置回调函数成功!"); - } + if (portMap == null) { + portMap = new HashMap<>(); } - /** 设备上传的报警信息是COMM_VCA_ALARM(0x4993)类型, - 在SDK初始化之后增加调用NET_DVR_SetSDKLocalCfg(enumType为NET_DVR_LOCAL_CFG_TYPE_GENERAL) - 设置通用参数NET_DVR_LOCAL_GENERAL_CFG的byAlarmJsonPictureSeparate为1, - 将Json数据和图片数据分离上传,这样设置之后,报警布防回调函数里面接收到的报警信息类型为COMM_ISAPI_ALARM(0x6009), - 报警信息结构体为NET_DVR_ALARM_ISAPI_INFO(与设备无关,SDK封装的数据结构),更便于解析。*/ - - HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG struNET_DVR_LOCAL_GENERAL_CFG = new HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG(); - struNET_DVR_LOCAL_GENERAL_CFG.byAlarmJsonPictureSeparate = 1; //设置JSON透传报警数据和图片分离 - struNET_DVR_LOCAL_GENERAL_CFG.write(); - Pointer pStrNET_DVR_LOCAL_GENERAL_CFG = struNET_DVR_LOCAL_GENERAL_CFG.getPointer(); - hCNetSDK.NET_DVR_SetSDKLocalCfg(17, pStrNET_DVR_LOCAL_GENERAL_CFG); - - if (numMap == null) { - numMap = new HashMap<>(); + if (macMap == null) { + macMap = new HashMap<>(); } + + // 物联网平台获取报警主机设备信息 List list = externalUtils.getList(0, 0, null, null, "105", null); + + // 物联网平台获取的报警主机列表 if (CollectionUtils.isNotEmpty(list)) { + HTTPClientUtil clientUtil = new HTTPClientUtil(); for (Map map : list) { +// System.out.println(map.get("tags")); String s = JSON.toJSONString(map.get("tags")).replace("\\", ""); s = s.substring(1, s.length() - 1); Map tagsMap = JSONObject.parseObject(s, Map.class); - String number = tagsMap.get("hostNumber").toString(); - Alarm.login_V40(tagsMap.get("ip").toString(), Short.parseShort(tagsMap.get("port").toString()), "admin", "asd0514.."); //登录设备 - if (numMap.get(number) != null) { - Alarm.setAlarm(numMap.get(number));//报警布防,和报警监听二选一即可 - } - } - } -// Alarm.startListen("192.168.1.100", (short) 7200);//报警监听,不需要登陆设备 - while (true) { - //这里加入控制台输入控制,是为了保持连接状态,当输入Y表示布防结束 - System.out.print("请选择是否撤出布防(Y/N):\n"); - Scanner input = new Scanner(System.in); - String str = input.next(); - if ("Y".equals(str)) { - break; + // 报警主机信息 + String number = tagsMap.get("hostNumber").toString();//序列号 + String ip = tagsMap.get("ip").toString(); + String port = tagsMap.get("port").toString(); + String mac = tagsMap.get("mac").toString(); + + HttpClient client = new HttpClient(); + clientMap.put(number, client); + ipMap.put(number, ip); + portMap.put(number, port); + macMap.put(mac, number); + + new Thread(() -> { + // 登录认证 + String rzUrl = "http://" + ip + ":" + port + "/ISAPI/System/deviceInfo"; + String renzheng = HTTPClientUtil.renzheng(rzUrl, client); + System.out.println("登录信息:" + renzheng); + + if (renzheng.contains(number)) { + // 获取设备系统能力集 + String jtUrl = "http://" + ip + ":" + port + "/ISAPI/System/capabilities"; + HTTPClientUtil.doGet(jtUrl, client); + + // 获取布防订阅能力 + String strUrl = "http://" + ip + ":" + port + "/ISAPI/Event/notification/subscribeEventCap"; + HTTPClientUtil.doGet(strUrl, client); + + // 建立布防订阅连接 + String jlUrl = "http://" + ip + ":" + port + "/ISAPI/Event/notification/subscribeEvent?deployID=1"; + String xml = "\n" + + "\n" + + "\n" + + " 1\n" + + " all\n" + + ""; + System.out.println("jl:" + clientUtil.doPost(jlUrl, xml, number, client, mac)); + } + }).start(); } } - Alarm.logout(); - //释放SDK - hCNetSDK.NET_DVR_Cleanup(); - return; - }).start(); - + } catch (Exception e) { + e.printStackTrace(); + } +// if (hCNetSDK == null) { +// if (!createSDKInstance()) { +// System.out.println("Load SDK fail"); +// return; +// } +// } +// //linux系统建议调用以下接口加载组件库 +// if (osSelect.isLinux()) { +// HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256); +// HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256); +// //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限 +// String strPath1 = System.getProperty("user.dir") + "/lib/libcrypto.so.1.1"; +// String strPath2 = System.getProperty("user.dir") + "/lib/libssl.so.1.1"; +// +// System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length()); +// ptrByteArray1.write(); +// hCNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArray1.getPointer()); +// +// System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length()); +// ptrByteArray2.write(); +// hCNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArray2.getPointer()); +// +// String strPathCom = System.getProperty("user.dir") + "/lib/"; +// HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH(); +// System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length()); +// struComPath.write(); +// hCNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer()); +// } +// +// /**初始化*/ +// hCNetSDK.NET_DVR_Init(); +// /**加载日志*/ +// hCNetSDK.NET_DVR_SetLogToFile(3, "./sdklog", false); +// //设置报警回调函数 +// if (fMSFCallBack_V31 == null) { +// fMSFCallBack_V31 = new FMSGCallBack_V31(); +// +// Pointer pUser = null; +// if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUser)) { +// System.out.println("设置回调函数失败!"); +// return; +// } else { +// System.out.println("设置回调函数成功!"); +// } +// } +// /** 设备上传的报警信息是COMM_VCA_ALARM(0x4993)类型, +// 在SDK初始化之后增加调用NET_DVR_SetSDKLocalCfg(enumType为NET_DVR_LOCAL_CFG_TYPE_GENERAL) +// 设置通用参数NET_DVR_LOCAL_GENERAL_CFG的byAlarmJsonPictureSeparate为1, +// 将Json数据和图片数据分离上传,这样设置之后,报警布防回调函数里面接收到的报警信息类型为COMM_ISAPI_ALARM(0x6009), +// 报警信息结构体为NET_DVR_ALARM_ISAPI_INFO(与设备无关,SDK封装的数据结构),更便于解析。*/ +// +// HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG struNET_DVR_LOCAL_GENERAL_CFG = new HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG(); +// struNET_DVR_LOCAL_GENERAL_CFG.byAlarmJsonPictureSeparate = 1; //设置JSON透传报警数据和图片分离 +// struNET_DVR_LOCAL_GENERAL_CFG.write(); +// Pointer pStrNET_DVR_LOCAL_GENERAL_CFG = struNET_DVR_LOCAL_GENERAL_CFG.getPointer(); +// hCNetSDK.NET_DVR_SetSDKLocalCfg(17, pStrNET_DVR_LOCAL_GENERAL_CFG); +// +// if (numMap == null) { +// numMap = new HashMap<>(); +// } +// +// List list = null; +// try { +// list = externalUtils.getList(0, 0, null, null, "105", null); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// +// if (CollectionUtils.isNotEmpty(list)) { +// for (Map map : list) { +// String s = JSON.toJSONString(map.get("tags")).replace("\\", ""); +// s = s.substring(1, s.length() - 1); +// Map tagsMap = JSONObject.parseObject(s, Map.class); +// String number = tagsMap.get("hostNumber").toString(); +// Alarm.login_V40(tagsMap.get("ip").toString(), Short.parseShort(tagsMap.get("port").toString()), "admin", "hao12345"); //登录设备 +// if (numMap.get(number) != null) { +// Alarm.setAlarm(numMap.get(number));//报警布防,和报警监听二选一即可 +// } +// } +// } +// +//// Alarm.login_V40("171.16.207.20", (short) 80, "admin", "hao12345"); //登录设备 +//// Alarm.setAlarm(1);//报警布防,和报警监听二选一即可 +//// Alarm.startListen("192.168.1.100", (short) 7200);//报警监听,不需要登陆设备 +// while (true) { +// //这里加入控制台输入控制,是为了保持连接状态,当输入Y表示布防结束1 +// System.out.print("请选择是否撤出布防(Y/N):\n"); +// Scanner input = new Scanner(System.in); +// String str = input.next(); +// if ("Y".equals(str)) { +// break; +// } +// } +// Alarm.logout(); +// //释放SDK +// hCNetSDK.NET_DVR_Cleanup(); } } diff --git a/src/main/java/org/springblade/hospital/hik/alarm/AlarmDataParse.java b/src/main/java/org/springblade/hospital/hik/alarm/AlarmDataParse.java index 9f89e82..62b1249 100644 --- a/src/main/java/org/springblade/hospital/hik/alarm/AlarmDataParse.java +++ b/src/main/java/org/springblade/hospital/hik/alarm/AlarmDataParse.java @@ -334,6 +334,7 @@ public class AlarmDataParse { alarmInformation.setSystemNum((int) bySubSysNo); alarmInformation.setHostSerialNumber(sSerialNumber); alarmInformation.setHostIp(ip); + alarmInformation.setAlarmType(1); if (CollectionUtils.isNotEmpty(list)) { Map map = list.get(0); @@ -375,7 +376,7 @@ public class AlarmDataParse { s = s.substring(1, s.length() - 1); Map tagsMap = JSONObject.parseObject(s, Map.class); - byte[] byteValue = DataTrans.intToBytesBigEndian(1); + byte[] byteValue = DataTrans.shortToBytesBigEndian((short) 1); ByteString byteString = ByteString.copyFrom(byteValue); Point point = Point.newBuilder() .setData(byteString) @@ -384,29 +385,29 @@ public class AlarmDataParse { .setPntType(7) .build(); boolean b = queueUtils.saveQueueDataStatus(point); - queueUtils.saveQueueDataAlarm(point); +// queueUtils.saveQueueDataAlarm(point); System.out.println("===" + b); // 报警信息发送到远程服务器 - if (restTemplate == null) { - restTemplate = SpringUtil.getBean(RestTemplate.class); - } - String url = "http://152.136.119.150:81/alarmInformation/hikRemote"; - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8")); - - Map map = new HashMap<>(); - map.put("id_", tagsMap.get("mac").toString() + "_sector_" + Integer.sum(strCIDalarm.wDefenceNo, 1)); - map.put("devType_", 2); - map.put("pntType_", 7); - map.put("pntTypeValue_", 1); - String content = JSON.toJSONString(map); - - HttpEntity httpEntity = new HttpEntity<>(content, headers); - - // 发送post请求,并输出结果 - R r = restTemplate.postForObject(url, httpEntity, R.class); - System.out.println("调用远程服务器接口成功!!:" + r); +// if (restTemplate == null) { +// restTemplate = SpringUtil.getBean(RestTemplate.class); +// } +// String url = "http://152.136.119.150:81/alarmInformation/hikRemote"; +// HttpHeaders headers = new HttpHeaders(); +// headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8")); +// +// Map map = new HashMap<>(); +// map.put("id_", tagsMap.get("mac").toString() + "_sector_" + Integer.sum(strCIDalarm.wDefenceNo, 1)); +// map.put("devType_", 2); +// map.put("pntType_", 7); +// map.put("pntTypeValue_", 1); +// String content = JSON.toJSONString(map); +// +// HttpEntity httpEntity = new HttpEntity<>(content, headers); +// +// // 发送post请求,并输出结果 +// R r = restTemplate.postForObject(url, httpEntity, R.class); +// System.out.println("调用远程服务器接口成功!!:" + r); // webSocket推送给客户端消息 JSONObject jsonObject = new JSONObject(); diff --git a/src/main/java/org/springblade/hospital/hik/alarm/FMSGCallBack.java b/src/main/java/org/springblade/hospital/hik/alarm/FMSGCallBack.java index ece6374..84c89cf 100644 --- a/src/main/java/org/springblade/hospital/hik/alarm/FMSGCallBack.java +++ b/src/main/java/org/springblade/hospital/hik/alarm/FMSGCallBack.java @@ -1,110 +1,16 @@ package org.springblade.hospital.hik.alarm; -import com.google.protobuf.ByteString; -import com.hisense.device.agent.grpc.Point; import com.sun.jna.Pointer; -import org.springblade.core.tool.utils.SpringUtil; -import org.springblade.hospital.agent.utils.DataTrans; -import org.springblade.hospital.agent.utils.QueueUtils; -import org.springblade.hospital.entity.AlarmInformation; import org.springblade.hospital.hik.NetSDKDemo.HCNetSDK; -import org.springblade.hospital.mapper.AlarmInformationMapper; -import org.springblade.hospital.service.IAlarmInformationService; -import org.springblade.hospital.service.impl.AlarmInformationServiceImpl; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.io.UnsupportedEncodingException; -import java.text.SimpleDateFormat; -import java.util.Arrays; /** * @author jiangxin * @create 2022-08-15-17:26 */ public class FMSGCallBack implements HCNetSDK.FMSGCallBack { - -// QueueUtils queueUtils; -// -// IAlarmInformationService alarmInformationService; -// -// public FMSGCallBack(QueueUtils queueUtils) { -// this.queueUtils = queueUtils; -// } - //报警信息回调函数 public void invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) { AlarmDataParse.alarmDataHandle(lCommand, pAlarmer, pAlarmInfo, dwBufLen, pUser); - -// HCNetSDK.NET_DVR_CID_ALARM strCIDalarm = new HCNetSDK.NET_DVR_CID_ALARM(); -// strCIDalarm.write(); -// Pointer pstrCIDalarm = strCIDalarm.getPointer(); -// pstrCIDalarm.write(0, pAlarmInfo.getByteArray(0, strCIDalarm.size()), 0, strCIDalarm.size()); -// strCIDalarm.read(); -// try { -// String TriggerTime = "" + String.format("%04d", strCIDalarm.struTriggerTime.wYear) + "-" + -// String.format("%02d", strCIDalarm.struTriggerTime.byMonth) + "-" + -// String.format("%02d", strCIDalarm.struTriggerTime.byDay) + " " + -// String.format("%02d", strCIDalarm.struTriggerTime.byHour) + ":" + -// String.format("%02d", strCIDalarm.struTriggerTime.byMinute) + ":" + -// String.format("%02d", strCIDalarm.struTriggerTime.bySecond); //触发报警时间 -// String sCIDCode = new String(strCIDalarm.sCIDCode, "GBK"); //CID事件号 -// String sCIDDescribe = new String(strCIDalarm.sCIDDescribe, "UTF-8"); //CID事件名 -// byte bySubSysNo = strCIDalarm.bySubSysNo; //子系统号 -// if (strCIDalarm.wDefenceNo != 0xff) { -// System.out.println("防区号:" + Integer.sum(strCIDalarm.wDefenceNo, 1)); -// } -// SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); -// System.out.println("【CID事件】" + "触发时间:" + format.parse(TriggerTime) + "CID事件号:" + sCIDCode + "CID事件名:" + sCIDDescribe + "子系统号:" + -// bySubSysNo); -//// System.out.println(strCIDalarm.struUploadTime); -//// System.out.println(Arrays.toString(strCIDalarm.sCenterAccount)); -//// System.out.println(strCIDalarm.byUserType); -//// System.out.println(strCIDalarm.byReportType); -//// System.out.println(strCIDalarm.wKeyUserNo); -//// System.out.println(strCIDalarm.byKeypadNo); -//// System.out.println(strCIDalarm.byVideoChanNo); -//// System.out.println(strCIDalarm.byDiskNo); -//// System.out.println(strCIDalarm.wModuleAddr); -//// System.out.println(strCIDalarm.byCenterType); -//// System.out.println(strCIDalarm.byRes1); -//// System.out.println(strCIDalarm.byRepeaterNo); -//// System.out.println(Arrays.toString(strCIDalarm.byDevSerialNo)); -//// System.out.println(strCIDalarm.byRepeaterNo); -//// System.out.println(strCIDalarm.wRemoteCtrllerUserNo); -//// System.out.println(strCIDalarm.dwIOTChannelNo); -// -// // 存本地 -// alarmInformationService = SpringUtil.getBean(IAlarmInformationService.class); -// AlarmInformation alarmInformation = new AlarmInformation(); -// alarmInformation.setDeviceId(String.valueOf(Integer.sum(strCIDalarm.wDefenceNo, 1))); -// alarmInformation.setReportTime(format.parse(TriggerTime)); -// alarmInformation.setContent(sCIDCode + ":" + sCIDDescribe); -// alarmInformation.setType(Integer.toHexString(lCommand)); -// boolean save = alarmInformationService.save(alarmInformation); -// System.out.println("---" + save); -// -// -//// 上报海信iot平台 -// byte[] byteValue = DataTrans.intToBytesBigEndian(0); -// ByteString byteString = ByteString.copyFrom(byteValue); -// Point point = Point.newBuilder().setData(byteString) -// .setDataType(1) -// .setType(2) -// .setDevType(2) -// .setChann(4) -//// .setId("82001") -// .setId(String.valueOf(Integer.sum(strCIDalarm.wDefenceNo, 1))) -// .setPntType(5) -// .setPntTypeValue(6).build(); -// boolean b = queueUtils.saveQueueDataStatus(point); -// queueUtils.saveQueueDataAlarm(point); -// System.out.println("===" + b); -// -// } catch (Exception e) { -// e.printStackTrace(); -// } return; } } diff --git a/src/main/java/org/springblade/hospital/newalarm/communicationCom/HTTPClientUtil.java b/src/main/java/org/springblade/hospital/newalarm/communicationCom/HTTPClientUtil.java new file mode 100644 index 0000000..04b26a2 --- /dev/null +++ b/src/main/java/org/springblade/hospital/newalarm/communicationCom/HTTPClientUtil.java @@ -0,0 +1,352 @@ +package org.springblade.hospital.newalarm.communicationCom; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.google.protobuf.ByteString; +import com.hisense.device.agent.grpc.Point; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.UsernamePasswordCredentials; +import org.apache.commons.httpclient.auth.AuthScope; +import org.apache.commons.httpclient.methods.DeleteMethod; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.methods.PutMethod; +import org.springblade.common.cache.DictBizCache; +import org.springblade.core.tool.utils.SpringUtil; +import org.springblade.hospital.agent.utils.DataTrans; +import org.springblade.hospital.agent.utils.QueueUtils; +import org.springblade.hospital.entity.AlarmInformation; +import org.springblade.hospital.service.IAlarmInformationService; +import org.springblade.hospital.utils.ExternalUtils; +import org.springblade.hospital.websocket.WebSocketServer; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +public class HTTPClientUtil { + + public static HttpClient client = new HttpClient(); + // public static String strIP = "171.16.206.139"; +// public static int iPort = 80; + private static ExternalUtils externalUtils; + private static QueueUtils queueUtils; + private static IAlarmInformationService alarmInformationService; + + public static String renzheng(String rzUrl, HttpClient client) { + // 设置用户名和密码 + UsernamePasswordCredentials creds = new UsernamePasswordCredentials("admin", "hao12345"); + client.getState().setCredentials(AuthScope.ANY, creds); + GetMethod method = new GetMethod(rzUrl); + method.setDoAuthentication(true); + String strResponseData = null; + try { + int statusCode = client.executeMethod(method); + System.out.println("认证状态码:" + statusCode); + byte[] responseData = method.getResponseBodyAsString().getBytes(method.getResponseCharSet()); + strResponseData = new String(responseData, "utf-8"); + } catch (IOException e) { + e.printStackTrace(); + } + method.releaseConnection(); + // 输出接收的消息 + return strResponseData; + } + + public static String doGet(String url, HttpClient client) { + + GetMethod method = new GetMethod(url); + method.setDoAuthentication(true); + + String response = null; + try { + int statusCode = client.executeMethod(method); + // Return response message + byte[] responseBody = method.getResponseBodyAsString().getBytes(method.getResponseCharSet()); + // Use encoding in the Return response message (utf-8 or gb2312) + response = new String(responseBody, "utf-8"); + } catch (IOException e) { + e.printStackTrace(); + } + // Release the connection + method.releaseConnection(); + return response; + } + + public static String doPut(String url, String inbound, HttpClient client) throws Exception { + PutMethod method = new PutMethod(url); + method.setDoAuthentication(true); + +// method.setRequestBody(inbound); + + int statusCode = client.executeMethod(method); + + // Return response message + byte[] responseBody = method.getResponseBodyAsString().getBytes(method.getResponseCharSet()); +// // Use encoding in the Return response message (utf-8 or gb2312) + String response = new String(responseBody, "utf-8"); +// // Release the connection + method.releaseConnection(); + return response; + } + + public String doPost(String url, String inbound, String sSerialNumber, HttpClient client, String mac) { + StringBuffer stringBuffer = new StringBuffer(); + try { +// System.out.println("执行了!!!" + sSerialNumber); + PostMethod method = new PostMethod(url); + method.setDoAuthentication(true); + method.setRequestBody(inbound); + method.addRequestHeader("Connection", "Keep-Alive"); + + int statusCode = client.executeMethod(method); + + InputStream inputStream = method.getResponseBodyAsStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); + + + String str = ""; + List list = new ArrayList<>(); + + while ((str = br.readLine()) != null) { + + if (str.contains("--boundary")) { + Map resMap = JSON.parseObject(str.replaceAll("--boundary", ""), Map.class); + + if (resMap.get("CIDEvent") != null) { + // 报警信息 + Map cidMap = JSON.parseObject(resMap.get("CIDEvent").toString(), Map.class); + System.out.println("报警信息:" + cidMap); + + if (externalUtils == null) { + externalUtils = SpringUtil.getBean(ExternalUtils.class); + } + + int zone = 0; + + if (cidMap.get("system") != null) { + // system子系统号 + int system = Integer.parseInt(cidMap.get("system").toString()); + // zone防区号 + if (cidMap.get("zone") != null) { + zone = Integer.parseInt(cidMap.get("zone").toString()) + 1; + list = externalUtils.getList(0, 0, mac + "_sector_" + zone, null, "100", sSerialNumber); + } else { + list = externalUtils.getList(0, 0, mac + "_sys_" + system, null, "100", sSerialNumber); + } + } + + // 事件信息入本地库 + //SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-ddTHH:mm:ss+08:00"); + if (alarmInformationService == null) { + alarmInformationService = SpringUtil.getBean(IAlarmInformationService.class); + } + + String sCIDCode = cidMap.get("code").toString(); + AlarmInformation alarmInformation = new AlarmInformation(); + alarmInformation.setReportTime(new Date()); + alarmInformation.setType(sCIDCode); + alarmInformation.setContent(DictBizCache.getValue("alarm_message_type", sCIDCode)); + alarmInformation.setSystemNum(Integer.parseInt(cidMap.get("system").toString())); + alarmInformation.setHostSerialNumber(sSerialNumber); + alarmInformation.setHostIp(resMap.get("ipAddress").toString()); + alarmInformation.setAlarmType(1); + + if (CollectionUtils.isNotEmpty(list)) { + Map map = list.get(0); + alarmInformation.setDeviceName(map.get("name").toString()); + alarmInformation.setDeviceType(Integer.parseInt(String.valueOf(map.get("pid")))); + String s = JSON.toJSONString(map.get("tags")).replace("\\", ""); + s = s.substring(1, s.length() - 1); + Map tagsMap = JSONObject.parseObject(s, Map.class); + alarmInformation.setFloorNo(tagsMap.get("floorNo").toString()); + alarmInformation.setBuildId(tagsMap.get("buildingNo").toString()); + if (tagsMap.get("coordinate") != null) { + String coordinate = tagsMap.get("coordinate").toString(); + alarmInformation.setLatidute(coordinate.split("-")[0]); + alarmInformation.setLongidute(coordinate.split("-")[1]); + } + alarmInformation.setDeviceId(tagsMap.get("pmac").toString()); + Map bizProduct = JSONObject.parseObject(JSON.toJSONString(map.get("bizProduct")), Map.class); + alarmInformation.setProductName(bizProduct.get("name").toString()); + if (tagsMap.get("cameraCode") != null) { + alarmInformation.setCameraCode(tagsMap.get("cameraCode").toString()); + } + + // 主动修改设备状态-物联网平台 + if ("3973".equals(sCIDCode)) { + externalUtils.bizDevice(Integer.parseInt(String.valueOf(map.get("id"))), 5); + } else if ("1973".equals(sCIDCode) || "3570".equals(sCIDCode)) { + externalUtils.bizDevice(Integer.parseInt(String.valueOf(map.get("id"))), 6); + } else if ("1570".equals(sCIDCode)) { + externalUtils.bizDevice(Integer.parseInt(String.valueOf(map.get("id"))), 7); + } + } + boolean save = alarmInformationService.save(alarmInformation); + + // 只保留“即时报警”、“设备防拆报警” + if ("1103".equals(sCIDCode) || "1137".equals(sCIDCode)) { + // 上报海信iot平台 + if (queueUtils == null) { + queueUtils = SpringUtil.getBean(QueueUtils.class); + } + + List hostList = externalUtils.getList(0, 0, null, null, "105", sSerialNumber); + Map hostMap = hostList.get(0); + String s = JSON.toJSONString(hostMap.get("tags")).replace("\\", ""); + s = s.substring(1, s.length() - 1); + Map tagsMap = JSONObject.parseObject(s, Map.class); + + byte[] byteValue = DataTrans.shortToBytesBigEndian((short) 1); + ByteString byteString = ByteString.copyFrom(byteValue); + Point point = Point.newBuilder() + .setData(byteString) + .setId(tagsMap.get("mac").toString() + "_sector_" + zone) + .setDevType(2) + .setPntType(7) + .build(); + boolean b = queueUtils.saveQueueDataStatus(point); + System.out.println("===" + b); + + // 报警信息发送到远程服务器 + // if (restTemplate == null) { + // restTemplate = SpringUtil.getBean(RestTemplate.class); + // } + // String url = "http://152.136.119.150:81/alarmInformation/hikRemote"; + // HttpHeaders headers = new HttpHeaders(); + // headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8")); + // + // Map map = new HashMap<>(); + // map.put("id_", tagsMap.get("mac").toString() + "_sector_" + Integer.sum(strCIDalarm.wDefenceNo, 1)); + // map.put("devType_", 2); + // map.put("pntType_", 7); + // map.put("pntTypeValue_", 1); + // String content = JSON.toJSONString(map); + // + // HttpEntity httpEntity = new HttpEntity<>(content, headers); + // + // // 发送post请求,并输出结果 + // R r = restTemplate.postForObject(url, httpEntity, R.class); + // System.out.println("调用远程服务器接口成功!!:" + r); + + // webSocket推送给客户端消息 + JSONObject jsonObject = new JSONObject(); + jsonObject.put("message", JSONObject.toJSONString(alarmInformation)); + WebSocketServer.sendInfo(jsonObject); + } + + } +// System.out.println("接收到的数据:" + resMap); + } +// System.out.println(sSerialNumber + "接收到的数据:" + str); + } + + method.releaseConnection(); + } catch (IOException e) { + e.printStackTrace(); + } + + return stringBuffer.toString(); + } + + public static String doDelete(String url, HttpClient client) throws Exception { + + DeleteMethod method = new DeleteMethod(url); + method.setDoAuthentication(true); + + int statusCode = client.executeMethod(method); + + // Return response message + byte[] responseBody = method.getResponseBodyAsString().getBytes(method.getResponseCharSet()); + // Use encoding in the Return response message (utf-8 or gb2312) + String response = new String(responseBody, "utf-8"); + // Release the connection + method.releaseConnection(); + return response; + } + + //With the binary form POst method + public static String doPostwithBinaryData(String url, String json, String jsonName, String image, String imageName, String boundary) throws Exception { + + PostMethod method = new PostMethod(url); + method.setDoAuthentication(true); + + method.addRequestHeader("Accept", "text/html, application/xhtml+xml"); + method.addRequestHeader("Accept-Language", "zh-CN"); + method.addRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundary); + method.addRequestHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"); + method.addRequestHeader("Accept-Encoding", "gzip, deflate"); + method.addRequestHeader("Connection", "Keep-Alive"); + method.addRequestHeader("Cache-Control", "no-cache"); + + String bodyParam = + "--" + boundary + "\r\n" + + "Content-Disposition: form-data; name=\"" + jsonName + "\";\r\n" + + "Content-Type: text/json\r\n" + + "Content-Length: " + Integer.toString(json.length()) + "\r\n\r\n" + + json + "\r\n" + + "--" + boundary + "\r\n" + + "Content-Disposition: form-data; name=\"" + imageName + "\";\r\n" + + "Content-Type: image/jpeg\r\n" + + "Content-Length: " + Integer.toString(image.length()) + "\r\n\r\n" + + image + + "\r\n--" + boundary + "--\r\n"; + + method.setRequestBody(bodyParam); + + // Return response message + byte[] responseBody = method.getResponseBodyAsString().getBytes(method.getResponseCharSet()); + // Use encoding in the Return response message (utf-8 or gb2312) + String response = new String(responseBody, "utf-8"); + // Release the connection + method.releaseConnection(); + return response; + } + + public static String doPostStorageCloud(String url, String json, String faceimage, String boundary) throws Exception { + + PostMethod method = new PostMethod(url); + method.setDoAuthentication(true); + + method.addRequestHeader("Accept", "text/html, application/xhtml+xml"); + method.addRequestHeader("Accept-Language", "zh-CN"); + method.addRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundary); + method.addRequestHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"); + method.addRequestHeader("Accept-Encoding", "gzip, deflate"); + method.addRequestHeader("Connection", "Keep-Alive"); + method.addRequestHeader("Cache-Control", "no-cache"); + + String bodyParam = + "--" + boundary + "\r\n" + + "Content-Disposition: form-data; name=\"uploadStorageCloud\";\r\n" + + "Content-Type: text/json\r\n" + + "Content-Length: " + Integer.toString(json.length()) + "\r\n\r\n" + + json + "\r\n" + + "--" + boundary + "\r\n" + + "Content-Disposition: form-data; name=\"imageData\";\r\n" + + "Content-Type: image/jpeg\r\n" + + "Content-Length: " + Integer.toString(faceimage.length()) + "\r\n\r\n" + + faceimage + + "\r\n--" + boundary + "--\r\n"; + + method.setRequestBody(bodyParam); + + // Return response message + byte[] responseBody = method.getResponseBodyAsString().getBytes(method.getResponseCharSet()); + // Use encoding in the Return response message (utf-8 or gb2312) + String response = new String(responseBody, "utf-8"); + // Release the connection + method.releaseConnection(); + return response; + } + +} diff --git a/src/main/java/org/springblade/hospital/service/impl/AppDataServiceImpl.java b/src/main/java/org/springblade/hospital/service/impl/AppDataServiceImpl.java index c571fa6..8cff562 100644 --- a/src/main/java/org/springblade/hospital/service/impl/AppDataServiceImpl.java +++ b/src/main/java/org/springblade/hospital/service/impl/AppDataServiceImpl.java @@ -37,6 +37,7 @@ import org.springblade.modules.resource.entity.Attach; import org.springblade.modules.resource.service.IAttachService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.RestTemplate; @@ -59,26 +60,29 @@ public class AppDataServiceImpl extends BaseServiceImpl private final IAttachService attachService; + private final OssBuilder ossBuilder; + @Override @Transactional(rollbackFor = Exception.class) public List putFile(AppData appData, List resultList) { - List links = new ArrayList<>(); - SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd/"); - String uploadUrl = format.format(new Date()); +// SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd/"); +// String uploadUrl = format.format(new Date()); try { if (appData.getType() == 1 || appData.getType() == 2) { String url = ""; for (MultipartFile file : resultList) { // 文件上传到指定地址 - String s = UploadFileUtil.uploadFile(file, uploadUrl); +// String link = UploadFileUtil.uploadFile(file, uploadUrl); + BladeFile bladeFile = ossBuilder.template().putFile(file.getOriginalFilename(), file.getInputStream()); + String link = bladeFile.getLink(); Attach attach = new Attach(); - attach.setLink(s); + attach.setLink(link); attach.setOriginalName(file.getOriginalFilename()); attachService.save(attach); url += attach.getId() + ","; - links.add(s); + links.add(link); } if (StringUtils.isNotBlank(url)) { appData.setUrl(url.substring(0, url.length() - 1)); diff --git a/src/main/java/org/springblade/hospital/service/impl/CornJobServiceImpl.java b/src/main/java/org/springblade/hospital/service/impl/CornJobServiceImpl.java index 5055e6b..6761ee0 100644 --- a/src/main/java/org/springblade/hospital/service/impl/CornJobServiceImpl.java +++ b/src/main/java/org/springblade/hospital/service/impl/CornJobServiceImpl.java @@ -29,11 +29,14 @@ import org.springblade.hospital.service.ICornJobService; import org.springframework.stereotype.Service; import java.sql.Time; +import java.sql.Timestamp; import java.time.*; +import java.util.Calendar; import java.util.Date; /** * 服务实现类 + * * @author BladeX */ @Service @@ -42,7 +45,7 @@ public class CornJobServiceImpl extends BaseServiceImpl @Override public boolean add(CornJob cornJob) { // 重复校验 - check(cornJob.getId(), cornJob.getType(), cornJob.getDeviceId()); + check(cornJob.getId(), cornJob.getType(), cornJob.getDeviceId(), cornJob.getIsRegular()); if (cornJob.getExecuteTime() != null) { cornJob.setNextExecuteTime(getNextTime(cornJob.getExecuteTime())); @@ -53,7 +56,7 @@ public class CornJobServiceImpl extends BaseServiceImpl @Override public boolean edit(CornJob cornJob) { // 重复校验 - check(cornJob.getId(), cornJob.getType(), cornJob.getDeviceId()); + check(cornJob.getId(), cornJob.getType(), cornJob.getDeviceId(), cornJob.getIsRegular()); if (cornJob.getExecuteTime() != null) { cornJob.setNextExecuteTime(getNextTime(cornJob.getExecuteTime())); @@ -78,13 +81,15 @@ public class CornJobServiceImpl extends BaseServiceImpl return date; } - private void check(Long id, int type, String deviceId) { + private void check(Long id, int type, String deviceId, Integer isRegular) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.eq(CornJob::getType, type).eq(CornJob::getDeviceId, deviceId); + wrapper.eq(CornJob::getType, type).eq(CornJob::getDeviceId, deviceId).eq(CornJob::getIsRegular, isRegular); if (id != null) { wrapper.ne(CornJob::getId, id); + System.out.println("id不为空输出!!!" + id); } long count = this.count(wrapper); + System.out.println("count数量" + count); if (count > 0) { throw new ServiceException("数据重复!"); } diff --git a/src/main/java/org/springblade/hospital/utils/CornJobUtil.java b/src/main/java/org/springblade/hospital/utils/CornJobUtil.java index f18d7fe..83f5630 100644 --- a/src/main/java/org/springblade/hospital/utils/CornJobUtil.java +++ b/src/main/java/org/springblade/hospital/utils/CornJobUtil.java @@ -1,14 +1,24 @@ package org.springblade.hospital.utils; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.google.protobuf.ByteString; +import com.hisense.device.agent.grpc.Point; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.methods.PostMethod; +import org.springblade.common.cache.DictBizCache; +import org.springblade.core.tool.utils.SpringUtil; +import org.springblade.hospital.agent.utils.DataTrans; +import org.springblade.hospital.agent.utils.QueueUtils; import org.springblade.hospital.entity.AlarmInformation; import org.springblade.hospital.entity.CornJob; import org.springblade.hospital.hik.NetSDKDemo.HCNetSDK; import org.springblade.hospital.hik.alarm.Alarm; +import org.springblade.hospital.service.IAlarmInformationService; import org.springblade.hospital.service.ICornJobService; import org.springblade.hospital.websocket.WebSocketServer; import org.springframework.beans.factory.annotation.Autowired; @@ -17,6 +27,9 @@ import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; import java.util.*; @Component @@ -28,13 +41,19 @@ public class CornJobUtil { @Autowired ICornJobService cornJobService; + @Autowired + IAlarmInformationService alarmInformationService; + + @Autowired + QueueUtils queueUtils; + /** * 定时更新设备状态,每1分钟执行一次 */ @Async - @Scheduled(initialDelay = 5000, fixedRate = 60000) +// @Scheduled(initialDelay = 5000, fixedRate = 60000) public void updateStatus() { - System.out.println("定时任务执行了1"); + System.out.println("定时1分钟获取1次设备状态"); externalUtils.updateStatus(); } @@ -42,60 +61,62 @@ public class CornJobUtil { * 定时布撤防,每3分钟执行一次 */ @Async - @Scheduled(initialDelay = 6000, fixedRate = 180000) +// @Scheduled(initialDelay = 6000, fixedRate = 180000) public void task() { System.out.println("定时任务执行了2"); -// List jobs = cornJobService.list(Wrappers.lambdaQuery().eq(CornJob::getStatus, 1)); -// if (CollectionUtils.isNotEmpty(jobs)) { -// List jobList = new ArrayList<>(); -// for (CornJob job : jobs) { -// Date nextExecuteTime = job.getNextExecuteTime(); -// if (new Date().compareTo(nextExecuteTime) < 0) { -// continue; -// } -// System.out.println("-----------------===================="); -// try { -// if (StringUtils.isNotBlank(job.getDeviceId())) { -// String[] ids = job.getDeviceId().split(","); -// // 布防 -// if (job.getType() == 1) { -// for (String id : ids) { -// Alarm.fqbf(job.getHostSerialNumber(), Integer.parseInt(id) - 1); -// } -// } -// // 撤防 -// else if (job.getType() == 2) { -// for (String id : ids) { -// Alarm.fqcf(job.getHostSerialNumber(), Integer.parseInt(id) - 1); -// } -// } -// // 修改下次执行时间 -// Calendar calendar = new GregorianCalendar(); -// calendar.setTime(nextExecuteTime); -// // 把日期往后增加一天,整数 往后推,负数往前移动 -// calendar.add(Calendar.DATE, 1); -// job.setNextExecuteTime(calendar.getTime()); -// jobList.add(job); -// } -// } catch (NumberFormatException e) { -// e.printStackTrace(); -// } -// } -// cornJobService.updateBatchById(jobList); -// } + List jobs = cornJobService.list(Wrappers.lambdaQuery().eq(CornJob::getStatus, 1).eq(CornJob::getIsRegular, 1)); + if (CollectionUtils.isNotEmpty(jobs)) { + List jobList = new ArrayList<>(); + for (CornJob job : jobs) { + Date nextExecuteTime = job.getNextExecuteTime(); + if (new Date().compareTo(nextExecuteTime) < 0) { + continue; + } + System.out.println("-----------------===================="); + try { + if (StringUtils.isNotBlank(job.getDeviceId())) { + String[] ids = job.getDeviceId().split(","); + // 布防 + if (job.getType() == 1) { + for (String id : ids) { + String[] split = id.split("_"); + Alarm.zibufang(job.getHostSerialNumber(), Integer.parseInt(split[split.length - 1])); + } + } + // 撤防 + else if (job.getType() == 2) { + for (String id : ids) { + String[] split = id.split("_"); + Alarm.zichefang(job.getHostSerialNumber(), Integer.parseInt(split[split.length - 1])); + } + } + // 修改下次执行时间 + Calendar calendar = new GregorianCalendar(); + calendar.setTime(nextExecuteTime); + // 把日期往后增加一天,整数 往后推,负数往前移动 + calendar.add(Calendar.DATE, 1); + job.setNextExecuteTime(calendar.getTime()); + jobList.add(job); + } + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + cornJobService.updateBatchById(jobList); + } } @Async - @Scheduled(initialDelay = 7000, fixedRate = 3600000) - public void testWebSocket(){ - System.out.println("定时任务执行了3"); - AlarmInformation alarmInformation = new AlarmInformation(); - alarmInformation.setReportTime(new Date()); - alarmInformation.setBuildId("2"); - alarmInformation.setFloorNo("2"); - alarmInformation.setContent("测试报警信息"); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("message", JSONObject.toJSONString(alarmInformation)); - WebSocketServer.sendInfo(jsonObject); +// @Scheduled(initialDelay = 7000, fixedRate = 3600000) + public void testWebSocket() { +// System.out.println("定时任务执行了3"); +// AlarmInformation alarmInformation = new AlarmInformation(); +// alarmInformation.setReportTime(new Date()); +// alarmInformation.setBuildId("2"); +// alarmInformation.setFloorNo("2"); +// alarmInformation.setContent("测试报警信息"); +// JSONObject jsonObject = new JSONObject(); +// jsonObject.put("message", JSONObject.toJSONString(alarmInformation)); +// WebSocketServer.sendInfo(jsonObject); } } diff --git a/src/main/java/org/springblade/hospital/utils/ExternalUtils.java b/src/main/java/org/springblade/hospital/utils/ExternalUtils.java index 2b5c835..54fb51e 100644 --- a/src/main/java/org/springblade/hospital/utils/ExternalUtils.java +++ b/src/main/java/org/springblade/hospital/utils/ExternalUtils.java @@ -7,6 +7,7 @@ import com.google.protobuf.ByteString; import com.hisense.device.agent.grpc.Point; import io.swagger.models.auth.In; import org.apache.commons.lang3.StringUtils; +import org.springblade.common.cache.ParamCache; import org.springblade.core.cache.utils.CacheUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.SpringUtil; @@ -15,6 +16,7 @@ import org.springblade.hospital.agent.utils.QueueUtils; import org.springblade.hospital.entity.KeyAndSecret; import org.springblade.hospital.hik.NetSDKDemo.HCNetSDK; import org.springblade.hospital.hik.alarm.Alarm; +import org.springblade.hospital.newalarm.communicationCom.HTTPClientUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; import org.springframework.stereotype.Component; @@ -26,6 +28,7 @@ import java.util.Map; import java.util.concurrent.Exchanger; import java.util.stream.Collectors; +import static org.springblade.common.constant.CommonConstant.IOT_PLATFORM_URL; import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE; @Component @@ -41,7 +44,9 @@ public class ExternalUtils { * 获取物联网平台token */ private String getToken(String appKey, String appSecret) { - String url = "http://182.139.182.190:60032/prod-api/api/Login"; + String url = ParamCache.getValue(IOT_PLATFORM_URL) + "Login"; +// String url = "http://171.16.8.58:8080/prod-api/api/Login"; +// String url = "http://182.139.182.190:60032/prod-api/api/Login"; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8")); @@ -89,7 +94,9 @@ public class ExternalUtils { } private Map getMap(String token, int page, int pageSize, String id, String type, String pid, String number) { - String url = "http://182.139.182.190:60032/prod-api/api/bizDevice/list?pid="; + String url = ParamCache.getValue(IOT_PLATFORM_URL) + "bizDevice/list?pid="; +// String url = "http://171.16.8.58:8080/prod-api/api/bizDevice/list?pid="; +// String url = "http://182.139.182.190:60032/prod-api/api/bizDevice/list?pid="; // String pid = "pid=100"; if (StringUtils.isNotBlank(type)) { if ("4".equals(type)) { @@ -111,7 +118,7 @@ public class ExternalUtils { } if (StringUtils.isNotBlank(id)) { - url += "¶ms[mac]=" + id; + url += "¶ms[pmac]=" + id; } HttpHeaders headers = new HttpHeaders(); @@ -131,95 +138,145 @@ public class ExternalUtils { * 更新设备状态 */ public void updateStatus() { - // 设备列表信息 - + // 报警主机信息 List hosts = getList(0, 0, null, null, "105", null); + + // 子系统、防区信息 List mapList = getList(0, 0, null, null, "100", null); + // 遍历设备列表更新设备状态信息 if (CollectionUtils.isNotEmpty(hosts)) { - // 报警主机在线状态:true在线 false离线 -// boolean presence = Alarm.presence(); - for (Map hostMap : hosts) { - String tags = JSON.toJSONString(hostMap.get("tags")).replace("\\", ""); - tags = tags.substring(1, tags.length() - 1); - Map tagMap = JSONObject.parseObject(tags, Map.class); - String number = tagMap.get("hostNumber").toString(); - String mac = tagMap.get("mac").toString(); - - // 设备状态信息 - HCNetSDK.NET_DVR_ALARMHOST_MAIN_STATUS_V40 status = Alarm.getStatus(number); - // 如果查不到该报警主机的状态信息 - if (status == null) { - continue; - } + try { + for (Map hostMap : hosts) { + String tags = JSON.toJSONString(hostMap.get("tags")).replace("\\", ""); + tags = tags.substring(1, tags.length() - 1); + Map tagMap = JSONObject.parseObject(tags, Map.class); + String number = tagMap.get("hostNumber").toString(); // 序列号 + String mac = tagMap.get("mac").toString(); // 自定义mac + + // 认证 + String rzUrl = "http://" + Alarm.ipMap.get(number) + ":" + Alarm.portMap.get(number) + "/ISAPI/System/deviceInfo"; + String renzheng = HTTPClientUtil.renzheng(rzUrl, HTTPClientUtil.client); + + if (renzheng.contains(number)) { + // 获取该报警主机的所有状态 + String status = "http://" + Alarm.ipMap.get(number) + ":" + Alarm.portMap.get(number) + "/ISAPI/SecurityCP/status/host?format=json"; + String statusData = HTTPClientUtil.doGet(status, HTTPClientUtil.client); + + Map statusMap = JSONObject.parseObject(statusData, Map.class); + Map alarmHostStatus = JSONObject.parseObject(statusMap.get("AlarmHostStatus").toString(), Map.class); + Map communiStatus = JSONObject.parseObject(alarmHostStatus.get("CommuniStatus").toString(), Map.class); + System.out.println("CommuniStatus" + communiStatus); + + // 如果通讯断开跳过 + if (!"normal".equals(communiStatus.get("wired"))) { + continue; + } - List list = mapList.stream().filter(map -> JSON.toJSONString(map.get("tags")).contains(number)).collect(Collectors.toList()); - for (Map map : list) { - // 物联网设备状态 - int state = Integer.parseInt(String.valueOf(map.get("status"))); - - String s = JSON.toJSONString(map.get("tags")).replace("\\", ""); - s = s.substring(1, s.length() - 1); - Map tagsMap = JSONObject.parseObject(s, Map.class); - String id = mac + "_" + tagsMap.get("mac").toString(); - String type = tagsMap.get("type").toString(); - - // 防区号/子系统号 - int sCIDCode = Integer.parseInt(tagsMap.get("buildingNo").toString()); - - // 设备真实状态 - int fqStatus = 0; - int presence = 0; - - if ("2".equals(type)) { - presence = 1; - // 防区布防状态 0-对应防区处于撤防状态,1-对应防区处于布防状态 - byte bySetupAlarmStatus = status.bySetupAlarmStatus[sCIDCode - 1]; - // 防区旁路状态 0-表示防区没有旁路 1-表示防区旁路 - byte byBypassStatus = status.byBypassStatus[sCIDCode - 1]; - // 防区故障状态,0-对应防区处于正常状态,1-对应防区处于故障状态 - byte byAlarmInFaultStatus = status.byAlarmInFaultStatus[sCIDCode - 1]; - // 防区报警状态,0-对应防区当前无报警,1-对应防区当前有报警 - byte byAlarmInStatus = status.byAlarmInFaultStatus[sCIDCode - 1]; - // 上报防区报警状态 -// updateById(id, 7, byAlarmInStatus, 2); -// test1(id, 7, byAlarmInStatus, 2); - test1(id, 7, 1, 2); - - // 撤防-6 布防-5 旁路-7 - if (byAlarmInFaultStatus == 0) { - if (bySetupAlarmStatus == 1) { - fqStatus = 5; - } else if (bySetupAlarmStatus == 0 && byBypassStatus == 0) { - fqStatus = 6; - } else if (byBypassStatus == 1) { - fqStatus = 7; + // 防区状态 + List zoneList = JSONObject.parseObject(alarmHostStatus.get("ZoneList").toString(), List.class); + System.out.println("ZoneList" + zoneList); + // 子系统状态 + List subSysList = JSONObject.parseObject(alarmHostStatus.get("SubSysList").toString(), List.class); + System.out.println("SubSysList" + subSysList); + + // 过滤只有该报警主机下的子系统、防区 + List list = mapList.stream().filter(map -> JSON.toJSONString(map.get("tags")).contains(number)).collect(Collectors.toList()); + for (Map map : list) { + // 物联网设备状态 + int state = Integer.parseInt(String.valueOf(map.get("status"))); + + String s = JSON.toJSONString(map.get("tags")).replace("\\", ""); + s = s.substring(1, s.length() - 1); + Map tagsMap = JSONObject.parseObject(s, Map.class); + String id = tagsMap.get("pmac").toString(); + String type = tagsMap.get("type").toString(); + + // 防区号/子系统号 + int sCIDCode = Integer.parseInt(tagsMap.get("buildingNo").toString()); + + // 设备真实状态 + int fqStatus = 0; + int presence = 0; + + if ("2".equals(type)) { + presence = 1; + List zones = zoneList.stream().filter(zone -> Integer.parseInt(JSONObject.parseObject(zone.get("Zone").toString(), Map.class).get("id").toString()) == sCIDCode - 1).collect(Collectors.toList()); + + if (CollectionUtils.isNotEmpty(zones)) { + Map zoneMap = zones.get(0); + Map zone = JSONObject.parseObject(zoneMap.get("Zone").toString(), Map.class); + // 防区布防状态 0-对应防区处于撤防状态,1-对应防区处于布防状态 + int bySetupAlarmStatus = 0; + if ((boolean) zone.get("isArming")) { + bySetupAlarmStatus = 1; + } + + // 防区旁路状态 0-表示防区没有旁路 1-表示防区旁路 + int byBypassStatus = 0; + if ((boolean) zone.get("bypassed")) { + byBypassStatus = 1; + } + + // 防区故障状态,0-对应防区处于正常状态,1-对应防区处于故障状态 + int byAlarmInFaultStatus = 0; + if ("breakDown".equals(zone.get("status"))) { + byAlarmInFaultStatus = 1; + } + + // 防区报警状态,0-对应防区当前无报警,1-对应防区当前有报警 + int byAlarmInStatus = 0; + if ((boolean) zone.get("alarm")) { + byAlarmInStatus = 1; + } + + // 上报防区报警状态 +// updateById(id, 7, byAlarmInStatus, type); +// test1(id, 7, byAlarmInStatus, 2); +// test1(id, 7, 1, 2); + + // 撤防-6 布防-5 旁路-7 + if (byAlarmInFaultStatus == 0) { + if (bySetupAlarmStatus == 1) { + fqStatus = 5; + } else if (bySetupAlarmStatus == 0 && byBypassStatus == 0) { + fqStatus = 6; + } else if (byBypassStatus == 1) { + fqStatus = 7; + } + } else { + fqStatus = 4; + } + } + } else if ("3".equals(type)) { + presence = 2; + List subSyss = subSysList.stream().filter(sys -> Integer.parseInt(JSONObject.parseObject(sys.get("SubSys").toString(), Map.class).get("id").toString()) == sCIDCode).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(subSyss)) { + Map sysMap = subSyss.get(0); + Map subSys = JSONObject.parseObject(sysMap.get("SubSys").toString(), Map.class); + //子系统布防状态,0-对应子系统处于撤防状态,1-对应子系统处于布防状态 + fqStatus = 6; + if (!"disarm".equals(subSys.get("arming"))) { + fqStatus = 5; + } + } } - } else { - fqStatus = 4; - } - } else if ("3".equals(type)) { - presence = 2; - //子系统布防状态,0-对应子系统处于撤防状态,1-对应子系统处于布防状态 - byte bySubSystemGuardStatus = status.bySubSystemGuardStatus[sCIDCode - 1]; - if (bySubSystemGuardStatus == 0) { - fqStatus = 6; - } else { - fqStatus = 5; - } - } - // 海信iot -// updateById(id, fqStatus,presence,type); - test(id, fqStatus, presence, type); + // 海信iot + updateById(id, fqStatus, presence, type); +// test(id, fqStatus, presence, type); - if (fqStatus == state) { - continue; - } + if (fqStatus == state) { + continue; + } - // 物联网平台 - bizDevice(Integer.parseInt(String.valueOf(map.get("id"))), fqStatus); + // 物联网平台 + bizDevice(Integer.parseInt(String.valueOf(map.get("id"))), fqStatus); + } + } } + } catch (Exception e) { + e.printStackTrace(); } } } @@ -318,7 +375,9 @@ public class ExternalUtils { } private Map device(String token, int id, int status) { - String url = "http://182.139.182.190:60032/prod-api/api/bizDevice"; + String url = ParamCache.getValue(IOT_PLATFORM_URL) + "bizDevice"; +// String url = "http://171.16.8.58:8080/prod-api/api/bizDevice"; +// String url = "http://182.139.182.190:60032/prod-api/api/bizDevice"; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8")); headers.setBearerAuth(token); diff --git a/src/main/java/org/springblade/hospital/utils/UploadFileUtil.java b/src/main/java/org/springblade/hospital/utils/UploadFileUtil.java index fea6c53..631f38d 100644 --- a/src/main/java/org/springblade/hospital/utils/UploadFileUtil.java +++ b/src/main/java/org/springblade/hospital/utils/UploadFileUtil.java @@ -9,7 +9,8 @@ import java.util.UUID; public class UploadFileUtil { public static String uploadFile(MultipartFile upload, String path) throws IOException { - String uploadUrl = "D:/Develop/nginx-1.18.0/html/upload/"; +// String uploadUrl = "D:/Develop/nginx-1.18.0/html/upload/"; + String uploadUrl = "/usr/local/nginx/html/upload/"; //判断该路径是否存在 File file = new File(uploadUrl + path); if (!file.exists()) { diff --git a/src/main/java/org/springblade/modules/system/controller/DictBizController.java b/src/main/java/org/springblade/modules/system/controller/DictBizController.java index f3b7b59..bf560ab 100644 --- a/src/main/java/org/springblade/modules/system/controller/DictBizController.java +++ b/src/main/java/org/springblade/modules/system/controller/DictBizController.java @@ -17,6 +17,7 @@ package org.springblade.modules.system.controller; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.annotations.*; @@ -39,8 +40,7 @@ import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; import javax.validation.Valid; -import java.util.List; -import java.util.Map; +import java.util.*; import static org.springblade.core.cache.constant.CacheConstant.DICT_CACHE; @@ -203,5 +203,20 @@ public class DictBizController extends BladeController { return R.data(list); } + @GetMapping("/getValues") + public R getValues(String keys) { + String[] keyArray = keys.split(","); + List list = dictService.list(Wrappers.lambdaQuery().eq(DictBiz::getCode, "camera_information").in(DictBiz::getDictKey, keyArray)); + List> codes = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(list)) { + for (DictBiz dictBiz : list) { + Map map = new HashMap<>(); + map.put("name", dictBiz.getDictKey()); + map.put("code", dictBiz.getDictValue()); + codes.add(map); + } + } + return R.data(codes); + } } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 1f84306..9fb8a40 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -2,6 +2,7 @@ spring: redis: ##redis 单机环境配置 +# host: 171.16.8.51 host: 127.0.0.1 port: 6379 password: @@ -14,6 +15,7 @@ spring: datasource: # MySql url: jdbc:mysql://localhost:3306/hospital?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true +# url: jdbc:mysql://171.16.8.51:3306/hospital?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true username: root password: 123456 # PostgreSQL diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 3f393c5..12feb67 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -137,10 +137,12 @@ report: oss: enabled: true name: minio - tenant-mode: true - endpoint: http://127.0.0.1:9000 - access-key: VStUadh8yjZK2Cv6 - secret-key: FzED6Ddhw9iW5xwKw29OF6nRHlrRpGI0 + tenant-mode: false + endpoint: http://171.16.8.51:9000 + access-key: g5HeFysuXl8GR6Rn + secret-key: fz2cbDybMz6VOYFnUHSa24jywAAJ7BkM +# access-key: ZKga7e7SwuQ24ONPUNrA +# secret-key: EhdALlRn4cCgpXepMmNzzs9QQDOk2VoE6guQHFFt bucket-name: hospital #第三方登陆配置 @@ -226,6 +228,7 @@ blade: - /blade-test/** - /** - /api/appData/putFile + - /alarmInformation/alarm #授权认证配置 auth: - method: ALL