Commit a53dce38c2f58c0bfd37203e46dc57aa56025f45

Authored by 648540858
Committed by GitHub
2 parents c04de4cd 5f7c5382

Merge pull request #673 from 648540858/wvp-28181-2.0-multi-network

Wvp 28181 2.0 multi network
Showing 49 changed files with 1258 additions and 844 deletions
sql/update.sql
@@ -17,6 +17,9 @@ alter table device @@ -17,6 +17,9 @@ alter table device
17 add sdpIp varchar(50) default null; 17 add sdpIp varchar(50) default null;
18 18
19 alter table device 19 alter table device
  20 + add localIp varchar(50) default null;
  21 +
  22 +alter table device
20 add password varchar(255) default null; 23 add password varchar(255) default null;
21 24
22 alter table device 25 alter table device
src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
@@ -2,8 +2,10 @@ package com.genersoft.iot.vmp.common; @@ -2,8 +2,10 @@ package com.genersoft.iot.vmp.common;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4
  5 +import java.io.Serializable;
  6 +
5 @Schema(description = "流信息") 7 @Schema(description = "流信息")
6 -public class StreamInfo { 8 +public class StreamInfo implements Serializable, Cloneable{
7 9
8 @Schema(description = "应用名") 10 @Schema(description = "应用名")
9 private String app; 11 private String app;
@@ -13,54 +15,56 @@ public class StreamInfo { @@ -13,54 +15,56 @@ public class StreamInfo {
13 private String deviceID; 15 private String deviceID;
14 @Schema(description = "通道编号") 16 @Schema(description = "通道编号")
15 private String channelId; 17 private String channelId;
16 - @Schema(description = "HTTP-FLV流地址")  
17 - private String flv;  
18 18
19 @Schema(description = "IP") 19 @Schema(description = "IP")
20 private String ip; 20 private String ip;
  21 +
  22 + @Schema(description = "HTTP-FLV流地址")
  23 + private StreamURL flv;
  24 +
21 @Schema(description = "HTTPS-FLV流地址") 25 @Schema(description = "HTTPS-FLV流地址")
22 - private String https_flv; 26 + private StreamURL https_flv;
23 @Schema(description = "Websocket-FLV流地址") 27 @Schema(description = "Websocket-FLV流地址")
24 - private String ws_flv; 28 + private StreamURL ws_flv;
25 @Schema(description = "Websockets-FLV流地址") 29 @Schema(description = "Websockets-FLV流地址")
26 - private String wss_flv; 30 + private StreamURL wss_flv;
27 @Schema(description = "HTTP-FMP4流地址") 31 @Schema(description = "HTTP-FMP4流地址")
28 - private String fmp4; 32 + private StreamURL fmp4;
29 @Schema(description = "HTTPS-FMP4流地址") 33 @Schema(description = "HTTPS-FMP4流地址")
30 - private String https_fmp4; 34 + private StreamURL https_fmp4;
31 @Schema(description = "Websocket-FMP4流地址") 35 @Schema(description = "Websocket-FMP4流地址")
32 - private String ws_fmp4; 36 + private StreamURL ws_fmp4;
33 @Schema(description = "Websockets-FMP4流地址") 37 @Schema(description = "Websockets-FMP4流地址")
34 - private String wss_fmp4; 38 + private StreamURL wss_fmp4;
35 @Schema(description = "HLS流地址") 39 @Schema(description = "HLS流地址")
36 - private String hls; 40 + private StreamURL hls;
37 @Schema(description = "HTTPS-HLS流地址") 41 @Schema(description = "HTTPS-HLS流地址")
38 - private String https_hls; 42 + private StreamURL https_hls;
39 @Schema(description = "Websocket-HLS流地址") 43 @Schema(description = "Websocket-HLS流地址")
40 - private String ws_hls; 44 + private StreamURL ws_hls;
41 @Schema(description = "Websockets-HLS流地址") 45 @Schema(description = "Websockets-HLS流地址")
42 - private String wss_hls; 46 + private StreamURL wss_hls;
43 @Schema(description = "HTTP-TS流地址") 47 @Schema(description = "HTTP-TS流地址")
44 - private String ts; 48 + private StreamURL ts;
45 @Schema(description = "HTTPS-TS流地址") 49 @Schema(description = "HTTPS-TS流地址")
46 - private String https_ts; 50 + private StreamURL https_ts;
47 @Schema(description = "Websocket-TS流地址") 51 @Schema(description = "Websocket-TS流地址")
48 - private String ws_ts; 52 + private StreamURL ws_ts;
49 @Schema(description = "Websockets-TS流地址") 53 @Schema(description = "Websockets-TS流地址")
50 - private String wss_ts; 54 + private StreamURL wss_ts;
51 @Schema(description = "RTMP流地址") 55 @Schema(description = "RTMP流地址")
52 - private String rtmp; 56 + private StreamURL rtmp;
53 @Schema(description = "RTMPS流地址") 57 @Schema(description = "RTMPS流地址")
54 - private String rtmps; 58 + private StreamURL rtmps;
55 @Schema(description = "RTSP流地址") 59 @Schema(description = "RTSP流地址")
56 - private String rtsp; 60 + private StreamURL rtsp;
57 @Schema(description = "RTSPS流地址") 61 @Schema(description = "RTSPS流地址")
58 - private String rtsps; 62 + private StreamURL rtsps;
59 @Schema(description = "RTC流地址") 63 @Schema(description = "RTC流地址")
60 - private String rtc; 64 + private StreamURL rtc;
61 65
62 @Schema(description = "RTCS流地址") 66 @Schema(description = "RTCS流地址")
63 - private String rtcs; 67 + private StreamURL rtcs;
64 @Schema(description = "流媒体ID") 68 @Schema(description = "流媒体ID")
65 private String mediaServerId; 69 private String mediaServerId;
66 @Schema(description = "流编码信息") 70 @Schema(description = "流编码信息")
@@ -75,125 +79,221 @@ public class StreamInfo { @@ -75,125 +79,221 @@ public class StreamInfo {
75 @Schema(description = "是否暂停(录像回放使用)") 79 @Schema(description = "是否暂停(录像回放使用)")
76 private boolean pause; 80 private boolean pause;
77 81
78 - public static class TransactionInfo{  
79 - public String callId;  
80 - public String localTag;  
81 - public String remoteTag;  
82 - public String branch; 82 + public void setFlv(StreamURL flv) {
  83 + this.flv = flv;
83 } 84 }
84 85
85 - private TransactionInfo transactionInfo; 86 + public void setHttps_flv(StreamURL https_flv) {
  87 + this.https_flv = https_flv;
  88 + }
86 89
87 - public String getApp() {  
88 - return app; 90 + public void setWs_flv(StreamURL ws_flv) {
  91 + this.ws_flv = ws_flv;
89 } 92 }
90 93
91 - public void setApp(String app) {  
92 - this.app = app; 94 + public void setWss_flv(StreamURL wss_flv) {
  95 + this.wss_flv = wss_flv;
93 } 96 }
94 97
95 - public String getDeviceID() {  
96 - return deviceID; 98 + public void setFmp4(StreamURL fmp4) {
  99 + this.fmp4 = fmp4;
97 } 100 }
98 101
99 - public void setDeviceID(String deviceID) {  
100 - this.deviceID = deviceID; 102 + public void setHttps_fmp4(StreamURL https_fmp4) {
  103 + this.https_fmp4 = https_fmp4;
101 } 104 }
102 105
103 - public String getChannelId() {  
104 - return channelId; 106 + public void setWs_fmp4(StreamURL ws_fmp4) {
  107 + this.ws_fmp4 = ws_fmp4;
105 } 108 }
106 109
107 - public void setChannelId(String channelId) {  
108 - this.channelId = channelId; 110 + public void setWss_fmp4(StreamURL wss_fmp4) {
  111 + this.wss_fmp4 = wss_fmp4;
109 } 112 }
110 113
111 - public String getFlv() {  
112 - return flv; 114 + public void setHls(StreamURL hls) {
  115 + this.hls = hls;
113 } 116 }
114 117
115 - public void setFlv(String flv) {  
116 - this.flv = flv; 118 + public void setHttps_hls(StreamURL https_hls) {
  119 + this.https_hls = https_hls;
117 } 120 }
118 121
119 - public String getWs_flv() {  
120 - return ws_flv; 122 + public void setWs_hls(StreamURL ws_hls) {
  123 + this.ws_hls = ws_hls;
121 } 124 }
122 125
123 - public void setWs_flv(String ws_flv) {  
124 - this.ws_flv = ws_flv; 126 + public void setWss_hls(StreamURL wss_hls) {
  127 + this.wss_hls = wss_hls;
125 } 128 }
126 129
127 - public String getRtmp() {  
128 - return rtmp; 130 + public void setTs(StreamURL ts) {
  131 + this.ts = ts;
129 } 132 }
130 133
131 - public void setRtmp(String rtmp) {  
132 - this.rtmp = rtmp; 134 + public void setHttps_ts(StreamURL https_ts) {
  135 + this.https_ts = https_ts;
133 } 136 }
134 137
135 - public String getHls() {  
136 - return hls; 138 + public void setWs_ts(StreamURL ws_ts) {
  139 + this.ws_ts = ws_ts;
137 } 140 }
138 141
139 - public void setHls(String hls) {  
140 - this.hls = hls; 142 + public void setWss_ts(StreamURL wss_ts) {
  143 + this.wss_ts = wss_ts;
141 } 144 }
142 145
143 - public String getRtsp() {  
144 - return rtsp; 146 + public void setRtmp(StreamURL rtmp) {
  147 + this.rtmp = rtmp;
145 } 148 }
146 149
147 - public void setRtsp(String rtsp) {  
148 - this.rtsp = rtsp; 150 + public void setRtmps(StreamURL rtmps) {
  151 + this.rtmps = rtmps;
149 } 152 }
150 153
151 - public Object getTracks() {  
152 - return tracks; 154 + public void setRtsp(StreamURL rtsp) {
  155 + this.rtsp = rtsp;
153 } 156 }
154 157
155 - public void setTracks(Object tracks) {  
156 - this.tracks = tracks; 158 + public void setRtsps(StreamURL rtsps) {
  159 + this.rtsps = rtsps;
157 } 160 }
158 161
159 - public String getFmp4() {  
160 - return fmp4; 162 + public void setRtc(StreamURL rtc) {
  163 + this.rtc = rtc;
161 } 164 }
162 165
163 - public void setFmp4(String fmp4) {  
164 - this.fmp4 = fmp4; 166 + public void setRtcs(StreamURL rtcs) {
  167 + this.rtcs = rtcs;
165 } 168 }
166 169
167 - public String getWs_fmp4() {  
168 - return ws_fmp4; 170 + public void setRtmp(String host, int port, int sslPort, String app, String stream, String callIdParam) {
  171 + String file = String.format("%s/%s/%s", app, stream, callIdParam);
  172 + this.rtmp = new StreamURL("rtmp", host, port, file);
  173 + if (sslPort != 0) {
  174 + this.rtmps = new StreamURL("rtmps", host, sslPort, file);
  175 + }
  176 + }
  177 +
  178 + public void setRtsp(String host, int port, int sslPort, String app, String stream, String callIdParam) {
  179 + String file = String.format("%s/%s/%s", app, stream, callIdParam);
  180 + this.rtsp = new StreamURL("rtsp", host, port, file);
  181 + if (sslPort != 0) {
  182 + this.rtsps = new StreamURL("rtsps", host, sslPort, file);
  183 + }
  184 + }
  185 +
  186 + public void setFlv(String host, int port, int sslPort, String app, String stream, String callIdParam) {
  187 + String file = String.format("%s/%s.live.flv%s", app, stream, callIdParam);
  188 + this.flv = new StreamURL("http", host, port, file);
  189 + this.ws_flv = new StreamURL("ws", host, port, file);
  190 + if (sslPort != 0) {
  191 + this.https_flv = new StreamURL("https", host, sslPort, file);
  192 + this.wss_flv = new StreamURL("wss", host, sslPort, file);
  193 + }
  194 + }
  195 +
  196 + public void setFmp4(String host, int port, int sslPort, String app, String stream, String callIdParam) {
  197 + String file = String.format("%s/%s.live.mp4%s", app, stream, callIdParam);
  198 + this.fmp4 = new StreamURL("http", host, port, file);
  199 + this.ws_fmp4 = new StreamURL("ws", host, port, file);
  200 + if (sslPort != 0) {
  201 + this.https_fmp4 = new StreamURL("https", host, sslPort, file);
  202 + this.wss_fmp4 = new StreamURL("wss", host, sslPort, file);
  203 + }
  204 + }
  205 +
  206 + public void setHls(String host, int port, int sslPort, String app, String stream, String callIdParam) {
  207 + String file = String.format("%s/%s/hls.m3u8%s", app, stream, callIdParam);
  208 + this.hls = new StreamURL("http", host, port, file);
  209 + this.ws_hls = new StreamURL("ws", host, port, file);
  210 + if (sslPort != 0) {
  211 + this.https_hls = new StreamURL("https", host, sslPort, file);
  212 + this.wss_hls = new StreamURL("wss", host, sslPort, file);
  213 + }
  214 + }
  215 +
  216 + public void setTs(String host, int port, int sslPort, String app, String stream, String callIdParam) {
  217 + String file = String.format("%s/%s.live.ts%s", app, stream, callIdParam);
  218 + this.ts = new StreamURL("http", host, port, file);
  219 + this.ws_ts = new StreamURL("ws", host, port, file);
  220 + if (sslPort != 0) {
  221 + this.https_ts = new StreamURL("https", host, sslPort, file);
  222 + this.wss_ts = new StreamURL("wss", host, sslPort, file);
  223 + }
  224 + }
  225 +
  226 + public void setRtc(String host, int port, int sslPort, String app, String stream, String callIdParam) {
  227 + String file = String.format("index/api/webrtc?app=%s&stream=%s&type=play%s", app, stream, callIdParam);
  228 + this.rtc = new StreamURL("http", host, port, file);
  229 + if (sslPort != 0) {
  230 + this.rtcs = new StreamURL("https", host, sslPort, file);
  231 + }
  232 + }
  233 +
  234 + public void channgeStreamIp(String localAddr) {
  235 + this.flv.setHost(localAddr);
  236 + this.ws_flv.setHost(localAddr);
  237 + this.hls.setHost(localAddr);
  238 + this.ws_hls.setHost(localAddr);
  239 + this.ts.setHost(localAddr);
  240 + this.ws_ts.setHost(localAddr);
  241 + this.fmp4.setHost(localAddr);
  242 + this.ws_fmp4.setHost(localAddr);
  243 + this.rtc.setHost(localAddr);
  244 + if (this.https_flv != null) {
  245 + this.https_flv.setHost(localAddr);
  246 + this.wss_flv.setHost(localAddr);
  247 + this.https_hls.setHost(localAddr);
  248 + this.wss_hls.setHost(localAddr);
  249 + this.wss_ts.setHost(localAddr);
  250 + this.https_fmp4.setHost(localAddr);
  251 + this.wss_fmp4.setHost(localAddr);
  252 + this.rtcs.setHost(localAddr);
  253 + }
  254 + this.rtsp.setHost(localAddr);
  255 + if (this.rtsps != null) {
  256 + this.rtsps.setHost(localAddr);
  257 + }
  258 + this.rtmp.setHost(localAddr);
  259 + if (this.rtmps != null) {
  260 + this.rtmps.setHost(localAddr);
  261 + }
  262 +
169 } 263 }
170 264
171 - public void setWs_fmp4(String ws_fmp4) {  
172 - this.ws_fmp4 = ws_fmp4; 265 +
  266 + public static class TransactionInfo{
  267 + public String callId;
  268 + public String localTag;
  269 + public String remoteTag;
  270 + public String branch;
173 } 271 }
174 272
175 - public String getWs_hls() {  
176 - return ws_hls; 273 + private TransactionInfo transactionInfo;
  274 +
  275 + public String getApp() {
  276 + return app;
177 } 277 }
178 278
179 - public void setWs_hls(String ws_hls) {  
180 - this.ws_hls = ws_hls; 279 + public void setApp(String app) {
  280 + this.app = app;
181 } 281 }
182 282
183 - public String getTs() {  
184 - return ts; 283 + public String getDeviceID() {
  284 + return deviceID;
185 } 285 }
186 286
187 - public void setTs(String ts) {  
188 - this.ts = ts; 287 + public void setDeviceID(String deviceID) {
  288 + this.deviceID = deviceID;
189 } 289 }
190 290
191 - public String getWs_ts() {  
192 - return ws_ts; 291 + public String getChannelId() {
  292 + return channelId;
193 } 293 }
194 294
195 - public void setWs_ts(String ws_ts) {  
196 - this.ws_ts = ws_ts; 295 + public void setChannelId(String channelId) {
  296 + this.channelId = channelId;
197 } 297 }
198 298
199 public String getStream() { 299 public String getStream() {
@@ -204,110 +304,125 @@ public class StreamInfo { @@ -204,110 +304,125 @@ public class StreamInfo {
204 this.stream = stream; 304 this.stream = stream;
205 } 305 }
206 306
207 - public String getRtc() {  
208 - return rtc; 307 + public String getIp() {
  308 + return ip;
209 } 309 }
210 310
211 - public void setRtc(String rtc) {  
212 - this.rtc = rtc; 311 + public void setIp(String ip) {
  312 + this.ip = ip;
213 } 313 }
214 314
215 - public TransactionInfo getTransactionInfo() {  
216 - return transactionInfo; 315 + public StreamURL getFlv() {
  316 + return flv;
217 } 317 }
218 318
219 - public void setTransactionInfo(TransactionInfo transactionInfo) {  
220 - this.transactionInfo = transactionInfo; 319 + public StreamURL getHttps_flv() {
  320 + return https_flv;
221 } 321 }
222 322
223 - public String getMediaServerId() {  
224 - return mediaServerId; 323 + public StreamURL getWs_flv() {
  324 + return ws_flv;
225 } 325 }
226 326
227 - public void setMediaServerId(String mediaServerId) {  
228 - this.mediaServerId = mediaServerId;  
229 - }  
230 327
231 - public String getHttps_flv() {  
232 - return https_flv; 328 + public StreamURL getWss_flv() {
  329 + return wss_flv;
233 } 330 }
234 331
235 - public void setHttps_flv(String https_flv) {  
236 - this.https_flv = https_flv; 332 + public StreamURL getFmp4() {
  333 + return fmp4;
237 } 334 }
238 335
239 - public String getWss_flv() {  
240 - return wss_flv; 336 +
  337 +
  338 + public StreamURL getHttps_fmp4() {
  339 + return https_fmp4;
241 } 340 }
242 341
243 - public void setWss_flv(String wss_flv) {  
244 - this.wss_flv = wss_flv; 342 + public StreamURL getWs_fmp4() {
  343 + return ws_fmp4;
245 } 344 }
246 345
247 - public String getWss_fmp4() { 346 + public StreamURL getWss_fmp4() {
248 return wss_fmp4; 347 return wss_fmp4;
249 } 348 }
250 349
251 - public void setWss_fmp4(String wss_fmp4) {  
252 - this.wss_fmp4 = wss_fmp4; 350 + public StreamURL getHls() {
  351 + return hls;
253 } 352 }
254 353
255 - public String getWss_hls() { 354 +
  355 + public StreamURL getHttps_hls() {
  356 + return https_hls;
  357 + }
  358 +
  359 + public StreamURL getWs_hls() {
  360 + return ws_hls;
  361 + }
  362 +
  363 + public StreamURL getWss_hls() {
256 return wss_hls; 364 return wss_hls;
257 } 365 }
258 366
259 - public void setWss_hls(String wss_hls) {  
260 - this.wss_hls = wss_hls; 367 + public StreamURL getTs() {
  368 + return ts;
261 } 369 }
262 370
263 - public String getWss_ts() {  
264 - return wss_ts; 371 +
  372 + public StreamURL getHttps_ts() {
  373 + return https_ts;
265 } 374 }
266 375
267 - public void setWss_ts(String wss_ts) {  
268 - this.wss_ts = wss_ts; 376 +
  377 + public StreamURL getWs_ts() {
  378 + return ws_ts;
269 } 379 }
270 380
271 - public String getRtmps() {  
272 - return rtmps; 381 +
  382 + public StreamURL getWss_ts() {
  383 + return wss_ts;
273 } 384 }
274 385
275 - public void setRtmps(String rtmps) {  
276 - this.rtmps = rtmps; 386 +
  387 + public StreamURL getRtmp() {
  388 + return rtmp;
277 } 389 }
278 390
279 - public String getRtsps() {  
280 - return rtsps; 391 + public StreamURL getRtmps() {
  392 + return rtmps;
281 } 393 }
282 394
283 - public void setRtsps(String rtsps) {  
284 - this.rtsps = rtsps; 395 + public StreamURL getRtsp() {
  396 + return rtsp;
285 } 397 }
286 398
287 - public String getHttps_hls() {  
288 - return https_hls; 399 + public StreamURL getRtsps() {
  400 + return rtsps;
289 } 401 }
290 402
291 - public void setHttps_hls(String https_hls) {  
292 - this.https_hls = https_hls; 403 + public StreamURL getRtc() {
  404 + return rtc;
293 } 405 }
294 406
295 - public String getHttps_fmp4() {  
296 - return https_fmp4; 407 + public StreamURL getRtcs() {
  408 + return rtcs;
297 } 409 }
298 410
299 - public void setHttps_fmp4(String https_fmp4) {  
300 - this.https_fmp4 = https_fmp4; 411 + public String getMediaServerId() {
  412 + return mediaServerId;
301 } 413 }
302 414
303 - public String getHttps_ts() {  
304 - return https_ts; 415 + public void setMediaServerId(String mediaServerId) {
  416 + this.mediaServerId = mediaServerId;
305 } 417 }
306 418
307 - public void setHttps_ts(String https_ts) {  
308 - this.https_ts = https_ts; 419 + public Object getTracks() {
  420 + return tracks;
309 } 421 }
310 422
  423 + public void setTracks(Object tracks) {
  424 + this.tracks = tracks;
  425 + }
311 426
312 public String getStartTime() { 427 public String getStartTime() {
313 return startTime; 428 return startTime;
@@ -333,27 +448,30 @@ public class StreamInfo { @@ -333,27 +448,30 @@ public class StreamInfo {
333 this.progress = progress; 448 this.progress = progress;
334 } 449 }
335 450
336 - public String getIp() {  
337 - return ip;  
338 - }  
339 -  
340 - public void setIp(String ip) {  
341 - this.ip = ip; 451 + public boolean isPause() {
  452 + return pause;
342 } 453 }
343 454
344 - public String getRtcs() {  
345 - return rtcs; 455 + public void setPause(boolean pause) {
  456 + this.pause = pause;
346 } 457 }
347 458
348 - public void setRtcs(String rtcs) {  
349 - this.rtcs = rtcs; 459 + public TransactionInfo getTransactionInfo() {
  460 + return transactionInfo;
350 } 461 }
351 462
352 - public boolean isPause() {  
353 - return pause; 463 + public void setTransactionInfo(TransactionInfo transactionInfo) {
  464 + this.transactionInfo = transactionInfo;
354 } 465 }
355 466
356 - public void setPause(boolean pause) {  
357 - this.pause = pause; 467 + @Override
  468 + public StreamInfo clone() {
  469 + StreamInfo instance = null;
  470 + try{
  471 + instance = (StreamInfo)super.clone();
  472 + }catch(CloneNotSupportedException e) {
  473 + e.printStackTrace();
  474 + }
  475 + return instance;
358 } 476 }
359 } 477 }
src/main/java/com/genersoft/iot/vmp/common/StreamURL.java 0 → 100644
  1 +package com.genersoft.iot.vmp.common;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +
  5 +import java.io.Serializable;
  6 +
  7 +
  8 +@Schema(description = "流地址信息")
  9 +public class StreamURL implements Serializable {
  10 +
  11 + @Schema(description = "协议")
  12 + private String protocol;
  13 +
  14 + @Schema(description = "主机地址")
  15 + private String host;
  16 +
  17 + @Schema(description = "端口")
  18 + private int port = -1;
  19 +
  20 + @Schema(description = "定位位置")
  21 + private String file;
  22 +
  23 + @Schema(description = "拼接后的地址")
  24 + private String url;
  25 +
  26 + public StreamURL() {
  27 + }
  28 +
  29 + public StreamURL(String protocol, String host, int port, String file) {
  30 + this.protocol = protocol;
  31 + this.host = host;
  32 + this.port = port;
  33 + this.file = file;
  34 + }
  35 +
  36 + public String getProtocol() {
  37 + return protocol;
  38 + }
  39 +
  40 + public void setProtocol(String protocol) {
  41 + this.protocol = protocol;
  42 + }
  43 +
  44 + public String getHost() {
  45 + return host;
  46 + }
  47 +
  48 + public void setHost(String host) {
  49 + this.host = host;
  50 + }
  51 +
  52 + public int getPort() {
  53 + return port;
  54 + }
  55 +
  56 + public void setPort(int port) {
  57 + this.port = port;
  58 + }
  59 +
  60 + public String getFile() {
  61 + return file;
  62 + }
  63 +
  64 + public void setFile(String file) {
  65 + this.file = file;
  66 + }
  67 +
  68 + public String getUrl() {
  69 + return this.toString();
  70 + }
  71 +
  72 + @Override
  73 + public String toString() {
  74 + if (protocol != null && host != null && port != -1 ) {
  75 + return String.format("%s://%s:%s/%s", protocol, host, port, file);
  76 + }else {
  77 + return null;
  78 + }
  79 + }
  80 +}
src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java
@@ -127,11 +127,15 @@ public class DynamicTask { @@ -127,11 +127,15 @@ public class DynamicTask {
127 public void execute(){ 127 public void execute(){
128 if (futureMap.size() > 0) { 128 if (futureMap.size() > 0) {
129 for (String key : futureMap.keySet()) { 129 for (String key : futureMap.keySet()) {
130 - if (futureMap.get(key).isDone()) { 130 + if (futureMap.get(key).isDone() || futureMap.get(key).isCancelled()) {
131 futureMap.remove(key); 131 futureMap.remove(key);
132 runnableMap.remove(key); 132 runnableMap.remove(key);
133 } 133 }
134 } 134 }
135 } 135 }
136 } 136 }
  137 +
  138 + public boolean isAlive(String key) {
  139 + return futureMap.get(key) != null && !futureMap.get(key).isDone() && !futureMap.get(key).isCancelled();
  140 + }
137 } 141 }
src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java
@@ -25,7 +25,7 @@ public class MediaConfig{ @@ -25,7 +25,7 @@ public class MediaConfig{
25 @Value("${media.ip}") 25 @Value("${media.ip}")
26 private String ip; 26 private String ip;
27 27
28 - @Value("${media.hook-ip:${sip.ip}}") 28 + @Value("${media.hook-ip:}")
29 private String hookIp; 29 private String hookIp;
30 30
31 @Value("${sip.ip}") 31 @Value("${sip.ip}")
@@ -86,7 +86,7 @@ public class MediaConfig{ @@ -86,7 +86,7 @@ public class MediaConfig{
86 86
87 public String getHookIp() { 87 public String getHookIp() {
88 if (ObjectUtils.isEmpty(hookIp)){ 88 if (ObjectUtils.isEmpty(hookIp)){
89 - return sipIp; 89 + return sipIp.split(",")[0];
90 }else { 90 }else {
91 return hookIp; 91 return hookIp;
92 } 92 }
src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java
@@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.conf; @@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.conf;
3 3
4 import org.springframework.boot.context.properties.ConfigurationProperties; 4 import org.springframework.boot.context.properties.ConfigurationProperties;
5 import org.springframework.stereotype.Component; 5 import org.springframework.stereotype.Component;
  6 +import org.springframework.util.ObjectUtils;
6 7
7 @Component 8 @Component
8 @ConfigurationProperties(prefix = "sip", ignoreInvalidFields = true) 9 @ConfigurationProperties(prefix = "sip", ignoreInvalidFields = true)
@@ -10,11 +11,6 @@ public class SipConfig { @@ -10,11 +11,6 @@ public class SipConfig {
10 11
11 private String ip; 12 private String ip;
12 13
13 - /**  
14 - * 默认使用 0.0.0.0  
15 - */  
16 - private String monitorIp = "0.0.0.0";  
17 -  
18 private Integer port; 14 private Integer port;
19 15
20 private String domain; 16 private String domain;
@@ -25,8 +21,6 @@ public class SipConfig { @@ -25,8 +21,6 @@ public class SipConfig {
25 21
26 Integer ptzSpeed = 50; 22 Integer ptzSpeed = 50;
27 23
28 - Integer keepaliveTimeOut = 255;  
29 -  
30 Integer registerTimeInterval = 120; 24 Integer registerTimeInterval = 120;
31 25
32 private boolean alarm; 26 private boolean alarm;
@@ -35,10 +29,6 @@ public class SipConfig { @@ -35,10 +29,6 @@ public class SipConfig {
35 this.ip = ip; 29 this.ip = ip;
36 } 30 }
37 31
38 - public void setMonitorIp(String monitorIp) {  
39 - this.monitorIp = monitorIp;  
40 - }  
41 -  
42 public void setPort(Integer port) { 32 public void setPort(Integer port) {
43 this.port = port; 33 this.port = port;
44 } 34 }
@@ -59,18 +49,11 @@ public class SipConfig { @@ -59,18 +49,11 @@ public class SipConfig {
59 this.ptzSpeed = ptzSpeed; 49 this.ptzSpeed = ptzSpeed;
60 } 50 }
61 51
62 - public void setKeepaliveTimeOut(Integer keepaliveTimeOut) {  
63 - this.keepaliveTimeOut = keepaliveTimeOut;  
64 - }  
65 52
66 public void setRegisterTimeInterval(Integer registerTimeInterval) { 53 public void setRegisterTimeInterval(Integer registerTimeInterval) {
67 this.registerTimeInterval = registerTimeInterval; 54 this.registerTimeInterval = registerTimeInterval;
68 } 55 }
69 56
70 - public String getMonitorIp() {  
71 - return monitorIp;  
72 - }  
73 -  
74 public String getIp() { 57 public String getIp() {
75 return ip; 58 return ip;
76 } 59 }
@@ -99,10 +82,6 @@ public class SipConfig { @@ -99,10 +82,6 @@ public class SipConfig {
99 return ptzSpeed; 82 return ptzSpeed;
100 } 83 }
101 84
102 - public Integer getKeepaliveTimeOut() {  
103 - return keepaliveTimeOut;  
104 - }  
105 -  
106 public Integer getRegisterTimeInterval() { 85 public Integer getRegisterTimeInterval() {
107 return registerTimeInterval; 86 return registerTimeInterval;
108 } 87 }
@@ -114,4 +93,10 @@ public class SipConfig { @@ -114,4 +93,10 @@ public class SipConfig {
114 public void setAlarm(boolean alarm) { 93 public void setAlarm(boolean alarm) {
115 this.alarm = alarm; 94 this.alarm = alarm;
116 } 95 }
  96 +
  97 + public void getLocalIp(String deviceLocalIp) {
  98 + if (ObjectUtils.isEmpty(deviceLocalIp)) {
  99 +
  100 + }
  101 + }
117 } 102 }
src/main/java/com/genersoft/iot/vmp/conf/SipPlatformRunner.java
@@ -2,7 +2,6 @@ package com.genersoft.iot.vmp.conf; @@ -2,7 +2,6 @@ package com.genersoft.iot.vmp.conf;
2 2
3 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; 3 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
4 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch; 4 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatformCatch;
5 -import com.genersoft.iot.vmp.gb28181.event.EventPublisher;  
6 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; 5 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
7 import com.genersoft.iot.vmp.service.IPlatformService; 6 import com.genersoft.iot.vmp.service.IPlatformService;
8 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 7 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
@@ -47,7 +46,7 @@ public class SipPlatformRunner implements CommandLineRunner { @@ -47,7 +46,7 @@ public class SipPlatformRunner implements CommandLineRunner {
47 parentPlatformCatch.setId(parentPlatform.getServerGBId()); 46 parentPlatformCatch.setId(parentPlatform.getServerGBId());
48 redisCatchStorage.updatePlatformCatchInfo(parentPlatformCatch); 47 redisCatchStorage.updatePlatformCatchInfo(parentPlatformCatch);
49 // 设置所有平台离线 48 // 设置所有平台离线
50 - platformService.offline(parentPlatform); 49 + platformService.offline(parentPlatform, true);
51 // 取消订阅 50 // 取消订阅
52 sipCommanderForPlatform.unregister(parentPlatform, null, (eventResult)->{ 51 sipCommanderForPlatform.unregister(parentPlatform, null, (eventResult)->{
53 platformService.login(parentPlatform); 52 platformService.login(parentPlatform);
src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
@@ -33,6 +33,8 @@ public class UserSetting { @@ -33,6 +33,8 @@ public class UserSetting {
33 33
34 private Boolean usePushingAsStatus = Boolean.TRUE; 34 private Boolean usePushingAsStatus = Boolean.TRUE;
35 35
  36 + private Boolean useSourceIpAsStreamIp = Boolean.FALSE;
  37 +
36 private Boolean streamOnDemand = Boolean.TRUE; 38 private Boolean streamOnDemand = Boolean.TRUE;
37 39
38 private Boolean pushAuthority = Boolean.TRUE; 40 private Boolean pushAuthority = Boolean.TRUE;
@@ -161,6 +163,14 @@ public class UserSetting { @@ -161,6 +163,14 @@ public class UserSetting {
161 this.streamOnDemand = streamOnDemand; 163 this.streamOnDemand = streamOnDemand;
162 } 164 }
163 165
  166 + public Boolean getUseSourceIpAsStreamIp() {
  167 + return useSourceIpAsStreamIp;
  168 + }
  169 +
  170 + public void setUseSourceIpAsStreamIp(Boolean useSourceIpAsStreamIp) {
  171 + this.useSourceIpAsStreamIp = useSourceIpAsStreamIp;
  172 + }
  173 +
164 public Boolean getPushAuthority() { 174 public Boolean getPushAuthority() {
165 return pushAuthority; 175 return pushAuthority;
166 } 176 }
src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
@@ -8,16 +8,18 @@ import gov.nist.javax.sip.SipStackImpl; @@ -8,16 +8,18 @@ import gov.nist.javax.sip.SipStackImpl;
8 import org.slf4j.Logger; 8 import org.slf4j.Logger;
9 import org.slf4j.LoggerFactory; 9 import org.slf4j.LoggerFactory;
10 import org.springframework.beans.factory.annotation.Autowired; 10 import org.springframework.beans.factory.annotation.Autowired;
11 -import org.springframework.context.annotation.Bean;  
12 -import org.springframework.context.annotation.Configuration;  
13 -import org.springframework.context.annotation.DependsOn; 11 +import org.springframework.boot.CommandLineRunner;
  12 +import org.springframework.core.annotation.Order;
  13 +import org.springframework.stereotype.Component;
  14 +import org.springframework.util.ObjectUtils;
14 15
15 import javax.sip.*; 16 import javax.sip.*;
16 -import java.util.Properties;  
17 -import java.util.TooManyListenersException; 17 +import java.util.*;
  18 +import java.util.concurrent.ConcurrentHashMap;
18 19
19 -@Configuration  
20 -public class SipLayer{ 20 +@Component
  21 +@Order(value=1)
  22 +public class SipLayer implements CommandLineRunner {
21 23
22 private final static Logger logger = LoggerFactory.getLogger(SipLayer.class); 24 private final static Logger logger = LoggerFactory.getLogger(SipLayer.class);
23 25
@@ -27,70 +29,117 @@ public class SipLayer{ @@ -27,70 +29,117 @@ public class SipLayer{
27 @Autowired 29 @Autowired
28 private ISIPProcessorObserver sipProcessorObserver; 30 private ISIPProcessorObserver sipProcessorObserver;
29 31
30 - private SipStackImpl sipStack; 32 +
  33 +
  34 + private final Map<String, SipProviderImpl> tcpSipProviderMap = new ConcurrentHashMap<>();
  35 + private final Map<String, SipProviderImpl> udpSipProviderMap = new ConcurrentHashMap<>();
31 36
32 private SipFactory sipFactory; 37 private SipFactory sipFactory;
33 38
  39 + @Override
  40 + public void run(String... args) {
  41 + List<String> monitorIps = new ArrayList<>();
  42 + // 使用逗号分割多个ip
  43 + String separator = ",";
  44 + if (sipConfig.getIp().indexOf(separator) > 0) {
  45 + String[] split = sipConfig.getIp().split(separator);
  46 + monitorIps.addAll(Arrays.asList(split));
  47 + }else {
  48 + monitorIps.add(sipConfig.getIp());
  49 + }
34 50
35 - @Bean("sipFactory")  
36 - SipFactory createSipFactory() {  
37 sipFactory = SipFactory.getInstance(); 51 sipFactory = SipFactory.getInstance();
38 sipFactory.setPathName("gov.nist"); 52 sipFactory.setPathName("gov.nist");
39 - return sipFactory;  
40 - }  
41 -  
42 - @Bean("sipStack")  
43 - @DependsOn({"sipFactory"})  
44 - SipStackImpl createSipStack() throws PeerUnavailableException {  
45 - sipStack = ( SipStackImpl )sipFactory.createSipStack(DefaultProperties.getProperties(sipConfig.getMonitorIp(), false));  
46 - return sipStack; 53 + if (monitorIps.size() > 0) {
  54 + for (String monitorIp : monitorIps) {
  55 + addListeningPoint(monitorIp, sipConfig.getPort());
  56 + }
  57 + if (udpSipProviderMap.size() + tcpSipProviderMap.size() == 0) {
  58 + System.exit(1);
  59 + }
  60 + }
47 } 61 }
48 62
49 - @Bean(name = "tcpSipProvider")  
50 - @DependsOn("sipStack")  
51 - SipProviderImpl startTcpListener() {  
52 - ListeningPoint tcpListeningPoint = null;  
53 - SipProviderImpl tcpSipProvider = null; 63 + private void addListeningPoint(String monitorIp, int port){
  64 + SipStackImpl sipStack;
  65 + try {
  66 + sipStack = (SipStackImpl)sipFactory.createSipStack(DefaultProperties.getProperties(monitorIp, false));
  67 + } catch (PeerUnavailableException e) {
  68 + logger.error("[Sip Server] SIP服务启动失败, 监听地址{}失败,请检查ip是否正确", monitorIp);
  69 + return;
  70 + }
  71 +
54 try { 72 try {
55 - tcpListeningPoint = sipStack.createListeningPoint(sipConfig.getMonitorIp(), sipConfig.getPort(), "TCP");  
56 - tcpSipProvider = (SipProviderImpl)sipStack.createSipProvider(tcpListeningPoint); 73 + ListeningPoint tcpListeningPoint = sipStack.createListeningPoint(monitorIp, port, "TCP");
  74 + SipProviderImpl tcpSipProvider = (SipProviderImpl)sipStack.createSipProvider(tcpListeningPoint);
  75 +
57 tcpSipProvider.setDialogErrorsAutomaticallyHandled(); 76 tcpSipProvider.setDialogErrorsAutomaticallyHandled();
58 tcpSipProvider.addSipListener(sipProcessorObserver); 77 tcpSipProvider.addSipListener(sipProcessorObserver);
59 - logger.info("[Sip Server] TCP 启动成功 {}:{}", sipConfig.getMonitorIp(), sipConfig.getPort());  
60 - } catch (TransportNotSupportedException e) {  
61 - e.printStackTrace();  
62 - } catch (InvalidArgumentException e) {  
63 - logger.error("[Sip Server] 无法使用 [ {}:{} ]作为SIP[ TCP ]服务,可排查: 1. sip.monitor-ip 是否为本机网卡IP; 2. sip.port 是否已被占用"  
64 - , sipConfig.getMonitorIp(), sipConfig.getPort());  
65 - } catch (TooManyListenersException e) {  
66 - e.printStackTrace();  
67 - } catch (ObjectInUseException e) {  
68 - e.printStackTrace(); 78 + tcpSipProviderMap.put(monitorIp, tcpSipProvider);
  79 +
  80 + logger.info("[Sip Server] tcp://{}:{} 启动成功", monitorIp, port);
  81 + } catch (TransportNotSupportedException
  82 + | TooManyListenersException
  83 + | ObjectInUseException
  84 + | InvalidArgumentException e) {
  85 + logger.error("[Sip Server] tcp://{}:{} SIP服务启动失败,请检查端口是否被占用或者ip是否正确"
  86 + , monitorIp, port);
69 } 87 }
70 - return tcpSipProvider;  
71 - }  
72 -  
73 - @Bean(name = "udpSipProvider")  
74 - @DependsOn("sipStack")  
75 - SipProviderImpl startUdpListener() {  
76 - ListeningPoint udpListeningPoint = null;  
77 - SipProviderImpl udpSipProvider = null; 88 +
78 try { 89 try {
79 - udpListeningPoint = sipStack.createListeningPoint(sipConfig.getMonitorIp(), sipConfig.getPort(), "UDP");  
80 - udpSipProvider = (SipProviderImpl)sipStack.createSipProvider(udpListeningPoint); 90 + ListeningPoint udpListeningPoint = sipStack.createListeningPoint(monitorIp, port, "UDP");
  91 +
  92 + SipProviderImpl udpSipProvider = (SipProviderImpl)sipStack.createSipProvider(udpListeningPoint);
81 udpSipProvider.addSipListener(sipProcessorObserver); 93 udpSipProvider.addSipListener(sipProcessorObserver);
82 - } catch (TransportNotSupportedException e) {  
83 - e.printStackTrace();  
84 - } catch (InvalidArgumentException e) {  
85 - logger.error("[Sip Server] 无法使用 [ {}:{} ]作为SIP[ UDP ]服务,可排查: 1. sip.monitor-ip 是否为本机网卡IP; 2. sip.port 是否已被占用"  
86 - , sipConfig.getMonitorIp(), sipConfig.getPort());  
87 - } catch (TooManyListenersException e) {  
88 - e.printStackTrace();  
89 - } catch (ObjectInUseException e) {  
90 - e.printStackTrace(); 94 +
  95 + udpSipProviderMap.put(monitorIp, udpSipProvider);
  96 +
  97 + logger.info("[Sip Server] udp://{}:{} 启动成功", monitorIp, port);
  98 + } catch (TransportNotSupportedException
  99 + | TooManyListenersException
  100 + | ObjectInUseException
  101 + | InvalidArgumentException e) {
  102 + logger.error("[Sip Server] udp://{}:{} SIP服务启动失败,请检查端口是否被占用或者ip是否正确"
  103 + , monitorIp, port);
91 } 104 }
92 - logger.info("[Sip Server] UDP 启动成功 {}:{}", sipConfig.getMonitorIp(), sipConfig.getPort());  
93 - return udpSipProvider;  
94 } 105 }
95 106
  107 + public SipFactory getSipFactory() {
  108 + return sipFactory;
  109 + }
  110 +
  111 + public SipProviderImpl getUdpSipProvider(String ip) {
  112 + if (ObjectUtils.isEmpty(ip)) {
  113 + return null;
  114 + }
  115 + return udpSipProviderMap.get(ip);
  116 + }
  117 +
  118 + public SipProviderImpl getUdpSipProvider() {
  119 + if (udpSipProviderMap.size() != 1) {
  120 + return null;
  121 + }
  122 + return udpSipProviderMap.values().stream().findFirst().get();
  123 + }
  124 +
  125 + public SipProviderImpl getTcpSipProvider() {
  126 + if (tcpSipProviderMap.size() != 1) {
  127 + return null;
  128 + }
  129 + return tcpSipProviderMap.values().stream().findFirst().get();
  130 + }
  131 +
  132 + public SipProviderImpl getTcpSipProvider(String ip) {
  133 + if (ObjectUtils.isEmpty(ip)) {
  134 + return null;
  135 + }
  136 + return tcpSipProviderMap.get(ip);
  137 + }
  138 +
  139 + public String getLocalIp(String deviceLocalIp) {
  140 + if (!ObjectUtils.isEmpty(deviceLocalIp)) {
  141 + return deviceLocalIp;
  142 + }
  143 + return getUdpSipProvider().getListeningPoint().getIPAddress();
  144 + }
96 } 145 }
src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java
@@ -178,6 +178,9 @@ public class Device { @@ -178,6 +178,9 @@ public class Device {
178 @Schema(description = "收流IP") 178 @Schema(description = "收流IP")
179 private String sdpIp; 179 private String sdpIp;
180 180
  181 + @Schema(description = "SIP交互IP(设备访问平台的IP)")
  182 + private String localIp;
  183 +
181 184
182 public String getDeviceId() { 185 public String getDeviceId() {
183 return deviceId; 186 return deviceId;
@@ -402,4 +405,12 @@ public class Device { @@ -402,4 +405,12 @@ public class Device {
402 public void setSdpIp(String sdpIp) { 405 public void setSdpIp(String sdpIp) {
403 this.sdpIp = sdpIp; 406 this.sdpIp = sdpIp;
404 } 407 }
  408 +
  409 + public String getLocalIp() {
  410 + return localIp;
  411 + }
  412 +
  413 + public void setLocalIp(String localIp) {
  414 + this.localIp = localIp;
  415 + }
405 } 416 }
src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java
@@ -5,11 +5,9 @@ import org.slf4j.Logger; @@ -5,11 +5,9 @@ import org.slf4j.Logger;
5 import org.slf4j.LoggerFactory; 5 import org.slf4j.LoggerFactory;
6 import org.springframework.context.ApplicationListener; 6 import org.springframework.context.ApplicationListener;
7 import org.springframework.stereotype.Component; 7 import org.springframework.stereotype.Component;
8 -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;  
9 8
10 -import java.util.HashMap;  
11 -import java.util.Hashtable;  
12 import java.util.Map; 9 import java.util.Map;
  10 +import java.util.concurrent.ConcurrentHashMap;
13 11
14 /** 12 /**
15 * @description: 录像查询结束事件 13 * @description: 录像查询结束事件
@@ -22,13 +20,12 @@ public class RecordEndEventListener implements ApplicationListener&lt;RecordEndEven @@ -22,13 +20,12 @@ public class RecordEndEventListener implements ApplicationListener&lt;RecordEndEven
22 20
23 private final static Logger logger = LoggerFactory.getLogger(RecordEndEventListener.class); 21 private final static Logger logger = LoggerFactory.getLogger(RecordEndEventListener.class);
24 22
25 - private static Map<String, SseEmitter> sseEmitters = new Hashtable<>();  
26 -  
27 public interface RecordEndEventHandler{ 23 public interface RecordEndEventHandler{
28 void handler(RecordInfo recordInfo); 24 void handler(RecordInfo recordInfo);
29 } 25 }
30 26
31 - private Map<String, RecordEndEventHandler> handlerMap = new HashMap<>(); 27 + private Map<String, RecordEndEventHandler> handlerMap = new ConcurrentHashMap<>();
  28 +
32 @Override 29 @Override
33 public void onApplicationEvent(RecordEndEvent event) { 30 public void onApplicationEvent(RecordEndEvent event) {
34 logger.info("录像查询完成事件触发,deviceId:{}, channelId: {}, 录像数量{}条", event.getRecordInfo().getDeviceId(), 31 logger.info("录像查询完成事件触发,deviceId:{}, channelId: {}, 录像数量{}条", event.getRecordInfo().getDeviceId(),
@@ -38,7 +35,6 @@ public class RecordEndEventListener implements ApplicationListener&lt;RecordEndEven @@ -38,7 +35,6 @@ public class RecordEndEventListener implements ApplicationListener&lt;RecordEndEven
38 recordEndEventHandler.handler(event.getRecordInfo()); 35 recordEndEventHandler.handler(event.getRecordInfo());
39 } 36 }
40 } 37 }
41 -  
42 } 38 }
43 39
44 public void addEndEventHandler(String device, String channelId, RecordEndEventHandler recordEndEventHandler) { 40 public void addEndEventHandler(String device, String channelId, RecordEndEventHandler recordEndEventHandler) {
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java
@@ -5,6 +5,7 @@ import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; @@ -5,6 +5,7 @@ import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
5 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; 5 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
6 import com.genersoft.iot.vmp.gb28181.transmit.event.response.ISIPResponseProcessor; 6 import com.genersoft.iot.vmp.gb28181.transmit.event.response.ISIPResponseProcessor;
7 import com.genersoft.iot.vmp.gb28181.transmit.event.timeout.ITimeoutProcessor; 7 import com.genersoft.iot.vmp.gb28181.transmit.event.timeout.ITimeoutProcessor;
  8 +import gov.nist.javax.sip.message.SIPRequest;
8 import org.slf4j.Logger; 9 import org.slf4j.Logger;
9 import org.slf4j.LoggerFactory; 10 import org.slf4j.LoggerFactory;
10 import org.springframework.beans.factory.annotation.Autowired; 11 import org.springframework.beans.factory.annotation.Autowired;
@@ -15,6 +16,7 @@ import javax.sip.*; @@ -15,6 +16,7 @@ import javax.sip.*;
15 import javax.sip.header.*; 16 import javax.sip.header.*;
16 import javax.sip.message.Request; 17 import javax.sip.message.Request;
17 import javax.sip.message.Response; 18 import javax.sip.message.Response;
  19 +import java.net.InetAddress;
18 import java.util.Map; 20 import java.util.Map;
19 import java.util.concurrent.ConcurrentHashMap; 21 import java.util.concurrent.ConcurrentHashMap;
20 22
@@ -75,6 +77,7 @@ public class SIPProcessorObserver implements ISIPProcessorObserver { @@ -75,6 +77,7 @@ public class SIPProcessorObserver implements ISIPProcessorObserver {
75 ISIPRequestProcessor sipRequestProcessor = requestProcessorMap.get(method); 77 ISIPRequestProcessor sipRequestProcessor = requestProcessorMap.get(method);
76 if (sipRequestProcessor == null) { 78 if (sipRequestProcessor == null) {
77 logger.warn("不支持方法{}的request", method); 79 logger.warn("不支持方法{}的request", method);
  80 + // TODO 回复错误玛
78 return; 81 return;
79 } 82 }
80 requestProcessorMap.get(method).process(requestEvent); 83 requestProcessorMap.get(method).process(requestEvent);
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPSender.java
1 package com.genersoft.iot.vmp.gb28181.transmit; 1 package com.genersoft.iot.vmp.gb28181.transmit;
2 2
  3 +import com.genersoft.iot.vmp.gb28181.SipLayer;
3 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; 4 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
4 import com.genersoft.iot.vmp.gb28181.utils.SipUtils; 5 import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
5 import com.genersoft.iot.vmp.utils.GitUtil; 6 import com.genersoft.iot.vmp.utils.GitUtil;
@@ -7,11 +8,10 @@ import gov.nist.javax.sip.SipProviderImpl; @@ -7,11 +8,10 @@ import gov.nist.javax.sip.SipProviderImpl;
7 import org.slf4j.Logger; 8 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory; 9 import org.slf4j.LoggerFactory;
9 import org.springframework.beans.factory.annotation.Autowired; 10 import org.springframework.beans.factory.annotation.Autowired;
10 -import org.springframework.beans.factory.annotation.Qualifier;  
11 import org.springframework.stereotype.Component; 11 import org.springframework.stereotype.Component;
  12 +import org.springframework.util.ObjectUtils;
12 13
13 import javax.sip.SipException; 14 import javax.sip.SipException;
14 -import javax.sip.SipFactory;  
15 import javax.sip.header.CallIdHeader; 15 import javax.sip.header.CallIdHeader;
16 import javax.sip.header.UserAgentHeader; 16 import javax.sip.header.UserAgentHeader;
17 import javax.sip.header.ViaHeader; 17 import javax.sip.header.ViaHeader;
@@ -30,15 +30,7 @@ public class SIPSender { @@ -30,15 +30,7 @@ public class SIPSender {
30 private final Logger logger = LoggerFactory.getLogger(SIPSender.class); 30 private final Logger logger = LoggerFactory.getLogger(SIPSender.class);
31 31
32 @Autowired 32 @Autowired
33 - @Qualifier(value = "tcpSipProvider")  
34 - private SipProviderImpl tcpSipProvider;  
35 -  
36 - @Autowired  
37 - @Qualifier(value = "udpSipProvider")  
38 - private SipProviderImpl udpSipProvider;  
39 -  
40 - @Autowired  
41 - private SipFactory sipFactory; 33 + private SipLayer sipLayer;
42 34
43 @Autowired 35 @Autowired
44 private GitUtil gitUtil; 36 private GitUtil gitUtil;
@@ -46,25 +38,25 @@ public class SIPSender { @@ -46,25 +38,25 @@ public class SIPSender {
46 @Autowired 38 @Autowired
47 private SipSubscribe sipSubscribe; 39 private SipSubscribe sipSubscribe;
48 40
49 - public void transmitRequest(Message message) throws SipException, ParseException {  
50 - transmitRequest(message, null, null); 41 + public void transmitRequest(String ip, Message message) throws SipException, ParseException {
  42 + transmitRequest(ip, message, null, null);
51 } 43 }
52 44
53 - public void transmitRequest(Message message, SipSubscribe.Event errorEvent) throws SipException, ParseException {  
54 - transmitRequest(message, errorEvent, null); 45 + public void transmitRequest(String ip, Message message, SipSubscribe.Event errorEvent) throws SipException, ParseException {
  46 + transmitRequest(ip, message, errorEvent, null);
55 } 47 }
56 48
57 - public void transmitRequest(Message message, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException, ParseException { 49 + public void transmitRequest(String ip, Message message, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException, ParseException {
58 ViaHeader viaHeader = (ViaHeader)message.getHeader(ViaHeader.NAME); 50 ViaHeader viaHeader = (ViaHeader)message.getHeader(ViaHeader.NAME);
59 String transport = "UDP"; 51 String transport = "UDP";
60 if (viaHeader == null) { 52 if (viaHeader == null) {
61 - logger.warn("[消息头缺失]: ViaHeader"); 53 + logger.warn("[消息头缺失]: ViaHeader, 使用默认的UDP方式处理数据");
62 }else { 54 }else {
63 transport = viaHeader.getTransport(); 55 transport = viaHeader.getTransport();
64 } 56 }
65 if (message.getHeader(UserAgentHeader.NAME) == null) { 57 if (message.getHeader(UserAgentHeader.NAME) == null) {
66 try { 58 try {
67 - message.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 59 + message.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
68 } catch (ParseException e) { 60 } catch (ParseException e) {
69 logger.error("添加UserAgentHeader失败", e); 61 logger.error("添加UserAgentHeader失败", e);
70 } 62 }
@@ -88,6 +80,11 @@ public class SIPSender { @@ -88,6 +80,11 @@ public class SIPSender {
88 }); 80 });
89 } 81 }
90 if ("TCP".equals(transport)) { 82 if ("TCP".equals(transport)) {
  83 + SipProviderImpl tcpSipProvider = sipLayer.getTcpSipProvider(ip);
  84 + if (tcpSipProvider == null) {
  85 + logger.error("[发送信息失败] 未找到tcp://{}的监听信息", ip);
  86 + return;
  87 + }
91 if (message instanceof Request) { 88 if (message instanceof Request) {
92 tcpSipProvider.sendRequest((Request)message); 89 tcpSipProvider.sendRequest((Request)message);
93 }else if (message instanceof Response) { 90 }else if (message instanceof Response) {
@@ -95,16 +92,41 @@ public class SIPSender { @@ -95,16 +92,41 @@ public class SIPSender {
95 } 92 }
96 93
97 } else if ("UDP".equals(transport)) { 94 } else if ("UDP".equals(transport)) {
  95 + SipProviderImpl sipProvider = sipLayer.getUdpSipProvider(ip);
  96 + if (sipProvider == null) {
  97 + logger.error("[发送信息失败] 未找到udp://{}的监听信息", ip);
  98 + return;
  99 + }
98 if (message instanceof Request) { 100 if (message instanceof Request) {
99 - udpSipProvider.sendRequest((Request)message); 101 + sipProvider.sendRequest((Request)message);
100 }else if (message instanceof Response) { 102 }else if (message instanceof Response) {
101 - udpSipProvider.sendResponse((Response)message); 103 + sipProvider.sendResponse((Response)message);
102 } 104 }
103 } 105 }
104 } 106 }
105 107
106 - public CallIdHeader getNewCallIdHeader(String transport){  
107 - return transport.equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()  
108 - : udpSipProvider.getNewCallId(); 108 + public CallIdHeader getNewCallIdHeader(String ip, String transport){
  109 + if (ObjectUtils.isEmpty(transport)) {
  110 + return sipLayer.getUdpSipProvider().getNewCallId();
  111 + }
  112 + SipProviderImpl sipProvider;
  113 + if (ObjectUtils.isEmpty(ip)) {
  114 + sipProvider = transport.equalsIgnoreCase("TCP") ? sipLayer.getTcpSipProvider()
  115 + : sipLayer.getUdpSipProvider();
  116 + }else {
  117 + sipProvider = transport.equalsIgnoreCase("TCP") ? sipLayer.getTcpSipProvider(ip)
  118 + : sipLayer.getUdpSipProvider(ip);
  119 + }
  120 +
  121 + if (sipProvider == null) {
  122 + sipProvider = sipLayer.getUdpSipProvider();
  123 + }
  124 +
  125 + if (sipProvider != null) {
  126 + return sipProvider.getNewCallId();
  127 + }else {
  128 + logger.warn("[新建CallIdHeader失败], ip={}, transport={}", ip, transport);
  129 + return null;
  130 + }
109 } 131 }
110 } 132 }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
1 package com.genersoft.iot.vmp.gb28181.transmit.callback; 1 package com.genersoft.iot.vmp.gb28181.transmit.callback;
2 2
3 -import java.util.HashMap; 3 +import com.genersoft.iot.vmp.vmanager.bean.DeferredResultEx;
  4 +import org.springframework.stereotype.Component;
  5 +import org.springframework.util.ObjectUtils;
  6 +import org.springframework.web.context.request.async.DeferredResult;
  7 +
  8 +import java.util.Collection;
4 import java.util.Map; 9 import java.util.Map;
5 import java.util.Set; 10 import java.util.Set;
6 import java.util.concurrent.ConcurrentHashMap; 11 import java.util.concurrent.ConcurrentHashMap;
7 12
8 -import org.springframework.http.HttpStatus;  
9 -import org.springframework.http.ResponseEntity;  
10 -import org.springframework.stereotype.Component;  
11 -import org.springframework.web.context.request.async.DeferredResult;  
12 -  
13 /** 13 /**
14 * @description: 异步请求处理 14 * @description: 异步请求处理
15 * @author: swwheihei 15 * @author: swwheihei
@@ -51,31 +51,48 @@ public class DeferredResultHolder { @@ -51,31 +51,48 @@ public class DeferredResultHolder {
51 51
52 public static final String CALLBACK_CMD_BROADCAST = "CALLBACK_BROADCAST"; 52 public static final String CALLBACK_CMD_BROADCAST = "CALLBACK_BROADCAST";
53 53
54 - private Map<String, Map<String, DeferredResult>> map = new ConcurrentHashMap<>(); 54 + private Map<String, Map<String, DeferredResultEx>> map = new ConcurrentHashMap<>();
55 55
56 56
57 - public void put(String key, String id, DeferredResult result) {  
58 - Map<String, DeferredResult> deferredResultMap = map.get(key); 57 + public void put(String key, String id, DeferredResultEx result) {
  58 + Map<String, DeferredResultEx> deferredResultMap = map.get(key);
59 if (deferredResultMap == null) { 59 if (deferredResultMap == null) {
60 deferredResultMap = new ConcurrentHashMap<>(); 60 deferredResultMap = new ConcurrentHashMap<>();
61 map.put(key, deferredResultMap); 61 map.put(key, deferredResultMap);
62 } 62 }
63 deferredResultMap.put(id, result); 63 deferredResultMap.put(id, result);
64 } 64 }
65 -  
66 - public DeferredResult get(String key, String id) {  
67 - Map<String, DeferredResult> deferredResultMap = map.get(key); 65 +
  66 + public void put(String key, String id, DeferredResult result) {
  67 + Map<String, DeferredResultEx> deferredResultMap = map.get(key);
68 if (deferredResultMap == null) { 68 if (deferredResultMap == null) {
  69 + deferredResultMap = new ConcurrentHashMap<>();
  70 + map.put(key, deferredResultMap);
  71 + }
  72 + deferredResultMap.put(id, new DeferredResultEx(result));
  73 + }
  74 +
  75 + public DeferredResultEx get(String key, String id) {
  76 + Map<String, DeferredResultEx> deferredResultMap = map.get(key);
  77 + if (deferredResultMap == null || ObjectUtils.isEmpty(id)) {
69 return null; 78 return null;
70 } 79 }
71 return deferredResultMap.get(id); 80 return deferredResultMap.get(id);
72 } 81 }
73 82
  83 + public Collection<DeferredResultEx> getAllByKey(String key) {
  84 + Map<String, DeferredResultEx> deferredResultMap = map.get(key);
  85 + if (deferredResultMap == null) {
  86 + return null;
  87 + }
  88 + return deferredResultMap.values();
  89 + }
  90 +
74 public boolean exist(String key, String id){ 91 public boolean exist(String key, String id){
75 if (key == null) { 92 if (key == null) {
76 return false; 93 return false;
77 } 94 }
78 - Map<String, DeferredResult> deferredResultMap = map.get(key); 95 + Map<String, DeferredResultEx> deferredResultMap = map.get(key);
79 if (id == null) { 96 if (id == null) {
80 return deferredResultMap != null; 97 return deferredResultMap != null;
81 }else { 98 }else {
@@ -88,15 +105,15 @@ public class DeferredResultHolder { @@ -88,15 +105,15 @@ public class DeferredResultHolder {
88 * @param msg 105 * @param msg
89 */ 106 */
90 public void invokeResult(RequestMessage msg) { 107 public void invokeResult(RequestMessage msg) {
91 - Map<String, DeferredResult> deferredResultMap = map.get(msg.getKey()); 108 + Map<String, DeferredResultEx> deferredResultMap = map.get(msg.getKey());
92 if (deferredResultMap == null) { 109 if (deferredResultMap == null) {
93 return; 110 return;
94 } 111 }
95 - DeferredResult result = deferredResultMap.get(msg.getId()); 112 + DeferredResultEx result = deferredResultMap.get(msg.getId());
96 if (result == null) { 113 if (result == null) {
97 return; 114 return;
98 } 115 }
99 - result.setResult(msg.getData()); 116 + result.getDeferredResult().setResult(msg.getData());
100 deferredResultMap.remove(msg.getId()); 117 deferredResultMap.remove(msg.getId());
101 if (deferredResultMap.size() == 0) { 118 if (deferredResultMap.size() == 0) {
102 map.remove(msg.getKey()); 119 map.remove(msg.getKey());
@@ -108,18 +125,30 @@ public class DeferredResultHolder { @@ -108,18 +125,30 @@ public class DeferredResultHolder {
108 * @param msg 125 * @param msg
109 */ 126 */
110 public void invokeAllResult(RequestMessage msg) { 127 public void invokeAllResult(RequestMessage msg) {
111 - Map<String, DeferredResult> deferredResultMap = map.get(msg.getKey()); 128 + Map<String, DeferredResultEx> deferredResultMap = map.get(msg.getKey());
112 if (deferredResultMap == null) { 129 if (deferredResultMap == null) {
113 return; 130 return;
114 } 131 }
115 - Set<String> ids = deferredResultMap.keySet();  
116 - for (String id : ids) {  
117 - DeferredResult result = deferredResultMap.get(id);  
118 - if (result == null) { 132 + synchronized (this) {
  133 + deferredResultMap = map.get(msg.getKey());
  134 + if (deferredResultMap == null) {
119 return; 135 return;
120 } 136 }
121 - result.setResult(msg.getData()); 137 + Set<String> ids = deferredResultMap.keySet();
  138 + for (String id : ids) {
  139 + DeferredResultEx result = deferredResultMap.get(id);
  140 + if (result == null) {
  141 + return;
  142 + }
  143 + if (result.getFilter() != null) {
  144 + Object handler = result.getFilter().handler(msg.getData());
  145 + result.getDeferredResult().setResult(handler);
  146 + }else {
  147 + result.getDeferredResult().setResult(msg.getData());
  148 + }
  149 +
  150 + }
  151 + map.remove(msg.getKey());
122 } 152 }
123 - map.remove(msg.getKey());  
124 } 153 }
125 } 154 }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java
1 package com.genersoft.iot.vmp.gb28181.transmit.cmd; 1 package com.genersoft.iot.vmp.gb28181.transmit.cmd;
2 2
3 import com.genersoft.iot.vmp.conf.SipConfig; 3 import com.genersoft.iot.vmp.conf.SipConfig;
  4 +import com.genersoft.iot.vmp.gb28181.SipLayer;
4 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; 5 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
5 import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; 6 import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
6 import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo; 7 import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo;
@@ -36,7 +37,7 @@ public class SIPRequestHeaderPlarformProvider { @@ -36,7 +37,7 @@ public class SIPRequestHeaderPlarformProvider {
36 private SipConfig sipConfig; 37 private SipConfig sipConfig;
37 38
38 @Autowired 39 @Autowired
39 - private SipFactory sipFactory; 40 + private SipLayer sipLayer;
40 41
41 @Autowired 42 @Autowired
42 private GitUtil gitUtil; 43 private GitUtil gitUtil;
@@ -44,42 +45,42 @@ public class SIPRequestHeaderPlarformProvider { @@ -44,42 +45,42 @@ public class SIPRequestHeaderPlarformProvider {
44 @Autowired 45 @Autowired
45 private IRedisCatchStorage redisCatchStorage; 46 private IRedisCatchStorage redisCatchStorage;
46 47
47 - public Request createRegisterRequest(@NotNull ParentPlatform platform, long CSeq, String fromTag, String viaTag, CallIdHeader callIdHeader, boolean isRegister) throws ParseException, InvalidArgumentException, PeerUnavailableException { 48 + public Request createRegisterRequest(@NotNull ParentPlatform parentPlatform, long CSeq, String fromTag, String viaTag, CallIdHeader callIdHeader, boolean isRegister) throws ParseException, InvalidArgumentException, PeerUnavailableException {
48 Request request = null; 49 Request request = null;
49 - String sipAddress = sipConfig.getIp() + ":" + sipConfig.getPort(); 50 + String sipAddress = parentPlatform.getDeviceIp() + ":" + parentPlatform.getDevicePort();
50 //请求行 51 //请求行
51 - SipURI requestLine = sipFactory.createAddressFactory().createSipURI(platform.getServerGBId(),  
52 - platform.getServerIP() + ":" + platform.getServerPort()); 52 + SipURI requestLine = sipLayer.getSipFactory().createAddressFactory().createSipURI(parentPlatform.getServerGBId(),
  53 + parentPlatform.getServerIP() + ":" + parentPlatform.getServerPort());
53 //via 54 //via
54 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); 55 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
55 - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(platform.getServerIP(), platform.getServerPort(), platform.getTransport(), viaTag); 56 + ViaHeader viaHeader = sipLayer.getSipFactory().createHeaderFactory().createViaHeader(parentPlatform.getServerIP(), parentPlatform.getServerPort(), parentPlatform.getTransport(), viaTag);
56 viaHeader.setRPort(); 57 viaHeader.setRPort();
57 viaHeaders.add(viaHeader); 58 viaHeaders.add(viaHeader);
58 //from 59 //from
59 - SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(platform.getDeviceGBId(), sipConfig.getDomain());  
60 - Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);  
61 - FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag); 60 + SipURI fromSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(parentPlatform.getDeviceGBId(), sipConfig.getDomain());
  61 + Address fromAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(fromSipURI);
  62 + FromHeader fromHeader = sipLayer.getSipFactory().createHeaderFactory().createFromHeader(fromAddress, fromTag);
62 //to 63 //to
63 - SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(platform.getDeviceGBId(), sipConfig.getDomain());  
64 - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);  
65 - ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress,null); 64 + SipURI toSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(parentPlatform.getDeviceGBId(), sipConfig.getDomain());
  65 + Address toAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(toSipURI);
  66 + ToHeader toHeader = sipLayer.getSipFactory().createHeaderFactory().createToHeader(toAddress,null);
66 67
67 //Forwards 68 //Forwards
68 - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); 69 + MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
69 70
70 //ceq 71 //ceq
71 - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(CSeq, Request.REGISTER);  
72 - request = sipFactory.createMessageFactory().createRequest(requestLine, Request.REGISTER, callIdHeader, 72 + CSeqHeader cSeqHeader = sipLayer.getSipFactory().createHeaderFactory().createCSeqHeader(CSeq, Request.REGISTER);
  73 + request = sipLayer.getSipFactory().createMessageFactory().createRequest(requestLine, Request.REGISTER, callIdHeader,
73 cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards); 74 cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
74 75
75 - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory()  
76 - .createSipURI(platform.getDeviceGBId(), sipAddress));  
77 - request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); 76 + Address concatAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(sipLayer.getSipFactory().createAddressFactory()
  77 + .createSipURI(parentPlatform.getDeviceGBId(), sipAddress));
  78 + request.addHeader(sipLayer.getSipFactory().createHeaderFactory().createContactHeader(concatAddress));
78 79
79 - ExpiresHeader expires = sipFactory.createHeaderFactory().createExpiresHeader(isRegister ? platform.getExpires() : 0); 80 + ExpiresHeader expires = sipLayer.getSipFactory().createHeaderFactory().createExpiresHeader(isRegister ? parentPlatform.getExpires() : 0);
80 request.addHeader(expires); 81 request.addHeader(expires);
81 82
82 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 83 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
83 84
84 return request; 85 return request;
85 } 86 }
@@ -89,9 +90,9 @@ public class SIPRequestHeaderPlarformProvider { @@ -89,9 +90,9 @@ public class SIPRequestHeaderPlarformProvider {
89 90
90 91
91 Request registerRequest = createRegisterRequest(parentPlatform, redisCatchStorage.getCSEQ(), fromTag, viaTag, callIdHeader, isRegister); 92 Request registerRequest = createRegisterRequest(parentPlatform, redisCatchStorage.getCSEQ(), fromTag, viaTag, callIdHeader, isRegister);
92 - SipURI requestURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerIP() + ":" + parentPlatform.getServerPort()); 93 + SipURI requestURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerIP() + ":" + parentPlatform.getServerPort());
93 if (www == null) { 94 if (www == null) {
94 - AuthorizationHeader authorizationHeader = sipFactory.createHeaderFactory().createAuthorizationHeader("Digest"); 95 + AuthorizationHeader authorizationHeader = sipLayer.getSipFactory().createHeaderFactory().createAuthorizationHeader("Digest");
95 authorizationHeader.setUsername(parentPlatform.getDeviceGBId()); 96 authorizationHeader.setUsername(parentPlatform.getDeviceGBId());
96 authorizationHeader.setURI(requestURI); 97 authorizationHeader.setURI(requestURI);
97 authorizationHeader.setAlgorithm("MD5"); 98 authorizationHeader.setAlgorithm("MD5");
@@ -140,7 +141,7 @@ public class SIPRequestHeaderPlarformProvider { @@ -140,7 +141,7 @@ public class SIPRequestHeaderPlarformProvider {
140 141
141 String RESPONSE = DigestUtils.md5DigestAsHex(reStr.toString().getBytes()); 142 String RESPONSE = DigestUtils.md5DigestAsHex(reStr.toString().getBytes());
142 143
143 - AuthorizationHeader authorizationHeader = sipFactory.createHeaderFactory().createAuthorizationHeader(scheme); 144 + AuthorizationHeader authorizationHeader = sipLayer.getSipFactory().createHeaderFactory().createAuthorizationHeader(scheme);
144 authorizationHeader.setUsername(parentPlatform.getDeviceGBId()); 145 authorizationHeader.setUsername(parentPlatform.getDeviceGBId());
145 authorizationHeader.setRealm(realm); 146 authorizationHeader.setRealm(realm);
146 authorizationHeader.setNonce(nonce); 147 authorizationHeader.setNonce(nonce);
@@ -158,7 +159,7 @@ public class SIPRequestHeaderPlarformProvider { @@ -158,7 +159,7 @@ public class SIPRequestHeaderPlarformProvider {
158 } 159 }
159 160
160 public Request createMessageRequest(ParentPlatform parentPlatform, String content, SendRtpItem sendRtpItem) throws PeerUnavailableException, ParseException, InvalidArgumentException { 161 public Request createMessageRequest(ParentPlatform parentPlatform, String content, SendRtpItem sendRtpItem) throws PeerUnavailableException, ParseException, InvalidArgumentException {
161 - CallIdHeader callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(sendRtpItem.getCallId()); 162 + CallIdHeader callIdHeader = sipLayer.getSipFactory().createHeaderFactory().createCallIdHeader(sendRtpItem.getCallId());
162 return createMessageRequest(parentPlatform, content, sendRtpItem.getToTag(), SipUtils.getNewViaTag(), sendRtpItem.getFromTag(), callIdHeader); 163 return createMessageRequest(parentPlatform, content, sendRtpItem.getToTag(), SipUtils.getNewViaTag(), sendRtpItem.getFromTag(), callIdHeader);
163 } 164 }
164 165
@@ -171,36 +172,36 @@ public class SIPRequestHeaderPlarformProvider { @@ -171,36 +172,36 @@ public class SIPRequestHeaderPlarformProvider {
171 Request request = null; 172 Request request = null;
172 String serverAddress = parentPlatform.getServerIP()+ ":" + parentPlatform.getServerPort(); 173 String serverAddress = parentPlatform.getServerIP()+ ":" + parentPlatform.getServerPort();
173 // sipuri 174 // sipuri
174 - SipURI requestURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(), serverAddress); 175 + SipURI requestURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(parentPlatform.getServerGBId(), serverAddress);
175 // via 176 // via
176 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); 177 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
177 - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(parentPlatform.getDeviceIp(), Integer.parseInt(parentPlatform.getDevicePort()), 178 + ViaHeader viaHeader = sipLayer.getSipFactory().createHeaderFactory().createViaHeader(parentPlatform.getDeviceIp(), Integer.parseInt(parentPlatform.getDevicePort()),
178 parentPlatform.getTransport(), viaTag); 179 parentPlatform.getTransport(), viaTag);
179 viaHeader.setRPort(); 180 viaHeader.setRPort();
180 viaHeaders.add(viaHeader); 181 viaHeaders.add(viaHeader);
181 // from 182 // from
182 - // SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getDeviceGBId(), parentPlatform.getDeviceIp() + ":" + parentPlatform.getDeviceIp());  
183 - SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getDeviceGBId(), sipConfig.getDomain());  
184 - Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);  
185 - FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag); 183 + // SipURI fromSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(parentPlatform.getDeviceGBId(), parentPlatform.getDeviceIp() + ":" + parentPlatform.getDeviceIp());
  184 + SipURI fromSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(parentPlatform.getDeviceGBId(), sipConfig.getDomain());
  185 + Address fromAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(fromSipURI);
  186 + FromHeader fromHeader = sipLayer.getSipFactory().createHeaderFactory().createFromHeader(fromAddress, fromTag);
186 // to 187 // to
187 - SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(), serverAddress);  
188 - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);  
189 - ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, toTag); 188 + SipURI toSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(parentPlatform.getServerGBId(), serverAddress);
  189 + Address toAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(toSipURI);
  190 + ToHeader toHeader = sipLayer.getSipFactory().createHeaderFactory().createToHeader(toAddress, toTag);
190 191
191 // Forwards 192 // Forwards
192 - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); 193 + MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
193 // ceq 194 // ceq
194 - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.MESSAGE);  
195 - MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipFactory.createMessageFactory(); 195 + CSeqHeader cSeqHeader = sipLayer.getSipFactory().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.MESSAGE);
  196 + MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipLayer.getSipFactory().createMessageFactory();
196 // 设置编码, 防止中文乱码 197 // 设置编码, 防止中文乱码
197 messageFactory.setDefaultContentEncodingCharset(parentPlatform.getCharacterSet()); 198 messageFactory.setDefaultContentEncodingCharset(parentPlatform.getCharacterSet());
198 request = messageFactory.createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader, 199 request = messageFactory.createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader,
199 toHeader, viaHeaders, maxForwards); 200 toHeader, viaHeaders, maxForwards);
200 201
201 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 202 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
202 203
203 - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); 204 + ContentTypeHeader contentTypeHeader = sipLayer.getSipFactory().createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
204 request.setContent(content, contentTypeHeader); 205 request.setContent(content, contentTypeHeader);
205 return request; 206 return request;
206 } 207 }
@@ -208,54 +209,54 @@ public class SIPRequestHeaderPlarformProvider { @@ -208,54 +209,54 @@ public class SIPRequestHeaderPlarformProvider {
208 public SIPRequest createNotifyRequest(ParentPlatform parentPlatform, String content, SubscribeInfo subscribeInfo) throws PeerUnavailableException, ParseException, InvalidArgumentException { 209 public SIPRequest createNotifyRequest(ParentPlatform parentPlatform, String content, SubscribeInfo subscribeInfo) throws PeerUnavailableException, ParseException, InvalidArgumentException {
209 SIPRequest request = null; 210 SIPRequest request = null;
210 // sipuri 211 // sipuri
211 - SipURI requestURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerIP()+ ":" + parentPlatform.getServerPort()); 212 + SipURI requestURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerIP()+ ":" + parentPlatform.getServerPort());
212 // via 213 // via
213 ArrayList<ViaHeader> viaHeaders = new ArrayList<>(); 214 ArrayList<ViaHeader> viaHeaders = new ArrayList<>();
214 - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(parentPlatform.getDeviceIp(), Integer.parseInt(parentPlatform.getDevicePort()), 215 + ViaHeader viaHeader = sipLayer.getSipFactory().createHeaderFactory().createViaHeader(parentPlatform.getDeviceIp(), Integer.parseInt(parentPlatform.getDevicePort()),
215 parentPlatform.getTransport(), SipUtils.getNewViaTag()); 216 parentPlatform.getTransport(), SipUtils.getNewViaTag());
216 viaHeader.setRPort(); 217 viaHeader.setRPort();
217 viaHeaders.add(viaHeader); 218 viaHeaders.add(viaHeader);
218 // from 219 // from
219 - SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getDeviceGBId(), 220 + SipURI fromSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(parentPlatform.getDeviceGBId(),
220 parentPlatform.getDeviceIp() + ":" + parentPlatform.getDevicePort()); 221 parentPlatform.getDeviceIp() + ":" + parentPlatform.getDevicePort());
221 - Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);  
222 - FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, subscribeInfo.getResponse().getToTag()); 222 + Address fromAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(fromSipURI);
  223 + FromHeader fromHeader = sipLayer.getSipFactory().createHeaderFactory().createFromHeader(fromAddress, subscribeInfo.getResponse().getToTag());
223 // to 224 // to
224 - SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerGBDomain());  
225 - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);  
226 - ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, subscribeInfo.getRequest().getFromTag()); 225 + SipURI toSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(parentPlatform.getServerGBId(), parentPlatform.getServerGBDomain());
  226 + Address toAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(toSipURI);
  227 + ToHeader toHeader = sipLayer.getSipFactory().createHeaderFactory().createToHeader(toAddress, subscribeInfo.getRequest().getFromTag());
227 228
228 // Forwards 229 // Forwards
229 - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); 230 + MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
230 // ceq 231 // ceq
231 - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.NOTIFY);  
232 - MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipFactory.createMessageFactory(); 232 + CSeqHeader cSeqHeader = sipLayer.getSipFactory().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.NOTIFY);
  233 + MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipLayer.getSipFactory().createMessageFactory();
233 // 设置编码, 防止中文乱码 234 // 设置编码, 防止中文乱码
234 messageFactory.setDefaultContentEncodingCharset("gb2312"); 235 messageFactory.setDefaultContentEncodingCharset("gb2312");
235 236
236 - CallIdHeader callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(subscribeInfo.getRequest().getCallIdHeader().getCallId()); 237 + CallIdHeader callIdHeader = sipLayer.getSipFactory().createHeaderFactory().createCallIdHeader(subscribeInfo.getRequest().getCallIdHeader().getCallId());
237 238
238 request = (SIPRequest) messageFactory.createRequest(requestURI, Request.NOTIFY, callIdHeader, cSeqHeader, fromHeader, 239 request = (SIPRequest) messageFactory.createRequest(requestURI, Request.NOTIFY, callIdHeader, cSeqHeader, fromHeader,
239 toHeader, viaHeaders, maxForwards); 240 toHeader, viaHeaders, maxForwards);
240 241
241 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 242 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
242 243
243 - EventHeader event = sipFactory.createHeaderFactory().createEventHeader(subscribeInfo.getEventType()); 244 + EventHeader event = sipLayer.getSipFactory().createHeaderFactory().createEventHeader(subscribeInfo.getEventType());
244 if (subscribeInfo.getEventId() != null) { 245 if (subscribeInfo.getEventId() != null) {
245 event.setEventId(subscribeInfo.getEventId()); 246 event.setEventId(subscribeInfo.getEventId());
246 } 247 }
247 248
248 request.addHeader(event); 249 request.addHeader(event);
249 250
250 - SubscriptionStateHeader active = sipFactory.createHeaderFactory().createSubscriptionStateHeader("active"); 251 + SubscriptionStateHeader active = sipLayer.getSipFactory().createHeaderFactory().createSubscriptionStateHeader("active");
251 request.setHeader(active); 252 request.setHeader(active);
252 253
253 - String sipAddress = sipConfig.getIp() + ":" + sipConfig.getPort();  
254 - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory() 254 + String sipAddress = parentPlatform.getDeviceIp() + ":" + parentPlatform.getDevicePort();
  255 + Address concatAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(sipLayer.getSipFactory().createAddressFactory()
255 .createSipURI(parentPlatform.getDeviceGBId(), sipAddress)); 256 .createSipURI(parentPlatform.getDeviceGBId(), sipAddress));
256 - request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); 257 + request.addHeader(sipLayer.getSipFactory().createHeaderFactory().createContactHeader(concatAddress));
257 258
258 - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); 259 + ContentTypeHeader contentTypeHeader = sipLayer.getSipFactory().createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
259 request.setContent(content, contentTypeHeader); 260 request.setContent(content, contentTypeHeader);
260 return request; 261 return request;
261 } 262 }
@@ -268,42 +269,42 @@ public class SIPRequestHeaderPlarformProvider { @@ -268,42 +269,42 @@ public class SIPRequestHeaderPlarformProvider {
268 269
269 SIPRequest request = null; 270 SIPRequest request = null;
270 // sipuri 271 // sipuri
271 - SipURI requestURI = sipFactory.createAddressFactory().createSipURI(platform.getServerGBId(), platform.getServerIP()+ ":" + platform.getServerPort()); 272 + SipURI requestURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(platform.getServerGBId(), platform.getServerIP()+ ":" + platform.getServerPort());
272 // via 273 // via
273 ArrayList<ViaHeader> viaHeaders = new ArrayList<>(); 274 ArrayList<ViaHeader> viaHeaders = new ArrayList<>();
274 - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(platform.getDeviceIp(), Integer.parseInt(platform.getDevicePort()), 275 + ViaHeader viaHeader = sipLayer.getSipFactory().createHeaderFactory().createViaHeader(platform.getDeviceIp(), Integer.parseInt(platform.getDevicePort()),
275 platform.getTransport(), SipUtils.getNewViaTag()); 276 platform.getTransport(), SipUtils.getNewViaTag());
276 viaHeader.setRPort(); 277 viaHeader.setRPort();
277 viaHeaders.add(viaHeader); 278 viaHeaders.add(viaHeader);
278 // from 279 // from
279 - SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(platform.getDeviceGBId(), 280 + SipURI fromSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(platform.getDeviceGBId(),
280 platform.getDeviceIp() + ":" + platform.getDevicePort()); 281 platform.getDeviceIp() + ":" + platform.getDevicePort());
281 - Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);  
282 - FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, sendRtpItem.getToTag()); 282 + Address fromAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(fromSipURI);
  283 + FromHeader fromHeader = sipLayer.getSipFactory().createHeaderFactory().createFromHeader(fromAddress, sendRtpItem.getToTag());
283 // to 284 // to
284 - SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(platform.getServerGBId(), platform.getServerGBDomain());  
285 - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);  
286 - ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, sendRtpItem.getFromTag()); 285 + SipURI toSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(platform.getServerGBId(), platform.getServerGBDomain());
  286 + Address toAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(toSipURI);
  287 + ToHeader toHeader = sipLayer.getSipFactory().createHeaderFactory().createToHeader(toAddress, sendRtpItem.getFromTag());
287 288
288 // Forwards 289 // Forwards
289 - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); 290 + MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
290 // ceq 291 // ceq
291 - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.BYE);  
292 - MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipFactory.createMessageFactory(); 292 + CSeqHeader cSeqHeader = sipLayer.getSipFactory().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.BYE);
  293 + MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipLayer.getSipFactory().createMessageFactory();
293 // 设置编码, 防止中文乱码 294 // 设置编码, 防止中文乱码
294 messageFactory.setDefaultContentEncodingCharset("gb2312"); 295 messageFactory.setDefaultContentEncodingCharset("gb2312");
295 296
296 - CallIdHeader callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(sendRtpItem.getCallId()); 297 + CallIdHeader callIdHeader = sipLayer.getSipFactory().createHeaderFactory().createCallIdHeader(sendRtpItem.getCallId());
297 298
298 request = (SIPRequest) messageFactory.createRequest(requestURI, Request.BYE, callIdHeader, cSeqHeader, fromHeader, 299 request = (SIPRequest) messageFactory.createRequest(requestURI, Request.BYE, callIdHeader, cSeqHeader, fromHeader,
299 toHeader, viaHeaders, maxForwards); 300 toHeader, viaHeaders, maxForwards);
300 301
301 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 302 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
302 303
303 - String sipAddress = sipConfig.getIp() + ":" + sipConfig.getPort();  
304 - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory() 304 + String sipAddress = platform.getDeviceIp() + ":" + platform.getDevicePort();
  305 + Address concatAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(sipLayer.getSipFactory().createAddressFactory()
305 .createSipURI(platform.getDeviceGBId(), sipAddress)); 306 .createSipURI(platform.getDeviceGBId(), sipAddress));
306 - request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); 307 + request.addHeader(sipLayer.getSipFactory().createHeaderFactory().createContactHeader(concatAddress));
307 308
308 return request; 309 return request;
309 } 310 }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
1 package com.genersoft.iot.vmp.gb28181.transmit.cmd; 1 package com.genersoft.iot.vmp.gb28181.transmit.cmd;
2 2
3 -import java.text.ParseException;  
4 -import java.util.ArrayList;  
5 -  
6 -import javax.sip.*;  
7 -import javax.sip.address.Address;  
8 -import javax.sip.address.SipURI;  
9 -import javax.sip.header.*;  
10 -import javax.sip.message.Request;  
11 -  
12 -import com.genersoft.iot.vmp.common.StreamInfo;  
13 -import com.genersoft.iot.vmp.gb28181.bean.SipMsgInfo; 3 +import com.genersoft.iot.vmp.conf.SipConfig;
  4 +import com.genersoft.iot.vmp.gb28181.SipLayer;
  5 +import com.genersoft.iot.vmp.gb28181.bean.Device;
14 import com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo; 6 import com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo;
15 -import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;  
16 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; 7 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
17 import com.genersoft.iot.vmp.gb28181.utils.SipUtils; 8 import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
18 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 9 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
19 import com.genersoft.iot.vmp.utils.GitUtil; 10 import com.genersoft.iot.vmp.utils.GitUtil;
20 -import gov.nist.javax.sip.SipProviderImpl;  
21 -import gov.nist.javax.sip.SipStackImpl;  
22 import gov.nist.javax.sip.message.SIPRequest; 11 import gov.nist.javax.sip.message.SIPRequest;
23 import gov.nist.javax.sip.message.SIPResponse; 12 import gov.nist.javax.sip.message.SIPResponse;
24 -import gov.nist.javax.sip.stack.SIPDialog;  
25 import org.springframework.beans.factory.annotation.Autowired; 13 import org.springframework.beans.factory.annotation.Autowired;
26 -import org.springframework.beans.factory.annotation.Qualifier;  
27 import org.springframework.stereotype.Component; 14 import org.springframework.stereotype.Component;
28 15
29 -import com.genersoft.iot.vmp.conf.SipConfig;  
30 -import com.genersoft.iot.vmp.gb28181.bean.Device; 16 +import javax.sip.InvalidArgumentException;
  17 +import javax.sip.PeerUnavailableException;
  18 +import javax.sip.SipException;
  19 +import javax.sip.address.Address;
  20 +import javax.sip.address.SipURI;
  21 +import javax.sip.header.*;
  22 +import javax.sip.message.Request;
  23 +import java.text.ParseException;
  24 +import java.util.ArrayList;
31 25
32 /** 26 /**
33 * @description:摄像头命令request创造器 TODO 冗余代码太多待优化 27 * @description:摄像头命令request创造器 TODO 冗余代码太多待优化
@@ -41,7 +35,7 @@ public class SIPRequestHeaderProvider { @@ -41,7 +35,7 @@ public class SIPRequestHeaderProvider {
41 private SipConfig sipConfig; 35 private SipConfig sipConfig;
42 36
43 @Autowired 37 @Autowired
44 - private SipFactory sipFactory; 38 + private SipLayer sipLayer;
45 39
46 @Autowired 40 @Autowired
47 private GitUtil gitUtil; 41 private GitUtil gitUtil;
@@ -55,32 +49,32 @@ public class SIPRequestHeaderProvider { @@ -55,32 +49,32 @@ public class SIPRequestHeaderProvider {
55 public Request createMessageRequest(Device device, String content, String viaTag, String fromTag, String toTag, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException { 49 public Request createMessageRequest(Device device, String content, String viaTag, String fromTag, String toTag, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException {
56 Request request = null; 50 Request request = null;
57 // sipuri 51 // sipuri
58 - SipURI requestURI = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress()); 52 + SipURI requestURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());
59 // via 53 // via
60 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); 54 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
61 - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), device.getTransport(), viaTag); 55 + ViaHeader viaHeader = sipLayer.getSipFactory().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), viaTag);
62 viaHeader.setRPort(); 56 viaHeader.setRPort();
63 viaHeaders.add(viaHeader); 57 viaHeaders.add(viaHeader);
64 // from 58 // from
65 - SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());  
66 - Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);  
67 - FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag); 59 + SipURI fromSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());
  60 + Address fromAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(fromSipURI);
  61 + FromHeader fromHeader = sipLayer.getSipFactory().createHeaderFactory().createFromHeader(fromAddress, fromTag);
68 // to 62 // to
69 - SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());  
70 - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);  
71 - ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, toTag); 63 + SipURI toSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());
  64 + Address toAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(toSipURI);
  65 + ToHeader toHeader = sipLayer.getSipFactory().createHeaderFactory().createToHeader(toAddress, toTag);
72 66
73 // Forwards 67 // Forwards
74 - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); 68 + MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
75 // ceq 69 // ceq
76 - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.MESSAGE); 70 + CSeqHeader cSeqHeader = sipLayer.getSipFactory().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.MESSAGE);
77 71
78 - request = sipFactory.createMessageFactory().createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader, 72 + request = sipLayer.getSipFactory().createMessageFactory().createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader,
79 toHeader, viaHeaders, maxForwards); 73 toHeader, viaHeaders, maxForwards);
80 74
81 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 75 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
82 76
83 - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); 77 + ContentTypeHeader contentTypeHeader = sipLayer.getSipFactory().createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
84 request.setContent(content, contentTypeHeader); 78 request.setContent(content, contentTypeHeader);
85 return request; 79 return request;
86 } 80 }
@@ -88,38 +82,39 @@ public class SIPRequestHeaderProvider { @@ -88,38 +82,39 @@ public class SIPRequestHeaderProvider {
88 public Request createInviteRequest(Device device, String channelId, String content, String viaTag, String fromTag, String toTag, String ssrc, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException { 82 public Request createInviteRequest(Device device, String channelId, String content, String viaTag, String fromTag, String toTag, String ssrc, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException {
89 Request request = null; 83 Request request = null;
90 //请求行 84 //请求行
91 - SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress()); 85 + SipURI requestLine = sipLayer.getSipFactory().createAddressFactory().createSipURI(channelId, device.getHostAddress());
92 //via 86 //via
93 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); 87 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
94 - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), device.getTransport(), viaTag); 88 + HeaderFactory headerFactory = sipLayer.getSipFactory().createHeaderFactory();
  89 + ViaHeader viaHeader = sipLayer.getSipFactory().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), viaTag);
95 viaHeader.setRPort(); 90 viaHeader.setRPort();
96 viaHeaders.add(viaHeader); 91 viaHeaders.add(viaHeader);
97 92
98 //from 93 //from
99 - SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());  
100 - Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);  
101 - FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag); //必须要有标记,否则无法创建会话,无法回应ack 94 + SipURI fromSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());
  95 + Address fromAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(fromSipURI);
  96 + FromHeader fromHeader = sipLayer.getSipFactory().createHeaderFactory().createFromHeader(fromAddress, fromTag); //必须要有标记,否则无法创建会话,无法回应ack
102 //to 97 //to
103 - SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress());  
104 - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);  
105 - ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress,null); 98 + SipURI toSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(channelId, device.getHostAddress());
  99 + Address toAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(toSipURI);
  100 + ToHeader toHeader = sipLayer.getSipFactory().createHeaderFactory().createToHeader(toAddress,null);
106 101
107 //Forwards 102 //Forwards
108 - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); 103 + MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
109 104
110 //ceq 105 //ceq
111 - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INVITE);  
112 - request = sipFactory.createMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards); 106 + CSeqHeader cSeqHeader = sipLayer.getSipFactory().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INVITE);
  107 + request = sipLayer.getSipFactory().createMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
113 108
114 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 109 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
115 110
116 - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));  
117 - // Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), device.getHost().getIp()+":"+device.getHost().getPort()));  
118 - request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); 111 + Address concatAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(sipLayer.getSipFactory().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
  112 + // Address concatAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(sipLayer.getSipFactory().createAddressFactory().createSipURI(sipConfig.getId(), device.getHost().getIp()+":"+device.getHost().getPort()));
  113 + request.addHeader(sipLayer.getSipFactory().createHeaderFactory().createContactHeader(concatAddress));
119 // Subject 114 // Subject
120 - SubjectHeader subjectHeader = sipFactory.createHeaderFactory().createSubjectHeader(String.format("%s:%s,%s:%s", channelId, ssrc, sipConfig.getId(), 0)); 115 + SubjectHeader subjectHeader = sipLayer.getSipFactory().createHeaderFactory().createSubjectHeader(String.format("%s:%s,%s:%s", channelId, ssrc, sipConfig.getId(), 0));
121 request.addHeader(subjectHeader); 116 request.addHeader(subjectHeader);
122 - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); 117 + ContentTypeHeader contentTypeHeader = sipLayer.getSipFactory().createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP");
123 request.setContent(content, contentTypeHeader); 118 request.setContent(content, contentTypeHeader);
124 return request; 119 return request;
125 } 120 }
@@ -127,39 +122,39 @@ public class SIPRequestHeaderProvider { @@ -127,39 +122,39 @@ public class SIPRequestHeaderProvider {
127 public Request createPlaybackInviteRequest(Device device, String channelId, String content, String viaTag, String fromTag, String toTag, CallIdHeader callIdHeader, String ssrc) throws ParseException, InvalidArgumentException, PeerUnavailableException { 122 public Request createPlaybackInviteRequest(Device device, String channelId, String content, String viaTag, String fromTag, String toTag, CallIdHeader callIdHeader, String ssrc) throws ParseException, InvalidArgumentException, PeerUnavailableException {
128 Request request = null; 123 Request request = null;
129 //请求行 124 //请求行
130 - SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress()); 125 + SipURI requestLine = sipLayer.getSipFactory().createAddressFactory().createSipURI(channelId, device.getHostAddress());
131 // via 126 // via
132 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); 127 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
133 - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), device.getTransport(), viaTag); 128 + ViaHeader viaHeader = sipLayer.getSipFactory().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), viaTag);
134 viaHeader.setRPort(); 129 viaHeader.setRPort();
135 viaHeaders.add(viaHeader); 130 viaHeaders.add(viaHeader);
136 //from 131 //from
137 - SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());  
138 - Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);  
139 - FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag); //必须要有标记,否则无法创建会话,无法回应ack 132 + SipURI fromSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());
  133 + Address fromAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(fromSipURI);
  134 + FromHeader fromHeader = sipLayer.getSipFactory().createHeaderFactory().createFromHeader(fromAddress, fromTag); //必须要有标记,否则无法创建会话,无法回应ack
140 //to 135 //to
141 - SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress());  
142 - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);  
143 - ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress,null); 136 + SipURI toSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(channelId, device.getHostAddress());
  137 + Address toAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(toSipURI);
  138 + ToHeader toHeader = sipLayer.getSipFactory().createHeaderFactory().createToHeader(toAddress,null);
144 139
145 //Forwards 140 //Forwards
146 - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); 141 + MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
147 142
148 //ceq 143 //ceq
149 - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INVITE);  
150 - request = sipFactory.createMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards); 144 + CSeqHeader cSeqHeader = sipLayer.getSipFactory().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INVITE);
  145 + request = sipLayer.getSipFactory().createMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
151 146
152 - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));  
153 - // Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), device.getHost().getIp()+":"+device.getHost().getPort()));  
154 - request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); 147 + Address concatAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(sipLayer.getSipFactory().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
  148 + // Address concatAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(sipLayer.getSipFactory().createAddressFactory().createSipURI(sipConfig.getId(), device.getHost().getIp()+":"+device.getHost().getPort()));
  149 + request.addHeader(sipLayer.getSipFactory().createHeaderFactory().createContactHeader(concatAddress));
155 150
156 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 151 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
157 152
158 // Subject 153 // Subject
159 - SubjectHeader subjectHeader = sipFactory.createHeaderFactory().createSubjectHeader(String.format("%s:%s,%s:%s", channelId, ssrc, sipConfig.getId(), 0)); 154 + SubjectHeader subjectHeader = sipLayer.getSipFactory().createHeaderFactory().createSubjectHeader(String.format("%s:%s,%s:%s", channelId, ssrc, sipConfig.getId(), 0));
160 request.addHeader(subjectHeader); 155 request.addHeader(subjectHeader);
161 156
162 - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); 157 + ContentTypeHeader contentTypeHeader = sipLayer.getSipFactory().createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP");
163 request.setContent(content, contentTypeHeader); 158 request.setContent(content, contentTypeHeader);
164 return request; 159 return request;
165 } 160 }
@@ -167,34 +162,34 @@ public class SIPRequestHeaderProvider { @@ -167,34 +162,34 @@ public class SIPRequestHeaderProvider {
167 public Request createByteRequest(Device device, String channelId, SipTransactionInfo transactionInfo) throws ParseException, InvalidArgumentException, PeerUnavailableException { 162 public Request createByteRequest(Device device, String channelId, SipTransactionInfo transactionInfo) throws ParseException, InvalidArgumentException, PeerUnavailableException {
168 Request request = null; 163 Request request = null;
169 //请求行 164 //请求行
170 - SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress()); 165 + SipURI requestLine = sipLayer.getSipFactory().createAddressFactory().createSipURI(channelId, device.getHostAddress());
171 // via 166 // via
172 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); 167 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
173 - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), device.getTransport(), SipUtils.getNewViaTag()); 168 + ViaHeader viaHeader = sipLayer.getSipFactory().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), SipUtils.getNewViaTag());
174 viaHeaders.add(viaHeader); 169 viaHeaders.add(viaHeader);
175 //from 170 //from
176 - SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(),sipConfig.getDomain());  
177 - Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);  
178 - FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, transactionInfo.getFromTag()); 171 + SipURI fromSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(sipConfig.getId(),sipConfig.getDomain());
  172 + Address fromAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(fromSipURI);
  173 + FromHeader fromHeader = sipLayer.getSipFactory().createHeaderFactory().createFromHeader(fromAddress, transactionInfo.getFromTag());
179 //to 174 //to
180 - SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(channelId,device.getHostAddress());  
181 - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);  
182 - ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, transactionInfo.getToTag()); 175 + SipURI toSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(channelId,device.getHostAddress());
  176 + Address toAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(toSipURI);
  177 + ToHeader toHeader = sipLayer.getSipFactory().createHeaderFactory().createToHeader(toAddress, transactionInfo.getToTag());
183 178
184 //Forwards 179 //Forwards
185 - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); 180 + MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
186 181
187 //ceq 182 //ceq
188 - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.BYE);  
189 - CallIdHeader callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(transactionInfo.getCallId());  
190 - request = sipFactory.createMessageFactory().createRequest(requestLine, Request.BYE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards); 183 + CSeqHeader cSeqHeader = sipLayer.getSipFactory().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.BYE);
  184 + CallIdHeader callIdHeader = sipLayer.getSipFactory().createHeaderFactory().createCallIdHeader(transactionInfo.getCallId());
  185 + request = sipLayer.getSipFactory().createMessageFactory().createRequest(requestLine, Request.BYE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
191 186
192 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 187 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
193 188
194 - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));  
195 - request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); 189 + Address concatAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(sipLayer.getSipFactory().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
  190 + request.addHeader(sipLayer.getSipFactory().createHeaderFactory().createContactHeader(concatAddress));
196 191
197 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 192 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
198 193
199 return request; 194 return request;
200 } 195 }
@@ -202,50 +197,50 @@ public class SIPRequestHeaderProvider { @@ -202,50 +197,50 @@ public class SIPRequestHeaderProvider {
202 public Request createSubscribeRequest(Device device, String content, SIPRequest requestOld, Integer expires, String event, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException { 197 public Request createSubscribeRequest(Device device, String content, SIPRequest requestOld, Integer expires, String event, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException {
203 Request request = null; 198 Request request = null;
204 // sipuri 199 // sipuri
205 - SipURI requestURI = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress()); 200 + SipURI requestURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());
206 // via 201 // via
207 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); 202 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
208 - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), 203 + ViaHeader viaHeader = sipLayer.getSipFactory().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(),
209 device.getTransport(), SipUtils.getNewViaTag()); 204 device.getTransport(), SipUtils.getNewViaTag());
210 viaHeader.setRPort(); 205 viaHeader.setRPort();
211 viaHeaders.add(viaHeader); 206 viaHeaders.add(viaHeader);
212 // from 207 // from
213 - SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());  
214 - Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);  
215 - FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, requestOld == null ? SipUtils.getNewFromTag() :requestOld.getFromTag()); 208 + SipURI fromSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());
  209 + Address fromAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(fromSipURI);
  210 + FromHeader fromHeader = sipLayer.getSipFactory().createHeaderFactory().createFromHeader(fromAddress, requestOld == null ? SipUtils.getNewFromTag() :requestOld.getFromTag());
216 // to 211 // to
217 - SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());  
218 - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);  
219 - ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, requestOld == null ? null :requestOld.getToTag()); 212 + SipURI toSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());
  213 + Address toAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(toSipURI);
  214 + ToHeader toHeader = sipLayer.getSipFactory().createHeaderFactory().createToHeader(toAddress, requestOld == null ? null :requestOld.getToTag());
220 215
221 // Forwards 216 // Forwards
222 - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); 217 + MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
223 218
224 // ceq 219 // ceq
225 - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.SUBSCRIBE); 220 + CSeqHeader cSeqHeader = sipLayer.getSipFactory().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.SUBSCRIBE);
226 221
227 - request = sipFactory.createMessageFactory().createRequest(requestURI, Request.SUBSCRIBE, callIdHeader, cSeqHeader, fromHeader, 222 + request = sipLayer.getSipFactory().createMessageFactory().createRequest(requestURI, Request.SUBSCRIBE, callIdHeader, cSeqHeader, fromHeader,
228 toHeader, viaHeaders, maxForwards); 223 toHeader, viaHeaders, maxForwards);
229 224
230 225
231 - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));  
232 - request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); 226 + Address concatAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(sipLayer.getSipFactory().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
  227 + request.addHeader(sipLayer.getSipFactory().createHeaderFactory().createContactHeader(concatAddress));
233 228
234 // Expires 229 // Expires
235 - ExpiresHeader expireHeader = sipFactory.createHeaderFactory().createExpiresHeader(expires); 230 + ExpiresHeader expireHeader = sipLayer.getSipFactory().createHeaderFactory().createExpiresHeader(expires);
236 request.addHeader(expireHeader); 231 request.addHeader(expireHeader);
237 232
238 // Event 233 // Event
239 - EventHeader eventHeader = sipFactory.createHeaderFactory().createEventHeader(event); 234 + EventHeader eventHeader = sipLayer.getSipFactory().createHeaderFactory().createEventHeader(event);
240 235
241 int random = (int) Math.floor(Math.random() * 10000); 236 int random = (int) Math.floor(Math.random() * 10000);
242 eventHeader.setEventId(random + ""); 237 eventHeader.setEventId(random + "");
243 request.addHeader(eventHeader); 238 request.addHeader(eventHeader);
244 239
245 - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); 240 + ContentTypeHeader contentTypeHeader = sipLayer.getSipFactory().createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
246 request.setContent(content, contentTypeHeader); 241 request.setContent(content, contentTypeHeader);
247 242
248 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 243 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
249 244
250 return request; 245 return request;
251 } 246 }
@@ -257,64 +252,65 @@ public class SIPRequestHeaderProvider { @@ -257,64 +252,65 @@ public class SIPRequestHeaderProvider {
257 } 252 }
258 SIPRequest request = null; 253 SIPRequest request = null;
259 //请求行 254 //请求行
260 - SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress()); 255 + SipURI requestLine = sipLayer.getSipFactory().createAddressFactory().createSipURI(channelId, device.getHostAddress());
261 // via 256 // via
262 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); 257 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
263 - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), device.getTransport(), SipUtils.getNewViaTag()); 258 + ViaHeader viaHeader = sipLayer.getSipFactory().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(), device.getTransport(), SipUtils.getNewViaTag());
264 viaHeaders.add(viaHeader); 259 viaHeaders.add(viaHeader);
265 //from 260 //from
266 - SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(),sipConfig.getDomain());  
267 - Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);  
268 - FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, transactionInfo.getFromTag()); 261 + SipURI fromSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(sipConfig.getId(),sipConfig.getDomain());
  262 + Address fromAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(fromSipURI);
  263 + FromHeader fromHeader = sipLayer.getSipFactory().createHeaderFactory().createFromHeader(fromAddress, transactionInfo.getFromTag());
269 //to 264 //to
270 - SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(channelId,device.getHostAddress());  
271 - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);  
272 - ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, transactionInfo.getToTag()); 265 + SipURI toSipURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(channelId,device.getHostAddress());
  266 + Address toAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(toSipURI);
  267 + ToHeader toHeader = sipLayer.getSipFactory().createHeaderFactory().createToHeader(toAddress, transactionInfo.getToTag());
273 268
274 //Forwards 269 //Forwards
275 - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); 270 + MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
276 271
277 //ceq 272 //ceq
278 - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INFO);  
279 - CallIdHeader callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(transactionInfo.getCallId());  
280 - request = (SIPRequest)sipFactory.createMessageFactory().createRequest(requestLine, Request.INFO, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards); 273 + CSeqHeader cSeqHeader = sipLayer.getSipFactory().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INFO);
  274 + CallIdHeader callIdHeader = sipLayer.getSipFactory().createHeaderFactory().createCallIdHeader(transactionInfo.getCallId());
  275 + request = (SIPRequest)sipLayer.getSipFactory().createMessageFactory().createRequest(requestLine, Request.INFO, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards);
281 276
282 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 277 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
283 278
284 - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));  
285 - request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); 279 + Address concatAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(sipLayer.getSipFactory().createAddressFactory().createSipURI(sipConfig.getId(), sipLayer.getLocalIp(device.getLocalIp())+":"+sipConfig.getPort()));
  280 + request.addHeader(sipLayer.getSipFactory().createHeaderFactory().createContactHeader(concatAddress));
286 281
287 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 282 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
288 283
289 if (content != null) { 284 if (content != null) {
290 - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", 285 + ContentTypeHeader contentTypeHeader = sipLayer.getSipFactory().createHeaderFactory().createContentTypeHeader("Application",
291 "MANSRTSP"); 286 "MANSRTSP");
292 request.setContent(content, contentTypeHeader); 287 request.setContent(content, contentTypeHeader);
293 } 288 }
294 return request; 289 return request;
295 } 290 }
296 291
297 - public Request createAckRequest(SipURI sipURI, SIPResponse sipResponse) throws ParseException, InvalidArgumentException, PeerUnavailableException { 292 + public Request createAckRequest(String localIp, SipURI sipURI, SIPResponse sipResponse) throws ParseException, InvalidArgumentException, PeerUnavailableException {
  293 +
298 294
299 // via 295 // via
300 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); 296 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
301 - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), sipResponse.getTopmostViaHeader().getTransport(), SipUtils.getNewViaTag()); 297 + ViaHeader viaHeader = sipLayer.getSipFactory().createHeaderFactory().createViaHeader(localIp, sipConfig.getPort(), sipResponse.getTopmostViaHeader().getTransport(), SipUtils.getNewViaTag());
302 viaHeaders.add(viaHeader); 298 viaHeaders.add(viaHeader);
303 299
304 //Forwards 300 //Forwards
305 - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); 301 + MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
306 302
307 //ceq 303 //ceq
308 - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(sipResponse.getCSeqHeader().getSeqNumber(), Request.ACK); 304 + CSeqHeader cSeqHeader = sipLayer.getSipFactory().createHeaderFactory().createCSeqHeader(sipResponse.getCSeqHeader().getSeqNumber(), Request.ACK);
309 305
310 - Request request = sipFactory.createMessageFactory().createRequest(sipURI, Request.ACK, sipResponse.getCallIdHeader(), cSeqHeader, sipResponse.getFromHeader(), sipResponse.getToHeader(), viaHeaders, maxForwards); 306 + Request request = sipLayer.getSipFactory().createMessageFactory().createRequest(sipURI, Request.ACK, sipResponse.getCallIdHeader(), cSeqHeader, sipResponse.getFromHeader(), sipResponse.getToHeader(), viaHeaders, maxForwards);
311 307
312 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 308 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
313 309
314 - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));  
315 - request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); 310 + Address concatAddress = sipLayer.getSipFactory().createAddressFactory().createAddress(sipLayer.getSipFactory().createAddressFactory().createSipURI(sipConfig.getId(), localIp + ":"+sipConfig.getPort()));
  311 + request.addHeader(sipLayer.getSipFactory().createHeaderFactory().createContactHeader(concatAddress));
316 312
317 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 313 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
318 314
319 return request; 315 return request;
320 } 316 }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -5,6 +5,7 @@ import com.genersoft.iot.vmp.common.StreamInfo; @@ -5,6 +5,7 @@ import com.genersoft.iot.vmp.common.StreamInfo;
5 import com.genersoft.iot.vmp.conf.SipConfig; 5 import com.genersoft.iot.vmp.conf.SipConfig;
6 import com.genersoft.iot.vmp.conf.UserSetting; 6 import com.genersoft.iot.vmp.conf.UserSetting;
7 import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; 7 import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
  8 +import com.genersoft.iot.vmp.gb28181.SipLayer;
8 import com.genersoft.iot.vmp.gb28181.bean.*; 9 import com.genersoft.iot.vmp.gb28181.bean.*;
9 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; 10 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
10 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; 11 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
@@ -32,7 +33,6 @@ import org.springframework.util.ObjectUtils; @@ -32,7 +33,6 @@ import org.springframework.util.ObjectUtils;
32 import javax.sip.InvalidArgumentException; 33 import javax.sip.InvalidArgumentException;
33 import javax.sip.ResponseEvent; 34 import javax.sip.ResponseEvent;
34 import javax.sip.SipException; 35 import javax.sip.SipException;
35 -import javax.sip.SipFactory;  
36 import javax.sip.header.CallIdHeader; 36 import javax.sip.header.CallIdHeader;
37 import javax.sip.message.Request; 37 import javax.sip.message.Request;
38 import java.text.ParseException; 38 import java.text.ParseException;
@@ -52,7 +52,7 @@ public class SIPCommander implements ISIPCommander { @@ -52,7 +52,7 @@ public class SIPCommander implements ISIPCommander {
52 private SipConfig sipConfig; 52 private SipConfig sipConfig;
53 53
54 @Autowired 54 @Autowired
55 - private SipFactory sipFactory; 55 + private SipLayer sipLayer;
56 56
57 @Autowired 57 @Autowired
58 private SIPSender sipSender; 58 private SIPSender sipSender;
@@ -181,9 +181,9 @@ public class SIPCommander implements ISIPCommander { @@ -181,9 +181,9 @@ public class SIPCommander implements ISIPCommander {
181 ptzXml.append("</Info>\r\n"); 181 ptzXml.append("</Info>\r\n");
182 ptzXml.append("</Control>\r\n"); 182 ptzXml.append("</Control>\r\n");
183 183
184 - Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, sipSender.getNewCallIdHeader(device.getTransport())); 184 + Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
185 185
186 - sipSender.transmitRequest( request); 186 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request);
187 } 187 }
188 188
189 /** 189 /**
@@ -216,8 +216,8 @@ public class SIPCommander implements ISIPCommander { @@ -216,8 +216,8 @@ public class SIPCommander implements ISIPCommander {
216 216
217 217
218 218
219 - SIPRequest request = (SIPRequest) headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));  
220 - sipSender.transmitRequest(request); 219 + SIPRequest request = (SIPRequest) headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  220 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request);
221 221
222 } 222 }
223 223
@@ -245,8 +245,8 @@ public class SIPCommander implements ISIPCommander { @@ -245,8 +245,8 @@ public class SIPCommander implements ISIPCommander {
245 ptzXml.append("</Control>\r\n"); 245 ptzXml.append("</Control>\r\n");
246 246
247 247
248 - Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));  
249 - sipSender.transmitRequest(request, errorEvent, okEvent); 248 + Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  249 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request, errorEvent, okEvent);
250 250
251 } 251 }
252 252
@@ -340,8 +340,8 @@ public class SIPCommander implements ISIPCommander { @@ -340,8 +340,8 @@ public class SIPCommander implements ISIPCommander {
340 340
341 341
342 342
343 - Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, ssrcInfo.getSsrc(),sipSender.getNewCallIdHeader(device.getTransport()));  
344 - sipSender.transmitRequest( request, (e -> { 343 + Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, ssrcInfo.getSsrc(),sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  344 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, (e -> {
345 streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); 345 streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
346 mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); 346 mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
347 errorEvent.response(e); 347 errorEvent.response(e);
@@ -423,36 +423,39 @@ public class SIPCommander implements ISIPCommander { @@ -423,36 +423,39 @@ public class SIPCommander implements ISIPCommander {
423 content.append("a=rtpmap:97 MPEG4/90000\r\n"); 423 content.append("a=rtpmap:97 MPEG4/90000\r\n");
424 content.append("a=rtpmap:98 H264/90000\r\n"); 424 content.append("a=rtpmap:98 H264/90000\r\n");
425 content.append("a=rtpmap:99 H265/90000\r\n"); 425 content.append("a=rtpmap:99 H265/90000\r\n");
426 - if ("TCP-PASSIVE".equalsIgnoreCase(streamMode)) { // tcp被动模式 426 + if ("TCP-PASSIVE".equalsIgnoreCase(streamMode)) {
  427 + // tcp被动模式
427 content.append("a=setup:passive\r\n"); 428 content.append("a=setup:passive\r\n");
428 content.append("a=connection:new\r\n"); 429 content.append("a=connection:new\r\n");
429 - } else if ("TCP-ACTIVE".equalsIgnoreCase(streamMode)) { // tcp主动模式 430 + } else if ("TCP-ACTIVE".equalsIgnoreCase(streamMode)) {
  431 + // tcp主动模式
430 content.append("a=setup:active\r\n"); 432 content.append("a=setup:active\r\n");
431 content.append("a=connection:new\r\n"); 433 content.append("a=connection:new\r\n");
432 } 434 }
433 } 435 }
434 436
435 - content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc 437 + //ssrc
  438 + content.append("y=" + ssrcInfo.getSsrc() + "\r\n");
436 439
437 HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId()); 440 HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId());
438 // 添加订阅 441 // 添加订阅
439 subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> { 442 subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> {
440 if (hookEvent != null) { 443 if (hookEvent != null) {
441 - InviteStreamInfo inviteStreamInfo = new InviteStreamInfo(mediaServerItemInUse, json,sipSender.getNewCallIdHeader(device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream()); 444 + InviteStreamInfo inviteStreamInfo = new InviteStreamInfo(mediaServerItemInUse, json,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream());
442 hookEvent.call(inviteStreamInfo); 445 hookEvent.call(inviteStreamInfo);
443 } 446 }
444 subscribe.removeSubscribe(hookSubscribe); 447 subscribe.removeSubscribe(hookSubscribe);
445 }); 448 });
446 - Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()), ssrcInfo.getSsrc()); 449 + Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()), ssrcInfo.getSsrc());
447 450
448 - sipSender.transmitRequest( request, errorEvent, event -> { 451 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent, event -> {
449 ResponseEvent responseEvent = (ResponseEvent) event.event; 452 ResponseEvent responseEvent = (ResponseEvent) event.event;
450 SIPResponse response = (SIPResponse) responseEvent.getResponse(); 453 SIPResponse response = (SIPResponse) responseEvent.getResponse();
451 - streamSession.put(device.getDeviceId(), channelId,sipSender.getNewCallIdHeader(device.getTransport()).getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.playback); 454 + streamSession.put(device.getDeviceId(), channelId,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.playback);
452 okEvent.response(event); 455 okEvent.response(event);
453 }); 456 });
454 if (inviteStreamCallback != null) { 457 if (inviteStreamCallback != null) {
455 - inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null,sipSender.getNewCallIdHeader(device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream())); 458 + inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream()));
456 } 459 }
457 } 460 }
458 461
@@ -541,7 +544,7 @@ public class SIPCommander implements ISIPCommander { @@ -541,7 +544,7 @@ public class SIPCommander implements ISIPCommander {
541 HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, null, mediaServerItem.getId()); 544 HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, null, mediaServerItem.getId());
542 // 添加订阅 545 // 添加订阅
543 subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> { 546 subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> {
544 - hookEvent.call(new InviteStreamInfo(mediaServerItem, json,sipSender.getNewCallIdHeader(device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream())); 547 + hookEvent.call(new InviteStreamInfo(mediaServerItem, json,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream()));
545 subscribe.removeSubscribe(hookSubscribe); 548 subscribe.removeSubscribe(hookSubscribe);
546 hookSubscribe.getContent().put("regist", false); 549 hookSubscribe.getContent().put("regist", false);
547 hookSubscribe.getContent().put("schema", "rtsp"); 550 hookSubscribe.getContent().put("schema", "rtsp");
@@ -550,7 +553,7 @@ public class SIPCommander implements ISIPCommander { @@ -550,7 +553,7 @@ public class SIPCommander implements ISIPCommander {
550 (MediaServerItem mediaServerItemForEnd, JSONObject jsonForEnd) -> { 553 (MediaServerItem mediaServerItemForEnd, JSONObject jsonForEnd) -> {
551 logger.info("[录像]下载结束, 发送BYE"); 554 logger.info("[录像]下载结束, 发送BYE");
552 try { 555 try {
553 - streamByeCmd(device, channelId, ssrcInfo.getStream(),sipSender.getNewCallIdHeader(device.getTransport()).getCallId()); 556 + streamByeCmd(device, channelId, ssrcInfo.getStream(),sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId());
554 } catch (InvalidArgumentException | ParseException | SipException | 557 } catch (InvalidArgumentException | ParseException | SipException |
555 SsrcTransactionNotFoundException e) { 558 SsrcTransactionNotFoundException e) {
556 logger.error("[录像]下载结束, 发送BYE失败 {}", e.getMessage()); 559 logger.error("[录像]下载结束, 发送BYE失败 {}", e.getMessage());
@@ -558,14 +561,14 @@ public class SIPCommander implements ISIPCommander { @@ -558,14 +561,14 @@ public class SIPCommander implements ISIPCommander {
558 }); 561 });
559 }); 562 });
560 563
561 - Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()), ssrcInfo.getSsrc()); 564 + Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()), ssrcInfo.getSsrc());
562 if (inviteStreamCallback != null) { 565 if (inviteStreamCallback != null) {
563 - inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null,sipSender.getNewCallIdHeader(device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream())); 566 + inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream()));
564 } 567 }
565 - sipSender.transmitRequest( request, errorEvent, okEvent -> { 568 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent, okEvent -> {
566 ResponseEvent responseEvent = (ResponseEvent) okEvent.event; 569 ResponseEvent responseEvent = (ResponseEvent) okEvent.event;
567 SIPResponse response = (SIPResponse) responseEvent.getResponse(); 570 SIPResponse response = (SIPResponse) responseEvent.getResponse();
568 - streamSession.put(device.getDeviceId(), channelId,sipSender.getNewCallIdHeader(device.getTransport()).getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.download); 571 + streamSession.put(device.getDeviceId(), channelId,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.download);
569 }); 572 });
570 } 573 }
571 574
@@ -592,7 +595,7 @@ public class SIPCommander implements ISIPCommander { @@ -592,7 +595,7 @@ public class SIPCommander implements ISIPCommander {
592 streamSession.remove(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream()); 595 streamSession.remove(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream());
593 596
594 Request byteRequest = headerProvider.createByteRequest(device, channelId, ssrcTransaction.getSipTransactionInfo()); 597 Request byteRequest = headerProvider.createByteRequest(device, channelId, ssrcTransaction.getSipTransactionInfo());
595 - sipSender.transmitRequest( byteRequest, null, okEvent); 598 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), byteRequest, null, okEvent);
596 } 599 }
597 600
598 /** 601 /**
@@ -625,8 +628,8 @@ public class SIPCommander implements ISIPCommander { @@ -625,8 +628,8 @@ public class SIPCommander implements ISIPCommander {
625 628
626 629
627 630
628 - Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));  
629 - sipSender.transmitRequest( request); 631 + Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  632 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request);
630 633
631 } 634 }
632 635
@@ -645,8 +648,8 @@ public class SIPCommander implements ISIPCommander { @@ -645,8 +648,8 @@ public class SIPCommander implements ISIPCommander {
645 648
646 649
647 650
648 - Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));  
649 - sipSender.transmitRequest( request, errorEvent); 651 + Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  652 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
650 653
651 } 654 }
652 655
@@ -676,8 +679,8 @@ public class SIPCommander implements ISIPCommander { @@ -676,8 +679,8 @@ public class SIPCommander implements ISIPCommander {
676 679
677 680
678 681
679 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));  
680 - sipSender.transmitRequest( request, errorEvent); 682 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  683 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
681 } 684 }
682 685
683 /** 686 /**
@@ -700,8 +703,8 @@ public class SIPCommander implements ISIPCommander { @@ -700,8 +703,8 @@ public class SIPCommander implements ISIPCommander {
700 703
701 704
702 705
703 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));  
704 - sipSender.transmitRequest( request); 706 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  707 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request);
705 } 708 }
706 709
707 /** 710 /**
@@ -725,8 +728,8 @@ public class SIPCommander implements ISIPCommander { @@ -725,8 +728,8 @@ public class SIPCommander implements ISIPCommander {
725 728
726 729
727 730
728 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));  
729 - sipSender.transmitRequest( request, errorEvent); 731 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  732 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
730 } 733 }
731 734
732 /** 735 /**
@@ -761,8 +764,8 @@ public class SIPCommander implements ISIPCommander { @@ -761,8 +764,8 @@ public class SIPCommander implements ISIPCommander {
761 764
762 765
763 766
764 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));  
765 - sipSender.transmitRequest( request, errorEvent); 767 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  768 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
766 } 769 }
767 770
768 /** 771 /**
@@ -790,8 +793,8 @@ public class SIPCommander implements ISIPCommander { @@ -790,8 +793,8 @@ public class SIPCommander implements ISIPCommander {
790 793
791 794
792 795
793 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));  
794 - sipSender.transmitRequest( request); 796 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  797 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request);
795 } 798 }
796 799
797 /** 800 /**
@@ -837,8 +840,8 @@ public class SIPCommander implements ISIPCommander { @@ -837,8 +840,8 @@ public class SIPCommander implements ISIPCommander {
837 840
838 841
839 842
840 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));  
841 - sipSender.transmitRequest( request, errorEvent); 843 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  844 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
842 } 845 }
843 846
844 /** 847 /**
@@ -900,8 +903,8 @@ public class SIPCommander implements ISIPCommander { @@ -900,8 +903,8 @@ public class SIPCommander implements ISIPCommander {
900 903
901 904
902 905
903 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));  
904 - sipSender.transmitRequest( request, errorEvent); 906 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  907 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
905 } 908 }
906 909
907 /** 910 /**
@@ -923,9 +926,9 @@ public class SIPCommander implements ISIPCommander { @@ -923,9 +926,9 @@ public class SIPCommander implements ISIPCommander {
923 926
924 927
925 928
926 - Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport())); 929 + Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
927 930
928 - sipSender.transmitRequest( request, errorEvent); 931 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
929 } 932 }
930 933
931 /** 934 /**
@@ -947,9 +950,9 @@ public class SIPCommander implements ISIPCommander { @@ -947,9 +950,9 @@ public class SIPCommander implements ISIPCommander {
947 950
948 951
949 952
950 - Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport())); 953 + Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
951 954
952 - sipSender.transmitRequest( request); 955 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request);
953 956
954 } 957 }
955 958
@@ -972,9 +975,9 @@ public class SIPCommander implements ISIPCommander { @@ -972,9 +975,9 @@ public class SIPCommander implements ISIPCommander {
972 975
973 976
974 977
975 - Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport())); 978 + Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
976 979
977 - sipSender.transmitRequest( request, errorEvent); 980 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
978 } 981 }
979 982
980 /** 983 /**
@@ -1018,9 +1021,9 @@ public class SIPCommander implements ISIPCommander { @@ -1018,9 +1021,9 @@ public class SIPCommander implements ISIPCommander {
1018 1021
1019 1022
1020 Request request = headerProvider.createMessageRequest(device, recordInfoXml.toString(), 1023 Request request = headerProvider.createMessageRequest(device, recordInfoXml.toString(),
1021 - SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport())); 1024 + SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
1022 1025
1023 - sipSender.transmitRequest( request, errorEvent, okEvent); 1026 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent, okEvent);
1024 } 1027 }
1025 1028
1026 /** 1029 /**
@@ -1068,8 +1071,8 @@ public class SIPCommander implements ISIPCommander { @@ -1068,8 +1071,8 @@ public class SIPCommander implements ISIPCommander {
1068 1071
1069 1072
1070 1073
1071 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));  
1072 - sipSender.transmitRequest( request, errorEvent); 1074 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  1075 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
1073 } 1076 }
1074 1077
1075 /** 1078 /**
@@ -1098,8 +1101,8 @@ public class SIPCommander implements ISIPCommander { @@ -1098,8 +1101,8 @@ public class SIPCommander implements ISIPCommander {
1098 1101
1099 1102
1100 1103
1101 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));  
1102 - sipSender.transmitRequest( request, errorEvent); 1104 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  1105 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
1103 } 1106 }
1104 1107
1105 /** 1108 /**
@@ -1125,8 +1128,8 @@ public class SIPCommander implements ISIPCommander { @@ -1125,8 +1128,8 @@ public class SIPCommander implements ISIPCommander {
1125 1128
1126 1129
1127 1130
1128 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));  
1129 - sipSender.transmitRequest( request, errorEvent); 1131 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  1132 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
1130 } 1133 }
1131 1134
1132 /** 1135 /**
@@ -1149,9 +1152,9 @@ public class SIPCommander implements ISIPCommander { @@ -1149,9 +1152,9 @@ public class SIPCommander implements ISIPCommander {
1149 1152
1150 1153
1151 1154
1152 - Request request = headerProvider.createMessageRequest(device, mobilePostitionXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport())); 1155 + Request request = headerProvider.createMessageRequest(device, mobilePostitionXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
1153 1156
1154 - sipSender.transmitRequest( request, errorEvent); 1157 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
1155 1158
1156 } 1159 }
1157 1160
@@ -1179,13 +1182,13 @@ public class SIPCommander implements ISIPCommander { @@ -1179,13 +1182,13 @@ public class SIPCommander implements ISIPCommander {
1179 CallIdHeader callIdHeader; 1182 CallIdHeader callIdHeader;
1180 1183
1181 if (requestOld != null) { 1184 if (requestOld != null) {
1182 - callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(requestOld.getCallIdHeader().getCallId()); 1185 + callIdHeader = sipLayer.getSipFactory().createHeaderFactory().createCallIdHeader(requestOld.getCallIdHeader().getCallId());
1183 } else { 1186 } else {
1184 - callIdHeader = sipSender.getNewCallIdHeader(device.getTransport()); 1187 + callIdHeader = sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport());
1185 } 1188 }
1186 SIPRequest request = (SIPRequest) headerProvider.createSubscribeRequest(device, subscribePostitionXml.toString(), requestOld, device.getSubscribeCycleForMobilePosition(), "presence",callIdHeader); //Position;id=" + tm.substring(tm.length() - 4)); 1189 SIPRequest request = (SIPRequest) headerProvider.createSubscribeRequest(device, subscribePostitionXml.toString(), requestOld, device.getSubscribeCycleForMobilePosition(), "presence",callIdHeader); //Position;id=" + tm.substring(tm.length() - 4));
1187 1190
1188 - sipSender.transmitRequest( request, errorEvent, okEvent); 1191 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent, okEvent);
1189 return request; 1192 return request;
1190 } 1193 }
1191 1194
@@ -1234,8 +1237,8 @@ public class SIPCommander implements ISIPCommander { @@ -1234,8 +1237,8 @@ public class SIPCommander implements ISIPCommander {
1234 1237
1235 1238
1236 1239
1237 - Request request = headerProvider.createSubscribeRequest(device, cmdXml.toString(), null, expires, "presence",sipSender.getNewCallIdHeader(device.getTransport()));  
1238 - sipSender.transmitRequest( request); 1240 + Request request = headerProvider.createSubscribeRequest(device, cmdXml.toString(), null, expires, "presence",sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  1241 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request);
1239 1242
1240 } 1243 }
1241 1244
@@ -1254,15 +1257,15 @@ public class SIPCommander implements ISIPCommander { @@ -1254,15 +1257,15 @@ public class SIPCommander implements ISIPCommander {
1254 CallIdHeader callIdHeader; 1257 CallIdHeader callIdHeader;
1255 1258
1256 if (requestOld != null) { 1259 if (requestOld != null) {
1257 - callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(requestOld.getCallIdHeader().getCallId()); 1260 + callIdHeader = sipLayer.getSipFactory().createHeaderFactory().createCallIdHeader(requestOld.getCallIdHeader().getCallId());
1258 } else { 1261 } else {
1259 - callIdHeader = sipSender.getNewCallIdHeader(device.getTransport()); 1262 + callIdHeader = sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport());
1260 } 1263 }
1261 1264
1262 // 有效时间默认为60秒以上 1265 // 有效时间默认为60秒以上
1263 SIPRequest request = (SIPRequest) headerProvider.createSubscribeRequest(device, cmdXml.toString(), requestOld, device.getSubscribeCycleForCatalog(), "Catalog", 1266 SIPRequest request = (SIPRequest) headerProvider.createSubscribeRequest(device, cmdXml.toString(), requestOld, device.getSubscribeCycleForCatalog(), "Catalog",
1264 callIdHeader); 1267 callIdHeader);
1265 - sipSender.transmitRequest( request, errorEvent, okEvent); 1268 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent, okEvent);
1266 return request; 1269 return request;
1267 } 1270 }
1268 1271
@@ -1283,9 +1286,9 @@ public class SIPCommander implements ISIPCommander { @@ -1283,9 +1286,9 @@ public class SIPCommander implements ISIPCommander {
1283 dragXml.append(cmdString); 1286 dragXml.append(cmdString);
1284 dragXml.append("</Control>\r\n"); 1287 dragXml.append("</Control>\r\n");
1285 1288
1286 - Request request = headerProvider.createMessageRequest(device, dragXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport())); 1289 + Request request = headerProvider.createMessageRequest(device, dragXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
1287 logger.debug("拉框信令: " + request.toString()); 1290 logger.debug("拉框信令: " + request.toString());
1288 - sipSender.transmitRequest(request); 1291 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request);
1289 } 1292 }
1290 1293
1291 1294
@@ -1364,7 +1367,7 @@ public class SIPCommander implements ISIPCommander { @@ -1364,7 +1367,7 @@ public class SIPCommander implements ISIPCommander {
1364 return; 1367 return;
1365 } 1368 }
1366 1369
1367 - sipSender.transmitRequest( request, errorEvent, okEvent); 1370 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent, okEvent);
1368 } 1371 }
1369 1372
1370 @Override 1373 @Override
@@ -1394,8 +1397,8 @@ public class SIPCommander implements ISIPCommander { @@ -1394,8 +1397,8 @@ public class SIPCommander implements ISIPCommander {
1394 deviceStatusXml.append("</Notify>\r\n"); 1397 deviceStatusXml.append("</Notify>\r\n");
1395 1398
1396 1399
1397 - Request request = headerProvider.createMessageRequest(device, deviceStatusXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(device.getTransport()));  
1398 - sipSender.transmitRequest(request); 1400 + Request request = headerProvider.createMessageRequest(device, deviceStatusXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  1401 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request);
1399 1402
1400 1403
1401 } 1404 }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
1 package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl; 1 package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl;
2 2
3 import com.alibaba.fastjson2.JSON; 3 import com.alibaba.fastjson2.JSON;
  4 +import com.alibaba.fastjson2.JSONObject;
  5 +import com.genersoft.iot.vmp.gb28181.SipLayer;
4 import com.genersoft.iot.vmp.gb28181.bean.*; 6 import com.genersoft.iot.vmp.gb28181.bean.*;
5 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; 7 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
6 import com.genersoft.iot.vmp.gb28181.transmit.SIPSender; 8 import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
@@ -53,7 +55,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -53,7 +55,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
53 private ZLMRTPServerFactory zlmrtpServerFactory; 55 private ZLMRTPServerFactory zlmrtpServerFactory;
54 56
55 @Autowired 57 @Autowired
56 - private SipFactory sipFactory; 58 + private SipLayer sipLayer;
57 59
58 @Autowired 60 @Autowired
59 private SIPSender sipSender; 61 private SIPSender sipSender;
@@ -73,7 +75,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -73,7 +75,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
73 SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent, boolean registerAgain, boolean isRegister) throws SipException, InvalidArgumentException, ParseException { 75 SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent, boolean registerAgain, boolean isRegister) throws SipException, InvalidArgumentException, ParseException {
74 Request request; 76 Request request;
75 if (!registerAgain ) { 77 if (!registerAgain ) {
76 - CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getTransport()); 78 + CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
77 79
78 request = headerProviderPlatformProvider.createRegisterRequest(parentPlatform, 80 request = headerProviderPlatformProvider.createRegisterRequest(parentPlatform,
79 redisCatchStorage.getCSEQ(), SipUtils.getNewFromTag(), 81 redisCatchStorage.getCSEQ(), SipUtils.getNewFromTag(),
@@ -95,11 +97,11 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -95,11 +97,11 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
95 }); 97 });
96 98
97 }else { 99 }else {
98 - CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getTransport()); 100 + CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
99 request = headerProviderPlatformProvider.createRegisterRequest(parentPlatform, SipUtils.getNewFromTag(), null, callId, www, callIdHeader, isRegister); 101 request = headerProviderPlatformProvider.createRegisterRequest(parentPlatform, SipUtils.getNewFromTag(), null, callId, www, callIdHeader, isRegister);
100 } 102 }
101 103
102 - sipSender.transmitRequest( request, null, okEvent); 104 + sipSender.transmitRequest(parentPlatform.getDeviceIp(), request, null, okEvent);
103 } 105 }
104 106
105 @Override 107 @Override
@@ -114,7 +116,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -114,7 +116,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
114 keepaliveXml.append("<Status>OK</Status>\r\n"); 116 keepaliveXml.append("<Status>OK</Status>\r\n");
115 keepaliveXml.append("</Notify>\r\n"); 117 keepaliveXml.append("</Notify>\r\n");
116 118
117 - CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getTransport()); 119 + CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
118 120
119 Request request = headerProviderPlatformProvider.createMessageRequest( 121 Request request = headerProviderPlatformProvider.createMessageRequest(
120 parentPlatform, 122 parentPlatform,
@@ -122,7 +124,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -122,7 +124,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
122 SipUtils.getNewFromTag(), 124 SipUtils.getNewFromTag(),
123 SipUtils.getNewViaTag(), 125 SipUtils.getNewViaTag(),
124 callIdHeader); 126 callIdHeader);
125 - sipSender.transmitRequest( request, errorEvent, okEvent); 127 + sipSender.transmitRequest(parentPlatform.getDeviceIp(), request, errorEvent, okEvent);
126 return callIdHeader.getCallId(); 128 return callIdHeader.getCallId();
127 } 129 }
128 130
@@ -145,10 +147,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -145,10 +147,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
145 String catalogXml = getCatalogXml(channels, sn, parentPlatform, size); 147 String catalogXml = getCatalogXml(channels, sn, parentPlatform, size);
146 148
147 // callid 149 // callid
148 - CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getTransport()); 150 + CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
149 151
150 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, catalogXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); 152 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, catalogXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader);
151 - sipSender.transmitRequest( request); 153 + sipSender.transmitRequest(parentPlatform.getDeviceIp(), request);
152 154
153 } 155 }
154 156
@@ -231,10 +233,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -231,10 +233,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
231 } 233 }
232 String catalogXml = getCatalogXml(deviceChannels, sn, parentPlatform, channels.size()); 234 String catalogXml = getCatalogXml(deviceChannels, sn, parentPlatform, channels.size());
233 // callid 235 // callid
234 - CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getTransport()); 236 + CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
235 237
236 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, catalogXml, fromTag, SipUtils.getNewViaTag(), callIdHeader); 238 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, catalogXml, fromTag, SipUtils.getNewViaTag(), callIdHeader);
237 - sipSender.transmitRequest( request, null, eventResult -> { 239 + sipSender.transmitRequest(parentPlatform.getDeviceIp(), request, null, eventResult -> {
238 int indexNext = index + parentPlatform.getCatalogGroup(); 240 int indexNext = index + parentPlatform.getCatalogGroup();
239 try { 241 try {
240 sendCatalogResponse(channels, parentPlatform, sn, fromTag, indexNext); 242 sendCatalogResponse(channels, parentPlatform, sn, fromTag, indexNext);
@@ -270,10 +272,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -270,10 +272,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
270 deviceInfoXml.append("<Result>OK</Result>\r\n"); 272 deviceInfoXml.append("<Result>OK</Result>\r\n");
271 deviceInfoXml.append("</Response>\r\n"); 273 deviceInfoXml.append("</Response>\r\n");
272 274
273 - CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getTransport()); 275 + CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
274 276
275 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceInfoXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); 277 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceInfoXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader);
276 - sipSender.transmitRequest( request); 278 + sipSender.transmitRequest(parentPlatform.getDeviceIp(), request);
277 } 279 }
278 280
279 /** 281 /**
@@ -300,10 +302,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -300,10 +302,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
300 deviceStatusXml.append("<Status>OK</Status>\r\n"); 302 deviceStatusXml.append("<Status>OK</Status>\r\n");
301 deviceStatusXml.append("</Response>\r\n"); 303 deviceStatusXml.append("</Response>\r\n");
302 304
303 - CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getTransport()); 305 + CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
304 306
305 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); 307 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader);
306 - sipSender.transmitRequest( request); 308 + sipSender.transmitRequest(parentPlatform.getDeviceIp(), request);
307 309
308 } 310 }
309 311
@@ -362,10 +364,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -362,10 +364,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
362 deviceStatusXml.append("</info>\r\n"); 364 deviceStatusXml.append("</info>\r\n");
363 deviceStatusXml.append("</Notify>\r\n"); 365 deviceStatusXml.append("</Notify>\r\n");
364 366
365 - CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getTransport()); 367 + CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
366 368
367 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), SipUtils.getNewFromTag(), SipUtils.getNewViaTag(), callIdHeader); 369 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), SipUtils.getNewFromTag(), SipUtils.getNewViaTag(), callIdHeader);
368 - sipSender.transmitRequest( request); 370 + sipSender.transmitRequest(parentPlatform.getDeviceIp(), request);
369 371
370 } 372 }
371 373
@@ -405,14 +407,14 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -405,14 +407,14 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
405 private void sendNotify(ParentPlatform parentPlatform, String catalogXmlContent, 407 private void sendNotify(ParentPlatform parentPlatform, String catalogXmlContent,
406 SubscribeInfo subscribeInfo, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent ) 408 SubscribeInfo subscribeInfo, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent )
407 throws SipException, ParseException, InvalidArgumentException { 409 throws SipException, ParseException, InvalidArgumentException {
408 - MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipFactory.createMessageFactory(); 410 + MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipLayer.getSipFactory().createMessageFactory();
409 String characterSet = parentPlatform.getCharacterSet(); 411 String characterSet = parentPlatform.getCharacterSet();
410 // 设置编码, 防止中文乱码 412 // 设置编码, 防止中文乱码
411 messageFactory.setDefaultContentEncodingCharset(characterSet); 413 messageFactory.setDefaultContentEncodingCharset(characterSet);
412 414
413 SIPRequest notifyRequest = headerProviderPlatformProvider.createNotifyRequest(parentPlatform, catalogXmlContent, subscribeInfo); 415 SIPRequest notifyRequest = headerProviderPlatformProvider.createNotifyRequest(parentPlatform, catalogXmlContent, subscribeInfo);
414 416
415 - sipSender.transmitRequest( notifyRequest); 417 + sipSender.transmitRequest(parentPlatform.getDeviceIp(), notifyRequest);
416 } 418 }
417 419
418 private String getCatalogXmlContentForCatalogAddOrUpdate(ParentPlatform parentPlatform, List<DeviceChannel> channels, int sumNum, String type, SubscribeInfo subscribeInfo) { 420 private String getCatalogXmlContentForCatalogAddOrUpdate(ParentPlatform parentPlatform, List<DeviceChannel> channels, int sumNum, String type, SubscribeInfo subscribeInfo) {
@@ -577,21 +579,21 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -577,21 +579,21 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
577 recordXml.append("</Response>\r\n"); 579 recordXml.append("</Response>\r\n");
578 580
579 // callid 581 // callid
580 - CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getTransport()); 582 + CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
581 583
582 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, recordXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); 584 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, recordXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader);
583 - sipSender.transmitRequest( request); 585 + sipSender.transmitRequest(parentPlatform.getDeviceIp(), request);
584 586
585 } 587 }
586 588
587 @Override 589 @Override
588 - public void sendMediaStatusNotify(ParentPlatform platform, SendRtpItem sendRtpItem) throws SipException, InvalidArgumentException, ParseException {  
589 - if (sendRtpItem == null || platform == null) { 590 + public void sendMediaStatusNotify(ParentPlatform parentPlatform, SendRtpItem sendRtpItem) throws SipException, InvalidArgumentException, ParseException {
  591 + if (sendRtpItem == null || parentPlatform == null) {
590 return; 592 return;
591 } 593 }
592 594
593 595
594 - String characterSet = platform.getCharacterSet(); 596 + String characterSet = parentPlatform.getCharacterSet();
595 StringBuffer mediaStatusXml = new StringBuffer(200); 597 StringBuffer mediaStatusXml = new StringBuffer(200);
596 mediaStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); 598 mediaStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
597 mediaStatusXml.append("<Notify>\r\n"); 599 mediaStatusXml.append("<Notify>\r\n");
@@ -601,10 +603,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -601,10 +603,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
601 mediaStatusXml.append("<NotifyType>121</NotifyType>\r\n"); 603 mediaStatusXml.append("<NotifyType>121</NotifyType>\r\n");
602 mediaStatusXml.append("</Notify>\r\n"); 604 mediaStatusXml.append("</Notify>\r\n");
603 605
604 - SIPRequest messageRequest = (SIPRequest)headerProviderPlatformProvider.createMessageRequest(platform, mediaStatusXml.toString(), 606 + SIPRequest messageRequest = (SIPRequest)headerProviderPlatformProvider.createMessageRequest(parentPlatform, mediaStatusXml.toString(),
605 sendRtpItem); 607 sendRtpItem);
606 608
607 - sipSender.transmitRequest(messageRequest); 609 + sipSender.transmitRequest(parentPlatform.getDeviceIp(),messageRequest);
608 610
609 } 611 }
610 612
@@ -620,26 +622,26 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -620,26 +622,26 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
620 } 622 }
621 623
622 @Override 624 @Override
623 - public void streamByeCmd(ParentPlatform platform, SendRtpItem sendRtpItem) throws SipException, InvalidArgumentException, ParseException { 625 + public void streamByeCmd(ParentPlatform parentPlatform, SendRtpItem sendRtpItem) throws SipException, InvalidArgumentException, ParseException {
624 if (sendRtpItem == null ) { 626 if (sendRtpItem == null ) {
625 logger.info("[向上级发送BYE], sendRtpItem 为NULL"); 627 logger.info("[向上级发送BYE], sendRtpItem 为NULL");
626 return; 628 return;
627 } 629 }
628 - if (platform == null) { 630 + if (parentPlatform == null) {
629 logger.info("[向上级发送BYE], platform 为NULL"); 631 logger.info("[向上级发送BYE], platform 为NULL");
630 return; 632 return;
631 } 633 }
632 - logger.info("[向上级发送BYE], {}/{}", platform.getServerGBId(), sendRtpItem.getChannelId()); 634 + logger.info("[向上级发送BYE], {}/{}", parentPlatform.getServerGBId(), sendRtpItem.getChannelId());
633 String mediaServerId = sendRtpItem.getMediaServerId(); 635 String mediaServerId = sendRtpItem.getMediaServerId();
634 MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId); 636 MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);
635 if (mediaServerItem != null) { 637 if (mediaServerItem != null) {
636 mediaServerService.releaseSsrc(mediaServerItem.getId(), sendRtpItem.getSsrc()); 638 mediaServerService.releaseSsrc(mediaServerItem.getId(), sendRtpItem.getSsrc());
637 zlmrtpServerFactory.closeRtpServer(mediaServerItem, sendRtpItem.getStreamId()); 639 zlmrtpServerFactory.closeRtpServer(mediaServerItem, sendRtpItem.getStreamId());
638 } 640 }
639 - SIPRequest byeRequest = headerProviderPlatformProvider.createByeRequest(platform, sendRtpItem); 641 + SIPRequest byeRequest = headerProviderPlatformProvider.createByeRequest(parentPlatform, sendRtpItem);
640 if (byeRequest == null) { 642 if (byeRequest == null) {
641 logger.warn("[向上级发送bye]:无法创建 byeRequest"); 643 logger.warn("[向上级发送bye]:无法创建 byeRequest");
642 } 644 }
643 - sipSender.transmitRequest(byeRequest); 645 + sipSender.transmitRequest(parentPlatform.getDeviceIp(),byeRequest);
644 } 646 }
645 } 647 }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java
@@ -177,7 +177,7 @@ public abstract class SIPRequestProcessorParent { @@ -177,7 +177,7 @@ public abstract class SIPRequestProcessorParent {
177 } 177 }
178 178
179 // 发送response 179 // 发送response
180 - sipSender.transmitRequest(response); 180 + sipSender.transmitRequest(sipRequest.getLocalAddress().getHostAddress(), response);
181 181
182 return response; 182 return response;
183 } 183 }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
@@ -418,7 +418,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -418,7 +418,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
418 // 未知错误。直接转发设备点播的错误 418 // 未知错误。直接转发设备点播的错误
419 try { 419 try {
420 Response response = getMessageFactory().createResponse(event.statusCode, evt.getRequest()); 420 Response response = getMessageFactory().createResponse(event.statusCode, evt.getRequest());
421 - sipSender.transmitRequest(response); 421 + sipSender.transmitRequest(request.getLocalAddress().getHostAddress(), response);
422 } catch (ParseException | SipException e) { 422 } catch (ParseException | SipException e) {
423 e.printStackTrace(); 423 e.printStackTrace();
424 } 424 }
@@ -481,8 +481,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -481,8 +481,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
481 playService.play(mediaServerItem, ssrcInfo, device, channelId, hookEvent, errorEvent, (code, msg) -> { 481 playService.play(mediaServerItem, ssrcInfo, device, channelId, hookEvent, errorEvent, (code, msg) -> {
482 logger.info("[上级点播]超时, 用户:{}, 通道:{}", username, channelId); 482 logger.info("[上级点播]超时, 用户:{}, 通道:{}", username, channelId);
483 redisCatchStorage.deleteSendRTPServer(platform.getServerGBId(), channelId, callIdHeader.getCallId(), null); 483 redisCatchStorage.deleteSendRTPServer(platform.getServerGBId(), channelId, callIdHeader.getCallId(), null);
484 - zlmrtpServerFactory.releasePort(finalMediaServerItem, sendRtpItem.getSsrc());  
485 - }, null); 484 + });
486 } else { 485 } else {
487 sendRtpItem.setStreamId(playTransaction.getStream()); 486 sendRtpItem.setStreamId(playTransaction.getStream());
488 // 写入redis, 超时时回复 487 // 写入redis, 超时时回复
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java
1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; 1 package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl;
2 2
3 import com.genersoft.iot.vmp.conf.SipConfig; 3 import com.genersoft.iot.vmp.conf.SipConfig;
  4 +import com.genersoft.iot.vmp.gb28181.auth.DigestServerAuthenticationHelper;
4 import com.genersoft.iot.vmp.gb28181.bean.Device; 5 import com.genersoft.iot.vmp.gb28181.bean.Device;
5 import com.genersoft.iot.vmp.gb28181.bean.WvpSipDate; 6 import com.genersoft.iot.vmp.gb28181.bean.WvpSipDate;
6 import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; 7 import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
7 import com.genersoft.iot.vmp.gb28181.transmit.SIPSender; 8 import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
8 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; 9 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
9 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; 10 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
10 -import com.genersoft.iot.vmp.gb28181.auth.DigestServerAuthenticationHelper;  
11 import com.genersoft.iot.vmp.service.IDeviceService; 11 import com.genersoft.iot.vmp.service.IDeviceService;
12 import com.genersoft.iot.vmp.utils.DateUtil; 12 import com.genersoft.iot.vmp.utils.DateUtil;
13 import gov.nist.javax.sip.RequestEventExt; 13 import gov.nist.javax.sip.RequestEventExt;
14 import gov.nist.javax.sip.address.AddressImpl; 14 import gov.nist.javax.sip.address.AddressImpl;
15 import gov.nist.javax.sip.address.SipUri; 15 import gov.nist.javax.sip.address.SipUri;
16 -import gov.nist.javax.sip.header.Expires;  
17 import gov.nist.javax.sip.header.SIPDateHeader; 16 import gov.nist.javax.sip.header.SIPDateHeader;
  17 +import gov.nist.javax.sip.message.SIPRequest;
18 import org.slf4j.Logger; 18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory; 19 import org.slf4j.LoggerFactory;
20 import org.springframework.beans.factory.InitializingBean; 20 import org.springframework.beans.factory.InitializingBean;
@@ -24,8 +24,10 @@ import org.springframework.util.ObjectUtils; @@ -24,8 +24,10 @@ import org.springframework.util.ObjectUtils;
24 24
25 import javax.sip.RequestEvent; 25 import javax.sip.RequestEvent;
26 import javax.sip.SipException; 26 import javax.sip.SipException;
27 -import javax.sip.header.*;  
28 -import javax.sip.message.Request; 27 +import javax.sip.header.AuthorizationHeader;
  28 +import javax.sip.header.ContactHeader;
  29 +import javax.sip.header.FromHeader;
  30 +import javax.sip.header.ViaHeader;
29 import javax.sip.message.Response; 31 import javax.sip.message.Response;
30 import java.security.NoSuchAlgorithmException; 32 import java.security.NoSuchAlgorithmException;
31 import java.text.ParseException; 33 import java.text.ParseException;
@@ -71,12 +73,11 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen @@ -71,12 +73,11 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
71 RequestEventExt evtExt = (RequestEventExt) evt; 73 RequestEventExt evtExt = (RequestEventExt) evt;
72 String requestAddress = evtExt.getRemoteIpAddress() + ":" + evtExt.getRemotePort(); 74 String requestAddress = evtExt.getRemoteIpAddress() + ":" + evtExt.getRemotePort();
73 logger.info("[注册请求] 开始处理: {}", requestAddress); 75 logger.info("[注册请求] 开始处理: {}", requestAddress);
74 - Request request = evt.getRequest();  
75 - ExpiresHeader expiresHeader = (ExpiresHeader) request.getHeader(Expires.NAME); 76 + SIPRequest request = (SIPRequest)evt.getRequest();
76 Response response = null; 77 Response response = null;
77 boolean passwordCorrect = false; 78 boolean passwordCorrect = false;
78 // 注册标志 79 // 注册标志
79 - boolean registerFlag = false; 80 + boolean registerFlag;
80 FromHeader fromHeader = (FromHeader) request.getHeader(FromHeader.NAME); 81 FromHeader fromHeader = (FromHeader) request.getHeader(FromHeader.NAME);
81 AddressImpl address = (AddressImpl) fromHeader.getAddress(); 82 AddressImpl address = (AddressImpl) fromHeader.getAddress();
82 SipUri uri = (SipUri) address.getURI(); 83 SipUri uri = (SipUri) address.getURI();
@@ -88,7 +89,7 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen @@ -88,7 +89,7 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
88 logger.info("[注册请求] 回复401: {}", requestAddress); 89 logger.info("[注册请求] 回复401: {}", requestAddress);
89 response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request); 90 response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request);
90 new DigestServerAuthenticationHelper().generateChallenge(getHeaderFactory(), response, sipConfig.getDomain()); 91 new DigestServerAuthenticationHelper().generateChallenge(getHeaderFactory(), response, sipConfig.getDomain());
91 - sipSender.transmitRequest(response); 92 + sipSender.transmitRequest(request.getLocalAddress().getHostAddress(), response);
92 return; 93 return;
93 } 94 }
94 95
@@ -101,7 +102,7 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen @@ -101,7 +102,7 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
101 response = getMessageFactory().createResponse(Response.FORBIDDEN, request); 102 response = getMessageFactory().createResponse(Response.FORBIDDEN, request);
102 response.setReasonPhrase("wrong password"); 103 response.setReasonPhrase("wrong password");
103 logger.info("[注册请求] 密码/SIP服务器ID错误, 回复403: {}", requestAddress); 104 logger.info("[注册请求] 密码/SIP服务器ID错误, 回复403: {}", requestAddress);
104 - sipSender.transmitRequest(response); 105 + sipSender.transmitRequest(request.getLocalAddress().getHostAddress(), response);
105 return; 106 return;
106 } 107 }
107 108
@@ -114,9 +115,9 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen @@ -114,9 +115,9 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
114 dateHeader.setDate(wvpSipDate); 115 dateHeader.setDate(wvpSipDate);
115 response.addHeader(dateHeader); 116 response.addHeader(dateHeader);
116 117
117 - if (expiresHeader == null) { 118 + if (request.getExpires() == null) {
118 response = getMessageFactory().createResponse(Response.BAD_REQUEST, request); 119 response = getMessageFactory().createResponse(Response.BAD_REQUEST, request);
119 - sipSender.transmitRequest(response); 120 + sipSender.transmitRequest(request.getLocalAddress().getHostAddress(), response);
120 return; 121 return;
121 } 122 }
122 // 添加Contact头 123 // 添加Contact头
@@ -145,12 +146,13 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen @@ -145,12 +146,13 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
145 device.setIp(received); 146 device.setIp(received);
146 device.setPort(rPort); 147 device.setPort(rPort);
147 device.setHostAddress(received.concat(":").concat(String.valueOf(rPort))); 148 device.setHostAddress(received.concat(":").concat(String.valueOf(rPort)));
148 - if (expiresHeader.getExpires() == 0) { 149 + device.setLocalIp(request.getLocalAddress().getHostAddress());
  150 + if (request.getExpires().getExpires() == 0) {
149 // 注销成功 151 // 注销成功
150 registerFlag = false; 152 registerFlag = false;
151 } else { 153 } else {
152 // 注册成功 154 // 注册成功
153 - device.setExpires(expiresHeader.getExpires()); 155 + device.setExpires(request.getExpires().getExpires());
154 registerFlag = true; 156 registerFlag = true;
155 // 判断TCP还是UDP 157 // 判断TCP还是UDP
156 ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME); 158 ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME);
@@ -158,7 +160,7 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen @@ -158,7 +160,7 @@ public class RegisterRequestProcessor extends SIPRequestProcessorParent implemen
158 device.setTransport("TCP".equalsIgnoreCase(transport) ? "TCP" : "UDP"); 160 device.setTransport("TCP".equalsIgnoreCase(transport) ? "TCP" : "UDP");
159 } 161 }
160 162
161 - sipSender.transmitRequest(response); 163 + sipSender.transmitRequest(request.getLocalAddress().getHostAddress(), response);
162 // 注册成功 164 // 注册成功
163 // 保存到redis 165 // 保存到redis
164 if (registerFlag) { 166 if (registerFlag) {
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java
@@ -93,7 +93,7 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme @@ -93,7 +93,7 @@ public class SubscribeRequestProcessor extends SIPRequestProcessorParent impleme
93 response.setExpires(expireHeader); 93 response.setExpires(expireHeader);
94 } 94 }
95 logger.info("response : " + response); 95 logger.info("response : " + response);
96 - sipSender.transmitRequest(response); 96 + sipSender.transmitRequest(request.getLocalAddress().getHostAddress(), response);
97 } 97 }
98 } catch (ParseException | SipException | InvalidArgumentException | DocumentException e) { 98 } catch (ParseException | SipException | InvalidArgumentException | DocumentException e) {
99 e.printStackTrace(); 99 e.printStackTrace();
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/control/cmd/DeviceControlQueryMessageHandler.java
@@ -9,8 +9,6 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorP @@ -9,8 +9,6 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorP
9 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; 9 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
10 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.control.ControlMessageHandler; 10 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.control.ControlMessageHandler;
11 import com.genersoft.iot.vmp.storager.IVideoManagerStorage; 11 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
12 -import com.genersoft.iot.vmp.utils.SpringBeanFactory;  
13 -import gov.nist.javax.sip.SipStackImpl;  
14 import gov.nist.javax.sip.message.SIPRequest; 12 import gov.nist.javax.sip.message.SIPRequest;
15 import org.dom4j.Element; 13 import org.dom4j.Element;
16 import org.slf4j.Logger; 14 import org.slf4j.Logger;
@@ -84,23 +82,24 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent @@ -84,23 +82,24 @@ public class DeviceControlQueryMessageHandler extends SIPRequestProcessorParent
84 logger.error("[命令发送失败] 国标级联 注销: {}", e.getMessage()); 82 logger.error("[命令发送失败] 国标级联 注销: {}", e.getMessage());
85 } 83 }
86 taskExecutor.execute(()->{ 84 taskExecutor.execute(()->{
87 - try {  
88 - Thread.sleep(3000);  
89 - SipProvider up = (SipProvider) SpringBeanFactory.getBean("udpSipProvider");  
90 - SipStackImpl stack = (SipStackImpl)up.getSipStack();  
91 - stack.stop();  
92 - Iterator listener = stack.getListeningPoints();  
93 - while (listener.hasNext()) {  
94 - stack.deleteListeningPoint((ListeningPoint) listener.next());  
95 - }  
96 - Iterator providers = stack.getSipProviders();  
97 - while (providers.hasNext()) {  
98 - stack.deleteSipProvider((SipProvider) providers.next());  
99 - }  
100 - VManageBootstrap.restart();  
101 - } catch (InterruptedException | ObjectInUseException e) {  
102 - logger.error("[任务执行失败] 服务重启: {}", e.getMessage());  
103 - } 85 + // 远程启动
  86 +// try {
  87 +// Thread.sleep(3000);
  88 +// SipProvider up = (SipProvider) SpringBeanFactory.getBean("udpSipProvider");
  89 +// SipStackImpl stack = (SipStackImpl)up.getSipStack();
  90 +// stack.stop();
  91 +// Iterator listener = stack.getListeningPoints();
  92 +// while (listener.hasNext()) {
  93 +// stack.deleteListeningPoint((ListeningPoint) listener.next());
  94 +// }
  95 +// Iterator providers = stack.getSipProviders();
  96 +// while (providers.hasNext()) {
  97 +// stack.deleteSipProvider((SipProvider) providers.next());
  98 +// }
  99 +// VManageBootstrap.restart();
  100 +// } catch (InterruptedException | ObjectInUseException e) {
  101 +// logger.error("[任务执行失败] 服务重启: {}", e.getMessage());
  102 +// }
104 }); 103 });
105 } else { 104 } else {
106 // 远程启动指定设备 105 // 远程启动指定设备
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/InviteResponseProcessor.java
1 package com.genersoft.iot.vmp.gb28181.transmit.event.response.impl; 1 package com.genersoft.iot.vmp.gb28181.transmit.event.response.impl;
2 2
3 import com.genersoft.iot.vmp.conf.SipConfig; 3 import com.genersoft.iot.vmp.conf.SipConfig;
  4 +import com.genersoft.iot.vmp.gb28181.SipLayer;
4 import com.genersoft.iot.vmp.gb28181.bean.Device; 5 import com.genersoft.iot.vmp.gb28181.bean.Device;
5 import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; 6 import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
6 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; 7 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
@@ -54,7 +55,7 @@ public class InviteResponseProcessor extends SIPResponseProcessorAbstract { @@ -54,7 +55,7 @@ public class InviteResponseProcessor extends SIPResponseProcessorAbstract {
54 55
55 56
56 @Autowired 57 @Autowired
57 - private SipFactory sipFactory; 58 + private SipLayer sipLayer;
58 59
59 @Autowired 60 @Autowired
60 private SIPSender sipSender; 61 private SIPSender sipSender;
@@ -103,11 +104,12 @@ public class InviteResponseProcessor extends SIPResponseProcessorAbstract { @@ -103,11 +104,12 @@ public class InviteResponseProcessor extends SIPResponseProcessorAbstract {
103 } else { 104 } else {
104 sdp = SdpFactory.getInstance().createSessionDescription(contentString); 105 sdp = SdpFactory.getInstance().createSessionDescription(contentString);
105 } 106 }
106 - SipURI requestUri = sipFactory.createAddressFactory().createSipURI(sdp.getOrigin().getUsername(), event.getRemoteIpAddress() + ":" + event.getRemotePort());  
107 - Request reqAck = headerProvider.createAckRequest(requestUri, response); 107 +
  108 + SipURI requestUri = sipLayer.getSipFactory().createAddressFactory().createSipURI(sdp.getOrigin().getUsername(), event.getRemoteIpAddress() + ":" + event.getRemotePort());
  109 + Request reqAck = headerProvider.createAckRequest(response.getLocalAddress().getHostAddress(), requestUri, response);
108 110
109 logger.info("[回复ack] {}-> {}:{} ", sdp.getOrigin().getUsername(), event.getRemoteIpAddress(), event.getRemotePort()); 111 logger.info("[回复ack] {}-> {}:{} ", sdp.getOrigin().getUsername(), event.getRemoteIpAddress(), event.getRemotePort());
110 - sipSender.transmitRequest(reqAck); 112 + sipSender.transmitRequest( response.getLocalAddress().getHostAddress(), reqAck);
111 } 113 }
112 } catch (InvalidArgumentException | ParseException | SipException | SdpParseException e) { 114 } catch (InvalidArgumentException | ParseException | SipException | SdpParseException e) {
113 logger.info("[点播回复ACK],异常:", e ); 115 logger.info("[点播回复ACK],异常:", e );
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/response/impl/RegisterResponseProcessor.java
@@ -100,7 +100,7 @@ public class RegisterResponseProcessor extends SIPResponseProcessorAbstract { @@ -100,7 +100,7 @@ public class RegisterResponseProcessor extends SIPResponseProcessorAbstract {
100 if (platformRegisterInfo.isRegister()) { 100 if (platformRegisterInfo.isRegister()) {
101 platformService.online(parentPlatform); 101 platformService.online(parentPlatform);
102 }else { 102 }else {
103 - platformService.offline(parentPlatform); 103 + platformService.offline(parentPlatform, false);
104 } 104 }
105 105
106 // 注册/注销成功移除缓存的信息 106 // 注册/注销成功移除缓存的信息
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -568,8 +568,6 @@ public class ZLMHttpHookListener { @@ -568,8 +568,6 @@ public class ZLMHttpHookListener {
568 public JSONObject onServerStarted(HttpServletRequest request, @RequestBody JSONObject jsonObject){ 568 public JSONObject onServerStarted(HttpServletRequest request, @RequestBody JSONObject jsonObject){
569 569
570 jsonObject.put("ip", request.getRemoteAddr()); 570 jsonObject.put("ip", request.getRemoteAddr());
571 - System.out.println(jsonObject.toJSONString()  
572 - );  
573 ZLMServerConfig zlmServerConfig = JSON.to(ZLMServerConfig.class, jsonObject); 571 ZLMServerConfig zlmServerConfig = JSON.to(ZLMServerConfig.class, jsonObject);
574 zlmServerConfig.setIp(request.getRemoteAddr()); 572 zlmServerConfig.setIp(request.getRemoteAddr());
575 logger.info("[ZLM HOOK] zlm 启动 " + zlmServerConfig.getGeneralMediaServerId()); 573 logger.info("[ZLM HOOK] zlm 启动 " + zlmServerConfig.getGeneralMediaServerId());
@@ -632,7 +630,6 @@ public class ZLMHttpHookListener { @@ -632,7 +630,6 @@ public class ZLMHttpHookListener {
632 @ResponseBody 630 @ResponseBody
633 @PostMapping(value = "/on_rtp_server_timeout", produces = "application/json;charset=UTF-8") 631 @PostMapping(value = "/on_rtp_server_timeout", produces = "application/json;charset=UTF-8")
634 public JSONObject onRtpServerTimeout(HttpServletRequest request, @RequestBody OnRtpServerTimeoutHookParam param){ 632 public JSONObject onRtpServerTimeout(HttpServletRequest request, @RequestBody OnRtpServerTimeoutHookParam param){
635 - System.out.println(param);  
636 logger.info("[ZLM HOOK] rtpServer收流超时:{}->{}({})", param.getMediaServerId(), param.getStream_id(), param.getSsrc()); 633 logger.info("[ZLM HOOK] rtpServer收流超时:{}->{}({})", param.getMediaServerId(), param.getStream_id(), param.getSsrc());
637 634
638 JSONObject ret = new JSONObject(); 635 JSONObject ret = new JSONObject();
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java
@@ -169,7 +169,6 @@ public class ZLMRESTfulUtils { @@ -169,7 +169,6 @@ public class ZLMRESTfulUtils {
169 .build(); 169 .build();
170 Response response = client.newCall(request).execute(); 170 Response response = client.newCall(request).execute();
171 if (response.isSuccessful()) { 171 if (response.isSuccessful()) {
172 - logger.info("response body contentType: " + Objects.requireNonNull(response.body()).contentType());  
173 if (targetPath != null) { 172 if (targetPath != null) {
174 File snapFolder = new File(targetPath); 173 File snapFolder = new File(targetPath);
175 if (!snapFolder.exists()) { 174 if (!snapFolder.exists()) {
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java
@@ -25,7 +25,7 @@ import java.util.Set; @@ -25,7 +25,7 @@ import java.util.Set;
25 import java.util.concurrent.ConcurrentHashMap; 25 import java.util.concurrent.ConcurrentHashMap;
26 26
27 @Component 27 @Component
28 -@Order(value=1) 28 +@Order(value=2)
29 public class ZLMRunner implements CommandLineRunner { 29 public class ZLMRunner implements CommandLineRunner {
30 30
31 private final static Logger logger = LoggerFactory.getLogger(ZLMRunner.class); 31 private final static Logger logger = LoggerFactory.getLogger(ZLMRunner.class);
src/main/java/com/genersoft/iot/vmp/service/IPlatformService.java
1 package com.genersoft.iot.vmp.service; 1 package com.genersoft.iot.vmp.service;
2 2
3 -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;  
4 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; 3 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
5 -import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo;  
6 -import com.genersoft.iot.vmp.service.bean.GPSMsgInfo;  
7 import com.github.pagehelper.PageInfo; 4 import com.github.pagehelper.PageInfo;
8 5
9 -import java.util.List;  
10 -  
11 /** 6 /**
12 * 国标平台的业务类 7 * 国标平台的业务类
13 * @author lin 8 * @author lin
@@ -40,7 +35,7 @@ public interface IPlatformService { @@ -40,7 +35,7 @@ public interface IPlatformService {
40 * 平台离线 35 * 平台离线
41 * @param parentPlatform 平台信息 36 * @param parentPlatform 平台信息
42 */ 37 */
43 - void offline(ParentPlatform parentPlatform); 38 + void offline(ParentPlatform parentPlatform, boolean stopRegisterTask);
44 39
45 /** 40 /**
46 * 向上级平台发起注册 41 * 向上级平台发起注册
src/main/java/com/genersoft/iot/vmp/service/IPlayService.java
@@ -13,7 +13,6 @@ import com.genersoft.iot.vmp.service.bean.InviteTimeOutCallback; @@ -13,7 +13,6 @@ import com.genersoft.iot.vmp.service.bean.InviteTimeOutCallback;
13 import com.genersoft.iot.vmp.service.bean.PlayBackCallback; 13 import com.genersoft.iot.vmp.service.bean.PlayBackCallback;
14 import com.genersoft.iot.vmp.service.bean.SSRCInfo; 14 import com.genersoft.iot.vmp.service.bean.SSRCInfo;
15 import com.genersoft.iot.vmp.vmanager.bean.WVPResult; 15 import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
16 -import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.PlayResult;  
17 import org.springframework.web.context.request.async.DeferredResult; 16 import org.springframework.web.context.request.async.DeferredResult;
18 17
19 import javax.sip.InvalidArgumentException; 18 import javax.sip.InvalidArgumentException;
@@ -25,12 +24,12 @@ import java.text.ParseException; @@ -25,12 +24,12 @@ import java.text.ParseException;
25 */ 24 */
26 public interface IPlayService { 25 public interface IPlayService {
27 26
28 - void onPublishHandlerForPlay(MediaServerItem mediaServerItem, JSONObject resonse, String deviceId, String channelId, String uuid); 27 + void onPublishHandlerForPlay(MediaServerItem mediaServerItem, JSONObject resonse, String deviceId, String channelId);
29 28
30 void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, 29 void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
31 ZlmHttpHookSubscribe.Event hookEvent, SipSubscribe.Event errorEvent, 30 ZlmHttpHookSubscribe.Event hookEvent, SipSubscribe.Event errorEvent,
32 - InviteTimeOutCallback timeoutCallback, String uuid);  
33 - PlayResult play(MediaServerItem mediaServerItem, String deviceId, String channelId, ZlmHttpHookSubscribe.Event event, SipSubscribe.Event errorEvent, Runnable timeoutCallback); 31 + InviteTimeOutCallback timeoutCallback);
  32 + void play(MediaServerItem mediaServerItem, String deviceId, String channelId, ZlmHttpHookSubscribe.Event event, SipSubscribe.Event errorEvent, Runnable timeoutCallback);
34 33
35 MediaServerItem getNewMediaServerItem(Device device); 34 MediaServerItem getNewMediaServerItem(Device device);
36 35
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
@@ -604,7 +604,7 @@ public class MediaServerServiceImpl implements IMediaServerService { @@ -604,7 +604,7 @@ public class MediaServerServiceImpl implements IMediaServerService {
604 mediaServerItem.setRtspSSLPort(zlmServerConfig.getRtspSSlport()); 604 mediaServerItem.setRtspSSLPort(zlmServerConfig.getRtspSSlport());
605 mediaServerItem.setRtpProxyPort(zlmServerConfig.getRtpProxyPort()); 605 mediaServerItem.setRtpProxyPort(zlmServerConfig.getRtpProxyPort());
606 mediaServerItem.setStreamIp(ip); 606 mediaServerItem.setStreamIp(ip);
607 - mediaServerItem.setHookIp(sipConfig.getIp()); 607 + mediaServerItem.setHookIp(sipConfig.getIp().split(",")[0]);
608 mediaServerItem.setSdpIp(ip); 608 mediaServerItem.setSdpIp(ip);
609 return mediaServerItem; 609 return mediaServerItem;
610 } 610 }
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
@@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSON; @@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSON;
4 import com.alibaba.fastjson2.JSONArray; 4 import com.alibaba.fastjson2.JSONArray;
5 import com.alibaba.fastjson2.JSONObject; 5 import com.alibaba.fastjson2.JSONObject;
6 import com.genersoft.iot.vmp.common.StreamInfo; 6 import com.genersoft.iot.vmp.common.StreamInfo;
  7 +import com.genersoft.iot.vmp.common.StreamURL;
7 import com.genersoft.iot.vmp.conf.MediaConfig; 8 import com.genersoft.iot.vmp.conf.MediaConfig;
8 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; 9 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
9 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 10 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
@@ -16,6 +17,8 @@ import org.springframework.beans.factory.annotation.Autowired; @@ -16,6 +17,8 @@ import org.springframework.beans.factory.annotation.Autowired;
16 import org.springframework.stereotype.Service; 17 import org.springframework.stereotype.Service;
17 import org.springframework.util.ObjectUtils; 18 import org.springframework.util.ObjectUtils;
18 19
  20 +import java.net.URL;
  21 +
19 @Service 22 @Service
20 public class MediaServiceImpl implements IMediaService { 23 public class MediaServiceImpl implements IMediaService {
21 24
@@ -91,38 +94,17 @@ public class MediaServiceImpl implements IMediaService { @@ -91,38 +94,17 @@ public class MediaServiceImpl implements IMediaService {
91 if (addr == null) { 94 if (addr == null) {
92 addr = mediaInfo.getStreamIp(); 95 addr = mediaInfo.getStreamIp();
93 } 96 }
  97 +
94 streamInfoResult.setIp(addr); 98 streamInfoResult.setIp(addr);
95 streamInfoResult.setMediaServerId(mediaInfo.getId()); 99 streamInfoResult.setMediaServerId(mediaInfo.getId());
96 String callIdParam = ObjectUtils.isEmpty(callId)?"":"?callId=" + callId; 100 String callIdParam = ObjectUtils.isEmpty(callId)?"":"?callId=" + callId;
97 - streamInfoResult.setRtmp(String.format("rtmp://%s:%s/%s/%s%s", addr, mediaInfo.getRtmpPort(), app, stream, callIdParam));  
98 - if (mediaInfo.getRtmpSSlPort() != 0) {  
99 - streamInfoResult.setRtmps(String.format("rtmps://%s:%s/%s/%s%s", addr, mediaInfo.getRtmpSSlPort(), app, stream, callIdParam));  
100 - }  
101 - streamInfoResult.setRtsp(String.format("rtsp://%s:%s/%s/%s%s", addr, mediaInfo.getRtspPort(), app, stream, callIdParam));  
102 - if (mediaInfo.getRtspSSLPort() != 0) {  
103 - streamInfoResult.setRtsps(String.format("rtsps://%s:%s/%s/%s%s", addr, mediaInfo.getRtspSSLPort(), app, stream, callIdParam));  
104 - }  
105 - streamInfoResult.setFlv(String.format("http://%s:%s/%s/%s.live.flv%s", addr, mediaInfo.getHttpPort(), app, stream, callIdParam));  
106 - streamInfoResult.setWs_flv(String.format("ws://%s:%s/%s/%s.live.flv%s", addr, mediaInfo.getHttpPort(), app, stream, callIdParam));  
107 - streamInfoResult.setHls(String.format("http://%s:%s/%s/%s/hls.m3u8%s", addr, mediaInfo.getHttpPort(), app, stream, callIdParam));  
108 - streamInfoResult.setWs_hls(String.format("ws://%s:%s/%s/%s/hls.m3u8%s", addr, mediaInfo.getHttpPort(), app, stream, callIdParam));  
109 - streamInfoResult.setFmp4(String.format("http://%s:%s/%s/%s.live.mp4%s", addr, mediaInfo.getHttpPort(), app, stream, callIdParam));  
110 - streamInfoResult.setWs_fmp4(String.format("ws://%s:%s/%s/%s.live.mp4%s", addr, mediaInfo.getHttpPort(), app, stream, callIdParam));  
111 - streamInfoResult.setTs(String.format("http://%s:%s/%s/%s.live.ts%s", addr, mediaInfo.getHttpPort(), app, stream, callIdParam));  
112 - streamInfoResult.setWs_ts(String.format("ws://%s:%s/%s/%s.live.ts%s", addr, mediaInfo.getHttpPort(), app, stream, callIdParam));  
113 - streamInfoResult.setRtc(String.format("http://%s:%s/index/api/webrtc?app=%s&stream=%s&type=play%s", mediaInfo.getStreamIp(), mediaInfo.getHttpPort(), app, stream, ObjectUtils.isEmpty(callId)?"":"&callId=" + callId));  
114 - if (mediaInfo.getHttpSSlPort() != 0) {  
115 - streamInfoResult.setHttps_flv(String.format("https://%s:%s/%s/%s.live.flv%s", addr, mediaInfo.getHttpSSlPort(), app, stream, callIdParam));  
116 - streamInfoResult.setWss_flv(String.format("wss://%s:%s/%s/%s.live.flv%s", addr, mediaInfo.getHttpSSlPort(), app, stream, callIdParam));  
117 - streamInfoResult.setHttps_hls(String.format("https://%s:%s/%s/%s/hls.m3u8%s", addr, mediaInfo.getHttpSSlPort(), app, stream, callIdParam));  
118 - streamInfoResult.setWss_hls(String.format("wss://%s:%s/%s/%s/hls.m3u8%s", addr, mediaInfo.getHttpSSlPort(), app, stream, callIdParam));  
119 - streamInfoResult.setHttps_fmp4(String.format("https://%s:%s/%s/%s.live.mp4%s", addr, mediaInfo.getHttpSSlPort(), app, stream, callIdParam));  
120 - streamInfoResult.setWss_fmp4(String.format("wss://%s:%s/%s/%s.live.mp4%s", addr, mediaInfo.getHttpSSlPort(), app, stream, callIdParam));  
121 - streamInfoResult.setHttps_ts(String.format("https://%s:%s/%s/%s.live.ts%s", addr, mediaInfo.getHttpSSlPort(), app, stream, callIdParam));  
122 - streamInfoResult.setWss_ts(String.format("wss://%s:%s/%s/%s.live.ts%s", addr, mediaInfo.getHttpSSlPort(), app, stream, callIdParam));  
123 - streamInfoResult.setWss_ts(String.format("wss://%s:%s/%s/%s.live.ts%s", addr, mediaInfo.getHttpSSlPort(), app, stream, callIdParam));  
124 - streamInfoResult.setRtcs(String.format("https://%s:%s/index/api/webrtc?app=%s&stream=%s&type=play%s", mediaInfo.getStreamIp(), mediaInfo.getHttpSSlPort(), app, stream, ObjectUtils.isEmpty(callId)?"":"&callId=" + callId));  
125 - } 101 + streamInfoResult.setRtmp(addr, mediaInfo.getRtmpPort(),mediaInfo.getRtmpSSlPort(), app, stream, callIdParam);
  102 + streamInfoResult.setRtsp(addr, mediaInfo.getRtspPort(),mediaInfo.getRtspSSLPort(), app, stream, callIdParam);
  103 + streamInfoResult.setFlv(addr, mediaInfo.getHttpPort(),mediaInfo.getHttpSSlPort(), app, stream, callIdParam);
  104 + streamInfoResult.setFmp4(addr, mediaInfo.getHttpPort(),mediaInfo.getHttpSSlPort(), app, stream, callIdParam);
  105 + streamInfoResult.setHls(addr, mediaInfo.getHttpPort(),mediaInfo.getHttpSSlPort(), app, stream, callIdParam);
  106 + streamInfoResult.setTs(addr, mediaInfo.getHttpPort(),mediaInfo.getHttpSSlPort(), app, stream, callIdParam);
  107 + streamInfoResult.setRtc(addr, mediaInfo.getHttpPort(),mediaInfo.getHttpSSlPort(), app, stream, callIdParam);
126 108
127 streamInfoResult.setTracks(tracks); 109 streamInfoResult.setTracks(tracks);
128 return streamInfoResult; 110 return streamInfoResult;
src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java
@@ -22,7 +22,6 @@ import org.springframework.stereotype.Service; @@ -22,7 +22,6 @@ import org.springframework.stereotype.Service;
22 22
23 import javax.sip.InvalidArgumentException; 23 import javax.sip.InvalidArgumentException;
24 import javax.sip.SipException; 24 import javax.sip.SipException;
25 -import javax.sip.TimeoutEvent;  
26 import java.text.ParseException; 25 import java.text.ParseException;
27 import java.util.HashMap; 26 import java.util.HashMap;
28 import java.util.List; 27 import java.util.List;
@@ -131,20 +130,23 @@ public class PlatformServiceImpl implements IPlatformService { @@ -131,20 +130,23 @@ public class PlatformServiceImpl implements IPlatformService {
131 } 130 }
132 131
133 final String registerTaskKey = REGISTER_KEY_PREFIX + parentPlatform.getServerGBId(); 132 final String registerTaskKey = REGISTER_KEY_PREFIX + parentPlatform.getServerGBId();
134 - if (dynamicTask.contains(registerTaskKey)) {  
135 - dynamicTask.stop(registerTaskKey);  
136 - }  
137 - // 添加注册任务  
138 - dynamicTask.startDelay(registerTaskKey, 133 + if (!dynamicTask.isAlive(registerTaskKey)) {
  134 + // 添加注册任务
  135 + dynamicTask.startCron(registerTaskKey,
139 // 注册失败(注册成功时由程序直接调用了online方法) 136 // 注册失败(注册成功时由程序直接调用了online方法)
140 ()-> { 137 ()-> {
141 try { 138 try {
142 - commanderForPlatform.register(parentPlatform, eventResult -> offline(parentPlatform),null); 139 + logger.info("[国标级联] 平台:{}注册即将到期,重新注册", parentPlatform.getServerGBId());
  140 + commanderForPlatform.register(parentPlatform, eventResult -> {
  141 + offline(parentPlatform, false);
  142 + },null);
143 } catch (InvalidArgumentException | ParseException | SipException e) { 143 } catch (InvalidArgumentException | ParseException | SipException e) {
144 logger.error("[命令发送失败] 国标级联定时注册: {}", e.getMessage()); 144 logger.error("[命令发送失败] 国标级联定时注册: {}", e.getMessage());
145 } 145 }
146 }, 146 },
147 (parentPlatform.getExpires() - 10) *1000); 147 (parentPlatform.getExpires() - 10) *1000);
  148 + }
  149 +
148 150
149 final String keepaliveTaskKey = KEEPALIVE_KEY_PREFIX + parentPlatform.getServerGBId(); 151 final String keepaliveTaskKey = KEEPALIVE_KEY_PREFIX + parentPlatform.getServerGBId();
150 if (!dynamicTask.contains(keepaliveTaskKey)) { 152 if (!dynamicTask.contains(keepaliveTaskKey)) {
@@ -160,16 +162,11 @@ public class PlatformServiceImpl implements IPlatformService { @@ -160,16 +162,11 @@ public class PlatformServiceImpl implements IPlatformService {
160 // 此时是第三次心跳超时, 平台离线 162 // 此时是第三次心跳超时, 平台离线
161 if (platformCatch.getKeepAliveReply() == 2) { 163 if (platformCatch.getKeepAliveReply() == 2) {
162 // 设置平台离线,并重新注册 164 // 设置平台离线,并重新注册
163 - offline(parentPlatform);  
164 logger.info("[国标级联] {},三次心跳超时后再次发起注册", parentPlatform.getServerGBId()); 165 logger.info("[国标级联] {},三次心跳超时后再次发起注册", parentPlatform.getServerGBId());
165 try { 166 try {
166 commanderForPlatform.register(parentPlatform, eventResult1 -> { 167 commanderForPlatform.register(parentPlatform, eventResult1 -> {
167 logger.info("[国标级联] {},三次心跳超时后再次发起注册仍然失败,开始定时发起注册,间隔为1分钟", parentPlatform.getServerGBId()); 168 logger.info("[国标级联] {},三次心跳超时后再次发起注册仍然失败,开始定时发起注册,间隔为1分钟", parentPlatform.getServerGBId());
168 - // 添加注册任务  
169 - dynamicTask.startCron(registerTaskKey,  
170 - // 注册失败(注册成功时由程序直接调用了online方法)  
171 - ()->logger.info("[国标级联] {},平台离线后持续发起注册,失败", parentPlatform.getServerGBId()),  
172 - 60*1000); 169 + offline(parentPlatform, false);
173 }, null); 170 }, null);
174 } catch (InvalidArgumentException | ParseException | SipException e) { 171 } catch (InvalidArgumentException | ParseException | SipException e) {
175 logger.error("[命令发送失败] 国标级联 注册: {}", e.getMessage()); 172 logger.error("[命令发送失败] 国标级联 注册: {}", e.getMessage());
@@ -198,7 +195,7 @@ public class PlatformServiceImpl implements IPlatformService { @@ -198,7 +195,7 @@ public class PlatformServiceImpl implements IPlatformService {
198 } 195 }
199 196
200 @Override 197 @Override
201 - public void offline(ParentPlatform parentPlatform) { 198 + public void offline(ParentPlatform parentPlatform, boolean stopRegister) {
202 logger.info("[平台离线]:{}", parentPlatform.getServerGBId()); 199 logger.info("[平台离线]:{}", parentPlatform.getServerGBId());
203 ParentPlatformCatch parentPlatformCatch = redisCatchStorage.queryPlatformCatchInfo(parentPlatform.getServerGBId()); 200 ParentPlatformCatch parentPlatformCatch = redisCatchStorage.queryPlatformCatchInfo(parentPlatform.getServerGBId());
204 parentPlatformCatch.setKeepAliveReply(0); 201 parentPlatformCatch.setKeepAliveReply(0);
@@ -212,11 +209,13 @@ public class PlatformServiceImpl implements IPlatformService { @@ -212,11 +209,13 @@ public class PlatformServiceImpl implements IPlatformService {
212 // 停止所有推流 209 // 停止所有推流
213 logger.info("[平台离线] {}, 停止所有推流", parentPlatform.getServerGBId()); 210 logger.info("[平台离线] {}, 停止所有推流", parentPlatform.getServerGBId());
214 stopAllPush(parentPlatform.getServerGBId()); 211 stopAllPush(parentPlatform.getServerGBId());
215 - // 清除注册定时  
216 - logger.info("[平台离线] {}, 停止定时注册任务", parentPlatform.getServerGBId());  
217 - final String registerTaskKey = REGISTER_KEY_PREFIX + parentPlatform.getServerGBId();  
218 - if (dynamicTask.contains(registerTaskKey)) {  
219 - dynamicTask.stop(registerTaskKey); 212 + if (stopRegister) {
  213 + // 清除注册定时
  214 + logger.info("[平台离线] {}, 停止定时注册任务", parentPlatform.getServerGBId());
  215 + final String registerTaskKey = REGISTER_KEY_PREFIX + parentPlatform.getServerGBId();
  216 + if (dynamicTask.contains(registerTaskKey)) {
  217 + dynamicTask.stop(registerTaskKey);
  218 + }
220 } 219 }
221 // 清除心跳定时 220 // 清除心跳定时
222 logger.info("[平台离线] {}, 停止定时发送心跳任务", parentPlatform.getServerGBId()); 221 logger.info("[平台离线] {}, 停止定时发送心跳任务", parentPlatform.getServerGBId());
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
@@ -36,7 +36,6 @@ import com.genersoft.iot.vmp.utils.DateUtil; @@ -36,7 +36,6 @@ import com.genersoft.iot.vmp.utils.DateUtil;
36 import com.genersoft.iot.vmp.utils.redis.RedisUtil; 36 import com.genersoft.iot.vmp.utils.redis.RedisUtil;
37 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; 37 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
38 import com.genersoft.iot.vmp.vmanager.bean.WVPResult; 38 import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
39 -import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.PlayResult;  
40 import org.slf4j.Logger; 39 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory; 40 import org.slf4j.LoggerFactory;
42 import org.springframework.beans.factory.annotation.Autowired; 41 import org.springframework.beans.factory.annotation.Autowired;
@@ -53,7 +52,6 @@ import java.math.BigDecimal; @@ -53,7 +52,6 @@ import java.math.BigDecimal;
53 import java.math.RoundingMode; 52 import java.math.RoundingMode;
54 import java.text.ParseException; 53 import java.text.ParseException;
55 import java.util.List; 54 import java.util.List;
56 -import java.util.Objects;  
57 import java.util.UUID; 55 import java.util.UUID;
58 56
59 @SuppressWarnings(value = {"rawtypes", "unchecked"}) 57 @SuppressWarnings(value = {"rawtypes", "unchecked"})
@@ -111,46 +109,19 @@ public class PlayServiceImpl implements IPlayService { @@ -111,46 +109,19 @@ public class PlayServiceImpl implements IPlayService {
111 private ThreadPoolTaskExecutor taskExecutor; 109 private ThreadPoolTaskExecutor taskExecutor;
112 110
113 @Override 111 @Override
114 - public PlayResult play(MediaServerItem mediaServerItem, String deviceId, String channelId,  
115 - ZlmHttpHookSubscribe.Event hookEvent, SipSubscribe.Event errorEvent,  
116 - Runnable timeoutCallback) { 112 + public void play(MediaServerItem mediaServerItem, String deviceId, String channelId,
  113 + ZlmHttpHookSubscribe.Event hookEvent, SipSubscribe.Event errorEvent,
  114 + Runnable timeoutCallback) {
117 if (mediaServerItem == null) { 115 if (mediaServerItem == null) {
118 throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到可用的zlm"); 116 throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到可用的zlm");
119 } 117 }
120 - PlayResult playResult = new PlayResult();  
121 - RequestMessage msg = new RequestMessage();  
122 String key = DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId; 118 String key = DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId;
  119 +
  120 + RequestMessage msg = new RequestMessage();
123 msg.setKey(key); 121 msg.setKey(key);
124 - String uuid = UUID.randomUUID().toString();  
125 - msg.setId(uuid);  
126 - playResult.setUuid(uuid);  
127 - DeferredResult<WVPResult<StreamInfo>> result = new DeferredResult<>(userSetting.getPlayTimeout().longValue());  
128 - playResult.setResult(result);  
129 - // 录像查询以channelId作为deviceId查询  
130 - resultHolder.put(key, uuid, result);  
131 122
132 Device device = redisCatchStorage.getDevice(deviceId); 123 Device device = redisCatchStorage.getDevice(deviceId);
133 StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId); 124 StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId);
134 - playResult.setDevice(device);  
135 -  
136 - result.onCompletion(() -> {  
137 - // 点播结束时调用截图接口  
138 - taskExecutor.execute(() -> {  
139 - // TODO 应该在上流时调用更好,结束也可能是错误结束  
140 - String path = "snap";  
141 - String fileName = deviceId + "_" + channelId + ".jpg";  
142 - WVPResult wvpResult = (WVPResult) result.getResult();  
143 - if (Objects.requireNonNull(wvpResult).getCode() == 0) {  
144 - StreamInfo streamInfoForSuccess = (StreamInfo) wvpResult.getData();  
145 - MediaServerItem mediaInfo = mediaServerService.getOne(streamInfoForSuccess.getMediaServerId());  
146 - String streamUrl = streamInfoForSuccess.getFmp4();  
147 -  
148 - // 请求截图  
149 - logger.info("[请求截图]: " + fileName);  
150 - zlmresTfulUtils.getSnap(mediaInfo, streamUrl, 15, 1, path, fileName);  
151 - }  
152 - });  
153 - });  
154 125
155 if (streamInfo != null) { 126 if (streamInfo != null) {
156 String streamId = streamInfo.getStream(); 127 String streamId = streamInfo.getStream();
@@ -160,7 +131,7 @@ public class PlayServiceImpl implements IPlayService { @@ -160,7 +131,7 @@ public class PlayServiceImpl implements IPlayService {
160 wvpResult.setMsg("点播失败, redis缓存streamId等于null"); 131 wvpResult.setMsg("点播失败, redis缓存streamId等于null");
161 msg.setData(wvpResult); 132 msg.setData(wvpResult);
162 resultHolder.invokeAllResult(msg); 133 resultHolder.invokeAllResult(msg);
163 - return playResult; 134 + return;
164 } 135 }
165 String mediaServerId = streamInfo.getMediaServerId(); 136 String mediaServerId = streamInfo.getMediaServerId();
166 MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId); 137 MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId);
@@ -178,14 +149,13 @@ public class PlayServiceImpl implements IPlayService { @@ -178,14 +149,13 @@ public class PlayServiceImpl implements IPlayService {
178 msg.setData(wvpResult); 149 msg.setData(wvpResult);
179 150
180 resultHolder.invokeAllResult(msg); 151 resultHolder.invokeAllResult(msg);
181 - return playResult; 152 + return;
182 } else { 153 } else {
183 WVPResult wvpResult = new WVPResult(); 154 WVPResult wvpResult = new WVPResult();
184 wvpResult.setCode(ErrorCode.SUCCESS.getCode()); 155 wvpResult.setCode(ErrorCode.SUCCESS.getCode());
185 wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); 156 wvpResult.setMsg(ErrorCode.SUCCESS.getMsg());
186 wvpResult.setData(streamInfo); 157 wvpResult.setData(streamInfo);
187 msg.setData(wvpResult); 158 msg.setData(wvpResult);
188 -  
189 resultHolder.invokeAllResult(msg); 159 resultHolder.invokeAllResult(msg);
190 if (hookEvent != null) { 160 if (hookEvent != null) {
191 hookEvent.response(mediaServerItem, JSON.parseObject(JSON.toJSONString(streamInfo))); 161 hookEvent.response(mediaServerItem, JSON.parseObject(JSON.toJSONString(streamInfo)));
@@ -211,7 +181,6 @@ public class PlayServiceImpl implements IPlayService { @@ -211,7 +181,6 @@ public class PlayServiceImpl implements IPlayService {
211 streamId = String.format("%s_%s", device.getDeviceId(), channelId); 181 streamId = String.format("%s_%s", device.getDeviceId(), channelId);
212 } 182 }
213 SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, device.isSsrcCheck(), false); 183 SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, device.isSsrcCheck(), false);
214 - logger.info(JSONObject.toJSONString(ssrcInfo));  
215 if (ssrcInfo == null) { 184 if (ssrcInfo == null) {
216 WVPResult wvpResult = new WVPResult(); 185 WVPResult wvpResult = new WVPResult();
217 wvpResult.setCode(ErrorCode.ERROR100.getCode()); 186 wvpResult.setCode(ErrorCode.ERROR100.getCode());
@@ -219,7 +188,7 @@ public class PlayServiceImpl implements IPlayService { @@ -219,7 +188,7 @@ public class PlayServiceImpl implements IPlayService {
219 msg.setData(wvpResult); 188 msg.setData(wvpResult);
220 189
221 resultHolder.invokeAllResult(msg); 190 resultHolder.invokeAllResult(msg);
222 - return playResult; 191 + return;
223 } 192 }
224 play(mediaServerItem, ssrcInfo, device, channelId, (mediaServerItemInUse, response) -> { 193 play(mediaServerItem, ssrcInfo, device, channelId, (mediaServerItemInUse, response) -> {
225 if (hookEvent != null) { 194 if (hookEvent != null) {
@@ -247,16 +216,15 @@ public class PlayServiceImpl implements IPlayService { @@ -247,16 +216,15 @@ public class PlayServiceImpl implements IPlayService {
247 msg.setData(wvpResult); 216 msg.setData(wvpResult);
248 // 回复之前所有的点播请求 217 // 回复之前所有的点播请求
249 resultHolder.invokeAllResult(msg); 218 resultHolder.invokeAllResult(msg);
250 - }, uuid); 219 + });
251 } 220 }
252 - return playResult;  
253 } 221 }
254 222
255 223
256 @Override 224 @Override
257 public void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, 225 public void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
258 ZlmHttpHookSubscribe.Event hookEvent, SipSubscribe.Event errorEvent, 226 ZlmHttpHookSubscribe.Event hookEvent, SipSubscribe.Event errorEvent,
259 - InviteTimeOutCallback timeoutCallback, String uuid) { 227 + InviteTimeOutCallback timeoutCallback) {
260 228
261 logger.info("[点播开始] deviceId: {}, channelId: {},收流端口: {}, 收流模式:{}, SSRC: {}, SSRC校验:{}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck()); 229 logger.info("[点播开始] deviceId: {}, channelId: {},收流端口: {}, 收流模式:{}, SSRC: {}, SSRC校验:{}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
262 // 超时处理 230 // 超时处理
@@ -279,16 +247,36 @@ public class PlayServiceImpl implements IPlayService { @@ -279,16 +247,36 @@ public class PlayServiceImpl implements IPlayService {
279 } 247 }
280 } 248 }
281 }, userSetting.getPlayTimeout()); 249 }, userSetting.getPlayTimeout());
  250 + //端口获取失败的ssrcInfo 没有必要发送点播指令
  251 + if (ssrcInfo.getPort() <= 0) {
  252 + logger.info("[点播端口分配异常],deviceId={},channelId={},ssrcInfo={}", device.getDeviceId(), channelId, ssrcInfo);
  253 + dynamicTask.stop(timeOutTaskKey);
  254 + // 释放ssrc
  255 + mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
282 256
  257 + streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
  258 +
  259 + RequestMessage msg = new RequestMessage();
  260 + msg.setKey(DeferredResultHolder.CALLBACK_CMD_PLAY + device.getDeviceId() + channelId);
  261 + msg.setData(WVPResult.fail(ErrorCode.ERROR100.getCode(), "点播端口分配异常"));
  262 + resultHolder.invokeAllResult(msg);
  263 + return;
  264 + }
283 try { 265 try {
284 cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> { 266 cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> {
285 logger.info("收到订阅消息: " + response.toJSONString()); 267 logger.info("收到订阅消息: " + response.toJSONString());
286 dynamicTask.stop(timeOutTaskKey); 268 dynamicTask.stop(timeOutTaskKey);
287 269
288 // hook响应 270 // hook响应
289 - onPublishHandlerForPlay(mediaServerItemInuse, response, device.getDeviceId(), channelId, uuid); 271 + onPublishHandlerForPlay(mediaServerItemInuse, response, device.getDeviceId(), channelId);
290 hookEvent.response(mediaServerItemInuse, response); 272 hookEvent.response(mediaServerItemInuse, response);
291 logger.info("[点播成功] deviceId: {}, channelId: {}", device.getDeviceId(), channelId); 273 logger.info("[点播成功] deviceId: {}, channelId: {}", device.getDeviceId(), channelId);
  274 + String streamUrl = String.format("rtsp://127.0.0.1:%s/%s/%s", mediaServerItemInuse.getRtspPort(), "rtp", ssrcInfo.getStream());
  275 + String path = "snap";
  276 + String fileName = device.getDeviceId() + "_" + channelId + ".jpg";
  277 + // 请求截图
  278 + logger.info("[请求截图]: " + fileName);
  279 + zlmresTfulUtils.getSnap(mediaServerItemInuse, streamUrl, 15, 1, path, fileName);
292 280
293 }, (event) -> { 281 }, (event) -> {
294 ResponseEvent responseEvent = (ResponseEvent) event.event; 282 ResponseEvent responseEvent = (ResponseEvent) event.event;
@@ -328,7 +316,7 @@ public class PlayServiceImpl implements IPlayService { @@ -328,7 +316,7 @@ public class PlayServiceImpl implements IPlayService {
328 logger.info("[ZLM HOOK] ssrc修正后收到订阅消息: " + response.toJSONString()); 316 logger.info("[ZLM HOOK] ssrc修正后收到订阅消息: " + response.toJSONString());
329 dynamicTask.stop(timeOutTaskKey); 317 dynamicTask.stop(timeOutTaskKey);
330 // hook响应 318 // hook响应
331 - onPublishHandlerForPlay(mediaServerItemInUse, response, device.getDeviceId(), channelId, uuid); 319 + onPublishHandlerForPlay(mediaServerItemInUse, response, device.getDeviceId(), channelId);
332 hookEvent.response(mediaServerItemInUse, response); 320 hookEvent.response(mediaServerItemInUse, response);
333 }); 321 });
334 } 322 }
@@ -364,13 +352,41 @@ public class PlayServiceImpl implements IPlayService { @@ -364,13 +352,41 @@ public class PlayServiceImpl implements IPlayService {
364 } 352 }
365 353
366 @Override 354 @Override
367 - public void onPublishHandlerForPlay(MediaServerItem mediaServerItem, JSONObject response, String deviceId, String channelId, String uuid) { 355 + public void onPublishHandlerForPlay(MediaServerItem mediaServerItem, JSONObject response, String deviceId, String channelId) {
  356 + StreamInfo streamInfo = onPublishHandler(mediaServerItem, response, deviceId, channelId);
368 RequestMessage msg = new RequestMessage(); 357 RequestMessage msg = new RequestMessage();
369 - if (uuid != null) {  
370 - msg.setId(uuid); 358 + msg.setKey(DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId);
  359 + if (streamInfo != null) {
  360 + DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId);
  361 + if (deviceChannel != null) {
  362 + deviceChannel.setStreamId(streamInfo.getStream());
  363 + storager.startPlay(deviceId, channelId, streamInfo.getStream());
  364 + }
  365 + redisCatchStorage.startPlay(streamInfo);
  366 +
  367 + WVPResult wvpResult = new WVPResult();
  368 + wvpResult.setCode(ErrorCode.SUCCESS.getCode());
  369 + wvpResult.setMsg(ErrorCode.SUCCESS.getMsg());
  370 + wvpResult.setData(streamInfo);
  371 +
  372 + msg.setData(wvpResult);
  373 + resultHolder.invokeAllResult(msg);
  374 +
  375 + } else {
  376 + logger.warn("设备预览API调用失败!");
  377 + msg.setData(WVPResult.fail(ErrorCode.ERROR100.getCode(), "设备预览API调用失败!"));
  378 + resultHolder.invokeAllResult(msg);
371 } 379 }
  380 + }
  381 +
  382 + private void onPublishHandlerForPlayback(MediaServerItem mediaServerItem, JSONObject response, String deviceId, String channelId, String uuid) {
  383 + RequestMessage msg = new RequestMessage();
372 msg.setKey(DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId); 384 msg.setKey(DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId);
  385 + if (!ObjectUtils.isEmpty(uuid)) {
  386 + msg.setId(uuid);
  387 + }
373 StreamInfo streamInfo = onPublishHandler(mediaServerItem, response, deviceId, channelId); 388 StreamInfo streamInfo = onPublishHandler(mediaServerItem, response, deviceId, channelId);
  389 +
374 if (streamInfo != null) { 390 if (streamInfo != null) {
375 DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId); 391 DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId);
376 if (deviceChannel != null) { 392 if (deviceChannel != null) {
@@ -387,8 +403,8 @@ public class PlayServiceImpl implements IPlayService { @@ -387,8 +403,8 @@ public class PlayServiceImpl implements IPlayService {
387 403
388 resultHolder.invokeAllResult(msg); 404 resultHolder.invokeAllResult(msg);
389 } else { 405 } else {
390 - logger.warn("设备预览API调用失败!");  
391 - msg.setData(WVPResult.fail(ErrorCode.ERROR100.getCode(), "设备预览API调用失败!")); 406 + logger.warn("录像回放调用失败!");
  407 + msg.setData(WVPResult.fail(ErrorCode.ERROR100.getCode(), "录像回放调用失败!"));
392 resultHolder.invokeAllResult(msg); 408 resultHolder.invokeAllResult(msg);
393 } 409 }
394 } 410 }
@@ -542,7 +558,7 @@ public class PlayServiceImpl implements IPlayService { @@ -542,7 +558,7 @@ public class PlayServiceImpl implements IPlayService {
542 logger.info("[ZLM HOOK] ssrc修正后收到订阅消息: " + response.toJSONString()); 558 logger.info("[ZLM HOOK] ssrc修正后收到订阅消息: " + response.toJSONString());
543 dynamicTask.stop(playBackTimeOutTaskKey); 559 dynamicTask.stop(playBackTimeOutTaskKey);
544 // hook响应 560 // hook响应
545 - onPublishHandlerForPlay(mediaServerItemInUse, response, device.getDeviceId(), channelId, uuid); 561 + onPublishHandlerForPlayback(mediaServerItemInUse, response, device.getDeviceId(), channelId, uuid);
546 hookEvent.call(new InviteStreamInfo(mediaServerItem, null, eventResult.callId, "rtp", ssrcInfo.getStream())); 562 hookEvent.call(new InviteStreamInfo(mediaServerItem, null, eventResult.callId, "rtp", ssrcInfo.getStream()));
547 }); 563 });
548 } 564 }
@@ -565,6 +581,8 @@ public class PlayServiceImpl implements IPlayService { @@ -565,6 +581,8 @@ public class PlayServiceImpl implements IPlayService {
565 return result; 581 return result;
566 } 582 }
567 583
  584 +
  585 +
568 @Override 586 @Override
569 public DeferredResult<WVPResult<StreamInfo>> download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) { 587 public DeferredResult<WVPResult<StreamInfo>> download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) {
570 Device device = storager.queryVideoDevice(deviceId); 588 Device device = storager.queryVideoDevice(deviceId);
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
@@ -221,6 +221,12 @@ public class StreamPushServiceImpl implements IStreamPushService { @@ -221,6 +221,12 @@ public class StreamPushServiceImpl implements IStreamPushService {
221 streamInfoPushItemMap.put(onStreamChangedHookParam.getApp() + onStreamChangedHookParam.getStream(), onStreamChangedHookParam); 221 streamInfoPushItemMap.put(onStreamChangedHookParam.getApp() + onStreamChangedHookParam.getStream(), onStreamChangedHookParam);
222 } 222 }
223 } 223 }
  224 + // 获取所有推流鉴权信息,清理过期的
  225 + List<StreamAuthorityInfo> allStreamAuthorityInfo = redisCatchStorage.getAllStreamAuthorityInfo();
  226 + Map<String, StreamAuthorityInfo> streamAuthorityInfoInfoMap = new HashMap<>();
  227 + for (StreamAuthorityInfo streamAuthorityInfo : allStreamAuthorityInfo) {
  228 + streamAuthorityInfoInfoMap.put(streamAuthorityInfo.getApp() + streamAuthorityInfo.getStream(), streamAuthorityInfo);
  229 + }
224 zlmresTfulUtils.getMediaList(mediaServerItem, (mediaList ->{ 230 zlmresTfulUtils.getMediaList(mediaServerItem, (mediaList ->{
225 if (mediaList == null) { 231 if (mediaList == null) {
226 return; 232 return;
@@ -239,6 +245,7 @@ public class StreamPushServiceImpl implements IStreamPushService { @@ -239,6 +245,7 @@ public class StreamPushServiceImpl implements IStreamPushService {
239 for (StreamPushItem streamPushItem : streamPushItems) { 245 for (StreamPushItem streamPushItem : streamPushItems) {
240 pushItemMap.remove(streamPushItem.getApp() + streamPushItem.getStream()); 246 pushItemMap.remove(streamPushItem.getApp() + streamPushItem.getStream());
241 streamInfoPushItemMap.remove(streamPushItem.getApp() + streamPushItem.getStream()); 247 streamInfoPushItemMap.remove(streamPushItem.getApp() + streamPushItem.getStream());
  248 + streamAuthorityInfoInfoMap.remove(streamPushItem.getApp() + streamPushItem.getStream());
242 } 249 }
243 } 250 }
244 List<StreamPushItem> offlinePushItems = new ArrayList<>(pushItemMap.values()); 251 List<StreamPushItem> offlinePushItems = new ArrayList<>(pushItemMap.values());
@@ -274,6 +281,14 @@ public class StreamPushServiceImpl implements IStreamPushService { @@ -274,6 +281,14 @@ public class StreamPushServiceImpl implements IStreamPushService {
274 redisCatchStorage.removeStream(mediaServerItem.getId(), "PUSH", offlineOnStreamChangedHookParam.getApp(), offlineOnStreamChangedHookParam.getStream()); 281 redisCatchStorage.removeStream(mediaServerItem.getId(), "PUSH", offlineOnStreamChangedHookParam.getApp(), offlineOnStreamChangedHookParam.getStream());
275 } 282 }
276 } 283 }
  284 +
  285 + Collection<StreamAuthorityInfo> streamAuthorityInfos = streamAuthorityInfoInfoMap.values();
  286 + if (streamAuthorityInfos.size() > 0) {
  287 + for (StreamAuthorityInfo streamAuthorityInfo : streamAuthorityInfos) {
  288 + // 移除redis内流的信息
  289 + redisCatchStorage.removeStreamAuthorityInfo(streamAuthorityInfo.getApp(), streamAuthorityInfo.getStream());
  290 + }
  291 + }
277 })); 292 }));
278 } 293 }
279 294
src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java
@@ -233,6 +233,8 @@ public interface IRedisCatchStorage { @@ -233,6 +233,8 @@ public interface IRedisCatchStorage {
233 */ 233 */
234 StreamAuthorityInfo getStreamAuthorityInfo(String app, String stream); 234 StreamAuthorityInfo getStreamAuthorityInfo(String app, String stream);
235 235
  236 + List<StreamAuthorityInfo> getAllStreamAuthorityInfo();
  237 +
236 /** 238 /**
237 * 发送redis消息 查询所有推流设备的状态 239 * 发送redis消息 查询所有推流设备的状态
238 */ 240 */
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java
@@ -25,6 +25,7 @@ public interface DeviceMapper { @@ -25,6 +25,7 @@ public interface DeviceMapper {
25 "streamMode," + 25 "streamMode," +
26 "ip," + 26 "ip," +
27 "sdpIp," + 27 "sdpIp," +
  28 + "localIp," +
28 "port," + 29 "port," +
29 "hostAddress," + 30 "hostAddress," +
30 "expires," + 31 "expires," +
@@ -54,6 +55,7 @@ public interface DeviceMapper { @@ -54,6 +55,7 @@ public interface DeviceMapper {
54 "streamMode," + 55 "streamMode," +
55 "ip," + 56 "ip," +
56 "sdpIp," + 57 "sdpIp," +
  58 + "localIp," +
57 "port," + 59 "port," +
58 "hostAddress," + 60 "hostAddress," +
59 "expires," + 61 "expires," +
@@ -80,6 +82,7 @@ public interface DeviceMapper { @@ -80,6 +82,7 @@ public interface DeviceMapper {
80 "#{streamMode}," + 82 "#{streamMode}," +
81 "#{ip}," + 83 "#{ip}," +
82 "#{sdpIp}," + 84 "#{sdpIp}," +
  85 + "#{localIp}," +
83 "#{port}," + 86 "#{port}," +
84 "#{hostAddress}," + 87 "#{hostAddress}," +
85 "#{expires}," + 88 "#{expires}," +
@@ -108,6 +111,7 @@ public interface DeviceMapper { @@ -108,6 +111,7 @@ public interface DeviceMapper {
108 "<if test=\"firmware != null\">, firmware='${firmware}'</if>" + 111 "<if test=\"firmware != null\">, firmware='${firmware}'</if>" +
109 "<if test=\"transport != null\">, transport='${transport}'</if>" + 112 "<if test=\"transport != null\">, transport='${transport}'</if>" +
110 "<if test=\"ip != null\">, ip='${ip}'</if>" + 113 "<if test=\"ip != null\">, ip='${ip}'</if>" +
  114 + "<if test=\"localIp != null\">, localIp='${localIp}'</if>" +
111 "<if test=\"port != null\">, port=${port}</if>" + 115 "<if test=\"port != null\">, port=${port}</if>" +
112 "<if test=\"hostAddress != null\">, hostAddress='${hostAddress}'</if>" + 116 "<if test=\"hostAddress != null\">, hostAddress='${hostAddress}'</if>" +
113 "<if test=\"online != null\">, online=${online}</if>" + 117 "<if test=\"online != null\">, online=${online}</if>" +
@@ -129,6 +133,7 @@ public interface DeviceMapper { @@ -129,6 +133,7 @@ public interface DeviceMapper {
129 "streamMode," + 133 "streamMode," +
130 "ip," + 134 "ip," +
131 "sdpIp," + 135 "sdpIp," +
  136 + "localIp," +
132 "port," + 137 "port," +
133 "hostAddress," + 138 "hostAddress," +
134 "expires," + 139 "expires," +
@@ -165,6 +170,7 @@ public interface DeviceMapper { @@ -165,6 +170,7 @@ public interface DeviceMapper {
165 "streamMode," + 170 "streamMode," +
166 "ip," + 171 "ip," +
167 "sdpIp," + 172 "sdpIp," +
  173 + "localIp," +
168 "port," + 174 "port," +
169 "hostAddress," + 175 "hostAddress," +
170 "expires," + 176 "expires," +
@@ -194,6 +200,7 @@ public interface DeviceMapper { @@ -194,6 +200,7 @@ public interface DeviceMapper {
194 "streamMode," + 200 "streamMode," +
195 "ip," + 201 "ip," +
196 "sdpIp," + 202 "sdpIp," +
  203 + "localIp," +
197 "port," + 204 "port," +
198 "hostAddress," + 205 "hostAddress," +
199 "expires," + 206 "expires," +
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
@@ -714,6 +714,18 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { @@ -714,6 +714,18 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage {
714 714
715 } 715 }
716 716
  717 + @Override
  718 + public List<StreamAuthorityInfo> getAllStreamAuthorityInfo() {
  719 + String scanKey = VideoManagerConstants.MEDIA_STREAM_AUTHORITY + userSetting.getServerId() + "_*_*" ;
  720 + List<StreamAuthorityInfo> result = new ArrayList<>();
  721 + List<Object> keys = RedisUtil.scan(scanKey);
  722 + for (Object o : keys) {
  723 + String key = (String) o;
  724 + result.add((StreamAuthorityInfo) RedisUtil.get(key));
  725 + }
  726 + return result;
  727 + }
  728 +
717 729
718 @Override 730 @Override
719 public OnStreamChangedHookParam getStreamInfo(String app, String streamId, String mediaServerId) { 731 public OnStreamChangedHookParam getStreamInfo(String app, String streamId, String mediaServerId) {
src/main/java/com/genersoft/iot/vmp/utils/redis/FastJsonRedisSerializer.java
1 package com.genersoft.iot.vmp.utils.redis; 1 package com.genersoft.iot.vmp.utils.redis;
2 2
3 -import java.nio.charset.Charset;  
4 - 3 +import com.alibaba.fastjson2.JSON;
5 import com.alibaba.fastjson2.JSONReader; 4 import com.alibaba.fastjson2.JSONReader;
6 import com.alibaba.fastjson2.JSONWriter; 5 import com.alibaba.fastjson2.JSONWriter;
7 import org.springframework.data.redis.serializer.RedisSerializer; 6 import org.springframework.data.redis.serializer.RedisSerializer;
8 import org.springframework.data.redis.serializer.SerializationException; 7 import org.springframework.data.redis.serializer.SerializationException;
9 8
10 -import com.alibaba.fastjson2.JSON;  
11 -import com.alibaba.fastjson2.JSONWriter.Feature; 9 +import java.nio.charset.Charset;
12 10
13 /** 11 /**
14 * @description:使用fastjson实现redis的序列化 12 * @description:使用fastjson实现redis的序列化
@@ -31,7 +29,7 @@ public class FastJsonRedisSerializer&lt;T&gt; implements RedisSerializer&lt;T&gt; { @@ -31,7 +29,7 @@ public class FastJsonRedisSerializer&lt;T&gt; implements RedisSerializer&lt;T&gt; {
31 if (t == null) { 29 if (t == null) {
32 return new byte[0]; 30 return new byte[0];
33 } 31 }
34 - return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET); 32 + return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName, JSONWriter.Feature.WritePairAsJavaBean).getBytes(DEFAULT_CHARSET);
35 } 33 }
36 34
37 @Override 35 @Override
@@ -42,4 +40,6 @@ public class FastJsonRedisSerializer&lt;T&gt; implements RedisSerializer&lt;T&gt; { @@ -42,4 +40,6 @@ public class FastJsonRedisSerializer&lt;T&gt; implements RedisSerializer&lt;T&gt; {
42 String str = new String(bytes, DEFAULT_CHARSET); 40 String str = new String(bytes, DEFAULT_CHARSET);
43 return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType); 41 return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType);
44 } 42 }
  43 +
  44 +
45 } 45 }
src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeferredResultEx.java 0 → 100644
  1 +package com.genersoft.iot.vmp.vmanager.bean;
  2 +
  3 +import org.springframework.web.context.request.async.DeferredResult;
  4 +
  5 +public class DeferredResultEx<T> {
  6 +
  7 + private DeferredResult<T> deferredResult;
  8 +
  9 + private DeferredResultFilter filter;
  10 +
  11 + public DeferredResultEx(DeferredResult<T> result) {
  12 + this.deferredResult = result;
  13 + }
  14 +
  15 +
  16 + public DeferredResult<T> getDeferredResult() {
  17 + return deferredResult;
  18 + }
  19 +
  20 + public void setDeferredResult(DeferredResult<T> deferredResult) {
  21 + this.deferredResult = deferredResult;
  22 + }
  23 +
  24 + public DeferredResultFilter getFilter() {
  25 + return filter;
  26 + }
  27 +
  28 + public void setFilter(DeferredResultFilter filter) {
  29 + this.filter = filter;
  30 + }
  31 +}
src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeferredResultFilter.java 0 → 100644
  1 +package com.genersoft.iot.vmp.vmanager.bean;
  2 +
  3 +public interface DeferredResultFilter {
  4 +
  5 + Object handler(Object o);
  6 +}
src/main/java/com/genersoft/iot/vmp/vmanager/bean/WVPResult.java
@@ -4,7 +4,7 @@ package com.genersoft.iot.vmp.vmanager.bean; @@ -4,7 +4,7 @@ package com.genersoft.iot.vmp.vmanager.bean;
4 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
5 5
6 @Schema(description = "统一返回结果") 6 @Schema(description = "统一返回结果")
7 -public class WVPResult<T> { 7 +public class WVPResult<T> implements Cloneable{
8 8
9 public WVPResult() { 9 public WVPResult() {
10 } 10 }
@@ -63,4 +63,9 @@ public class WVPResult&lt;T&gt; { @@ -63,4 +63,9 @@ public class WVPResult&lt;T&gt; {
63 public void setData(T data) { 63 public void setData(T data) {
64 this.data = data; 64 this.data = data;
65 } 65 }
  66 +
  67 + @Override
  68 + public Object clone() throws CloneNotSupportedException {
  69 + return super.clone();
  70 + }
66 } 71 }
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
1 package com.genersoft.iot.vmp.vmanager.gb28181.play; 1 package com.genersoft.iot.vmp.vmanager.gb28181.play;
2 2
3 import com.alibaba.fastjson2.JSONArray; 3 import com.alibaba.fastjson2.JSONArray;
  4 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.common.StreamInfo; 5 import com.genersoft.iot.vmp.common.StreamInfo;
  6 +import com.genersoft.iot.vmp.conf.UserSetting;
5 import com.genersoft.iot.vmp.conf.exception.ControllerException; 7 import com.genersoft.iot.vmp.conf.exception.ControllerException;
6 import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; 8 import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
  9 +import com.genersoft.iot.vmp.gb28181.bean.Device;
7 import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; 10 import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
8 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; 11 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
9 -import com.genersoft.iot.vmp.gb28181.bean.Device;  
10 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; 12 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
11 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; 13 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
  14 +import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
12 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; 15 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
13 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 16 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
14 import com.genersoft.iot.vmp.service.IMediaServerService; 17 import com.genersoft.iot.vmp.service.IMediaServerService;
  18 +import com.genersoft.iot.vmp.service.IMediaService;
  19 +import com.genersoft.iot.vmp.service.IPlayService;
15 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 20 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
  21 +import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
  22 +import com.genersoft.iot.vmp.vmanager.bean.DeferredResultEx;
16 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; 23 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
17 import com.genersoft.iot.vmp.vmanager.bean.WVPResult; 24 import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
18 -import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.PlayResult;  
19 -import com.genersoft.iot.vmp.service.IMediaService;  
20 -import com.genersoft.iot.vmp.service.IPlayService;  
21 -  
22 import io.swagger.v3.oas.annotations.Operation; 25 import io.swagger.v3.oas.annotations.Operation;
23 import io.swagger.v3.oas.annotations.Parameter; 26 import io.swagger.v3.oas.annotations.Parameter;
24 import io.swagger.v3.oas.annotations.tags.Tag; 27 import io.swagger.v3.oas.annotations.tags.Tag;
25 import org.slf4j.Logger; 28 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory; 29 import org.slf4j.LoggerFactory;
27 import org.springframework.beans.factory.annotation.Autowired; 30 import org.springframework.beans.factory.annotation.Autowired;
28 -import org.springframework.web.bind.annotation.CrossOrigin;  
29 -import org.springframework.web.bind.annotation.GetMapping;  
30 -import org.springframework.web.bind.annotation.PathVariable;  
31 -import org.springframework.web.bind.annotation.PostMapping;  
32 -import org.springframework.web.bind.annotation.RequestMapping;  
33 -import org.springframework.web.bind.annotation.RestController;  
34 -  
35 -import com.alibaba.fastjson2.JSONObject;  
36 -import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;  
37 -import com.genersoft.iot.vmp.storager.IVideoManagerStorage; 31 +import org.springframework.web.bind.annotation.*;
38 import org.springframework.web.context.request.async.DeferredResult; 32 import org.springframework.web.context.request.async.DeferredResult;
39 33
  34 +import javax.servlet.http.HttpServletRequest;
40 import javax.sip.InvalidArgumentException; 35 import javax.sip.InvalidArgumentException;
41 import javax.sip.SipException; 36 import javax.sip.SipException;
42 import java.text.ParseException; 37 import java.text.ParseException;
@@ -78,19 +73,63 @@ public class PlayController { @@ -78,19 +73,63 @@ public class PlayController {
78 @Autowired 73 @Autowired
79 private IMediaServerService mediaServerService; 74 private IMediaServerService mediaServerService;
80 75
  76 + @Autowired
  77 + private UserSetting userSetting;
  78 +
81 @Operation(summary = "开始点播") 79 @Operation(summary = "开始点播")
82 @Parameter(name = "deviceId", description = "设备国标编号", required = true) 80 @Parameter(name = "deviceId", description = "设备国标编号", required = true)
83 @Parameter(name = "channelId", description = "通道国标编号", required = true) 81 @Parameter(name = "channelId", description = "通道国标编号", required = true)
84 @GetMapping("/start/{deviceId}/{channelId}") 82 @GetMapping("/start/{deviceId}/{channelId}")
85 - public DeferredResult<WVPResult<StreamInfo>> play(@PathVariable String deviceId,  
86 - @PathVariable String channelId) { 83 + public DeferredResult<WVPResult<StreamInfo>> play(HttpServletRequest request, @PathVariable String deviceId,
  84 + @PathVariable String channelId) {
87 85
88 // 获取可用的zlm 86 // 获取可用的zlm
89 Device device = storager.queryVideoDevice(deviceId); 87 Device device = storager.queryVideoDevice(deviceId);
90 MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device); 88 MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device);
91 - PlayResult playResult = playService.play(newMediaServerItem, deviceId, channelId, null, null, null);  
92 89
93 - return playResult.getResult(); 90 + RequestMessage msg = new RequestMessage();
  91 + String key = DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId;
  92 + boolean exist = resultHolder.exist(key, null);
  93 + msg.setKey(key);
  94 + String uuid = UUID.randomUUID().toString();
  95 + msg.setId(uuid);
  96 + DeferredResult<WVPResult<StreamInfo>> result = new DeferredResult<>(userSetting.getPlayTimeout().longValue());
  97 + DeferredResultEx<WVPResult<StreamInfo>> deferredResultEx = new DeferredResultEx<>(result);
  98 +
  99 + result.onTimeout(()->{
  100 + logger.info("点播接口等待超时");
  101 + // 释放rtpserver
  102 + WVPResult<StreamInfo> wvpResult = new WVPResult<>();
  103 + wvpResult.setCode(ErrorCode.ERROR100.getCode());
  104 + wvpResult.setMsg("点播超时");
  105 + msg.setData(wvpResult);
  106 + resultHolder.invokeResult(msg);
  107 + });
  108 +
  109 + // TODO 在点播未成功的情况下在此调用接口点播会导致返回的流地址ip错误
  110 + deferredResultEx.setFilter(result1 -> {
  111 + WVPResult<StreamInfo> wvpResult1 = (WVPResult<StreamInfo>)result1;
  112 + WVPResult<StreamInfo> clone = null;
  113 + try {
  114 + clone = (WVPResult<StreamInfo>)wvpResult1.clone();
  115 + } catch (CloneNotSupportedException e) {
  116 + throw new RuntimeException(e);
  117 + }
  118 + if (clone.getCode() == ErrorCode.SUCCESS.getCode()) {
  119 + StreamInfo data = clone.getData().clone();
  120 + data.channgeStreamIp(request.getLocalName());
  121 + clone.setData(data);
  122 + }
  123 + return clone;
  124 + });
  125 +
  126 + // 录像查询以channelId作为deviceId查询
  127 + resultHolder.put(key, uuid, deferredResultEx);
  128 +
  129 + if (!exist) {
  130 + playService.play(newMediaServerItem, deviceId, channelId, null, null, null);
  131 + }
  132 + return result;
94 } 133 }
95 134
96 135
src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java
@@ -158,25 +158,25 @@ public class ServerController { @@ -158,25 +158,25 @@ public class ServerController {
158 @GetMapping(value = "/restart") 158 @GetMapping(value = "/restart")
159 @ResponseBody 159 @ResponseBody
160 public void restart() { 160 public void restart() {
161 - taskExecutor.execute(()-> {  
162 - try {  
163 - Thread.sleep(3000);  
164 - SipProvider up = (SipProvider) SpringBeanFactory.getBean("udpSipProvider");  
165 - SipStackImpl stack = (SipStackImpl) up.getSipStack();  
166 - stack.stop();  
167 - Iterator listener = stack.getListeningPoints();  
168 - while (listener.hasNext()) {  
169 - stack.deleteListeningPoint((ListeningPoint) listener.next());  
170 - }  
171 - Iterator providers = stack.getSipProviders();  
172 - while (providers.hasNext()) {  
173 - stack.deleteSipProvider((SipProvider) providers.next());  
174 - }  
175 - VManageBootstrap.restart();  
176 - } catch (InterruptedException | ObjectInUseException e) {  
177 - throw new ControllerException(ErrorCode.ERROR100.getCode(), e.getMessage());  
178 - }  
179 - }); 161 +// taskExecutor.execute(()-> {
  162 +// try {
  163 +// Thread.sleep(3000);
  164 +// SipProvider up = (SipProvider) SpringBeanFactory.getBean("udpSipProvider");
  165 +// SipStackImpl stack = (SipStackImpl) up.getSipStack();
  166 +// stack.stop();
  167 +// Iterator listener = stack.getListeningPoints();
  168 +// while (listener.hasNext()) {
  169 +// stack.deleteListeningPoint((ListeningPoint) listener.next());
  170 +// }
  171 +// Iterator providers = stack.getSipProviders();
  172 +// while (providers.hasNext()) {
  173 +// stack.deleteSipProvider((SipProvider) providers.next());
  174 +// }
  175 +// VManageBootstrap.restart();
  176 +// } catch (InterruptedException | ObjectInUseException e) {
  177 +// throw new ControllerException(ErrorCode.ERROR100.getCode(), e.getMessage());
  178 +// }
  179 +// });
180 }; 180 };
181 181
182 @Operation(summary = "获取系统信息信息") 182 @Operation(summary = "获取系统信息信息")
src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java
@@ -6,22 +6,17 @@ import com.genersoft.iot.vmp.conf.exception.ControllerException; @@ -6,22 +6,17 @@ import com.genersoft.iot.vmp.conf.exception.ControllerException;
6 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 6 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
7 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; 7 import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
8 import com.genersoft.iot.vmp.service.IMediaServerService; 8 import com.genersoft.iot.vmp.service.IMediaServerService;
9 -import com.genersoft.iot.vmp.service.IMediaService;  
10 -import com.genersoft.iot.vmp.storager.IRedisCatchStorage;  
11 import com.genersoft.iot.vmp.service.IStreamProxyService; 9 import com.genersoft.iot.vmp.service.IStreamProxyService;
12 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; 10 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
13 -import com.genersoft.iot.vmp.vmanager.bean.WVPResult;  
14 import com.github.pagehelper.PageInfo; 11 import com.github.pagehelper.PageInfo;
15 import io.swagger.v3.oas.annotations.Operation; 12 import io.swagger.v3.oas.annotations.Operation;
16 import io.swagger.v3.oas.annotations.Parameter; 13 import io.swagger.v3.oas.annotations.Parameter;
17 -import io.swagger.v3.oas.annotations.Parameters;  
18 import io.swagger.v3.oas.annotations.tags.Tag; 14 import io.swagger.v3.oas.annotations.tags.Tag;
19 import org.slf4j.Logger; 15 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory; 16 import org.slf4j.LoggerFactory;
21 import org.springframework.beans.factory.annotation.Autowired; 17 import org.springframework.beans.factory.annotation.Autowired;
22 import org.springframework.stereotype.Controller; 18 import org.springframework.stereotype.Controller;
23 import org.springframework.util.ObjectUtils; 19 import org.springframework.util.ObjectUtils;
24 -import org.springframework.util.StringUtils;  
25 import org.springframework.web.bind.annotation.*; 20 import org.springframework.web.bind.annotation.*;
26 21
27 @SuppressWarnings("rawtypes") 22 @SuppressWarnings("rawtypes")
@@ -63,7 +58,7 @@ public class StreamProxyController { @@ -63,7 +58,7 @@ public class StreamProxyController {
63 }) 58 })
64 @PostMapping(value = "/save") 59 @PostMapping(value = "/save")
65 @ResponseBody 60 @ResponseBody
66 - public StreamInfo save(@RequestBody StreamProxyItem param){ 61 + public StreamInfo save(@RequestBody StreamProxyItem param){
67 logger.info("添加代理: " + JSONObject.toJSONString(param)); 62 logger.info("添加代理: " + JSONObject.toJSONString(param));
68 if (ObjectUtils.isEmpty(param.getMediaServerId())) { 63 if (ObjectUtils.isEmpty(param.getMediaServerId())) {
69 param.setMediaServerId("auto"); 64 param.setMediaServerId("auto");
src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java
@@ -112,7 +112,7 @@ public class ApiStreamController { @@ -112,7 +112,7 @@ public class ApiStreamController {
112 return resultDeferredResult; 112 return resultDeferredResult;
113 } 113 }
114 MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device); 114 MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device);
115 - PlayResult play = playService.play(newMediaServerItem, serial, code, (mediaServerItem, response)->{ 115 + playService.play(newMediaServerItem, serial, code, (mediaServerItem, response)->{
116 StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(serial, code); 116 StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(serial, code);
117 JSONObject result = new JSONObject(); 117 JSONObject result = new JSONObject();
118 result.put("StreamID", streamInfo.getStream()); 118 result.put("StreamID", streamInfo.getStream());
src/main/resources/all-application.yml
@@ -105,8 +105,6 @@ sip: @@ -105,8 +105,6 @@ sip:
105 id: 44010200492000000001 105 id: 44010200492000000001
106 # [可选] 默认设备认证密码,后续扩展使用设备单独密码, 移除密码将不进行校验 106 # [可选] 默认设备认证密码,后续扩展使用设备单独密码, 移除密码将不进行校验
107 password: admin123 107 password: admin123
108 - # [可选] 心跳超时时间, 建议设置为心跳周期的三倍  
109 - keepalive-timeout: 255  
110 # [可选] 国标级联注册失败,再次发起注册的时间间隔。 默认60秒 108 # [可选] 国标级联注册失败,再次发起注册的时间间隔。 默认60秒
111 register-time-interval: 60 109 register-time-interval: 60
112 # [可选] 云台控制速度 110 # [可选] 云台控制速度
@@ -188,6 +186,8 @@ user-settings: @@ -188,6 +186,8 @@ user-settings:
188 logInDatebase: true 186 logInDatebase: true
189 # 使用推流状态作为推流通道状态 187 # 使用推流状态作为推流通道状态
190 use-pushing-as-status: true 188 use-pushing-as-status: true
  189 + # 使用来源请求ip作为streamIp
  190 + use-source-ip-as-stream-ip: true
191 # 按需拉流, true:有人观看拉流,无人观看释放, false:拉起后不自动释放 191 # 按需拉流, true:有人观看拉流,无人观看释放, false:拉起后不自动释放
192 stream-on-demand: true 192 stream-on-demand: true
193 # 推流鉴权, 默认开启 193 # 推流鉴权, 默认开启
web_src/src/components/dialog/devicePlayer.vue
@@ -53,93 +53,93 @@ @@ -53,93 +53,93 @@
53 更多地址<i class="el-icon-arrow-down el-icon--right"></i> 53 更多地址<i class="el-icon-arrow-down el-icon--right"></i>
54 </el-button> 54 </el-button>
55 <el-dropdown-menu slot="dropdown" > 55 <el-dropdown-menu slot="dropdown" >
56 - <el-dropdown-item :command="streamInfo.flv"> 56 + <el-dropdown-item :command="streamInfo.flv.url">
57 <el-tag >FLV:</el-tag> 57 <el-tag >FLV:</el-tag>
58 - <span>{{ streamInfo.flv }}</span> 58 + <span>{{ streamInfo.flv.url }}</span>
59 </el-dropdown-item> 59 </el-dropdown-item>
60 - <el-dropdown-item :command="streamInfo.https_flv"> 60 + <el-dropdown-item :command="streamInfo.https_flv.url">
61 <el-tag >FLV(https):</el-tag> 61 <el-tag >FLV(https):</el-tag>
62 - <span>{{ streamInfo.https_flv }}</span> 62 + <span>{{ streamInfo.https_flv.url }}</span>
63 </el-dropdown-item> 63 </el-dropdown-item>
64 - <el-dropdown-item :command="streamInfo.ws_flv"> 64 + <el-dropdown-item :command="streamInfo.ws_flv.url">
65 <el-tag >FLV(ws):</el-tag> 65 <el-tag >FLV(ws):</el-tag>
66 - <span >{{ streamInfo.ws_flv }}</span> 66 + <span >{{ streamInfo.ws_flv.url }}</span>
67 </el-dropdown-item> 67 </el-dropdown-item>
68 - <el-dropdown-item :command="streamInfo.wss_flv"> 68 + <el-dropdown-item :command="streamInfo.wss_flv.url">
69 <el-tag >FLV(wss):</el-tag> 69 <el-tag >FLV(wss):</el-tag>
70 - <span>{{ streamInfo.wss_flv }}</span> 70 + <span>{{ streamInfo.wss_flv.url }}</span>
71 </el-dropdown-item> 71 </el-dropdown-item>
72 - <el-dropdown-item :command="streamInfo.fmp4"> 72 + <el-dropdown-item :command="streamInfo.fmp4.url">
73 <el-tag >FMP4:</el-tag> 73 <el-tag >FMP4:</el-tag>
74 - <span>{{ streamInfo.fmp4 }}</span> 74 + <span>{{ streamInfo.fmp4.url }}</span>
75 </el-dropdown-item> 75 </el-dropdown-item>
76 - <el-dropdown-item :command="streamInfo.https_fmp4"> 76 + <el-dropdown-item :command="streamInfo.https_fmp4.url">
77 <el-tag >FMP4(https):</el-tag> 77 <el-tag >FMP4(https):</el-tag>
78 - <span>{{ streamInfo.https_fmp4 }}</span> 78 + <span>{{ streamInfo.https_fmp4.url }}</span>
79 </el-dropdown-item> 79 </el-dropdown-item>
80 - <el-dropdown-item :command="streamInfo.ws_fmp4"> 80 + <el-dropdown-item :command="streamInfo.ws_fmp4.url">
81 <el-tag >FMP4(ws):</el-tag> 81 <el-tag >FMP4(ws):</el-tag>
82 - <span>{{ streamInfo.ws_fmp4 }}</span> 82 + <span>{{ streamInfo.ws_fmp4.url }}</span>
83 </el-dropdown-item> 83 </el-dropdown-item>
84 - <el-dropdown-item :command="streamInfo.wss_fmp4"> 84 + <el-dropdown-item :command="streamInfo.wss_fmp4.url">
85 <el-tag >FMP4(wss):</el-tag> 85 <el-tag >FMP4(wss):</el-tag>
86 - <span>{{ streamInfo.wss_fmp4 }}</span> 86 + <span>{{ streamInfo.wss_fmp4.url }}</span>
87 </el-dropdown-item> 87 </el-dropdown-item>
88 - <el-dropdown-item :command="streamInfo.hls"> 88 + <el-dropdown-item :command="streamInfo.hls.url">
89 <el-tag>HLS:</el-tag> 89 <el-tag>HLS:</el-tag>
90 - <span>{{ streamInfo.hls }}</span> 90 + <span>{{ streamInfo.hls.url }}</span>
91 </el-dropdown-item> 91 </el-dropdown-item>
92 - <el-dropdown-item :command="streamInfo.https_hls"> 92 + <el-dropdown-item :command="streamInfo.https_hls.url">
93 <el-tag >HLS(https):</el-tag> 93 <el-tag >HLS(https):</el-tag>
94 - <span>{{ streamInfo.https_hls }}</span> 94 + <span>{{ streamInfo.https_hls.url }}</span>
95 </el-dropdown-item> 95 </el-dropdown-item>
96 - <el-dropdown-item :command="streamInfo.ws_hls"> 96 + <el-dropdown-item :command="streamInfo.ws_hls.url">
97 <el-tag >HLS(ws):</el-tag> 97 <el-tag >HLS(ws):</el-tag>
98 - <span>{{ streamInfo.ws_hls }}</span> 98 + <span>{{ streamInfo.ws_hls.url }}</span>
99 </el-dropdown-item> 99 </el-dropdown-item>
100 - <el-dropdown-item :command="streamInfo.wss_hls"> 100 + <el-dropdown-item :command="streamInfo.wss_hls.url">
101 <el-tag >HLS(wss):</el-tag> 101 <el-tag >HLS(wss):</el-tag>
102 - <span>{{ streamInfo.wss_hls }}</span> 102 + <span>{{ streamInfo.wss_hls.url }}</span>
103 </el-dropdown-item> 103 </el-dropdown-item>
104 - <el-dropdown-item :command="streamInfo.ts"> 104 + <el-dropdown-item :command="streamInfo.ts.url">
105 <el-tag>TS:</el-tag> 105 <el-tag>TS:</el-tag>
106 - <span>{{ streamInfo.ts }}</span> 106 + <span>{{ streamInfo.ts.url }}</span>
107 </el-dropdown-item> 107 </el-dropdown-item>
108 - <el-dropdown-item :command="streamInfo.https_ts"> 108 + <el-dropdown-item :command="streamInfo.https_ts.url">
109 <el-tag>TS(https):</el-tag> 109 <el-tag>TS(https):</el-tag>
110 - <span>{{ streamInfo.https_ts }}</span> 110 + <span>{{ streamInfo.https_ts.url }}</span>
111 </el-dropdown-item> 111 </el-dropdown-item>
112 - <el-dropdown-item :command="streamInfo.ws_ts"> 112 + <el-dropdown-item :command="streamInfo.ws_ts.url">
113 <el-tag>TS(ws):</el-tag> 113 <el-tag>TS(ws):</el-tag>
114 - <span>{{ streamInfo.ws_ts }}</span> 114 + <span>{{ streamInfo.ws_ts.url }}</span>
115 </el-dropdown-item> 115 </el-dropdown-item>
116 - <el-dropdown-item :command="streamInfo.wss_ts"> 116 + <el-dropdown-item :command="streamInfo.wss_ts.url">
117 <el-tag>TS(wss):</el-tag> 117 <el-tag>TS(wss):</el-tag>
118 - <span>{{ streamInfo.wss_ts }}</span> 118 + <span>{{ streamInfo.wss_ts.url }}</span>
119 </el-dropdown-item> 119 </el-dropdown-item>
120 - <el-dropdown-item :command="streamInfo.rtc"> 120 + <el-dropdown-item :command="streamInfo.rtc.url">
121 <el-tag >RTC:</el-tag> 121 <el-tag >RTC:</el-tag>
122 - <span>{{ streamInfo.rtc }}</span> 122 + <span>{{ streamInfo.rtc.url }}</span>
123 </el-dropdown-item> 123 </el-dropdown-item>
124 - <el-dropdown-item :command="streamInfo.rtcs"> 124 + <el-dropdown-item :command="streamInfo.rtcs.url">
125 <el-tag >RTCS:</el-tag> 125 <el-tag >RTCS:</el-tag>
126 <span>{{ streamInfo.rtcs }}</span> 126 <span>{{ streamInfo.rtcs }}</span>
127 </el-dropdown-item> 127 </el-dropdown-item>
128 - <el-dropdown-item :command="streamInfo.rtmp"> 128 + <el-dropdown-item :command="streamInfo.rtmp.url">
129 <el-tag >RTMP:</el-tag> 129 <el-tag >RTMP:</el-tag>
130 - <span>{{ streamInfo.rtmp }}</span> 130 + <span>{{ streamInfo.rtmp.url }}</span>
131 </el-dropdown-item> 131 </el-dropdown-item>
132 - <el-dropdown-item :command="streamInfo.rtmps"> 132 + <el-dropdown-item :command="streamInfo.rtmps.url">
133 <el-tag >RTMPS:</el-tag> 133 <el-tag >RTMPS:</el-tag>
134 - <span>{{ streamInfo.rtmps }}</span> 134 + <span>{{ streamInfo.rtmps.url }}</span>
135 </el-dropdown-item> 135 </el-dropdown-item>
136 - <el-dropdown-item :command="streamInfo.rtsp"> 136 + <el-dropdown-item :command="streamInfo.rtsp.url">
137 <el-tag >RTSP:</el-tag> 137 <el-tag >RTSP:</el-tag>
138 - <span>{{ streamInfo.rtsp }}</span> 138 + <span>{{ streamInfo.rtsp.url }}</span>
139 </el-dropdown-item> 139 </el-dropdown-item>
140 - <el-dropdown-item :command="streamInfo.rtsps"> 140 + <el-dropdown-item :command="streamInfo.rtsps.url">
141 <el-tag >RTSPS:</el-tag> 141 <el-tag >RTSPS:</el-tag>
142 - <span>{{ streamInfo.rtsps }}</span> 142 + <span>{{ streamInfo.rtsps.url }}</span>
143 </el-dropdown-item> 143 </el-dropdown-item>
144 </el-dropdown-menu> 144 </el-dropdown-menu>
145 </el-dropdown> 145 </el-dropdown>
@@ -450,9 +450,9 @@ export default { @@ -450,9 +450,9 @@ export default {
450 getUrlByStreamInfo(){ 450 getUrlByStreamInfo(){
451 console.log(this.streamInfo) 451 console.log(this.streamInfo)
452 if (location.protocol === "https:") { 452 if (location.protocol === "https:") {
453 - this.videoUrl = this.streamInfo[this.player[this.activePlayer][1]] 453 + this.videoUrl = this.streamInfo[this.player[this.activePlayer][1]].url
454 }else { 454 }else {
455 - this.videoUrl = this.streamInfo[this.player[this.activePlayer][0]] 455 + this.videoUrl = this.streamInfo[this.player[this.activePlayer][0]].url
456 } 456 }
457 return this.videoUrl; 457 return this.videoUrl;
458 458
web_src/src/components/live.vue
@@ -140,9 +140,9 @@ export default { @@ -140,9 +140,9 @@ export default {
140 if (res.data.code === 0 && res.data.data) { 140 if (res.data.code === 0 && res.data.data) {
141 let videoUrl; 141 let videoUrl;
142 if (location.protocol === "https:") { 142 if (location.protocol === "https:") {
143 - videoUrl = res.data.data.wss_flv; 143 + videoUrl = res.data.data.wss_flv.url;
144 } else { 144 } else {
145 - videoUrl = res.data.data.ws_flv; 145 + videoUrl = res.data.data.ws_flv.url;
146 } 146 }
147 itemData.playUrl = videoUrl; 147 itemData.playUrl = videoUrl;
148 that.setPlayUrl(videoUrl, idxTmp); 148 that.setPlayUrl(videoUrl, idxTmp);