Commit ec8ab540f8af6dca862d3ec9967e9042fa7dd8eb

Authored by hotcoffie
Committed by GitHub
2 parents bfaa519e 36170df3

Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0

README.md
... ... @@ -109,21 +109,45 @@ https://gitee.com/pan648540858/wvp-GB28181-pro.git
109 109 - [X] 支持使用mysql作为数据库,默认sqlite3,开箱即用。
110 110 - [X] WEB端支持播放H264与H265,音频支持G.711A/G.711U/AAC,覆盖国标常用编码格式。
111 111  
112   -# docker快速体验
113   -目前作者的docker-compose因为时间有限维护不及时,这里提供第三方提供的供大家使用,维护不易,大家记得给这位小伙伴点个star。
114   -https://github.com/SaltFish001/wvp_pro_compose
115   -[https://github.com/SaltFish001/wvp_pro_compose](https://github.com/SaltFish001/wvp_pro_compose)
116   -这是作者维护的一个镜像,可能存在不及时的问题。
117   -```shell
118   -docker pull 648540858/wvp_pro
119   -
120   -docker run --env WVP_IP="你的IP" -it -p 18080:18080 -p 30000-30500:30000-30500/udp -p 30000-30500:30000-30500/tcp -p 80:80 -p 5060:5060 -p 5060:5060/udp 648540858/wvp_pro
121   -```
122   -docker使用详情查看:[https://hub.docker.com/r/648540858/wvp_pro](https://hub.docker.com/r/648540858/wvp_pro)
  112 +[//]: # (# docker快速体验)
  113 +
  114 +[//]: # (目前作者的docker-compose因为时间有限维护不及时,这里提供第三方提供的供大家使用,维护不易,大家记得给这位小伙伴点个star。 )
  115 +
  116 +[//]: # (https://github.com/SaltFish001/wvp_pro_compose)
  117 +
  118 +[//]: # ([https://github.com/SaltFish001/wvp_pro_compose](https://github.com/SaltFish001/wvp_pro_compose))
  119 +
  120 +[//]: # (这是作者维护的一个镜像,可能存在不及时的问题。)
  121 +
  122 +[//]: # (```shell)
  123 +
  124 +[//]: # (docker pull 648540858/wvp_pro)
  125 +
  126 +[//]: # ()
  127 +[//]: # (docker run --env WVP_IP="你的IP" -it -p 18080:18080 -p 30000-30500:30000-30500/udp -p 30000-30500:30000-30500/tcp -p 80:80 -p 5060:5060 -p 5060:5060/udp 648540858/wvp_pro)
  128 +
  129 +[//]: # (```)
  130 +
  131 +[//]: # (docker使用详情查看:[https://hub.docker.com/r/648540858/wvp_pro](https://hub.docker.com/r/648540858/wvp_pro))
123 132  
124 133 # gitee同步仓库
125 134 https://gitee.com/pan648540858/wvp-GB28181-pro.git
126 135  
  136 +# 遇到问题
  137 +国标最麻烦的地方在于设备的兼容性,所以需要大量的设备来测试,目前作者手里的设备有限,再加上作者水平有限,所以遇到问题在所难免;
  138 +1. 查看wiki,仔细的阅读可以帮你避免几乎所有的问题
  139 +2. 搜索issues,这里有大部分的答案
  140 +3. 加QQ群,这里有大量热心的小伙伴,但是前提新希望你已经仔细阅读了wiki和搜索了issues。
  141 +4. 你可以请作者为你解答,但是我不是免费的。
  142 +5. 你可以把遇到问题的设备寄给我,可以更容易的复现问题。
  143 +
  144 +
  145 +# 合作
  146 +目前很多打着合作的幌子来私聊的,其实大家大可不必,目前作者没有精力,你有问题可以付费找我解答,也可以提PR
  147 +,如果对代码有建议可以提ISSUE;也可以加群一起聊聊。我们欢迎所有有兴趣但遇到项目中来的人。
  148 +
  149 +
  150 +
127 151 # 使用帮助
128 152 QQ群: 901799015, ZLM使用文档[https://github.com/ZLMediaKit/ZLMediaKit](https://github.com/ZLMediaKit/ZLMediaKit)
129 153 QQ私信一般不回, 精力有限.欢迎大家在群里讨论.觉得项目对你有帮助,欢迎star和提交pr。
... ...
... ... @@ -256,6 +256,7 @@
256 256 <plugin>
257 257 <groupId>org.springframework.boot</groupId>
258 258 <artifactId>spring-boot-maven-plugin</artifactId>
  259 + <version>2.3.5.RELEASE</version>
259 260 <configuration>
260 261 <includeSystemScope>true</includeSystemScope>
261 262 </configuration>
... ... @@ -263,6 +264,7 @@
263 264 <plugin>
264 265 <groupId>org.apache.maven.plugins</groupId>
265 266 <artifactId>maven-compiler-plugin</artifactId>
  267 + <version>3.8.1</version>
266 268 <configuration>
267 269 <source>1.8</source>
268 270 <target>1.8</target>
... ... @@ -272,6 +274,7 @@
272 274 <plugin>
273 275 <groupId>pl.project13.maven</groupId>
274 276 <artifactId>git-commit-id-plugin</artifactId>
  277 + <version>3.0.1</version>
275 278 <configuration>
276 279 <offline>true</offline>
277 280 </configuration>
... ... @@ -280,6 +283,7 @@
280 283 <plugin>
281 284 <groupId>org.apache.maven.plugins</groupId>
282 285 <artifactId>maven-surefire-plugin</artifactId>
  286 + <version>2.22.2</version>
283 287 <configuration>
284 288 <skipTests>true</skipTests>
285 289 </configuration>
... ...
src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java
... ... @@ -7,7 +7,6 @@ import org.springframework.boot.SpringApplication;
7 7 import org.springframework.boot.autoconfigure.SpringBootApplication;
8 8 import org.springframework.boot.web.servlet.ServletComponentScan;
9 9 import org.springframework.context.ConfigurableApplicationContext;
10   -import org.springframework.scheduling.annotation.EnableAsync;
11 10 import org.springframework.scheduling.annotation.EnableScheduling;
12 11 import springfox.documentation.oas.annotations.EnableOpenApi;
13 12  
... ...
src/main/java/com/genersoft/iot/vmp/common/ApiSaveConstant.java
1 1 package com.genersoft.iot.vmp.common;
2 2  
  3 +/**
  4 + * 为API重命名, 方便向数据库记录数据的时候展示
  5 + * @author lin
  6 + */
3 7 public class ApiSaveConstant {
4 8  
5 9 public static String getVal(String key) {
... ... @@ -35,8 +39,9 @@ public class ApiSaveConstant {
35 39 return "[设备控制] 强制关键帧";
36 40 case "home_position":
37 41 return "[设备控制] 看守位控制";
  42 + default:
  43 + return "";
38 44 }
39   - break;
40 45 case "query":
41 46 if (keyItemArray.length <= 5) {
42 47 return null;
... ... @@ -51,23 +56,30 @@ public class ApiSaveConstant {
51 56 return "[设备查询] 同步设备通道";
52 57 case "delete":
53 58 return "[设备查询] 移除设备";
  59 + default:
  60 + return "";
54 61 }
55   - break;
56 62 case "channel":
57 63 return "[设备查询] 更新通道信息";
58 64 case "transport":
59 65 return "[设备查询] 修改数据流传输模式";
  66 + default:
  67 + return "";
60 68 }
61   - break;
  69 + default:
  70 + return "";
62 71 }
  72 +
  73 + break;
63 74 case "gbStream":
64 75 switch (keyItemArray[3]) {
65 76 case "del":
66 77 return "移除通道与国标的关联";
67 78 case "add":
68 79 return "添加通道与国标的关联";
  80 + default:
  81 + return "";
69 82 }
70   - break;
71 83 case "media":
72 84 break;
73 85 case "position":
... ... @@ -85,8 +97,9 @@ public class ApiSaveConstant {
85 97 return "向上级平台添加国标通道";
86 98 case "del_channel_for_gb":
87 99 return "从上级平台移除国标通道";
  100 + default:
  101 + return "";
88 102 }
89   - break;
90 103 case "platform_gb_stream":
91 104 break;
92 105 case "play":
... ... @@ -101,32 +114,36 @@ public class ApiSaveConstant {
101 114 return "结束转码";
102 115 case "broadcast":
103 116 return "语音广播";
  117 + default:
  118 + return "";
104 119 }
105   - break;
106 120 case "download":
107 121 switch (keyItemArray[3]) {
108 122 case "start":
109 123 return "开始历史媒体下载";
110 124 case "stop":
111 125 return "停止历史媒体下载";
  126 + default:
  127 + return "";
112 128 }
113   - break;
114 129 case "playback":
115 130 switch (keyItemArray[3]) {
116 131 case "start":
117 132 return "开始视频回放";
118 133 case "stop":
119 134 return "停止视频回放";
  135 + default:
  136 + return "";
120 137 }
121   - break;
122 138 case "ptz":
123 139 switch (keyItemArray[3]) {
124 140 case "control":
125 141 return "云台控制";
126 142 case "front_end_command":
127 143 return "通用前端控制命令";
  144 + default:
  145 + return "";
128 146 }
129   - break;
130 147 case "gb_record":
131 148 break;
132 149 case "onvif":
... ... @@ -146,16 +163,18 @@ public class ApiSaveConstant {
146 163 return "启用代理";
147 164 case "stop":
148 165 return "停用代理";
  166 + default:
  167 + return "";
149 168 }
150   - break;
151 169 case "push":
152 170 switch (keyItemArray[3]) {
153 171 case "save_to_gb":
154 172 return "将推流添加到国标";
155 173 case "remove_form_gb":
156 174 return "将推流移出到国标";
  175 + default:
  176 + return "";
157 177 }
158   - break;
159 178 case "user":
160 179 switch (keyItemArray[3]) {
161 180 case "login":
... ... @@ -166,8 +185,11 @@ public class ApiSaveConstant {
166 185 return "添加用户";
167 186 case "delete":
168 187 return "删除用户";
  188 + default:
  189 + return "";
169 190 }
170   - break;
  191 + default:
  192 + return "";
171 193 }
172 194 }
173 195 return null;
... ...
src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java
... ... @@ -13,6 +13,7 @@ import java.io.IOException;
13 13  
14 14 /**
15 15 * 处理匿名用户访问逻辑
  16 + * @author lin
16 17 */
17 18 @Component
18 19 public class AnonymousAuthenticationEntryPoint implements AuthenticationEntryPoint {
... ... @@ -21,7 +22,6 @@ public class AnonymousAuthenticationEntryPoint implements AuthenticationEntryPoi
21 22  
22 23 @Override
23 24 public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) {
24   -// logger.debug("用户需要登录,访问[{}]失败,AuthenticationException=[{}]", request.getRequestURI(), e.getMessage());
25 25 // 允许跨域
26 26 response.setHeader("Access-Control-Allow-Origin", "*");
27 27 // 允许自定义请求头token(允许head跨域)
... ... @@ -30,7 +30,8 @@ public class AnonymousAuthenticationEntryPoint implements AuthenticationEntryPoi
30 30 JSONObject jsonObject = new JSONObject();
31 31 jsonObject.put("code", "-1");
32 32 jsonObject.put("msg", "请登录后重新请求");
33   - if (request.getRequestURI().contains("api/user/login")){
  33 + String logUri = "api/user/login";
  34 + if (request.getRequestURI().contains(logUri)){
34 35 jsonObject.put("msg", e.getMessage());
35 36 }
36 37 response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
... ...
src/main/java/com/genersoft/iot/vmp/domain/req/PresetQuerySipReq.java 0 → 100644
  1 +package com.genersoft.iot.vmp.domain.req;
  2 +
  3 +
  4 +/**
  5 + * @author chenjialing
  6 + */
  7 +public class PresetQuerySipReq {
  8 +
  9 + private String presetId;
  10 +
  11 + private String presetName;
  12 +
  13 + public String getPresetId() {
  14 + return presetId;
  15 + }
  16 +
  17 + public void setPresetId(String presetId) {
  18 + this.presetId = presetId;
  19 + }
  20 +
  21 + public String getPresetName() {
  22 + return presetName;
  23 + }
  24 +
  25 + public void setPresetName(String presetName) {
  26 + this.presetName = presetName;
  27 + }
  28 +}
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarmMethod.java 0 → 100644
  1 +package com.genersoft.iot.vmp.gb28181.bean;
  2 +
  3 +/**
  4 + * 报警方式
  5 + * @author lin
  6 + * 1为电话报警, 2为设备报警, 3为短信报警, 4为 GPS报警, 5为视频报警, 6为设备故障报警,
  7 + * 7其他报警;可以为直接组合如12为电话报警或 设备报警-
  8 + */
  9 +public enum DeviceAlarmMethod {
  10 + // 1为电话报警
  11 + Telephone(1),
  12 +
  13 + // 2为设备报警
  14 + Device(2),
  15 +
  16 + // 3为短信报警
  17 + SMS(3),
  18 +
  19 + // 4为 GPS报警
  20 + GPS(4),
  21 +
  22 + // 5为视频报警
  23 + Video(5),
  24 +
  25 + // 6为设备故障报警
  26 + DeviceFailure(6),
  27 +
  28 + // 7其他报警
  29 + Other(7);
  30 +
  31 + private final int val;
  32 +
  33 + DeviceAlarmMethod(int val) {
  34 + this.val=val;
  35 + }
  36 +
  37 + public int getVal() {
  38 + return val;
  39 + }
  40 +}
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java
... ... @@ -68,9 +68,6 @@ public class SIPRequestHeaderPlarformProvider {
68 68 toHeader, viaHeaders, maxForwards);
69 69  
70 70 List<String> agentParam = new ArrayList<>();
71   - agentParam.add("wvp-pro");
72   - UserAgentHeader userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam);
73   - request.addHeader(userAgentHeader);
74 71  
75 72 ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
76 73 request.setContent(content, contentTypeHeader);
... ... @@ -115,10 +112,6 @@ public class SIPRequestHeaderPlarformProvider {
115 112 ExpiresHeader expires = sipFactory.createHeaderFactory().createExpiresHeader(Integer.parseInt(platform.getExpires()));
116 113 request.addHeader(expires);
117 114  
118   - List<String> agentParam = new ArrayList<>();
119   - agentParam.add("wvp-pro");
120   - UserAgentHeader userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam);
121   - request.addHeader(userAgentHeader);
122 115  
123 116 return request;
124 117 }
... ... @@ -226,10 +219,6 @@ public class SIPRequestHeaderPlarformProvider {
226 219 messageFactory.setDefaultContentEncodingCharset(parentPlatform.getCharacterSet());
227 220 request = messageFactory.createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader,
228 221 toHeader, viaHeaders, maxForwards);
229   - List<String> agentParam = new ArrayList<>();
230   - agentParam.add("wvp-pro");
231   - UserAgentHeader userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam);
232   - request.addHeader(userAgentHeader);
233 222  
234 223 ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
235 224 request.setContent(content, contentTypeHeader);
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
... ... @@ -27,6 +27,7 @@ import org.slf4j.Logger;
27 27 import org.slf4j.LoggerFactory;
28 28 import org.springframework.beans.factory.annotation.Autowired;
29 29 import org.springframework.beans.factory.annotation.Qualifier;
  30 +import org.springframework.boot.SpringBootVersion;
30 31 import org.springframework.context.annotation.DependsOn;
31 32 import org.springframework.stereotype.Component;
32 33 import org.springframework.util.StringUtils;
... ... @@ -37,7 +38,9 @@ import javax.sip.header.*;
37 38 import javax.sip.message.Request;
38 39 import java.lang.reflect.Field;
39 40 import java.text.ParseException;
  41 +import java.util.ArrayList;
40 42 import java.util.HashSet;
  43 +import java.util.List;
41 44  
42 45 /**
43 46 * @description:设备能力接口,用于定义设备的控制、查询能力
... ... @@ -49,7 +52,7 @@ import java.util.HashSet;
49 52 public class SIPCommander implements ISIPCommander {
50 53  
51 54 private final Logger logger = LoggerFactory.getLogger(SIPCommander.class);
52   -
  55 +
53 56 @Autowired
54 57 private SipConfig sipConfig;
55 58  
... ... @@ -1643,7 +1646,18 @@ public class SIPCommander implements ISIPCommander {
1643 1646 } else if("UDP".equals(device.getTransport())) {
1644 1647 clientTransaction = udpSipProvider.getNewClientTransaction(request);
1645 1648 }
1646   -
  1649 + if (request.getHeader(UserAgentHeader.NAME) == null) {
  1650 + List<String> agentParam = new ArrayList<>();
  1651 + agentParam.add("wvp-pro");
  1652 + // TODO 添加版本信息以及日期
  1653 + UserAgentHeader userAgentHeader = null;
  1654 + try {
  1655 + userAgentHeader = sipFactory.createHeaderFactory().createUserAgentHeader(agentParam);
  1656 + } catch (ParseException e) {
  1657 + throw new RuntimeException(e);
  1658 + }
  1659 + request.addHeader(userAgentHeader);
  1660 + }
1647 1661 CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME);
1648 1662 // 添加错误订阅
1649 1663 if (errorEvent != null) {
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java
... ... @@ -32,7 +32,7 @@ import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.*;
32 32 @Component
33 33 public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler {
34 34  
35   - private Logger logger = LoggerFactory.getLogger(AlarmNotifyMessageHandler.class);
  35 + private final Logger logger = LoggerFactory.getLogger(AlarmNotifyMessageHandler.class);
36 36 private final String cmdType = "Alarm";
37 37  
38 38 @Autowired
... ... @@ -85,24 +85,27 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
85 85 deviceAlarm.setAlarmPriority(getText(rootElement, "AlarmPriority"));
86 86 deviceAlarm.setAlarmMethod(getText(rootElement, "AlarmMethod"));
87 87 deviceAlarm.setAlarmTime(getText(rootElement, "AlarmTime"));
88   - if (getText(rootElement, "AlarmDescription") == null) {
  88 + String alarmDescription = getText(rootElement, "AlarmDescription");
  89 + if (alarmDescription == null) {
89 90 deviceAlarm.setAlarmDescription("");
90 91 } else {
91   - deviceAlarm.setAlarmDescription(getText(rootElement, "AlarmDescription"));
  92 + deviceAlarm.setAlarmDescription(alarmDescription);
92 93 }
93   - if (NumericUtil.isDouble(getText(rootElement, "Longitude"))) {
94   - deviceAlarm.setLongitude(Double.parseDouble(getText(rootElement, "Longitude")));
  94 + String longitude = getText(rootElement, "Longitude");
  95 + if (longitude != null && NumericUtil.isDouble(longitude)) {
  96 + deviceAlarm.setLongitude(Double.parseDouble(longitude));
95 97 } else {
96 98 deviceAlarm.setLongitude(0.00);
97 99 }
98   - if (NumericUtil.isDouble(getText(rootElement, "Latitude"))) {
99   - deviceAlarm.setLatitude(Double.parseDouble(getText(rootElement, "Latitude")));
  100 + String latitude = getText(rootElement, "Latitude");
  101 + if (latitude != null && NumericUtil.isDouble(latitude)) {
  102 + deviceAlarm.setLatitude(Double.parseDouble(latitude));
100 103 } else {
101 104 deviceAlarm.setLatitude(0.00);
102 105 }
103 106  
104 107 if (!StringUtils.isEmpty(deviceAlarm.getAlarmMethod())) {
105   - if ( deviceAlarm.getAlarmMethod().equals("4")) {
  108 + if ( deviceAlarm.getAlarmMethod().contains(DeviceAlarmMethod.GPS.getVal() + "")) {
106 109 MobilePosition mobilePosition = new MobilePosition();
107 110 mobilePosition.setDeviceId(deviceAlarm.getDeviceId());
108 111 mobilePosition.setTime(deviceAlarm.getAlarmTime());
... ... @@ -122,7 +125,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
122 125 }
123 126 }
124 127 if (!StringUtils.isEmpty(deviceAlarm.getDeviceId())) {
125   - if (deviceAlarm.getAlarmMethod().equals("5")) {
  128 + if (deviceAlarm.getAlarmMethod().contains(DeviceAlarmMethod.Video.getVal() + "")) {
126 129 deviceAlarm.setAlarmType(getText(rootElement.element("Info"), "AlarmType"));
127 130 }
128 131 }
... ... @@ -173,25 +176,28 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme
173 176 deviceAlarm.setAlarmPriority(getText(rootElement, "AlarmPriority"));
174 177 deviceAlarm.setAlarmMethod(getText(rootElement, "AlarmMethod"));
175 178 deviceAlarm.setAlarmTime(getText(rootElement, "AlarmTime"));
176   - if (getText(rootElement, "AlarmDescription") == null) {
  179 + String alarmDescription = getText(rootElement, "AlarmDescription");
  180 + if (alarmDescription == null) {
177 181 deviceAlarm.setAlarmDescription("");
178 182 } else {
179   - deviceAlarm.setAlarmDescription(getText(rootElement, "AlarmDescription"));
  183 + deviceAlarm.setAlarmDescription(alarmDescription);
180 184 }
181   - if (NumericUtil.isDouble(getText(rootElement, "Longitude"))) {
182   - deviceAlarm.setLongitude(Double.parseDouble(getText(rootElement, "Longitude")));
  185 + String longitude = getText(rootElement, "Longitude");
  186 + if (longitude != null && NumericUtil.isDouble(longitude)) {
  187 + deviceAlarm.setLongitude(Double.parseDouble(longitude));
183 188 } else {
184 189 deviceAlarm.setLongitude(0.00);
185 190 }
186   - if (NumericUtil.isDouble(getText(rootElement, "Latitude"))) {
187   - deviceAlarm.setLatitude(Double.parseDouble(getText(rootElement, "Latitude")));
  191 + String latitude = getText(rootElement, "Latitude");
  192 + if (latitude != null && NumericUtil.isDouble(latitude)) {
  193 + deviceAlarm.setLatitude(Double.parseDouble(latitude));
188 194 } else {
189 195 deviceAlarm.setLatitude(0.00);
190 196 }
191 197  
192 198 if (!StringUtils.isEmpty(deviceAlarm.getAlarmMethod())) {
193 199  
194   - if (deviceAlarm.getAlarmMethod().equals("5")) {
  200 + if (deviceAlarm.getAlarmMethod().contains(DeviceAlarmMethod.Video.getVal() + "")) {
195 201 deviceAlarm.setAlarmType(getText(rootElement.element("Info"), "AlarmType"));
196 202 }
197 203 }
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/PresetQueryResponseMessageHandler.java 0 → 100644
  1 +package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.cmd;
  2 +
  3 +import com.genersoft.iot.vmp.conf.SipConfig;
  4 +import com.genersoft.iot.vmp.conf.UserSetting;
  5 +import com.genersoft.iot.vmp.domain.req.PresetQuerySipReq;
  6 +import com.genersoft.iot.vmp.gb28181.bean.*;
  7 +import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
  8 +import com.genersoft.iot.vmp.gb28181.session.CatalogDataCatch;
  9 +import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
  10 +import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
  11 +import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
  12 +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
  13 +import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler;
  14 +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform;
  15 +import com.genersoft.iot.vmp.gb28181.utils.NumericUtil;
  16 +import com.genersoft.iot.vmp.gb28181.utils.XmlUtil;
  17 +import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
  18 +import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
  19 +import org.dom4j.DocumentException;
  20 +import org.dom4j.Element;
  21 +import org.slf4j.Logger;
  22 +import org.slf4j.LoggerFactory;
  23 +import org.springframework.beans.factory.InitializingBean;
  24 +import org.springframework.beans.factory.annotation.Autowired;
  25 +import org.springframework.stereotype.Component;
  26 +import org.springframework.util.StringUtils;
  27 +
  28 +import javax.sip.InvalidArgumentException;
  29 +import javax.sip.RequestEvent;
  30 +import javax.sip.SipException;
  31 +import javax.sip.message.Response;
  32 +import java.text.ParseException;
  33 +import java.text.SimpleDateFormat;
  34 +import java.util.ArrayList;
  35 +import java.util.Iterator;
  36 +import java.util.List;
  37 +import java.util.UUID;
  38 +
  39 +import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.getText;
  40 +
  41 +@Component
  42 +public class PresetQueryResponseMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler {
  43 +
  44 + private Logger logger = LoggerFactory.getLogger(PresetQueryResponseMessageHandler.class);
  45 + private final String cmdType = "PresetQuery";
  46 +
  47 + private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  48 +
  49 + @Autowired
  50 + private ResponseMessageHandler responseMessageHandler;
  51 +
  52 + @Autowired
  53 + private DeferredResultHolder deferredResultHolder;
  54 +
  55 +
  56 + @Override
  57 + public void afterPropertiesSet() throws Exception {
  58 + responseMessageHandler.addHandler(cmdType, this);
  59 + }
  60 +
  61 + @Override
  62 + public void handForDevice(RequestEvent evt, Device device, Element element) {
  63 + Element rootElement = null;
  64 + try {
  65 + rootElement = getRootElement(evt, device.getCharset());
  66 +
  67 + Element presetListNumElement = rootElement.element("PresetList");
  68 + Element snElement = rootElement.element("SN");
  69 + //该字段可能为通道或则设备的id
  70 + String deviceId = getText(rootElement, "DeviceID");
  71 + String key = DeferredResultHolder.CALLBACK_CMD_PRESETQUERY + deviceId;
  72 + if (snElement == null || presetListNumElement == null) {
  73 + responseAck(evt, Response.BAD_REQUEST, "xml error");
  74 + return;
  75 + }
  76 + int sumNum = Integer.parseInt(presetListNumElement.attributeValue("Num"));
  77 + List<PresetQuerySipReq> presetQuerySipReqList = new ArrayList<>();
  78 + if (sumNum == 0) {
  79 + // 数据无预置位信息
  80 +
  81 +
  82 + }else {
  83 + for (Iterator<Element> presetIterator = presetListNumElement.elementIterator();presetIterator.hasNext();){
  84 + Element itemListElement = presetIterator.next();
  85 + PresetQuerySipReq presetQuerySipReq = new PresetQuerySipReq();
  86 + for (Iterator<Element> itemListIterator = itemListElement.elementIterator();itemListIterator.hasNext();){
  87 + // 遍历item
  88 + Element itemOne = itemListIterator.next();
  89 + String name = itemOne.getName();
  90 + String textTrim = itemOne.getTextTrim();
  91 + if("PresetID".equals(name)){
  92 + presetQuerySipReq.setPresetId(textTrim);
  93 + }else {
  94 + presetQuerySipReq.setPresetName(textTrim);
  95 + }
  96 + }
  97 + presetQuerySipReqList.add(presetQuerySipReq);
  98 +
  99 +
  100 + }
  101 +
  102 + }
  103 + RequestMessage requestMessage = new RequestMessage();
  104 + requestMessage.setKey(key);
  105 + requestMessage.setData(presetQuerySipReqList);
  106 + deferredResultHolder.invokeAllResult(requestMessage);
  107 + responseAck(evt, Response.OK);
  108 + } catch (DocumentException e) {
  109 + e.printStackTrace();
  110 + } catch (InvalidArgumentException e) {
  111 + e.printStackTrace();
  112 + } catch (ParseException e) {
  113 + e.printStackTrace();
  114 + } catch (SipException e) {
  115 + e.printStackTrace();
  116 + }
  117 + }
  118 +
  119 + @Override
  120 + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) {
  121 +
  122 + }
  123 +
  124 +}
... ...
web_src/index.html
... ... @@ -12,26 +12,7 @@
12 12 <script type="text/javascript" src="./static/js/jessibuca/jessibuca.js"></script>
13 13 <script type="text/javascript" src="./static/js/EasyWasmPlayer.js"></script>
14 14 <script type="text/javascript" src="./static/js/ZLMRTCClient.js"></script>
  15 + <script type="text/javascript" src="./static/js/mapConfig.js"></script>
15 16 <div id="app"></div>
16   - <!-- built files will be auto injected -->
17   - <script>
18   - // map组件全局参数, 注释此内容可以关闭地图功能
19   - window.mapParam = {
20   - // 坐标系 GCJ-02 WGS-84,
21   - coordinateSystem: "GCJ-02",
22   - // 地图瓦片地址
23   - tilesUrl: "http://webrd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8",
24   - // 瓦片大小
25   - tileSize: 256,
26   - // 默认层级
27   - zoom:10,
28   - // 默认地图中心点
29   - center:[116.41020, 39.915119],
30   - // 地图最大层级
31   - maxZoom:18,
32   - // 地图最小层级
33   - minZoom: 3
34   - }
35   - </script>
36 17 </body>
37 18 </html>
... ...
web_src/src/components/devicePosition.vue
... ... @@ -59,7 +59,7 @@ export default {
59 59 },
60 60 data() {
61 61 return {
62   - onOff: typeof window.mapParam !== "undefined",
  62 + onOff: typeof window.mapParam !== "undefined" && window.mapParam.enable,
63 63 deviceService: new DeviceService(),
64 64 layer: null,
65 65 lineLayer: null,
... ...
web_src/static/js/mapConfig.js 0 → 100644
  1 +// map组件全局参数, 注释此内容可以关闭地图功能
  2 +window.mapParam = {
  3 + // 开启/关闭地图功能
  4 + enable: true,
  5 + // 坐标系 GCJ-02 WGS-84,
  6 + coordinateSystem: "GCJ-02",
  7 + // 地图瓦片地址
  8 + tilesUrl: "http://webrd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8",
  9 + // 瓦片大小
  10 + tileSize: 256,
  11 + // 默认层级
  12 + zoom:10,
  13 + // 默认地图中心点
  14 + center:[116.41020, 39.915119],
  15 + // 地图最大层级
  16 + maxZoom:18,
  17 + // 地图最小层级
  18 + minZoom: 3
  19 +}
... ...