Commit a53dce38c2f58c0bfd37203e46dc57aa56025f45
Committed by
GitHub
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<RecordEndEven | @@ -22,13 +20,12 @@ public class RecordEndEventListener implements ApplicationListener<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<RecordEndEven | @@ -38,7 +35,6 @@ public class RecordEndEventListener implements ApplicationListener<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<T> implements RedisSerializer<T> { | @@ -31,7 +29,7 @@ public class FastJsonRedisSerializer<T> implements RedisSerializer<T> { | ||
| 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<T> implements RedisSerializer<T> { | @@ -42,4 +40,6 @@ public class FastJsonRedisSerializer<T> implements RedisSerializer<T> { | ||
| 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
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<T> { | @@ -63,4 +63,9 @@ public class WVPResult<T> { | ||
| 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); |