From c3ce2bc5d069ba57309567aee4ae418bc0cf75ed Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期五, 17 三月 2023 13:22:05 +0800 Subject: [PATCH] 优化异常处理以及级联设备状态查询 --- src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 102 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java index ced97ef..d51ab9f 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java @@ -1,10 +1,9 @@ package com.genersoft.iot.vmp.gb28181.utils; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import com.genersoft.iot.vmp.gb28181.bean.TreeType; import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; import com.genersoft.iot.vmp.utils.DateUtil; import org.dom4j.Attribute; @@ -14,12 +13,17 @@ import org.dom4j.io.SAXReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.util.StringUtils; +import org.springframework.util.ObjectUtils; +import org.springframework.util.ReflectionUtils; import javax.sip.RequestEvent; import javax.sip.message.Request; import java.io.ByteArrayInputStream; import java.io.StringReader; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.*; /** @@ -118,12 +122,12 @@ // 濡傛灉鏄睘鎬� for (Object o : element.attributes()) { Attribute attr = (Attribute) o; - if (!StringUtils.isEmpty(attr.getValue())) { + if (!ObjectUtils.isEmpty(attr.getValue())) { json.put("@" + attr.getName(), attr.getValue()); } } List<Element> chdEl = element.elements(); - if (chdEl.isEmpty() && !StringUtils.isEmpty(element.getText())) {// 濡傛灉娌℃湁瀛愬厓绱�,鍙湁涓�涓�� + if (chdEl.isEmpty() && !ObjectUtils.isEmpty(element.getText())) {// 濡傛灉娌℃湁瀛愬厓绱�,鍙湁涓�涓�� json.put(element.getName(), element.getText()); } @@ -154,7 +158,7 @@ } else { // 瀛愬厓绱犳病鏈夊瓙鍏冪礌 for (Object o : element.attributes()) { Attribute attr = (Attribute) o; - if (!StringUtils.isEmpty(attr.getValue())) { + if (!ObjectUtils.isEmpty(attr.getValue())) { json.put("@" + attr.getName(), attr.getValue()); } } @@ -197,7 +201,7 @@ return null; } String channelId = channdelIdElement.getTextTrim(); - if (StringUtils.isEmpty(channelId)) { + if (ObjectUtils.isEmpty(channelId)) { logger.warn("瑙f瀽Catalog娑堟伅鏃跺彂鐜扮己灏� DeviceID"); return null; } @@ -210,17 +214,26 @@ ChannelType channelType = ChannelType.Other; if (channelId.length() <= 8) { channelType = ChannelType.CivilCode; + deviceChannel.setHasAudio(false); }else { if (channelId.length() == 20) { int code = Integer.parseInt(channelId.substring(10, 13)); switch (code){ case 215: channelType = ChannelType.BusinessGroup; + deviceChannel.setHasAudio(false); break; case 216: channelType = ChannelType.VirtualOrganization; + deviceChannel.setHasAudio(false); + break; + case 136: + case 137: + case 138: + deviceChannel.setHasAudio(true); break; default: + deviceChannel.setHasAudio(false); break; } @@ -288,6 +301,10 @@ }else { deviceChannel.setParentId(parentId); } + // 鍏煎璁惧閫氶亾淇℃伅涓嚜宸变负鑷繁鐖惰妭鐐圭殑鎯呭喌 + if (deviceChannel.getParentId().equals(deviceChannel.getChannelId())) { + deviceChannel.setParentId(null); + } } deviceChannel.setBusinessGroupId(businessGroupID); if (channelType.equals(ChannelType.BusinessGroup) || channelType.equals(ChannelType.VirtualOrganization)) { @@ -316,7 +333,7 @@ // 璇嗗埆鑷甫鐨勭洰褰曟爣璇� String parental = XmlUtil.getText(itemDevice, "Parental"); // 鐢变簬娴峰悍浼氶敊璇殑鍙戦��65535浣滀负杩欓噷鐨勫彇鍊�,鎵�浠ヨ繖閲岄櫎闈炴槸0鍚﹀垯璁や负鏄�1 - if (!StringUtils.isEmpty(parental) && parental.length() == 1 && Integer.parseInt(parental) == 0) { + if (!ObjectUtils.isEmpty(parental) && parental.length() == 1 && Integer.parseInt(parental) == 0) { deviceChannel.setParental(0); }else { deviceChannel.setParental(1); @@ -332,14 +349,14 @@ deviceChannel.setPassword(XmlUtil.getText(itemDevice, "Password")); String safetyWay = XmlUtil.getText(itemDevice, "SafetyWay"); - if (StringUtils.isEmpty(safetyWay)) { + if (ObjectUtils.isEmpty(safetyWay)) { deviceChannel.setSafetyWay(0); } else { deviceChannel.setSafetyWay(Integer.parseInt(safetyWay)); } String registerWay = XmlUtil.getText(itemDevice, "RegisterWay"); - if (StringUtils.isEmpty(registerWay)) { + if (ObjectUtils.isEmpty(registerWay)) { deviceChannel.setRegisterWay(1); } else { deviceChannel.setRegisterWay(Integer.parseInt(registerWay)); @@ -381,6 +398,7 @@ } else { deviceChannel.setLatitude(0.00); } + deviceChannel.setGpsTime(DateUtil.getNow()); @@ -395,7 +413,79 @@ } else { deviceChannel.setPTZType(Integer.parseInt(XmlUtil.getText(itemDevice, "PTZType"))); } - deviceChannel.setHasAudio(true); // 榛樿鍚湁闊抽锛屾挱鏀炬椂鍐嶆鏌ユ槸鍚︽湁闊抽鍙婃槸鍚AC + return deviceChannel; } + + /** + * 鏂板鏂规硶鏀寔鍐呴儴宓屽 + * + * @param element xmlElement + * @param clazz 缁撴灉绫� + * @param <T> 娉涘瀷 + * @return 缁撴灉瀵硅薄 + * @throws NoSuchMethodException + * @throws InvocationTargetException + * @throws InstantiationException + * @throws IllegalAccessException + */ + public static <T> T loadElement(Element element, Class<T> clazz) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { + Field[] fields = clazz.getDeclaredFields(); + T t = clazz.getDeclaredConstructor().newInstance(); + for (Field field : fields) { + ReflectionUtils.makeAccessible(field); + MessageElement annotation = field.getAnnotation(MessageElement.class); + if (annotation == null) { + continue; + } + String value = annotation.value(); + String subVal = annotation.subVal(); + Element element1 = element.element(value); + if (element1 == null) { + continue; + } + if ("".equals(subVal)) { + // 鏃犱笅绾ф暟鎹� + Object fieldVal = element1.isTextOnly() ? element1.getText() : loadElement(element1, field.getType()); + Object o = simpleTypeDeal(field.getType(), fieldVal); + ReflectionUtils.setField(field, t, o); + } else { + // 瀛樺湪涓嬬骇鏁版嵁 + ArrayList<Object> list = new ArrayList<>(); + Type genericType = field.getGenericType(); + if (!(genericType instanceof ParameterizedType)) { + continue; + } + Class<?> aClass = (Class<?>) ((ParameterizedType) genericType).getActualTypeArguments()[0]; + for (Element element2 : element1.elements(subVal)) { + list.add(loadElement(element2, aClass)); + } + ReflectionUtils.setField(field, t, list); + } + } + return t; + } + + /** + * 绠�鍗曠被鍨嬪鐞� + * + * @param tClass + * @param val + * @return + */ + private static Object simpleTypeDeal(Class<?> tClass, Object val) { + if (tClass.equals(String.class)) { + return val.toString(); + } + if (tClass.equals(Integer.class)) { + return Integer.valueOf(val.toString()); + } + if (tClass.equals(Double.class)) { + return Double.valueOf(val.toString()); + } + if (tClass.equals(Long.class)) { + return Long.valueOf(val.toString()); + } + return val; + } } \ No newline at end of file -- Gitblit v1.8.0