Commit f223aad70516049577c261d5e6cd876abed07cb4

Authored by 648540858
2 parents f6320c7d a53dce38

Merge branch 'wvp-28181-2.0'

# Conflicts:
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/SubscribeRequestProcessor.java
#	src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/BroadcastResponseMessageHandler.java
#	src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
#	src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
#	src/main/java/com/genersoft/iot/vmp/media/zlm/dto/HookSubscribeFactory.java
#	src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
#	src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
#	src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
#	src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
#	src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
#	web_src/src/components/dialog/devicePlayer.vue
Showing 45 changed files with 1512 additions and 1040 deletions

Too many changes to show.

To preserve performance only 45 of 188 files are displayed.

README.md
@@ -101,6 +101,7 @@ https://gitee.com/pan648540858/wvp-GB28181-pro.git @@ -101,6 +101,7 @@ https://gitee.com/pan648540858/wvp-GB28181-pro.git
101 - [X] 敶恥 101 - [X] 敶恥
102 - [X] 敶 102 - [X] 敶
103 - [X] GPS霈a嚗瘚 103 - [X] GPS霈a嚗瘚
  104 +- [X] 瘛餃挽憭挽憭挽蝵桀
104 - [X] 瘛餃TSP閫 105 - [X] 瘛餃TSP閫
105 - [X] 瘛餃 106 - [X] 瘛餃
106 - [X] 瘛餃TMP閫 107 - [X] 瘛餃TMP閫
@@ -155,7 +156,6 @@ QQ蝘縑銝銝, 蝎曉.甈Z之摰嗅蝢日悄霈.閫★撖嫣 @@ -155,7 +156,6 @@ QQ蝘縑銝銝, 蝎曉.甈Z之摰嗅蝢日悄霈.閫★撖嫣
155 156
156 # 悅 157 # 悅
157 憿寧誨蝙摰賣IT悅嚗靽縑銝隞亥摨鈭★ 雿憿寧銋蝣蝙鈭鈭隞皞誨銝窈銵隞嚗 鈭蝙憿寧漣熒噩蛹銝璁憿寧嚗窈銵 雿輻憿寧隞嚗砲悅銝剖銵冽憿寧靘洵銝摨悅 158 憿寧誨蝙摰賣IT悅嚗靽縑銝隞亥摨鈭★ 雿憿寧銋蝣蝙鈭鈭隞皞誨銝窈銵隞嚗 鈭蝙憿寧漣熒噩蛹銝璁憿寧嚗窈銵 雿輻憿寧隞嚗砲悅銝剖銵冽憿寧靘洵銝摨悅
158 -  
159 # 靚 159 # 靚
160 陝雿憭(https://github.com/xia-chu) 皞獢,撟嗅撘葉蝏葬 160 陝雿憭(https://github.com/xia-chu) 皞獢,撟嗅撘葉蝏葬
161 陝雿dexter langhuihui](https://github.com/langhuihui) 撘皞末EB 161 陝雿dexter langhuihui](https://github.com/langhuihui) 撘皞末EB
@@ -165,7 +165,7 @@ QQ蝘縑銝銝, 蝎曉.甈Z之摰嗅蝢日悄霈.閫★撖嫣 @@ -165,7 +165,7 @@ QQ蝘縑銝銝, 蝎曉.甈Z之摰嗅蝢日悄霈.閫★撖嫣
165 [hotcoffie](https://github.com/hotcoffie) [xiaomu](https://github.com/nikmu) [TristingChen](https://github.com/TristingChen) 165 [hotcoffie](https://github.com/hotcoffie) [xiaomu](https://github.com/nikmu) [TristingChen](https://github.com/TristingChen)
166 [chenparty](https://github.com/chenparty) [Hotleave](https://github.com/hotleave) [ydwxb](https://github.com/ydwxb) 166 [chenparty](https://github.com/chenparty) [Hotleave](https://github.com/hotleave) [ydwxb](https://github.com/ydwxb)
167 [ydpd](https://github.com/ydpd) [szy833](https://github.com/szy833) [ydwxb](https://github.com/ydwxb) [Albertzhu666](https://github.com/Albertzhu666) 167 [ydpd](https://github.com/ydpd) [szy833](https://github.com/szy833) [ydwxb](https://github.com/ydwxb) [Albertzhu666](https://github.com/Albertzhu666)
168 -[mk1990](https://github.com/mk1990) 168 +[mk1990](https://github.com/mk1990) [SaltFish001](https://github.com/SaltFish001)
169 169
170 ps: 葵摰鈭之雿穿洽餈之雿祈頂溶 170 ps: 葵摰鈭之雿穿洽餈之雿祈頂溶
171 171
doc/_content/qa/play_error.md
1 <!-- 点播错误 --> 1 <!-- 点播错误 -->
2 # 点播错误 2 # 点播错误
3 -排查点播错误你首先要清[点播的基本流程](_content/theory/play.md),一般的流程如下: 3 +排查点播错误你首先要清[点播的基本流程](_content/theory/play.md),一般的流程如下:
4 ```plantuml 4 ```plantuml
5 @startuml 5 @startuml
6 "WEB用户" -> "WVP-PRO": 1. 发起点播请求 6 "WEB用户" -> "WVP-PRO": 1. 发起点播请求
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 11
12 <groupId>com.genersoft</groupId> 12 <groupId>com.genersoft</groupId>
13 <artifactId>wvp-pro</artifactId> 13 <artifactId>wvp-pro</artifactId>
14 - <version>2.3.2</version> 14 + <version>2.6.6</version>
15 <name>web video platform</name> 15 <name>web video platform</name>
16 <description>国标28181视频平台</description> 16 <description>国标28181视频平台</description>
17 17
@@ -153,13 +153,17 @@ @@ -153,13 +153,17 @@
153 <version>2.1.3</version> 153 <version>2.1.3</version>
154 </dependency> 154 </dependency>
155 155
156 - <!-- json解析库fastjson --> 156 + <!-- json解析库fastjson2 -->
157 <dependency> 157 <dependency>
158 - <groupId>com.alibaba</groupId>  
159 - <artifactId>fastjson</artifactId>  
160 - <version>1.2.83</version> 158 + <groupId>com.alibaba.fastjson2</groupId>
  159 + <artifactId>fastjson2</artifactId>
  160 + <version>2.0.17</version>
  161 + </dependency>
  162 + <dependency>
  163 + <groupId>com.alibaba.fastjson2</groupId>
  164 + <artifactId>fastjson2-extension</artifactId>
  165 + <version>2.0.17</version>
161 </dependency> 166 </dependency>
162 -  
163 167
164 <!-- okhttp --> 168 <!-- okhttp -->
165 <dependency> 169 <dependency>
sql/mysql.sql
1 --- MySQL dump 10.13 Distrib 8.0.29, for Linux (x86_64) 1 +-- MySQL dump 10.13 Distrib 8.0.30, for Linux (x86_64)
2 -- 2 --
3 --- Host: 127.0.0.1 Database: 242wvp 3 +-- Host: 127.0.0.1 Database: wvp
4 -- ------------------------------------------------------ 4 -- ------------------------------------------------------
5 --- Server version 8.0.29-0ubuntu0.22.04.3 5 +-- Server version 8.0.30
6 6
7 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; 7 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
8 /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; 8 /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
@@ -34,13 +34,13 @@ CREATE TABLE `device` ( @@ -34,13 +34,13 @@ CREATE TABLE `device` (
34 `online` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, 34 `online` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
35 `registerTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, 35 `registerTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
36 `keepaliveTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, 36 `keepaliveTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
37 - `ip` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, 37 + `ip` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
38 `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, 38 `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
39 `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, 39 `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
40 - `port` int NOT NULL,  
41 - `expires` int NOT NULL,  
42 - `subscribeCycleForCatalog` int NOT NULL,  
43 - `hostAddress` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, 40 + `port` int DEFAULT NULL,
  41 + `expires` int DEFAULT NULL,
  42 + `subscribeCycleForCatalog` int DEFAULT NULL,
  43 + `hostAddress` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
44 `charset` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, 44 `charset` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
45 `subscribeCycleForMobilePosition` int DEFAULT NULL, 45 `subscribeCycleForMobilePosition` int DEFAULT NULL,
46 `mobilePositionSubmissionInterval` int DEFAULT '5', 46 `mobilePositionSubmissionInterval` int DEFAULT '5',
@@ -49,9 +49,11 @@ CREATE TABLE `device` ( @@ -49,9 +49,11 @@ CREATE TABLE `device` (
49 `geoCoordSys` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, 49 `geoCoordSys` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
50 `treeType` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, 50 `treeType` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
51 `mediaServerId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'auto', 51 `mediaServerId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'auto',
  52 + `custom_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  53 + `password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
52 PRIMARY KEY (`id`), 54 PRIMARY KEY (`id`),
53 UNIQUE KEY `device_deviceId_uindex` (`deviceId`) 55 UNIQUE KEY `device_deviceId_uindex` (`deviceId`)
54 -) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; 56 +) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
55 /*!40101 SET character_set_client = @saved_cs_client */; 57 /*!40101 SET character_set_client = @saved_cs_client */;
56 58
57 -- 59 --
@@ -143,7 +145,7 @@ CREATE TABLE `device_channel` ( @@ -143,7 +145,7 @@ CREATE TABLE `device_channel` (
143 PRIMARY KEY (`id`), 145 PRIMARY KEY (`id`),
144 UNIQUE KEY `device_channel_id_uindex` (`id`), 146 UNIQUE KEY `device_channel_id_uindex` (`id`),
145 UNIQUE KEY `device_channel_pk` (`channelId`,`deviceId`) 147 UNIQUE KEY `device_channel_pk` (`channelId`,`deviceId`)
146 -) ENGINE=InnoDB AUTO_INCREMENT=60163 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; 148 +) ENGINE=InnoDB AUTO_INCREMENT=60301 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
147 /*!40101 SET character_set_client = @saved_cs_client */; 149 /*!40101 SET character_set_client = @saved_cs_client */;
148 150
149 -- 151 --
@@ -213,7 +215,7 @@ CREATE TABLE `gb_stream` ( @@ -213,7 +215,7 @@ CREATE TABLE `gb_stream` (
213 PRIMARY KEY (`gbStreamId`) USING BTREE, 215 PRIMARY KEY (`gbStreamId`) USING BTREE,
214 UNIQUE KEY `app` (`app`,`stream`) USING BTREE, 216 UNIQUE KEY `app` (`app`,`stream`) USING BTREE,
215 UNIQUE KEY `gbId` (`gbId`) USING BTREE 217 UNIQUE KEY `gbId` (`gbId`) USING BTREE
216 -) ENGINE=InnoDB AUTO_INCREMENT=301057 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 218 +) ENGINE=InnoDB AUTO_INCREMENT=301059 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
217 /*!40101 SET character_set_client = @saved_cs_client */; 219 /*!40101 SET character_set_client = @saved_cs_client */;
218 220
219 -- 221 --
@@ -243,7 +245,7 @@ CREATE TABLE `log` ( @@ -243,7 +245,7 @@ CREATE TABLE `log` (
243 `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, 245 `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
244 `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, 246 `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
245 PRIMARY KEY (`id`) USING BTREE 247 PRIMARY KEY (`id`) USING BTREE
246 -) ENGINE=InnoDB AUTO_INCREMENT=727574 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 248 +) ENGINE=InnoDB AUTO_INCREMENT=733627 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
247 /*!40101 SET character_set_client = @saved_cs_client */; 249 /*!40101 SET character_set_client = @saved_cs_client */;
248 250
249 -- 251 --
@@ -279,7 +281,6 @@ CREATE TABLE `media_server` ( @@ -279,7 +281,6 @@ CREATE TABLE `media_server` (
279 `secret` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, 281 `secret` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
280 `rtpEnable` int NOT NULL, 282 `rtpEnable` int NOT NULL,
281 `rtpPortRange` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, 283 `rtpPortRange` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
282 - `sendRtpPortRange` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,  
283 `recordAssistPort` int NOT NULL, 284 `recordAssistPort` int NOT NULL,
284 `defaultServer` int NOT NULL, 285 `defaultServer` int NOT NULL,
285 `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, 286 `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
@@ -336,7 +337,7 @@ CREATE TABLE `parent_platform` ( @@ -336,7 +337,7 @@ CREATE TABLE `parent_platform` (
336 PRIMARY KEY (`id`), 337 PRIMARY KEY (`id`),
337 UNIQUE KEY `parent_platform_id_uindex` (`id`), 338 UNIQUE KEY `parent_platform_id_uindex` (`id`),
338 UNIQUE KEY `parent_platform_pk` (`serverGBId`) 339 UNIQUE KEY `parent_platform_pk` (`serverGBId`)
339 -) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 340 +) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
340 /*!40101 SET character_set_client = @saved_cs_client */; 341 /*!40101 SET character_set_client = @saved_cs_client */;
341 342
342 -- 343 --
@@ -388,7 +389,7 @@ CREATE TABLE `platform_gb_channel` ( @@ -388,7 +389,7 @@ CREATE TABLE `platform_gb_channel` (
388 `catalogId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, 389 `catalogId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
389 `deviceChannelId` int NOT NULL, 390 `deviceChannelId` int NOT NULL,
390 PRIMARY KEY (`id`) 391 PRIMARY KEY (`id`)
391 -) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; 392 +) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
392 /*!40101 SET character_set_client = @saved_cs_client */; 393 /*!40101 SET character_set_client = @saved_cs_client */;
393 394
394 -- 395 --
@@ -414,7 +415,7 @@ CREATE TABLE `platform_gb_stream` ( @@ -414,7 +415,7 @@ CREATE TABLE `platform_gb_stream` (
414 `id` int NOT NULL AUTO_INCREMENT, 415 `id` int NOT NULL AUTO_INCREMENT,
415 PRIMARY KEY (`id`), 416 PRIMARY KEY (`id`),
416 UNIQUE KEY `platform_gb_stream_pk` (`platformId`,`catalogId`,`gbStreamId`) 417 UNIQUE KEY `platform_gb_stream_pk` (`platformId`,`catalogId`,`gbStreamId`)
417 -) ENGINE=InnoDB AUTO_INCREMENT=301759 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 418 +) ENGINE=InnoDB AUTO_INCREMENT=301766 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
418 /*!40101 SET character_set_client = @saved_cs_client */; 419 /*!40101 SET character_set_client = @saved_cs_client */;
419 420
420 -- 421 --
@@ -453,9 +454,10 @@ CREATE TABLE `stream_proxy` ( @@ -453,9 +454,10 @@ CREATE TABLE `stream_proxy` (
453 `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, 454 `createTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
454 `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, 455 `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
455 `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, 456 `updateTime` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  457 + `enable_disable_none_reader` bit(1) DEFAULT NULL,
456 PRIMARY KEY (`id`), 458 PRIMARY KEY (`id`),
457 UNIQUE KEY `stream_proxy_pk` (`app`,`stream`) 459 UNIQUE KEY `stream_proxy_pk` (`app`,`stream`)
458 -) ENGINE=InnoDB AUTO_INCREMENT=545 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; 460 +) ENGINE=InnoDB AUTO_INCREMENT=548 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
459 /*!40101 SET character_set_client = @saved_cs_client */; 461 /*!40101 SET character_set_client = @saved_cs_client */;
460 462
461 -- 463 --
@@ -492,7 +494,7 @@ CREATE TABLE `stream_push` ( @@ -492,7 +494,7 @@ CREATE TABLE `stream_push` (
492 `self` int DEFAULT NULL, 494 `self` int DEFAULT NULL,
493 PRIMARY KEY (`id`), 495 PRIMARY KEY (`id`),
494 UNIQUE KEY `stream_push_pk` (`app`,`stream`) 496 UNIQUE KEY `stream_push_pk` (`app`,`stream`)
495 -) ENGINE=InnoDB AUTO_INCREMENT=310546 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; 497 +) ENGINE=InnoDB AUTO_INCREMENT=310558 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
496 /*!40101 SET character_set_client = @saved_cs_client */; 498 /*!40101 SET character_set_client = @saved_cs_client */;
497 499
498 -- 500 --
@@ -521,7 +523,7 @@ CREATE TABLE `user` ( @@ -521,7 +523,7 @@ CREATE TABLE `user` (
521 `pushKey` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, 523 `pushKey` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
522 PRIMARY KEY (`id`) USING BTREE, 524 PRIMARY KEY (`id`) USING BTREE,
523 UNIQUE KEY `user_username_uindex` (`username`) USING BTREE 525 UNIQUE KEY `user_username_uindex` (`username`) USING BTREE
524 -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC; 526 +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
525 /*!40101 SET character_set_client = @saved_cs_client */; 527 /*!40101 SET character_set_client = @saved_cs_client */;
526 528
527 -- 529 --
@@ -570,4 +572,4 @@ UNLOCK TABLES; @@ -570,4 +572,4 @@ UNLOCK TABLES;
570 /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 572 /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
571 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 573 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
572 574
573 --- Dump completed on 2022-09-08 16:46:27 575 +-- Dump completed on 2022-10-18 17:00:02
sql/update.sql
1 alter table media_server 1 alter table media_server
2 drop column streamNoneReaderDelayMS; 2 drop column streamNoneReaderDelayMS;
3 3
  4 +alter table media_server
  5 + drop column sendRtpPortRange;
  6 +
4 alter table stream_proxy 7 alter table stream_proxy
5 add enable_disable_none_reader bit(1) default null; 8 add enable_disable_none_reader bit(1) default null;
  9 +
  10 +alter table device
  11 + add mediaServerId varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'auto';
  12 +
  13 +alter table device
  14 + add custom_name varchar(255) default null;
  15 +
  16 +alter table device
  17 + add sdpIp varchar(50) default null;
  18 +
  19 +alter table device
  20 + add localIp varchar(50) default null;
  21 +
  22 +alter table device
  23 + add password varchar(255) default null;
  24 +
  25 +alter table device
  26 + modify ip varchar(50) null;
  27 +
  28 +alter table device
  29 + modify port int null;
  30 +
  31 +alter table device
  32 + modify expires int null;
  33 +
  34 +alter table device
  35 + modify subscribeCycleForCatalog int null;
  36 +
  37 +alter table device
  38 + modify hostAddress varchar(50) null;
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/common/SystemAllInfo.java 0 → 100644
  1 +package com.genersoft.iot.vmp.common;
  2 +
  3 +import java.util.List;
  4 +
  5 +public class SystemAllInfo {
  6 +
  7 + private List<Object> cpu;
  8 + private List<Object> mem;
  9 + private List<Object> net;
  10 +
  11 + private long netTotal;
  12 +
  13 + private Object disk;
  14 +
  15 + public List<Object> getCpu() {
  16 + return cpu;
  17 + }
  18 +
  19 + public void setCpu(List<Object> cpu) {
  20 + this.cpu = cpu;
  21 + }
  22 +
  23 + public List<Object> getMem() {
  24 + return mem;
  25 + }
  26 +
  27 + public void setMem(List<Object> mem) {
  28 + this.mem = mem;
  29 + }
  30 +
  31 + public List<Object> getNet() {
  32 + return net;
  33 + }
  34 +
  35 + public void setNet(List<Object> net) {
  36 + this.net = net;
  37 + }
  38 +
  39 + public Object getDisk() {
  40 + return disk;
  41 + }
  42 +
  43 + public void setDisk(Object disk) {
  44 + this.disk = disk;
  45 + }
  46 +
  47 + public long getNetTotal() {
  48 + return netTotal;
  49 + }
  50 +
  51 + public void setNetTotal(long netTotal) {
  52 + this.netTotal = netTotal;
  53 + }
  54 +}
src/main/java/com/genersoft/iot/vmp/common/SystemInfoDto.java deleted 100644 → 0
1 -package com.genersoft.iot.vmp.common;  
2 -  
3 -public class SystemInfoDto<T> {  
4 - private String time;  
5 - private T data;  
6 -  
7 - public String getTime() {  
8 - return time;  
9 - }  
10 -  
11 - public void setTime(String time) {  
12 - this.time = time;  
13 - }  
14 -  
15 - public T getData() {  
16 - return data;  
17 - }  
18 -  
19 - public void setData(T data) {  
20 - this.data = data;  
21 - }  
22 -}  
src/main/java/com/genersoft/iot/vmp/common/VersionPo.java
1 package com.genersoft.iot.vmp.common; 1 package com.genersoft.iot.vmp.common;
2 2
3 -import com.alibaba.fastjson.annotation.JSONField; 3 +import com.alibaba.fastjson2.annotation.JSONField;
4 4
5 public class VersionPo { 5 public class VersionPo {
6 /** 6 /**
7 * git的全版本号 7 * git的全版本号
8 */ 8 */
9 - @JSONField(name="GIT-Revision") 9 + @JSONField(name="GIT_Revision")
10 private String GIT_Revision; 10 private String GIT_Revision;
11 /** 11 /**
12 * maven版本 12 * maven版本
13 */ 13 */
14 - @JSONField(name = "Create-By") 14 + @JSONField(name = "Create_By")
15 private String Create_By; 15 private String Create_By;
16 /** 16 /**
17 * git的分支 17 * git的分支
18 */ 18 */
19 - @JSONField(name = "GIT-BRANCH") 19 + @JSONField(name = "GIT_BRANCH")
20 private String GIT_BRANCH; 20 private String GIT_BRANCH;
21 /** 21 /**
22 * git的url 22 * git的url
23 */ 23 */
24 - @JSONField(name = "GIT-URL") 24 + @JSONField(name = "GIT_URL")
25 private String GIT_URL; 25 private String GIT_URL;
26 /** 26 /**
27 * 构建日期 27 * 构建日期
28 */ 28 */
29 - @JSONField(name = "BUILD-DATE") 29 + @JSONField(name = "BUILD_DATE")
30 private String BUILD_DATE; 30 private String BUILD_DATE;
31 /** 31 /**
  32 + * 构建日期
  33 + */
  34 + @JSONField(name = "GIT_DATE")
  35 + private String GIT_DATE;
  36 + /**
32 * 项目名称 配合pom使用 37 * 项目名称 配合pom使用
33 */ 38 */
34 @JSONField(name = "artifactId") 39 @JSONField(name = "artifactId")
@@ -36,7 +41,7 @@ public class VersionPo { @@ -36,7 +41,7 @@ public class VersionPo {
36 /** 41 /**
37 * git局部版本号 42 * git局部版本号
38 */ 43 */
39 - @JSONField(name = "GIT-Revision-SHORT") 44 + @JSONField(name = "GIT_Revision_SHORT")
40 private String GIT_Revision_SHORT; 45 private String GIT_Revision_SHORT;
41 /** 46 /**
42 * 项目的版本如2.0.1.0 配合pom使用 47 * 项目的版本如2.0.1.0 配合pom使用
@@ -133,4 +138,12 @@ public class VersionPo { @@ -133,4 +138,12 @@ public class VersionPo {
133 public String getBuild_Jdk() { 138 public String getBuild_Jdk() {
134 return Build_Jdk; 139 return Build_Jdk;
135 } 140 }
  141 +
  142 + public String getGIT_DATE() {
  143 + return GIT_DATE;
  144 + }
  145 +
  146 + public void setGIT_DATE(String GIT_DATE) {
  147 + this.GIT_DATE = GIT_DATE;
  148 + }
136 } 149 }
src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
@@ -27,11 +27,9 @@ public class VideoManagerConstants { @@ -27,11 +27,9 @@ public class VideoManagerConstants {
27 27
28 public static final String KEEPLIVEKEY_PREFIX = "VMP_KEEPALIVE_"; 28 public static final String KEEPLIVEKEY_PREFIX = "VMP_KEEPALIVE_";
29 29
30 - // 此处多了一个_,暂不修改 30 + // TODO 此处多了一个_,暂不修改
31 public static final String PLAYER_PREFIX = "VMP_PLAYER_"; 31 public static final String PLAYER_PREFIX = "VMP_PLAYER_";
32 public static final String PLAY_BLACK_PREFIX = "VMP_PLAYBACK_"; 32 public static final String PLAY_BLACK_PREFIX = "VMP_PLAYBACK_";
33 - public static final String PLAY_INFO_PREFIX = "VMP_PLAY_INFO_";  
34 -  
35 public static final String DOWNLOAD_PREFIX = "VMP_DOWNLOAD_"; 33 public static final String DOWNLOAD_PREFIX = "VMP_DOWNLOAD_";
36 34
37 public static final String PLATFORM_KEEPALIVE_PREFIX = "VMP_PLATFORM_KEEPALIVE_"; 35 public static final String PLATFORM_KEEPALIVE_PREFIX = "VMP_PLATFORM_KEEPALIVE_";
@@ -70,6 +68,8 @@ public class VideoManagerConstants { @@ -70,6 +68,8 @@ public class VideoManagerConstants {
70 68
71 public static final String SYSTEM_INFO_NET_PREFIX = "VMP_SYSTEM_INFO_NET_"; 69 public static final String SYSTEM_INFO_NET_PREFIX = "VMP_SYSTEM_INFO_NET_";
72 70
  71 + public static final String SYSTEM_INFO_DISK_PREFIX = "VMP_SYSTEM_INFO_DISK_";
  72 +
73 73
74 74
75 75
src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java
1 package com.genersoft.iot.vmp.conf; 1 package com.genersoft.iot.vmp.conf;
2 2
3 -import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask;  
4 import org.slf4j.Logger; 3 import org.slf4j.Logger;
5 import org.slf4j.LoggerFactory; 4 import org.slf4j.LoggerFactory;
6 -import org.springframework.beans.factory.annotation.Autowired;  
7 -import org.springframework.context.annotation.Bean;  
8 import org.springframework.scheduling.annotation.Scheduled; 5 import org.springframework.scheduling.annotation.Scheduled;
9 import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; 6 import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
10 import org.springframework.stereotype.Component; 7 import org.springframework.stereotype.Component;
@@ -101,12 +98,14 @@ public class DynamicTask { @@ -101,12 +98,14 @@ public class DynamicTask {
101 } 98 }
102 } 99 }
103 100
104 - public void stop(String key) {  
105 - if (futureMap.get(key) != null && !futureMap.get(key).isCancelled()) {  
106 - futureMap.get(key).cancel(false); 101 + public boolean stop(String key) {
  102 + boolean result = false;
  103 + if (futureMap.get(key) != null && !futureMap.get(key).isCancelled() && !futureMap.get(key).isDone()) {
  104 + result = futureMap.get(key).cancel(false);
107 futureMap.remove(key); 105 futureMap.remove(key);
108 runnableMap.remove(key); 106 runnableMap.remove(key);
109 } 107 }
  108 + return result;
110 } 109 }
111 110
112 public boolean contains(String key) { 111 public boolean contains(String key) {
@@ -128,11 +127,15 @@ public class DynamicTask { @@ -128,11 +127,15 @@ public class DynamicTask {
128 public void execute(){ 127 public void execute(){
129 if (futureMap.size() > 0) { 128 if (futureMap.size() > 0) {
130 for (String key : futureMap.keySet()) { 129 for (String key : futureMap.keySet()) {
131 - if (futureMap.get(key).isDone()) { 130 + if (futureMap.get(key).isDone() || futureMap.get(key).isCancelled()) {
132 futureMap.remove(key); 131 futureMap.remove(key);
133 runnableMap.remove(key); 132 runnableMap.remove(key);
134 } 133 }
135 } 134 }
136 } 135 }
137 } 136 }
  137 +
  138 + public boolean isAlive(String key) {
  139 + return futureMap.get(key) != null && !futureMap.get(key).isDone() && !futureMap.get(key).isCancelled();
  140 + }
138 } 141 }
src/main/java/com/genersoft/iot/vmp/conf/GlobalResponseAdvice.java
1 package com.genersoft.iot.vmp.conf; 1 package com.genersoft.iot.vmp.conf;
2 2
3 -import com.alibaba.fastjson.JSON;  
4 -import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; 3 +import com.alibaba.fastjson2.JSON;
  4 +import com.alibaba.fastjson2.support.spring.http.converter.FastJsonHttpMessageConverter;
5 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; 5 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
6 import com.genersoft.iot.vmp.vmanager.bean.WVPResult; 6 import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
7 import org.jetbrains.annotations.NotNull; 7 import org.jetbrains.annotations.NotNull;
src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java
@@ -2,13 +2,11 @@ package com.genersoft.iot.vmp.conf; @@ -2,13 +2,11 @@ package com.genersoft.iot.vmp.conf;
2 2
3 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 3 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
4 import com.genersoft.iot.vmp.utils.DateUtil; 4 import com.genersoft.iot.vmp.utils.DateUtil;
5 -import com.genersoft.iot.vmp.vmanager.gb28181.device.DeviceQuery;  
6 import org.slf4j.Logger; 5 import org.slf4j.Logger;
7 import org.slf4j.LoggerFactory; 6 import org.slf4j.LoggerFactory;
8 import org.springframework.beans.factory.annotation.Value; 7 import org.springframework.beans.factory.annotation.Value;
9 import org.springframework.context.annotation.Configuration; 8 import org.springframework.context.annotation.Configuration;
10 import org.springframework.util.ObjectUtils; 9 import org.springframework.util.ObjectUtils;
11 -import org.springframework.util.StringUtils;  
12 10
13 import java.net.InetAddress; 11 import java.net.InetAddress;
14 import java.net.UnknownHostException; 12 import java.net.UnknownHostException;
@@ -27,7 +25,7 @@ public class MediaConfig{ @@ -27,7 +25,7 @@ public class MediaConfig{
27 @Value("${media.ip}") 25 @Value("${media.ip}")
28 private String ip; 26 private String ip;
29 27
30 - @Value("${media.hook-ip:${sip.ip}}") 28 + @Value("${media.hook-ip:}")
31 private String hookIp; 29 private String hookIp;
32 30
33 @Value("${sip.ip}") 31 @Value("${sip.ip}")
@@ -75,10 +73,6 @@ public class MediaConfig{ @@ -75,10 +73,6 @@ public class MediaConfig{
75 @Value("${media.rtp.port-range}") 73 @Value("${media.rtp.port-range}")
76 private String rtpPortRange; 74 private String rtpPortRange;
77 75
78 -  
79 - @Value("${media.rtp.send-port-range}")  
80 - private String sendRtpPortRange;  
81 -  
82 @Value("${media.record-assist-port:0}") 76 @Value("${media.record-assist-port:0}")
83 private Integer recordAssistPort = 0; 77 private Integer recordAssistPort = 0;
84 78
@@ -92,7 +86,7 @@ public class MediaConfig{ @@ -92,7 +86,7 @@ public class MediaConfig{
92 86
93 public String getHookIp() { 87 public String getHookIp() {
94 if (ObjectUtils.isEmpty(hookIp)){ 88 if (ObjectUtils.isEmpty(hookIp)){
95 - return sipIp; 89 + return sipIp.split(",")[0];
96 }else { 90 }else {
97 return hookIp; 91 return hookIp;
98 } 92 }
@@ -191,10 +185,6 @@ public class MediaConfig{ @@ -191,10 +185,6 @@ public class MediaConfig{
191 return sipDomain; 185 return sipDomain;
192 } 186 }
193 187
194 - public String getSendRtpPortRange() {  
195 - return sendRtpPortRange;  
196 - }  
197 -  
198 public MediaServerItem getMediaSerItem(){ 188 public MediaServerItem getMediaSerItem(){
199 MediaServerItem mediaServerItem = new MediaServerItem(); 189 MediaServerItem mediaServerItem = new MediaServerItem();
200 mediaServerItem.setId(id); 190 mediaServerItem.setId(id);
@@ -214,9 +204,8 @@ public class MediaConfig{ @@ -214,9 +204,8 @@ public class MediaConfig{
214 mediaServerItem.setSecret(secret); 204 mediaServerItem.setSecret(secret);
215 mediaServerItem.setRtpEnable(rtpEnable); 205 mediaServerItem.setRtpEnable(rtpEnable);
216 mediaServerItem.setRtpPortRange(rtpPortRange); 206 mediaServerItem.setRtpPortRange(rtpPortRange);
217 - mediaServerItem.setSendRtpPortRange(sendRtpPortRange);  
218 mediaServerItem.setRecordAssistPort(recordAssistPort); 207 mediaServerItem.setRecordAssistPort(recordAssistPort);
219 - mediaServerItem.setHookAliveInterval(120); 208 + mediaServerItem.setHookAliveInterval(30.00f);
220 209
221 mediaServerItem.setCreateTime(DateUtil.getNow()); 210 mediaServerItem.setCreateTime(DateUtil.getNow());
222 mediaServerItem.setUpdateTime(DateUtil.getNow()); 211 mediaServerItem.setUpdateTime(DateUtil.getNow());
src/main/java/com/genersoft/iot/vmp/conf/MediaStatusTimerTask.java
1 package com.genersoft.iot.vmp.conf; 1 package com.genersoft.iot.vmp.conf;
2 2
3 -import com.alibaba.fastjson.JSONObject;  
4 import org.springframework.scheduling.annotation.Scheduled; 3 import org.springframework.scheduling.annotation.Scheduled;
5 4
6 /** 5 /**
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/SystemInfoTimerTask.java
@@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; @@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired;
9 import org.springframework.scheduling.annotation.Scheduled; 9 import org.springframework.scheduling.annotation.Scheduled;
10 import org.springframework.stereotype.Component; 10 import org.springframework.stereotype.Component;
11 11
  12 +import java.util.List;
12 import java.util.Map; 13 import java.util.Map;
13 14
14 /** 15 /**
@@ -22,15 +23,17 @@ public class SystemInfoTimerTask { @@ -22,15 +23,17 @@ public class SystemInfoTimerTask {
22 @Autowired 23 @Autowired
23 private IRedisCatchStorage redisCatchStorage; 24 private IRedisCatchStorage redisCatchStorage;
24 25
25 - @Scheduled(fixedRate = 1000) //每1秒执行一次 26 + @Scheduled(fixedRate = 2000) //每1秒执行一次
26 public void execute(){ 27 public void execute(){
27 try { 28 try {
28 double cpuInfo = SystemInfoUtils.getCpuInfo(); 29 double cpuInfo = SystemInfoUtils.getCpuInfo();
29 redisCatchStorage.addCpuInfo(cpuInfo); 30 redisCatchStorage.addCpuInfo(cpuInfo);
30 double memInfo = SystemInfoUtils.getMemInfo(); 31 double memInfo = SystemInfoUtils.getMemInfo();
31 redisCatchStorage.addMemInfo(memInfo); 32 redisCatchStorage.addMemInfo(memInfo);
32 - Map<String, String> networkInterfaces = SystemInfoUtils.getNetworkInterfaces(); 33 + Map<String, Double> networkInterfaces = SystemInfoUtils.getNetworkInterfaces();
33 redisCatchStorage.addNetInfo(networkInterfaces); 34 redisCatchStorage.addNetInfo(networkInterfaces);
  35 + List<Map<String, Object>> diskInfo =SystemInfoUtils.getDiskInfo();
  36 + redisCatchStorage.addDiskInfo(diskInfo);
34 } catch (InterruptedException e) { 37 } catch (InterruptedException e) {
35 logger.error("[获取系统信息失败] {}", e.getMessage()); 38 logger.error("[获取系统信息失败] {}", e.getMessage());
36 } 39 }
src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
@@ -33,8 +33,14 @@ public class UserSetting { @@ -33,8 +33,14 @@ 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
  40 + private Boolean pushAuthority = Boolean.TRUE;
  41 +
  42 + private Boolean gbSendStreamStrict = Boolean.FALSE;
  43 +
38 private String serverId = "000000"; 44 private String serverId = "000000";
39 45
40 private String thirdPartyGBIdReg = "[\\s\\S]*"; 46 private String thirdPartyGBIdReg = "[\\s\\S]*";
@@ -156,4 +162,28 @@ public class UserSetting { @@ -156,4 +162,28 @@ public class UserSetting {
156 public void setStreamOnDemand(Boolean streamOnDemand) { 162 public void setStreamOnDemand(Boolean streamOnDemand) {
157 this.streamOnDemand = streamOnDemand; 163 this.streamOnDemand = streamOnDemand;
158 } 164 }
  165 +
  166 + public Boolean getUseSourceIpAsStreamIp() {
  167 + return useSourceIpAsStreamIp;
  168 + }
  169 +
  170 + public void setUseSourceIpAsStreamIp(Boolean useSourceIpAsStreamIp) {
  171 + this.useSourceIpAsStreamIp = useSourceIpAsStreamIp;
  172 + }
  173 +
  174 + public Boolean getPushAuthority() {
  175 + return pushAuthority;
  176 + }
  177 +
  178 + public void setPushAuthority(Boolean pushAuthority) {
  179 + this.pushAuthority = pushAuthority;
  180 + }
  181 +
  182 + public Boolean getGbSendStreamStrict() {
  183 + return gbSendStreamStrict;
  184 + }
  185 +
  186 + public void setGbSendStreamStrict(Boolean gbSendStreamStrict) {
  187 + this.gbSendStreamStrict = gbSendStreamStrict;
  188 + }
159 } 189 }
src/main/java/com/genersoft/iot/vmp/conf/VersionInfo.java
@@ -19,6 +19,7 @@ public class VersionInfo { @@ -19,6 +19,7 @@ public class VersionInfo {
19 versionPo.setBUILD_DATE(gitUtil.getBuildDate()); 19 versionPo.setBUILD_DATE(gitUtil.getBuildDate());
20 versionPo.setGIT_Revision_SHORT(gitUtil.getCommitIdShort()); 20 versionPo.setGIT_Revision_SHORT(gitUtil.getCommitIdShort());
21 versionPo.setVersion(gitUtil.getBuildVersion()); 21 versionPo.setVersion(gitUtil.getBuildVersion());
  22 + versionPo.setGIT_DATE(gitUtil.getCommitTime());
22 23
23 return versionPo; 24 return versionPo;
24 } 25 }
src/main/java/com/genersoft/iot/vmp/conf/WVPTimerTask.java
1 package com.genersoft.iot.vmp.conf; 1 package com.genersoft.iot.vmp.conf;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.service.IMediaServerService; 4 import com.genersoft.iot.vmp.service.IMediaServerService;
5 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 5 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
6 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.beans.factory.annotation.Autowired;
src/main/java/com/genersoft/iot/vmp/conf/redis/RedisConfig.java
1 package com.genersoft.iot.vmp.conf.redis; 1 package com.genersoft.iot.vmp.conf.redis;
2 2
3 3
4 -import com.alibaba.fastjson.parser.ParserConfig;  
5 import com.genersoft.iot.vmp.common.VideoManagerConstants; 4 import com.genersoft.iot.vmp.common.VideoManagerConstants;
6 import com.genersoft.iot.vmp.service.redisMsg.*; 5 import com.genersoft.iot.vmp.service.redisMsg.*;
7 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.beans.factory.annotation.Autowired;
@@ -55,8 +54,7 @@ public class RedisConfig extends CachingConfigurerSupport { @@ -55,8 +54,7 @@ public class RedisConfig extends CachingConfigurerSupport {
55 // value值的序列化采用fastJsonRedisSerializer 54 // value值的序列化采用fastJsonRedisSerializer
56 redisTemplate.setValueSerializer(fastJsonRedisSerializer); 55 redisTemplate.setValueSerializer(fastJsonRedisSerializer);
57 redisTemplate.setHashValueSerializer(fastJsonRedisSerializer); 56 redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
58 - // 全局开启AutoType,不建议使用  
59 - ParserConfig.getGlobalInstance().setAutoTypeSupport(true); 57 +
60 // key的序列化采用StringRedisSerializer 58 // key的序列化采用StringRedisSerializer
61 redisTemplate.setKeySerializer(new StringRedisSerializer()); 59 redisTemplate.setKeySerializer(new StringRedisSerializer());
62 redisTemplate.setHashKeySerializer(new StringRedisSerializer()); 60 redisTemplate.setHashKeySerializer(new StringRedisSerializer());
src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java
1 package com.genersoft.iot.vmp.conf.security; 1 package com.genersoft.iot.vmp.conf.security;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; 4 import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
5 import org.apache.poi.hssf.eventmodel.ERFListener; 5 import org.apache.poi.hssf.eventmodel.ERFListener;
6 import org.slf4j.Logger; 6 import org.slf4j.Logger;
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
@@ -172,6 +172,15 @@ public class Device { @@ -172,6 +172,15 @@ public class Device {
172 @Schema(description = "树类型 国标规定了两种树的展现方式 行政区划:CivilCode 和业务分组:BusinessGroup") 172 @Schema(description = "树类型 国标规定了两种树的展现方式 行政区划:CivilCode 和业务分组:BusinessGroup")
173 private String treeType; 173 private String treeType;
174 174
  175 + @Schema(description = "密码")
  176 + private String password;
  177 +
  178 + @Schema(description = "收流IP")
  179 + private String sdpIp;
  180 +
  181 + @Schema(description = "SIP交互IP(设备访问平台的IP)")
  182 + private String localIp;
  183 +
175 184
176 public String getDeviceId() { 185 public String getDeviceId() {
177 return deviceId; 186 return deviceId;
@@ -382,4 +391,27 @@ public class Device { @@ -382,4 +391,27 @@ public class Device {
382 this.treeType = treeType; 391 this.treeType = treeType;
383 } 392 }
384 393
  394 + public String getPassword() {
  395 + return password;
  396 + }
  397 +
  398 + public void setPassword(String password) {
  399 + this.password = password;
  400 + }
  401 +
  402 + public String getSdpIp() {
  403 + return sdpIp;
  404 + }
  405 +
  406 + public void setSdpIp(String sdpIp) {
  407 + this.sdpIp = sdpIp;
  408 + }
  409 +
  410 + public String getLocalIp() {
  411 + return localIp;
  412 + }
  413 +
  414 + public void setLocalIp(String localIp) {
  415 + this.localIp = localIp;
  416 + }
385 } 417 }
src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteStreamInfo.java
1 package com.genersoft.iot.vmp.gb28181.bean; 1 package com.genersoft.iot.vmp.gb28181.bean;
2 2
3 -import com.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 4 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
5 5
6 public class InviteStreamInfo { 6 public class InviteStreamInfo {
src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java
@@ -3,15 +3,13 @@ package com.genersoft.iot.vmp.gb28181.bean; @@ -3,15 +3,13 @@ package com.genersoft.iot.vmp.gb28181.bean;
3 import gov.nist.javax.sip.message.SIPRequest; 3 import gov.nist.javax.sip.message.SIPRequest;
4 import gov.nist.javax.sip.message.SIPResponse; 4 import gov.nist.javax.sip.message.SIPResponse;
5 5
6 -import javax.sip.ServerTransaction;  
7 import javax.sip.header.*; 6 import javax.sip.header.*;
8 7
9 public class SubscribeInfo { 8 public class SubscribeInfo {
10 9
11 10
12 - public SubscribeInfo(ServerTransaction serverTransaction, String id) { 11 + public SubscribeInfo(SIPRequest request, String id) {
13 this.id = id; 12 this.id = id;
14 - SIPRequest request = (SIPRequest)serverTransaction.getRequest();  
15 this.request = request; 13 this.request = request;
16 this.expires = request.getExpires().getExpires(); 14 this.expires = request.getExpires().getExpires();
17 EventHeader eventHeader = (EventHeader)request.getHeader(EventHeader.NAME); 15 EventHeader eventHeader = (EventHeader)request.getHeader(EventHeader.NAME);
src/main/java/com/genersoft/iot/vmp/gb28181/conf/SipLoggerPass.java
@@ -6,6 +6,7 @@ import java.util.Properties; @@ -6,6 +6,7 @@ import java.util.Properties;
6 6
7 /** 7 /**
8 * sip日志格式化 8 * sip日志格式化
  9 + * 暂不使用
9 */ 10 */
10 public class SipLoggerPass implements StackLogger { 11 public class SipLoggerPass implements StackLogger {
11 12
src/main/java/com/genersoft/iot/vmp/gb28181/event/SipSubscribe.java
@@ -8,10 +8,12 @@ import org.slf4j.LoggerFactory; @@ -8,10 +8,12 @@ import org.slf4j.LoggerFactory;
8 import org.springframework.scheduling.annotation.Scheduled; 8 import org.springframework.scheduling.annotation.Scheduled;
9 import org.springframework.stereotype.Component; 9 import org.springframework.stereotype.Component;
10 10
11 -import javax.sip.*; 11 +import javax.sip.DialogTerminatedEvent;
  12 +import javax.sip.ResponseEvent;
  13 +import javax.sip.TimeoutEvent;
  14 +import javax.sip.TransactionTerminatedEvent;
12 import javax.sip.header.CallIdHeader; 15 import javax.sip.header.CallIdHeader;
13 import javax.sip.message.Response; 16 import javax.sip.message.Response;
14 -import java.text.ParseException;  
15 import java.time.Instant; 17 import java.time.Instant;
16 import java.util.Map; 18 import java.util.Map;
17 import java.util.concurrent.ConcurrentHashMap; 19 import java.util.concurrent.ConcurrentHashMap;
@@ -30,6 +32,7 @@ public class SipSubscribe { @@ -30,6 +32,7 @@ public class SipSubscribe {
30 private Map<String, SipSubscribe.Event> okSubscribes = new ConcurrentHashMap<>(); 32 private Map<String, SipSubscribe.Event> okSubscribes = new ConcurrentHashMap<>();
31 33
32 private Map<String, Instant> okTimeSubscribes = new ConcurrentHashMap<>(); 34 private Map<String, Instant> okTimeSubscribes = new ConcurrentHashMap<>();
  35 +
33 private Map<String, Instant> errorTimeSubscribes = new ConcurrentHashMap<>(); 36 private Map<String, Instant> errorTimeSubscribes = new ConcurrentHashMap<>();
34 37
35 // @Scheduled(cron="*/5 * * * * ?") //每五秒执行一次 38 // @Scheduled(cron="*/5 * * * * ?") //每五秒执行一次
src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java
1 package com.genersoft.iot.vmp.gb28181.event.record; 1 package com.genersoft.iot.vmp.gb28181.event.record;
2 2
3 import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; 3 import com.genersoft.iot.vmp.gb28181.bean.RecordInfo;
4 -import com.genersoft.iot.vmp.gb28181.bean.RecordItem;  
5 import org.slf4j.Logger; 4 import org.slf4j.Logger;
6 import org.slf4j.LoggerFactory; 5 import org.slf4j.LoggerFactory;
7 import org.springframework.context.ApplicationListener; 6 import org.springframework.context.ApplicationListener;
8 import org.springframework.stereotype.Component; 7 import org.springframework.stereotype.Component;
9 -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;  
10 8
11 -import java.io.IOException;  
12 -import java.util.*; 9 +import java.util.Map;
  10 +import java.util.concurrent.ConcurrentHashMap;
13 11
14 /** 12 /**
15 - * @description: 录像查询结束时间 13 + * @description: 录像查询结束事件
16 * @author: pan 14 * @author: pan
17 * @data: 2022-02-23 15 * @data: 2022-02-23
18 */ 16 */
@@ -22,13 +20,12 @@ public class RecordEndEventListener implements ApplicationListener&lt;RecordEndEven @@ -22,13 +20,12 @@ public class RecordEndEventListener implements ApplicationListener&lt;RecordEndEven
22 20
23 private final static Logger logger = LoggerFactory.getLogger(RecordEndEventListener.class); 21 private final static Logger logger = LoggerFactory.getLogger(RecordEndEventListener.class);
24 22
25 - private static Map<String, SseEmitter> sseEmitters = new Hashtable<>();  
26 -  
27 public interface RecordEndEventHandler{ 23 public interface RecordEndEventHandler{
28 void handler(RecordInfo recordInfo); 24 void handler(RecordInfo recordInfo);
29 } 25 }
30 26
31 - private Map<String, RecordEndEventHandler> handlerMap = new HashMap<>(); 27 + private Map<String, RecordEndEventHandler> handlerMap = new ConcurrentHashMap<>();
  28 +
32 @Override 29 @Override
33 public void onApplicationEvent(RecordEndEvent event) { 30 public void onApplicationEvent(RecordEndEvent event) {
34 logger.info("录像查询完成事件触发,deviceId:{}, channelId: {}, 录像数量{}条", event.getRecordInfo().getDeviceId(), 31 logger.info("录像查询完成事件触发,deviceId:{}, channelId: {}, 录像数量{}条", event.getRecordInfo().getDeviceId(),
@@ -38,7 +35,6 @@ public class RecordEndEventListener implements ApplicationListener&lt;RecordEndEven @@ -38,7 +35,6 @@ public class RecordEndEventListener implements ApplicationListener&lt;RecordEndEven
38 recordEndEventHandler.handler(event.getRecordInfo()); 35 recordEndEventHandler.handler(event.getRecordInfo());
39 } 36 }
40 } 37 }
41 -  
42 } 38 }
43 39
44 public void addEndEventHandler(String device, String channelId, RecordEndEventHandler recordEndEventHandler) { 40 public void addEndEventHandler(String device, String channelId, RecordEndEventHandler recordEndEventHandler) {
src/main/java/com/genersoft/iot/vmp/gb28181/session/CatalogDataCatch.java
@@ -42,7 +42,7 @@ public class CatalogDataCatch { @@ -42,7 +42,7 @@ public class CatalogDataCatch {
42 catalogData.setSn(sn); 42 catalogData.setSn(sn);
43 catalogData.setTotal(total); 43 catalogData.setTotal(total);
44 catalogData.setDevice(device); 44 catalogData.setDevice(device);
45 - catalogData.setChannelList(Collections.synchronizedList(new ArrayList<>())); 45 + catalogData.setChannelList(deviceChannelList);
46 catalogData.setStatus(CatalogData.CatalogDataStatus.runIng); 46 catalogData.setStatus(CatalogData.CatalogDataStatus.runIng);
47 catalogData.setLastTime(Instant.now()); 47 catalogData.setLastTime(Instant.now());
48 data.put(deviceId, catalogData); 48 data.put(deviceId, catalogData);
src/main/java/com/genersoft/iot/vmp/gb28181/task/SipDeviceRunner.java renamed to src/main/java/com/genersoft/iot/vmp/gb28181/task/SipRunner.java
1 package com.genersoft.iot.vmp.gb28181.task; 1 package com.genersoft.iot.vmp.gb28181.task;
2 2
  3 +import com.alibaba.fastjson2.JSONObject;
3 import com.genersoft.iot.vmp.conf.UserSetting; 4 import com.genersoft.iot.vmp.conf.UserSetting;
4 import com.genersoft.iot.vmp.gb28181.bean.Device; 5 import com.genersoft.iot.vmp.gb28181.bean.Device;
  6 +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
  7 +import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
  8 +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
  9 +import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
  10 +import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
5 import com.genersoft.iot.vmp.service.IDeviceService; 11 import com.genersoft.iot.vmp.service.IDeviceService;
  12 +import com.genersoft.iot.vmp.service.IMediaServerService;
  13 +import com.genersoft.iot.vmp.service.IPlatformService;
6 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 14 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
7 import com.genersoft.iot.vmp.storager.IVideoManagerStorage; 15 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
8 import org.springframework.beans.factory.annotation.Autowired; 16 import org.springframework.beans.factory.annotation.Autowired;
@@ -10,8 +18,9 @@ import org.springframework.boot.CommandLineRunner; @@ -10,8 +18,9 @@ import org.springframework.boot.CommandLineRunner;
10 import org.springframework.core.annotation.Order; 18 import org.springframework.core.annotation.Order;
11 import org.springframework.stereotype.Component; 19 import org.springframework.stereotype.Component;
12 20
13 -import java.util.ArrayList; 21 +import java.util.HashMap;
14 import java.util.List; 22 import java.util.List;
  23 +import java.util.Map;
15 24
16 25
17 /** 26 /**
@@ -20,7 +29,7 @@ import java.util.List; @@ -20,7 +29,7 @@ import java.util.List;
20 */ 29 */
21 @Component 30 @Component
22 @Order(value=4) 31 @Order(value=4)
23 -public class SipDeviceRunner implements CommandLineRunner { 32 +public class SipRunner implements CommandLineRunner {
24 33
25 @Autowired 34 @Autowired
26 private IVideoManagerStorage storager; 35 private IVideoManagerStorage storager;
@@ -34,6 +43,18 @@ public class SipDeviceRunner implements CommandLineRunner { @@ -34,6 +43,18 @@ public class SipDeviceRunner implements CommandLineRunner {
34 @Autowired 43 @Autowired
35 private IDeviceService deviceService; 44 private IDeviceService deviceService;
36 45
  46 + @Autowired
  47 + private ZLMRESTfulUtils zlmresTfulUtils;
  48 +
  49 + @Autowired
  50 + private IMediaServerService mediaServerService;
  51 +
  52 + @Autowired
  53 + private IPlatformService platformService;
  54 +
  55 + @Autowired
  56 + private ISIPCommanderForPlatform commanderForPlatform;
  57 +
37 @Override 58 @Override
38 public void run(String... args) throws Exception { 59 public void run(String... args) throws Exception {
39 List<Device> deviceList = deviceService.getAllOnlineDevice(); 60 List<Device> deviceList = deviceService.getAllOnlineDevice();
@@ -47,5 +68,28 @@ public class SipDeviceRunner implements CommandLineRunner { @@ -47,5 +68,28 @@ public class SipDeviceRunner implements CommandLineRunner {
47 } 68 }
48 // 重置cseq计数 69 // 重置cseq计数
49 redisCatchStorage.resetAllCSEQ(); 70 redisCatchStorage.resetAllCSEQ();
  71 + // 清理redis
  72 + // 查找国标推流
  73 + List<SendRtpItem> sendRtpItems = redisCatchStorage.queryAllSendRTPServer();
  74 + if (sendRtpItems.size() > 0) {
  75 + for (SendRtpItem sendRtpItem : sendRtpItems) {
  76 + MediaServerItem mediaServerItem = mediaServerService.getOne(sendRtpItem.getMediaServerId());
  77 + redisCatchStorage.deleteSendRTPServer(sendRtpItem.getPlatformId(),sendRtpItem.getChannelId(), sendRtpItem.getCallId(),sendRtpItem.getStreamId());
  78 + if (mediaServerItem != null) {
  79 + Map<String, Object> param = new HashMap<>();
  80 + param.put("vhost","__defaultVhost__");
  81 + param.put("app",sendRtpItem.getApp());
  82 + param.put("stream",sendRtpItem.getStreamId());
  83 + param.put("ssrc",sendRtpItem.getSsrc());
  84 + JSONObject jsonObject = zlmresTfulUtils.stopSendRtp(mediaServerItem, param);
  85 + if (jsonObject != null && jsonObject.getInteger("code") == 0) {
  86 + ParentPlatform platform = platformService.queryPlatformByServerGBId(sendRtpItem.getPlatformId());
  87 + if (platform != null) {
  88 + commanderForPlatform.streamByeCmd(platform, sendRtpItem.getCallId());
  89 + }
  90 + }
  91 + }
  92 + }
  93 + }
50 } 94 }
51 } 95 }
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 0 → 100644
  1 +package com.genersoft.iot.vmp.gb28181.transmit;
  2 +
  3 +import com.genersoft.iot.vmp.gb28181.SipLayer;
  4 +import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
  5 +import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
  6 +import com.genersoft.iot.vmp.utils.GitUtil;
  7 +import gov.nist.javax.sip.SipProviderImpl;
  8 +import org.slf4j.Logger;
  9 +import org.slf4j.LoggerFactory;
  10 +import org.springframework.beans.factory.annotation.Autowired;
  11 +import org.springframework.stereotype.Component;
  12 +import org.springframework.util.ObjectUtils;
  13 +
  14 +import javax.sip.SipException;
  15 +import javax.sip.header.CallIdHeader;
  16 +import javax.sip.header.UserAgentHeader;
  17 +import javax.sip.header.ViaHeader;
  18 +import javax.sip.message.Message;
  19 +import javax.sip.message.Request;
  20 +import javax.sip.message.Response;
  21 +import java.text.ParseException;
  22 +
  23 +/**
  24 + * 发送SIP消息
  25 + * @author lin
  26 + */
  27 +@Component
  28 +public class SIPSender {
  29 +
  30 + private final Logger logger = LoggerFactory.getLogger(SIPSender.class);
  31 +
  32 + @Autowired
  33 + private SipLayer sipLayer;
  34 +
  35 + @Autowired
  36 + private GitUtil gitUtil;
  37 +
  38 + @Autowired
  39 + private SipSubscribe sipSubscribe;
  40 +
  41 + public void transmitRequest(String ip, Message message) throws SipException, ParseException {
  42 + transmitRequest(ip, message, null, null);
  43 + }
  44 +
  45 + public void transmitRequest(String ip, Message message, SipSubscribe.Event errorEvent) throws SipException, ParseException {
  46 + transmitRequest(ip, message, errorEvent, null);
  47 + }
  48 +
  49 + public void transmitRequest(String ip, Message message, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException, ParseException {
  50 + ViaHeader viaHeader = (ViaHeader)message.getHeader(ViaHeader.NAME);
  51 + String transport = "UDP";
  52 + if (viaHeader == null) {
  53 + logger.warn("[消息头缺失]: ViaHeader, 使用默认的UDP方式处理数据");
  54 + }else {
  55 + transport = viaHeader.getTransport();
  56 + }
  57 + if (message.getHeader(UserAgentHeader.NAME) == null) {
  58 + try {
  59 + message.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
  60 + } catch (ParseException e) {
  61 + logger.error("添加UserAgentHeader失败", e);
  62 + }
  63 + }
  64 +
  65 + CallIdHeader callIdHeader = (CallIdHeader) message.getHeader(CallIdHeader.NAME);
  66 + // 添加错误订阅
  67 + if (errorEvent != null) {
  68 + sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> {
  69 + errorEvent.response(eventResult);
  70 + sipSubscribe.removeErrorSubscribe(eventResult.callId);
  71 + sipSubscribe.removeOkSubscribe(eventResult.callId);
  72 + }));
  73 + }
  74 + // 添加订阅
  75 + if (okEvent != null) {
  76 + sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult -> {
  77 + okEvent.response(eventResult);
  78 + sipSubscribe.removeOkSubscribe(eventResult.callId);
  79 + sipSubscribe.removeErrorSubscribe(eventResult.callId);
  80 + });
  81 + }
  82 + if ("TCP".equals(transport)) {
  83 + SipProviderImpl tcpSipProvider = sipLayer.getTcpSipProvider(ip);
  84 + if (tcpSipProvider == null) {
  85 + logger.error("[发送信息失败] 未找到tcp://{}的监听信息", ip);
  86 + return;
  87 + }
  88 + if (message instanceof Request) {
  89 + tcpSipProvider.sendRequest((Request)message);
  90 + }else if (message instanceof Response) {
  91 + tcpSipProvider.sendResponse((Response)message);
  92 + }
  93 +
  94 + } else if ("UDP".equals(transport)) {
  95 + SipProviderImpl sipProvider = sipLayer.getUdpSipProvider(ip);
  96 + if (sipProvider == null) {
  97 + logger.error("[发送信息失败] 未找到udp://{}的监听信息", ip);
  98 + return;
  99 + }
  100 + if (message instanceof Request) {
  101 + sipProvider.sendRequest((Request)message);
  102 + }else if (message instanceof Response) {
  103 + sipProvider.sendResponse((Response)message);
  104 + }
  105 + }
  106 + }
  107 +
  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 + }
  131 + }
  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/ISIPCommander.java
@@ -12,6 +12,8 @@ import gov.nist.javax.sip.message.SIPRequest; @@ -12,6 +12,8 @@ import gov.nist.javax.sip.message.SIPRequest;
12 import javax.sip.InvalidArgumentException; 12 import javax.sip.InvalidArgumentException;
13 import javax.sip.PeerUnavailableException; 13 import javax.sip.PeerUnavailableException;
14 import javax.sip.SipException; 14 import javax.sip.SipException;
  15 +import javax.sip.message.Message;
  16 +import javax.sip.message.Request;
15 import java.text.ParseException; 17 import java.text.ParseException;
16 import javax.sip.message.Request; 18 import javax.sip.message.Request;
17 19
@@ -359,9 +361,4 @@ public interface ISIPCommander { @@ -359,9 +361,4 @@ public interface ISIPCommander {
359 */ 361 */
360 void sendAlarmMessage(Device device, DeviceAlarm deviceAlarm) throws InvalidArgumentException, SipException, ParseException; 362 void sendAlarmMessage(Device device, DeviceAlarm deviceAlarm) throws InvalidArgumentException, SipException, ParseException;
361 363
362 - void transmitRequest(String transport, Request request) throws SipException, ParseException ;  
363 -  
364 - void transmitRequest(String transport, Request request, SipSubscribe.Event errorEvent) throws SipException, ParseException;  
365 -  
366 - void transmitRequest(String transport, Request request, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws SipException, ParseException;  
367 } 364 }
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;
@@ -51,44 +45,36 @@ public class SIPRequestHeaderProvider { @@ -51,44 +45,36 @@ public class SIPRequestHeaderProvider {
51 45
52 @Autowired 46 @Autowired
53 private VideoStreamSessionManager streamSession; 47 private VideoStreamSessionManager streamSession;
54 -  
55 - @Autowired  
56 - @Qualifier(value="tcpSipProvider")  
57 - private SipProviderImpl tcpSipProvider;  
58 -  
59 - @Autowired  
60 - @Qualifier(value="udpSipProvider")  
61 - private SipProviderImpl udpSipProvider;  
62 48
63 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 {
64 Request request = null; 50 Request request = null;
65 // sipuri 51 // sipuri
66 - SipURI requestURI = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress()); 52 + SipURI requestURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());
67 // via 53 // via
68 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); 54 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
69 - 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);
70 viaHeader.setRPort(); 56 viaHeader.setRPort();
71 viaHeaders.add(viaHeader); 57 viaHeaders.add(viaHeader);
72 // from 58 // from
73 - SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());  
74 - Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);  
75 - 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);
76 // to 62 // to
77 - SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());  
78 - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);  
79 - 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);
80 66
81 // Forwards 67 // Forwards
82 - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); 68 + MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
83 // ceq 69 // ceq
84 - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.MESSAGE); 70 + CSeqHeader cSeqHeader = sipLayer.getSipFactory().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.MESSAGE);
85 71
86 - request = sipFactory.createMessageFactory().createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader, 72 + request = sipLayer.getSipFactory().createMessageFactory().createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader,
87 toHeader, viaHeaders, maxForwards); 73 toHeader, viaHeaders, maxForwards);
88 74
89 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 75 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
90 76
91 - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); 77 + ContentTypeHeader contentTypeHeader = sipLayer.getSipFactory().createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
92 request.setContent(content, contentTypeHeader); 78 request.setContent(content, contentTypeHeader);
93 return request; 79 return request;
94 } 80 }
@@ -96,38 +82,39 @@ public class SIPRequestHeaderProvider { @@ -96,38 +82,39 @@ public class SIPRequestHeaderProvider {
96 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 {
97 Request request = null; 83 Request request = null;
98 //请求行 84 //请求行
99 - SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress()); 85 + SipURI requestLine = sipLayer.getSipFactory().createAddressFactory().createSipURI(channelId, device.getHostAddress());
100 //via 86 //via
101 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); 87 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
102 - 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);
103 viaHeader.setRPort(); 90 viaHeader.setRPort();
104 viaHeaders.add(viaHeader); 91 viaHeaders.add(viaHeader);
105 92
106 //from 93 //from
107 - SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());  
108 - Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);  
109 - 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
110 //to 97 //to
111 - SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress());  
112 - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);  
113 - 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);
114 101
115 //Forwards 102 //Forwards
116 - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); 103 + MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
117 104
118 //ceq 105 //ceq
119 - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INVITE);  
120 - 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);
121 108
122 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 109 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
123 110
124 - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));  
125 - // Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), device.getHost().getIp()+":"+device.getHost().getPort()));  
126 - 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));
127 // Subject 114 // Subject
128 - 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));
129 request.addHeader(subjectHeader); 116 request.addHeader(subjectHeader);
130 - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); 117 + ContentTypeHeader contentTypeHeader = sipLayer.getSipFactory().createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP");
131 request.setContent(content, contentTypeHeader); 118 request.setContent(content, contentTypeHeader);
132 return request; 119 return request;
133 } 120 }
@@ -135,39 +122,39 @@ public class SIPRequestHeaderProvider { @@ -135,39 +122,39 @@ public class SIPRequestHeaderProvider {
135 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 {
136 Request request = null; 123 Request request = null;
137 //请求行 124 //请求行
138 - SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress()); 125 + SipURI requestLine = sipLayer.getSipFactory().createAddressFactory().createSipURI(channelId, device.getHostAddress());
139 // via 126 // via
140 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); 127 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
141 - 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);
142 viaHeader.setRPort(); 129 viaHeader.setRPort();
143 viaHeaders.add(viaHeader); 130 viaHeaders.add(viaHeader);
144 //from 131 //from
145 - SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());  
146 - Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);  
147 - 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
148 //to 135 //to
149 - SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress());  
150 - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);  
151 - 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);
152 139
153 //Forwards 140 //Forwards
154 - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); 141 + MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
155 142
156 //ceq 143 //ceq
157 - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INVITE);  
158 - 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);
159 146
160 - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));  
161 - // Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), device.getHost().getIp()+":"+device.getHost().getPort()));  
162 - 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));
163 150
164 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 151 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
165 152
166 // Subject 153 // Subject
167 - 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));
168 request.addHeader(subjectHeader); 155 request.addHeader(subjectHeader);
169 156
170 - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); 157 + ContentTypeHeader contentTypeHeader = sipLayer.getSipFactory().createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP");
171 request.setContent(content, contentTypeHeader); 158 request.setContent(content, contentTypeHeader);
172 return request; 159 return request;
173 } 160 }
@@ -175,34 +162,34 @@ public class SIPRequestHeaderProvider { @@ -175,34 +162,34 @@ public class SIPRequestHeaderProvider {
175 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 {
176 Request request = null; 163 Request request = null;
177 //请求行 164 //请求行
178 - SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress()); 165 + SipURI requestLine = sipLayer.getSipFactory().createAddressFactory().createSipURI(channelId, device.getHostAddress());
179 // via 166 // via
180 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); 167 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
181 - 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());
182 viaHeaders.add(viaHeader); 169 viaHeaders.add(viaHeader);
183 //from 170 //from
184 - SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(),sipConfig.getDomain());  
185 - Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);  
186 - 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());
187 //to 174 //to
188 - SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(channelId,device.getHostAddress());  
189 - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);  
190 - 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());
191 178
192 //Forwards 179 //Forwards
193 - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); 180 + MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
194 181
195 //ceq 182 //ceq
196 - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.BYE);  
197 - CallIdHeader callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(transactionInfo.getCallId());  
198 - 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);
199 186
200 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 187 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
201 188
202 - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));  
203 - 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));
204 191
205 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 192 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
206 193
207 return request; 194 return request;
208 } 195 }
@@ -210,50 +197,50 @@ public class SIPRequestHeaderProvider { @@ -210,50 +197,50 @@ public class SIPRequestHeaderProvider {
210 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 {
211 Request request = null; 198 Request request = null;
212 // sipuri 199 // sipuri
213 - SipURI requestURI = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress()); 200 + SipURI requestURI = sipLayer.getSipFactory().createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());
214 // via 201 // via
215 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); 202 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
216 - ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), 203 + ViaHeader viaHeader = sipLayer.getSipFactory().createHeaderFactory().createViaHeader(sipLayer.getLocalIp(device.getLocalIp()), sipConfig.getPort(),
217 device.getTransport(), SipUtils.getNewViaTag()); 204 device.getTransport(), SipUtils.getNewViaTag());
218 viaHeader.setRPort(); 205 viaHeader.setRPort();
219 viaHeaders.add(viaHeader); 206 viaHeaders.add(viaHeader);
220 // from 207 // from
221 - SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getDomain());  
222 - Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);  
223 - 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());
224 // to 211 // to
225 - SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());  
226 - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);  
227 - 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());
228 215
229 // Forwards 216 // Forwards
230 - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); 217 + MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
231 218
232 // ceq 219 // ceq
233 - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.SUBSCRIBE); 220 + CSeqHeader cSeqHeader = sipLayer.getSipFactory().createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.SUBSCRIBE);
234 221
235 - request = sipFactory.createMessageFactory().createRequest(requestURI, Request.SUBSCRIBE, callIdHeader, cSeqHeader, fromHeader, 222 + request = sipLayer.getSipFactory().createMessageFactory().createRequest(requestURI, Request.SUBSCRIBE, callIdHeader, cSeqHeader, fromHeader,
236 toHeader, viaHeaders, maxForwards); 223 toHeader, viaHeaders, maxForwards);
237 224
238 225
239 - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));  
240 - 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));
241 228
242 // Expires 229 // Expires
243 - ExpiresHeader expireHeader = sipFactory.createHeaderFactory().createExpiresHeader(expires); 230 + ExpiresHeader expireHeader = sipLayer.getSipFactory().createHeaderFactory().createExpiresHeader(expires);
244 request.addHeader(expireHeader); 231 request.addHeader(expireHeader);
245 232
246 // Event 233 // Event
247 - EventHeader eventHeader = sipFactory.createHeaderFactory().createEventHeader(event); 234 + EventHeader eventHeader = sipLayer.getSipFactory().createHeaderFactory().createEventHeader(event);
248 235
249 int random = (int) Math.floor(Math.random() * 10000); 236 int random = (int) Math.floor(Math.random() * 10000);
250 eventHeader.setEventId(random + ""); 237 eventHeader.setEventId(random + "");
251 request.addHeader(eventHeader); 238 request.addHeader(eventHeader);
252 239
253 - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); 240 + ContentTypeHeader contentTypeHeader = sipLayer.getSipFactory().createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
254 request.setContent(content, contentTypeHeader); 241 request.setContent(content, contentTypeHeader);
255 242
256 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 243 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
257 244
258 return request; 245 return request;
259 } 246 }
@@ -265,64 +252,65 @@ public class SIPRequestHeaderProvider { @@ -265,64 +252,65 @@ public class SIPRequestHeaderProvider {
265 } 252 }
266 SIPRequest request = null; 253 SIPRequest request = null;
267 //请求行 254 //请求行
268 - SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress()); 255 + SipURI requestLine = sipLayer.getSipFactory().createAddressFactory().createSipURI(channelId, device.getHostAddress());
269 // via 256 // via
270 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); 257 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
271 - 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());
272 viaHeaders.add(viaHeader); 259 viaHeaders.add(viaHeader);
273 //from 260 //from
274 - SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(),sipConfig.getDomain());  
275 - Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI);  
276 - 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());
277 //to 264 //to
278 - SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(channelId,device.getHostAddress());  
279 - Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI);  
280 - 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());
281 268
282 //Forwards 269 //Forwards
283 - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); 270 + MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
284 271
285 //ceq 272 //ceq
286 - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(), Request.INFO);  
287 - CallIdHeader callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(transactionInfo.getCallId());  
288 - 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);
289 276
290 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 277 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
291 278
292 - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));  
293 - 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));
294 281
295 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 282 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
296 283
297 if (content != null) { 284 if (content != null) {
298 - ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", 285 + ContentTypeHeader contentTypeHeader = sipLayer.getSipFactory().createHeaderFactory().createContentTypeHeader("Application",
299 "MANSRTSP"); 286 "MANSRTSP");
300 request.setContent(content, contentTypeHeader); 287 request.setContent(content, contentTypeHeader);
301 } 288 }
302 return request; 289 return request;
303 } 290 }
304 291
305 - 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 +
306 294
307 // via 295 // via
308 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); 296 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
309 - 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());
310 viaHeaders.add(viaHeader); 298 viaHeaders.add(viaHeader);
311 299
312 //Forwards 300 //Forwards
313 - MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); 301 + MaxForwardsHeader maxForwards = sipLayer.getSipFactory().createHeaderFactory().createMaxForwardsHeader(70);
314 302
315 //ceq 303 //ceq
316 - CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(sipResponse.getCSeqHeader().getSeqNumber(), Request.ACK); 304 + CSeqHeader cSeqHeader = sipLayer.getSipFactory().createHeaderFactory().createCSeqHeader(sipResponse.getCSeqHeader().getSeqNumber(), Request.ACK);
317 305
318 - 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);
319 307
320 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 308 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
321 309
322 - Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort()));  
323 - 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));
324 312
325 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil)); 313 + request.addHeader(SipUtils.createUserAgentHeader(sipLayer.getSipFactory(), gitUtil));
326 314
327 return request; 315 return request;
328 } 316 }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.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.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.common.StreamInfo; 4 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;
  12 +import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
11 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; 13 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
12 import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider; 14 import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider;
  15 +import com.genersoft.iot.vmp.gb28181.utils.NumericUtil;
13 import com.genersoft.iot.vmp.gb28181.utils.SipUtils; 16 import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
14 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; 17 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
  18 +import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe;
15 import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory; 19 import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory;
16 import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamChange; 20 import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamChange;
17 import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamPush; 21 import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamPush;
@@ -23,16 +27,20 @@ import com.genersoft.iot.vmp.service.IMediaServerService; @@ -23,16 +27,20 @@ import com.genersoft.iot.vmp.service.IMediaServerService;
23 import com.genersoft.iot.vmp.service.bean.SSRCInfo; 27 import com.genersoft.iot.vmp.service.bean.SSRCInfo;
24 import com.genersoft.iot.vmp.utils.GitUtil; 28 import com.genersoft.iot.vmp.utils.GitUtil;
25 import gov.nist.javax.sip.SipProviderImpl; 29 import gov.nist.javax.sip.SipProviderImpl;
  30 +import com.genersoft.iot.vmp.utils.DateUtil;
26 import gov.nist.javax.sip.message.SIPRequest; 31 import gov.nist.javax.sip.message.SIPRequest;
27 import gov.nist.javax.sip.message.SIPResponse; 32 import gov.nist.javax.sip.message.SIPResponse;
28 import org.slf4j.Logger; 33 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory; 34 import org.slf4j.LoggerFactory;
30 import org.springframework.beans.factory.annotation.Autowired; 35 import org.springframework.beans.factory.annotation.Autowired;
31 -import org.springframework.beans.factory.annotation.Qualifier;  
32 import org.springframework.context.annotation.DependsOn; 36 import org.springframework.context.annotation.DependsOn;
33 import org.springframework.stereotype.Component; 37 import org.springframework.stereotype.Component;
34 import org.springframework.util.ObjectUtils; 38 import org.springframework.util.ObjectUtils;
35 39
  40 +import javax.sip.InvalidArgumentException;
  41 +import javax.sip.ResponseEvent;
  42 +import javax.sip.SipException;
  43 +import javax.sip.header.CallIdHeader;
36 import javax.sip.*; 44 import javax.sip.*;
37 import javax.sip.header.*; 45 import javax.sip.header.*;
38 import javax.sip.message.Request; 46 import javax.sip.message.Request;
@@ -53,18 +61,10 @@ public class SIPCommander implements ISIPCommander { @@ -53,18 +61,10 @@ public class SIPCommander implements ISIPCommander {
53 private SipConfig sipConfig; 61 private SipConfig sipConfig;
54 62
55 @Autowired 63 @Autowired
56 - private SipFactory sipFactory;  
57 -  
58 - @Autowired  
59 - private GitUtil gitUtil;  
60 -  
61 - @Autowired  
62 - @Qualifier(value = "tcpSipProvider")  
63 - private SipProviderImpl tcpSipProvider; 64 + private SipLayer sipLayer;
64 65
65 @Autowired 66 @Autowired
66 - @Qualifier(value = "udpSipProvider")  
67 - private SipProviderImpl udpSipProvider; 67 + private SIPSender sipSender;
68 68
69 @Autowired 69 @Autowired
70 private SIPRequestHeaderProvider headerProvider; 70 private SIPRequestHeaderProvider headerProvider;
@@ -78,8 +78,7 @@ public class SIPCommander implements ISIPCommander { @@ -78,8 +78,7 @@ public class SIPCommander implements ISIPCommander {
78 @Autowired 78 @Autowired
79 private ZlmHttpHookSubscribe subscribe; 79 private ZlmHttpHookSubscribe subscribe;
80 80
81 - @Autowired  
82 - private SipSubscribe sipSubscribe; 81 +
83 82
84 @Autowired 83 @Autowired
85 private IMediaServerService mediaServerService; 84 private IMediaServerService mediaServerService;
@@ -181,7 +180,7 @@ public class SIPCommander implements ISIPCommander { @@ -181,7 +180,7 @@ public class SIPCommander implements ISIPCommander {
181 public void ptzCmd(Device device, String channelId, int leftRight, int upDown, int inOut, int moveSpeed, 180 public void ptzCmd(Device device, String channelId, int leftRight, int upDown, int inOut, int moveSpeed,
182 int zoomSpeed) throws InvalidArgumentException, SipException, ParseException { 181 int zoomSpeed) throws InvalidArgumentException, SipException, ParseException {
183 String cmdStr = SipUtils.cmdString(leftRight, upDown, inOut, moveSpeed, zoomSpeed); 182 String cmdStr = SipUtils.cmdString(leftRight, upDown, inOut, moveSpeed, zoomSpeed);
184 - StringBuffer ptzXml = new StringBuffer(200); 183 + StringBuilder ptzXml = new StringBuilder(200);
185 String charset = device.getCharset(); 184 String charset = device.getCharset();
186 ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n"); 185 ptzXml.append("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>\r\n");
187 ptzXml.append("<Control>\r\n"); 186 ptzXml.append("<Control>\r\n");
@@ -194,12 +193,9 @@ public class SIPCommander implements ISIPCommander { @@ -194,12 +193,9 @@ public class SIPCommander implements ISIPCommander {
194 ptzXml.append("</Info>\r\n"); 193 ptzXml.append("</Info>\r\n");
195 ptzXml.append("</Control>\r\n"); 194 ptzXml.append("</Control>\r\n");
196 195
197 - CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()  
198 - : udpSipProvider.getNewCallId();  
199 -  
200 - Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); 196 + Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
201 197
202 - transmitRequest(device.getTransport(), request); 198 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request);
203 } 199 }
204 200
205 /** 201 /**
@@ -230,11 +226,10 @@ public class SIPCommander implements ISIPCommander { @@ -230,11 +226,10 @@ public class SIPCommander implements ISIPCommander {
230 ptzXml.append("</Control>\r\n"); 226 ptzXml.append("</Control>\r\n");
231 227
232 228
233 - CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()  
234 - : udpSipProvider.getNewCallId();  
235 229
236 - SIPRequest request = (SIPRequest) headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);  
237 - transmitRequest(device.getTransport(), request); 230 +
  231 + SIPRequest request = (SIPRequest) headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  232 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request);
238 233
239 } 234 }
240 235
@@ -262,11 +257,8 @@ public class SIPCommander implements ISIPCommander { @@ -262,11 +257,8 @@ public class SIPCommander implements ISIPCommander {
262 ptzXml.append("</Control>\r\n"); 257 ptzXml.append("</Control>\r\n");
263 258
264 259
265 - CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()  
266 - : udpSipProvider.getNewCallId();  
267 -  
268 - Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);  
269 - transmitRequest(device.getTransport(), request, errorEvent, okEvent); 260 + Request request = headerProvider.createMessageRequest(device, ptzXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  261 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request, errorEvent, okEvent);
270 262
271 } 263 }
272 264
@@ -295,12 +287,17 @@ public class SIPCommander implements ISIPCommander { @@ -295,12 +287,17 @@ public class SIPCommander implements ISIPCommander {
295 subscribe.removeSubscribe(hookSubscribe); 287 subscribe.removeSubscribe(hookSubscribe);
296 } 288 }
297 }); 289 });
298 - // 290 + String sdpIp;
  291 + if (!ObjectUtils.isEmpty(device.getSdpIp())) {
  292 + sdpIp = device.getSdpIp();
  293 + }else {
  294 + sdpIp = mediaServerItem.getSdpIp();
  295 + }
299 StringBuffer content = new StringBuffer(200); 296 StringBuffer content = new StringBuffer(200);
300 content.append("v=0\r\n"); 297 content.append("v=0\r\n");
301 - content.append("o=" + channelId + " 0 0 IN IP4 " + mediaServerItem.getSdpIp() + "\r\n"); 298 + content.append("o=" + channelId + " 0 0 IN IP4 " + sdpIp + "\r\n");
302 content.append("s=Play\r\n"); 299 content.append("s=Play\r\n");
303 - content.append("c=IN IP4 " + mediaServerItem.getSdpIp() + "\r\n"); 300 + content.append("c=IN IP4 " + sdpIp + "\r\n");
304 content.append("t=0 0\r\n"); 301 content.append("t=0 0\r\n");
305 302
306 if (userSetting.isSeniorSdp()) { 303 if (userSetting.isSeniorSdp()) {
@@ -353,11 +350,10 @@ public class SIPCommander implements ISIPCommander { @@ -353,11 +350,10 @@ public class SIPCommander implements ISIPCommander {
353 // f字段:f= v/编码格式/分辨率/帧率/码率类型/码率大小a/编码格式/码率大小/采样率 350 // f字段:f= v/编码格式/分辨率/帧率/码率类型/码率大小a/编码格式/码率大小/采样率
354 // content.append("f=v/2/5/25/1/4000a/1/8/1" + "\r\n"); // 未发现支持此特性的设备 351 // content.append("f=v/2/5/25/1/4000a/1/8/1" + "\r\n"); // 未发现支持此特性的设备
355 352
356 - CallIdHeader callIdHeader = device.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()  
357 - : udpSipProvider.getNewCallId();  
358 353
359 - Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, ssrcInfo.getSsrc(), callIdHeader);  
360 - transmitRequest(device.getTransport(), request, (e -> { 354 +
  355 + Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, ssrcInfo.getSsrc(),sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  356 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, (e -> {
361 streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); 357 streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
362 mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc()); 358 mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
363 errorEvent.response(e); 359 errorEvent.response(e);
@@ -385,13 +381,18 @@ public class SIPCommander implements ISIPCommander { @@ -385,13 +381,18 @@ public class SIPCommander implements ISIPCommander {
385 381
386 382
387 logger.info("{} 分配的ZLM为: {} [{}:{}]", ssrcInfo.getStream(), mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort()); 383 logger.info("{} 分配的ZLM为: {} [{}:{}]", ssrcInfo.getStream(), mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort());
388 - 384 + String sdpIp;
  385 + if (!ObjectUtils.isEmpty(device.getSdpIp())) {
  386 + sdpIp = device.getSdpIp();
  387 + }else {
  388 + sdpIp = mediaServerItem.getSdpIp();
  389 + }
389 StringBuffer content = new StringBuffer(200); 390 StringBuffer content = new StringBuffer(200);
390 content.append("v=0\r\n"); 391 content.append("v=0\r\n");
391 - content.append("o=" + channelId + " 0 0 IN IP4 " + mediaServerItem.getSdpIp() + "\r\n"); 392 + content.append("o=" + channelId + " 0 0 IN IP4 " + sdpIp + "\r\n");
392 content.append("s=Playback\r\n"); 393 content.append("s=Playback\r\n");
393 content.append("u=" + channelId + ":0\r\n"); 394 content.append("u=" + channelId + ":0\r\n");
394 - content.append("c=IN IP4 " + mediaServerItem.getSdpIp() + "\r\n"); 395 + content.append("c=IN IP4 " + sdpIp + "\r\n");
395 content.append("t=" + DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(startTime) + " " 396 content.append("t=" + DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(startTime) + " "
396 + DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(endTime) + "\r\n"); 397 + DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(endTime) + "\r\n");
397 398
@@ -434,38 +435,39 @@ public class SIPCommander implements ISIPCommander { @@ -434,38 +435,39 @@ public class SIPCommander implements ISIPCommander {
434 content.append("a=rtpmap:97 MPEG4/90000\r\n"); 435 content.append("a=rtpmap:97 MPEG4/90000\r\n");
435 content.append("a=rtpmap:98 H264/90000\r\n"); 436 content.append("a=rtpmap:98 H264/90000\r\n");
436 content.append("a=rtpmap:99 H265/90000\r\n"); 437 content.append("a=rtpmap:99 H265/90000\r\n");
437 - if ("TCP-PASSIVE".equalsIgnoreCase(streamMode)) { // tcp被动模式 438 + if ("TCP-PASSIVE".equalsIgnoreCase(streamMode)) {
  439 + // tcp被动模式
438 content.append("a=setup:passive\r\n"); 440 content.append("a=setup:passive\r\n");
439 content.append("a=connection:new\r\n"); 441 content.append("a=connection:new\r\n");
440 - } else if ("TCP-ACTIVE".equalsIgnoreCase(streamMode)) { // tcp主动模式 442 + } else if ("TCP-ACTIVE".equalsIgnoreCase(streamMode)) {
  443 + // tcp主动模式
441 content.append("a=setup:active\r\n"); 444 content.append("a=setup:active\r\n");
442 content.append("a=connection:new\r\n"); 445 content.append("a=connection:new\r\n");
443 } 446 }
444 } 447 }
445 448
446 - content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc 449 + //ssrc
  450 + content.append("y=" + ssrcInfo.getSsrc() + "\r\n");
447 451
448 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
449 - : udpSipProvider.getNewCallId();  
450 HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId()); 452 HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId());
451 // 添加订阅 453 // 添加订阅
452 subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> { 454 subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> {
453 if (hookEvent != null) { 455 if (hookEvent != null) {
454 - InviteStreamInfo inviteStreamInfo = new InviteStreamInfo(mediaServerItemInUse, json, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream()); 456 + InviteStreamInfo inviteStreamInfo = new InviteStreamInfo(mediaServerItemInUse, json,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream());
455 hookEvent.call(inviteStreamInfo); 457 hookEvent.call(inviteStreamInfo);
456 } 458 }
457 subscribe.removeSubscribe(hookSubscribe); 459 subscribe.removeSubscribe(hookSubscribe);
458 }); 460 });
459 - Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader, ssrcInfo.getSsrc()); 461 + Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()), ssrcInfo.getSsrc());
460 462
461 - transmitRequest(device.getTransport(), request, errorEvent, event -> { 463 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent, event -> {
462 ResponseEvent responseEvent = (ResponseEvent) event.event; 464 ResponseEvent responseEvent = (ResponseEvent) event.event;
463 SIPResponse response = (SIPResponse) responseEvent.getResponse(); 465 SIPResponse response = (SIPResponse) responseEvent.getResponse();
464 - streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.playback); 466 + streamSession.put(device.getDeviceId(), channelId,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.playback);
465 okEvent.response(event); 467 okEvent.response(event);
466 }); 468 });
467 if (inviteStreamCallback != null) { 469 if (inviteStreamCallback != null) {
468 - inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream())); 470 + inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream()));
469 } 471 }
470 } 472 }
471 473
@@ -484,13 +486,18 @@ public class SIPCommander implements ISIPCommander { @@ -484,13 +486,18 @@ public class SIPCommander implements ISIPCommander {
484 SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { 486 SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException {
485 487
486 logger.info("{} 分配的ZLM为: {} [{}:{}]", ssrcInfo.getStream(), mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort()); 488 logger.info("{} 分配的ZLM为: {} [{}:{}]", ssrcInfo.getStream(), mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort());
487 - 489 + String sdpIp;
  490 + if (!ObjectUtils.isEmpty(device.getSdpIp())) {
  491 + sdpIp = device.getSdpIp();
  492 + }else {
  493 + sdpIp = mediaServerItem.getSdpIp();
  494 + }
488 StringBuffer content = new StringBuffer(200); 495 StringBuffer content = new StringBuffer(200);
489 content.append("v=0\r\n"); 496 content.append("v=0\r\n");
490 - content.append("o=" + channelId + " 0 0 IN IP4 " + mediaServerItem.getSdpIp() + "\r\n"); 497 + content.append("o=" + channelId + " 0 0 IN IP4 " + sdpIp + "\r\n");
491 content.append("s=Download\r\n"); 498 content.append("s=Download\r\n");
492 content.append("u=" + channelId + ":0\r\n"); 499 content.append("u=" + channelId + ":0\r\n");
493 - content.append("c=IN IP4 " + mediaServerItem.getSdpIp() + "\r\n"); 500 + content.append("c=IN IP4 " + sdpIp + "\r\n");
494 content.append("t=" + DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(startTime) + " " 501 content.append("t=" + DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(startTime) + " "
495 + DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(endTime) + "\r\n"); 502 + DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(endTime) + "\r\n");
496 503
@@ -546,13 +553,10 @@ public class SIPCommander implements ISIPCommander { @@ -546,13 +553,10 @@ public class SIPCommander implements ISIPCommander {
546 553
547 content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc 554 content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc
548 555
549 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
550 - : udpSipProvider.getNewCallId();  
551 -  
552 HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, null, mediaServerItem.getId()); 556 HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, null, mediaServerItem.getId());
553 // 添加订阅 557 // 添加订阅
554 subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> { 558 subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> {
555 - hookEvent.call(new InviteStreamInfo(mediaServerItem, json, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream())); 559 + hookEvent.call(new InviteStreamInfo(mediaServerItem, json,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream()));
556 subscribe.removeSubscribe(hookSubscribe); 560 subscribe.removeSubscribe(hookSubscribe);
557 hookSubscribe.getContent().put("regist", false); 561 hookSubscribe.getContent().put("regist", false);
558 hookSubscribe.getContent().put("schema", "rtsp"); 562 hookSubscribe.getContent().put("schema", "rtsp");
@@ -561,7 +565,7 @@ public class SIPCommander implements ISIPCommander { @@ -561,7 +565,7 @@ public class SIPCommander implements ISIPCommander {
561 (MediaServerItem mediaServerItemForEnd, JSONObject jsonForEnd) -> { 565 (MediaServerItem mediaServerItemForEnd, JSONObject jsonForEnd) -> {
562 logger.info("[录像]下载结束, 发送BYE"); 566 logger.info("[录像]下载结束, 发送BYE");
563 try { 567 try {
564 - streamByeCmd(device, channelId, ssrcInfo.getStream(), callIdHeader.getCallId()); 568 + streamByeCmd(device, channelId, ssrcInfo.getStream(),sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId());
565 } catch (InvalidArgumentException | ParseException | SipException | 569 } catch (InvalidArgumentException | ParseException | SipException |
566 SsrcTransactionNotFoundException e) { 570 SsrcTransactionNotFoundException e) {
567 logger.error("[录像]下载结束, 发送BYE失败 {}", e.getMessage()); 571 logger.error("[录像]下载结束, 发送BYE失败 {}", e.getMessage());
@@ -569,14 +573,14 @@ public class SIPCommander implements ISIPCommander { @@ -569,14 +573,14 @@ public class SIPCommander implements ISIPCommander {
569 }); 573 });
570 }); 574 });
571 575
572 - Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader, ssrcInfo.getSsrc()); 576 + Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()), ssrcInfo.getSsrc());
573 if (inviteStreamCallback != null) { 577 if (inviteStreamCallback != null) {
574 - inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null, callIdHeader.getCallId(), "rtp", ssrcInfo.getStream())); 578 + inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream()));
575 } 579 }
576 - transmitRequest(device.getTransport(), request, errorEvent, okEvent -> { 580 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent, okEvent -> {
577 ResponseEvent responseEvent = (ResponseEvent) okEvent.event; 581 ResponseEvent responseEvent = (ResponseEvent) okEvent.event;
578 SIPResponse response = (SIPResponse) responseEvent.getResponse(); 582 SIPResponse response = (SIPResponse) responseEvent.getResponse();
579 - streamSession.put(device.getDeviceId(), channelId, callIdHeader.getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.download); 583 + streamSession.put(device.getDeviceId(), channelId,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.download);
580 }); 584 });
581 } 585 }
582 586
@@ -665,7 +669,7 @@ public class SIPCommander implements ISIPCommander { @@ -665,7 +669,7 @@ public class SIPCommander implements ISIPCommander {
665 streamSession.remove(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream()); 669 streamSession.remove(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream());
666 670
667 Request byteRequest = headerProvider.createByteRequest(device, channelId, ssrcTransaction.getSipTransactionInfo()); 671 Request byteRequest = headerProvider.createByteRequest(device, channelId, ssrcTransaction.getSipTransactionInfo());
668 - transmitRequest(device.getTransport(), byteRequest, null, okEvent); 672 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), byteRequest, null, okEvent);
669 } 673 }
670 674
671 @Override 675 @Override
@@ -691,11 +695,10 @@ public class SIPCommander implements ISIPCommander { @@ -691,11 +695,10 @@ public class SIPCommander implements ISIPCommander {
691 broadcastXml.append("<TargetID>" + channelId + "</TargetID>\r\n"); 695 broadcastXml.append("<TargetID>" + channelId + "</TargetID>\r\n");
692 broadcastXml.append("</Notify>\r\n"); 696 broadcastXml.append("</Notify>\r\n");
693 697
694 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
695 - : udpSipProvider.getNewCallId();  
696 698
697 - Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);  
698 - transmitRequest(device.getTransport(), request, errorEvent, okEvent); 699 +
  700 + Request request = headerProvider.createMessageRequest(device, broadcastXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  701 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request);
699 702
700 } 703 }
701 704
@@ -723,11 +726,10 @@ public class SIPCommander implements ISIPCommander { @@ -723,11 +726,10 @@ public class SIPCommander implements ISIPCommander {
723 cmdXml.append("<RecordCmd>" + recordCmdStr + "</RecordCmd>\r\n"); 726 cmdXml.append("<RecordCmd>" + recordCmdStr + "</RecordCmd>\r\n");
724 cmdXml.append("</Control>\r\n"); 727 cmdXml.append("</Control>\r\n");
725 728
726 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
727 - : udpSipProvider.getNewCallId();  
728 729
729 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);  
730 - transmitRequest(device.getTransport(), request, errorEvent); 730 +
  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);
731 } 733 }
732 734
733 /** 735 /**
@@ -748,11 +750,10 @@ public class SIPCommander implements ISIPCommander { @@ -748,11 +750,10 @@ public class SIPCommander implements ISIPCommander {
748 cmdXml.append("<TeleBoot>Boot</TeleBoot>\r\n"); 750 cmdXml.append("<TeleBoot>Boot</TeleBoot>\r\n");
749 cmdXml.append("</Control>\r\n"); 751 cmdXml.append("</Control>\r\n");
750 752
751 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
752 - : udpSipProvider.getNewCallId();  
753 753
754 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);  
755 - transmitRequest(device.getTransport(), request); 754 +
  755 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  756 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request);
756 } 757 }
757 758
758 /** 759 /**
@@ -774,11 +775,10 @@ public class SIPCommander implements ISIPCommander { @@ -774,11 +775,10 @@ public class SIPCommander implements ISIPCommander {
774 cmdXml.append("<GuardCmd>" + guardCmdStr + "</GuardCmd>\r\n"); 775 cmdXml.append("<GuardCmd>" + guardCmdStr + "</GuardCmd>\r\n");
775 cmdXml.append("</Control>\r\n"); 776 cmdXml.append("</Control>\r\n");
776 777
777 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
778 - : udpSipProvider.getNewCallId();  
779 778
780 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);  
781 - transmitRequest(device.getTransport(), request, errorEvent); 779 +
  780 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  781 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
782 } 782 }
783 783
784 /** 784 /**
@@ -811,11 +811,10 @@ public class SIPCommander implements ISIPCommander { @@ -811,11 +811,10 @@ public class SIPCommander implements ISIPCommander {
811 } 811 }
812 cmdXml.append("</Control>\r\n"); 812 cmdXml.append("</Control>\r\n");
813 813
814 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
815 - : udpSipProvider.getNewCallId();  
816 814
817 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);  
818 - transmitRequest(device.getTransport(), request, errorEvent); 815 +
  816 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  817 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
819 } 818 }
820 819
821 /** 820 /**
@@ -841,11 +840,10 @@ public class SIPCommander implements ISIPCommander { @@ -841,11 +840,10 @@ public class SIPCommander implements ISIPCommander {
841 cmdXml.append("<IFameCmd>Send</IFameCmd>\r\n"); 840 cmdXml.append("<IFameCmd>Send</IFameCmd>\r\n");
842 cmdXml.append("</Control>\r\n"); 841 cmdXml.append("</Control>\r\n");
843 842
844 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
845 - : udpSipProvider.getNewCallId();  
846 843
847 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);  
848 - transmitRequest(device.getTransport(), request); 844 +
  845 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  846 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request);
849 } 847 }
850 848
851 /** 849 /**
@@ -889,11 +887,10 @@ public class SIPCommander implements ISIPCommander { @@ -889,11 +887,10 @@ public class SIPCommander implements ISIPCommander {
889 cmdXml.append("</HomePosition>\r\n"); 887 cmdXml.append("</HomePosition>\r\n");
890 cmdXml.append("</Control>\r\n"); 888 cmdXml.append("</Control>\r\n");
891 889
892 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
893 - : udpSipProvider.getNewCallId();  
894 890
895 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);  
896 - transmitRequest(device.getTransport(), request, errorEvent); 891 +
  892 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  893 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
897 } 894 }
898 895
899 /** 896 /**
@@ -953,11 +950,10 @@ public class SIPCommander implements ISIPCommander { @@ -953,11 +950,10 @@ public class SIPCommander implements ISIPCommander {
953 cmdXml.append("</BasicParam>\r\n"); 950 cmdXml.append("</BasicParam>\r\n");
954 cmdXml.append("</Control>\r\n"); 951 cmdXml.append("</Control>\r\n");
955 952
956 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
957 - : udpSipProvider.getNewCallId();  
958 953
959 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);  
960 - transmitRequest(device.getTransport(), request, errorEvent); 954 +
  955 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  956 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
961 } 957 }
962 958
963 /** 959 /**
@@ -977,12 +973,11 @@ public class SIPCommander implements ISIPCommander { @@ -977,12 +973,11 @@ public class SIPCommander implements ISIPCommander {
977 catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); 973 catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
978 catalogXml.append("</Query>\r\n"); 974 catalogXml.append("</Query>\r\n");
979 975
980 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
981 - : udpSipProvider.getNewCallId();  
982 976
983 - Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);  
984 977
985 - transmitRequest(device.getTransport(), request, errorEvent); 978 + Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  979 +
  980 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
986 } 981 }
987 982
988 /** 983 /**
@@ -1002,12 +997,11 @@ public class SIPCommander implements ISIPCommander { @@ -1002,12 +997,11 @@ public class SIPCommander implements ISIPCommander {
1002 catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); 997 catalogXml.append("<DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
1003 catalogXml.append("</Query>\r\n"); 998 catalogXml.append("</Query>\r\n");
1004 999
1005 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
1006 - : udpSipProvider.getNewCallId();  
1007 1000
1008 - Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);  
1009 1001
1010 - transmitRequest(device.getTransport(), request); 1002 + Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  1003 +
  1004 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request);
1011 1005
1012 } 1006 }
1013 1007
@@ -1028,12 +1022,11 @@ public class SIPCommander implements ISIPCommander { @@ -1028,12 +1022,11 @@ public class SIPCommander implements ISIPCommander {
1028 catalogXml.append(" <DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n"); 1022 catalogXml.append(" <DeviceID>" + device.getDeviceId() + "</DeviceID>\r\n");
1029 catalogXml.append("</Query>\r\n"); 1023 catalogXml.append("</Query>\r\n");
1030 1024
1031 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
1032 - : udpSipProvider.getNewCallId();  
1033 1025
1034 - Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);  
1035 1026
1036 - transmitRequest(device.getTransport(), request, errorEvent); 1027 + Request request = headerProvider.createMessageRequest(device, catalogXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  1028 +
  1029 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
1037 } 1030 }
1038 1031
1039 /** 1032 /**
@@ -1074,13 +1067,12 @@ public class SIPCommander implements ISIPCommander { @@ -1074,13 +1067,12 @@ public class SIPCommander implements ISIPCommander {
1074 } 1067 }
1075 recordInfoXml.append("</Query>\r\n"); 1068 recordInfoXml.append("</Query>\r\n");
1076 1069
1077 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
1078 - : udpSipProvider.getNewCallId(); 1070 +
1079 1071
1080 Request request = headerProvider.createMessageRequest(device, recordInfoXml.toString(), 1072 Request request = headerProvider.createMessageRequest(device, recordInfoXml.toString(),
1081 - SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader); 1073 + SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
1082 1074
1083 - transmitRequest(device.getTransport(), request, errorEvent, okEvent); 1075 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent, okEvent);
1084 } 1076 }
1085 1077
1086 /** 1078 /**
@@ -1126,11 +1118,10 @@ public class SIPCommander implements ISIPCommander { @@ -1126,11 +1118,10 @@ public class SIPCommander implements ISIPCommander {
1126 } 1118 }
1127 cmdXml.append("</Query>\r\n"); 1119 cmdXml.append("</Query>\r\n");
1128 1120
1129 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
1130 - : udpSipProvider.getNewCallId();  
1131 1121
1132 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);  
1133 - transmitRequest(device.getTransport(), request, errorEvent); 1122 +
  1123 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  1124 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
1134 } 1125 }
1135 1126
1136 /** 1127 /**
@@ -1157,11 +1148,10 @@ public class SIPCommander implements ISIPCommander { @@ -1157,11 +1148,10 @@ public class SIPCommander implements ISIPCommander {
1157 cmdXml.append("<ConfigType>" + configType + "</ConfigType>\r\n"); 1148 cmdXml.append("<ConfigType>" + configType + "</ConfigType>\r\n");
1158 cmdXml.append("</Query>\r\n"); 1149 cmdXml.append("</Query>\r\n");
1159 1150
1160 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
1161 - : udpSipProvider.getNewCallId();  
1162 1151
1163 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);  
1164 - transmitRequest(device.getTransport(), request, errorEvent); 1152 +
  1153 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  1154 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
1165 } 1155 }
1166 1156
1167 /** 1157 /**
@@ -1185,11 +1175,10 @@ public class SIPCommander implements ISIPCommander { @@ -1185,11 +1175,10 @@ public class SIPCommander implements ISIPCommander {
1185 } 1175 }
1186 cmdXml.append("</Query>\r\n"); 1176 cmdXml.append("</Query>\r\n");
1187 1177
1188 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
1189 - : udpSipProvider.getNewCallId();  
1190 1178
1191 - Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null, callIdHeader);  
1192 - transmitRequest(device.getTransport(), request, errorEvent); 1179 +
  1180 + Request request = headerProvider.createMessageRequest(device, cmdXml.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  1181 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
1193 } 1182 }
1194 1183
1195 /** 1184 /**
@@ -1210,12 +1199,11 @@ public class SIPCommander implements ISIPCommander { @@ -1210,12 +1199,11 @@ public class SIPCommander implements ISIPCommander {
1210 mobilePostitionXml.append("<Interval>60</Interval>\r\n"); 1199 mobilePostitionXml.append("<Interval>60</Interval>\r\n");
1211 mobilePostitionXml.append("</Query>\r\n"); 1200 mobilePostitionXml.append("</Query>\r\n");
1212 1201
1213 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
1214 - : udpSipProvider.getNewCallId();  
1215 1202
1216 - Request request = headerProvider.createMessageRequest(device, mobilePostitionXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);  
1217 1203
1218 - transmitRequest(device.getTransport(), request, errorEvent); 1204 + Request request = headerProvider.createMessageRequest(device, mobilePostitionXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  1205 +
  1206 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent);
1219 1207
1220 } 1208 }
1221 1209
@@ -1243,14 +1231,13 @@ public class SIPCommander implements ISIPCommander { @@ -1243,14 +1231,13 @@ public class SIPCommander implements ISIPCommander {
1243 CallIdHeader callIdHeader; 1231 CallIdHeader callIdHeader;
1244 1232
1245 if (requestOld != null) { 1233 if (requestOld != null) {
1246 - callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(requestOld.getCallIdHeader().getCallId()); 1234 + callIdHeader = sipLayer.getSipFactory().createHeaderFactory().createCallIdHeader(requestOld.getCallIdHeader().getCallId());
1247 } else { 1235 } else {
1248 - callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
1249 - : udpSipProvider.getNewCallId(); 1236 + callIdHeader = sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport());
1250 } 1237 }
1251 - SIPRequest request = (SIPRequest) headerProvider.createSubscribeRequest(device, subscribePostitionXml.toString(), requestOld, device.getSubscribeCycleForMobilePosition(), "presence", callIdHeader); //Position;id=" + tm.substring(tm.length() - 4)); 1238 + SIPRequest request = (SIPRequest) headerProvider.createSubscribeRequest(device, subscribePostitionXml.toString(), requestOld, device.getSubscribeCycleForMobilePosition(), "presence",callIdHeader); //Position;id=" + tm.substring(tm.length() - 4));
1252 1239
1253 - transmitRequest(device.getTransport(), request, errorEvent, okEvent); 1240 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent, okEvent);
1254 return request; 1241 return request;
1255 } 1242 }
1256 1243
@@ -1297,11 +1284,10 @@ public class SIPCommander implements ISIPCommander { @@ -1297,11 +1284,10 @@ public class SIPCommander implements ISIPCommander {
1297 } 1284 }
1298 cmdXml.append("</Query>\r\n"); 1285 cmdXml.append("</Query>\r\n");
1299 1286
1300 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
1301 - : udpSipProvider.getNewCallId();  
1302 1287
1303 - Request request = headerProvider.createSubscribeRequest(device, cmdXml.toString(), null, expires, "presence", callIdHeader);  
1304 - transmitRequest(device.getTransport(), request); 1288 +
  1289 + Request request = headerProvider.createSubscribeRequest(device, cmdXml.toString(), null, expires, "presence",sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  1290 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request);
1305 1291
1306 } 1292 }
1307 1293
@@ -1320,16 +1306,15 @@ public class SIPCommander implements ISIPCommander { @@ -1320,16 +1306,15 @@ public class SIPCommander implements ISIPCommander {
1320 CallIdHeader callIdHeader; 1306 CallIdHeader callIdHeader;
1321 1307
1322 if (requestOld != null) { 1308 if (requestOld != null) {
1323 - callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(requestOld.getCallIdHeader().getCallId()); 1309 + callIdHeader = sipLayer.getSipFactory().createHeaderFactory().createCallIdHeader(requestOld.getCallIdHeader().getCallId());
1324 } else { 1310 } else {
1325 - callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
1326 - : udpSipProvider.getNewCallId(); 1311 + callIdHeader = sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport());
1327 } 1312 }
1328 1313
1329 // 有效时间默认为60秒以上 1314 // 有效时间默认为60秒以上
1330 SIPRequest request = (SIPRequest) headerProvider.createSubscribeRequest(device, cmdXml.toString(), requestOld, device.getSubscribeCycleForCatalog(), "Catalog", 1315 SIPRequest request = (SIPRequest) headerProvider.createSubscribeRequest(device, cmdXml.toString(), requestOld, device.getSubscribeCycleForCatalog(), "Catalog",
1331 callIdHeader); 1316 callIdHeader);
1332 - transmitRequest(device.getTransport(), request, errorEvent, okEvent); 1317 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent, okEvent);
1333 return request; 1318 return request;
1334 } 1319 }
1335 1320
@@ -1349,59 +1334,14 @@ public class SIPCommander implements ISIPCommander { @@ -1349,59 +1334,14 @@ public class SIPCommander implements ISIPCommander {
1349 } 1334 }
1350 dragXml.append(cmdString); 1335 dragXml.append(cmdString);
1351 dragXml.append("</Control>\r\n"); 1336 dragXml.append("</Control>\r\n");
1352 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
1353 - : udpSipProvider.getNewCallId();  
1354 - Request request = headerProvider.createMessageRequest(device, dragXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);  
1355 - logger.debug("拉框信令: " + request.toString());  
1356 - transmitRequest(device.getTransport(), request);  
1357 - }  
1358 -  
1359 -  
1360 - @Override  
1361 - public void transmitRequest(String transport, Request request) throws SipException, ParseException {  
1362 - transmitRequest(transport, request, null, null);  
1363 - }  
1364 1337
1365 - @Override  
1366 - public void transmitRequest(String transport, Request request, SipSubscribe.Event errorEvent) throws SipException, ParseException {  
1367 - transmitRequest(transport, request, errorEvent, null); 1338 + Request request = headerProvider.createMessageRequest(device, dragXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  1339 + logger.debug("拉框信令: " + request.toString());
  1340 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request);
1368 } 1341 }
1369 1342
1370 - @Override  
1371 - public void transmitRequest(String transport, Request request, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent) throws SipException, ParseException {  
1372 -  
1373 - if (request.getHeader(UserAgentHeader.NAME) == null) {  
1374 - try {  
1375 - request.addHeader(SipUtils.createUserAgentHeader(sipFactory, gitUtil));  
1376 - } catch (ParseException e) {  
1377 - logger.error("添加UserAgentHeader失败", e);  
1378 - }  
1379 - }  
1380 1343
1381 - CallIdHeader callIdHeader = (CallIdHeader) request.getHeader(CallIdHeader.NAME);  
1382 - // 添加错误订阅  
1383 - if (errorEvent != null) {  
1384 - sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), (eventResult -> {  
1385 - errorEvent.response(eventResult);  
1386 - sipSubscribe.removeErrorSubscribe(eventResult.callId);  
1387 - sipSubscribe.removeOkSubscribe(eventResult.callId);  
1388 - }));  
1389 - }  
1390 - // 添加订阅  
1391 - if (okEvent != null) {  
1392 - sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), eventResult -> {  
1393 - okEvent.response(eventResult);  
1394 - sipSubscribe.removeOkSubscribe(eventResult.callId);  
1395 - sipSubscribe.removeErrorSubscribe(eventResult.callId);  
1396 - });  
1397 - }  
1398 - if ("TCP".equals(transport)) {  
1399 - tcpSipProvider.sendRequest(request);  
1400 - } else if ("UDP".equals(transport)) {  
1401 - udpSipProvider.sendRequest(request);  
1402 - }  
1403 1344
1404 - }  
1405 1345
1406 1346
1407 /** 1347 /**
@@ -1476,7 +1416,7 @@ public class SIPCommander implements ISIPCommander { @@ -1476,7 +1416,7 @@ public class SIPCommander implements ISIPCommander {
1476 return; 1416 return;
1477 } 1417 }
1478 1418
1479 - transmitRequest(device.getTransport(), request, errorEvent, okEvent); 1419 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent, okEvent);
1480 } 1420 }
1481 1421
1482 @Override 1422 @Override
@@ -1505,10 +1445,9 @@ public class SIPCommander implements ISIPCommander { @@ -1505,10 +1445,9 @@ public class SIPCommander implements ISIPCommander {
1505 deviceStatusXml.append("</info>\r\n"); 1445 deviceStatusXml.append("</info>\r\n");
1506 deviceStatusXml.append("</Notify>\r\n"); 1446 deviceStatusXml.append("</Notify>\r\n");
1507 1447
1508 - CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
1509 - : udpSipProvider.getNewCallId();  
1510 - Request request = headerProvider.createMessageRequest(device, deviceStatusXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null, callIdHeader);  
1511 - transmitRequest(device.getTransport(), request); 1448 +
  1449 + Request request = headerProvider.createMessageRequest(device, deviceStatusXml.toString(), SipUtils.getNewViaTag(), SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()));
  1450 + sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()),request);
1512 1451
1513 1452
1514 } 1453 }
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.fastjson.JSONObject; 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;
  8 +import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
6 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; 9 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
7 import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderPlarformProvider; 10 import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderPlarformProvider;
8 import com.genersoft.iot.vmp.gb28181.utils.SipUtils; 11 import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
@@ -13,15 +16,12 @@ import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; @@ -13,15 +16,12 @@ import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
13 import com.genersoft.iot.vmp.service.IMediaServerService; 16 import com.genersoft.iot.vmp.service.IMediaServerService;
14 import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; 17 import com.genersoft.iot.vmp.service.bean.GPSMsgInfo;
15 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 18 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
16 -import gov.nist.javax.sip.SipProviderImpl;  
17 import gov.nist.javax.sip.message.MessageFactoryImpl; 19 import gov.nist.javax.sip.message.MessageFactoryImpl;
18 import gov.nist.javax.sip.message.SIPRequest; 20 import gov.nist.javax.sip.message.SIPRequest;
19 import org.slf4j.Logger; 21 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory; 22 import org.slf4j.LoggerFactory;
21 import org.springframework.beans.factory.annotation.Autowired; 23 import org.springframework.beans.factory.annotation.Autowired;
22 -import org.springframework.beans.factory.annotation.Qualifier;  
23 import org.springframework.context.annotation.DependsOn; 24 import org.springframework.context.annotation.DependsOn;
24 -import org.springframework.context.annotation.Lazy;  
25 import org.springframework.lang.Nullable; 25 import org.springframework.lang.Nullable;
26 import org.springframework.stereotype.Component; 26 import org.springframework.stereotype.Component;
27 import org.springframework.util.ObjectUtils; 27 import org.springframework.util.ObjectUtils;
@@ -56,21 +56,11 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -56,21 +56,11 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
56 @Autowired 56 @Autowired
57 private ZLMRTPServerFactory zlmrtpServerFactory; 57 private ZLMRTPServerFactory zlmrtpServerFactory;
58 58
59 - @Lazy  
60 @Autowired 59 @Autowired
61 - @Qualifier(value="tcpSipProvider")  
62 - private SipProviderImpl tcpSipProvider; 60 + private SipLayer sipLayer;
63 61
64 - @Lazy  
65 @Autowired 62 @Autowired
66 - @Qualifier(value="udpSipProvider")  
67 - private SipProviderImpl udpSipProvider;  
68 -  
69 - @Autowired  
70 - private SipFactory sipFactory;  
71 -  
72 - @Autowired  
73 - private SubscribeHolder subscribeHolder; 63 + private SIPSender sipSender;
74 64
75 @Override 65 @Override
76 public void register(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws InvalidArgumentException, ParseException, SipException { 66 public void register(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws InvalidArgumentException, ParseException, SipException {
@@ -87,13 +77,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -87,13 +77,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
87 SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent, boolean registerAgain, boolean isRegister) throws SipException, InvalidArgumentException, ParseException { 77 SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent, boolean registerAgain, boolean isRegister) throws SipException, InvalidArgumentException, ParseException {
88 Request request; 78 Request request;
89 if (!registerAgain ) { 79 if (!registerAgain ) {
90 - CallIdHeader callIdHeader = null;  
91 - if(parentPlatform.getTransport().equalsIgnoreCase("TCP")) {  
92 - callIdHeader = tcpSipProvider.getNewCallId();  
93 - }  
94 - if(parentPlatform.getTransport().equalsIgnoreCase("UDP")) {  
95 - callIdHeader = udpSipProvider.getNewCallId();  
96 - } 80 + CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
97 81
98 request = headerProviderPlatformProvider.createRegisterRequest(parentPlatform, 82 request = headerProviderPlatformProvider.createRegisterRequest(parentPlatform,
99 redisCatchStorage.getCSEQ(), SipUtils.getNewFromTag(), 83 redisCatchStorage.getCSEQ(), SipUtils.getNewFromTag(),
@@ -115,12 +99,11 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -115,12 +99,11 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
115 }); 99 });
116 100
117 }else { 101 }else {
118 - CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()  
119 - : udpSipProvider.getNewCallId(); 102 + CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
120 request = headerProviderPlatformProvider.createRegisterRequest(parentPlatform, SipUtils.getNewFromTag(), null, callId, www, callIdHeader, isRegister); 103 request = headerProviderPlatformProvider.createRegisterRequest(parentPlatform, SipUtils.getNewFromTag(), null, callId, www, callIdHeader, isRegister);
121 } 104 }
122 105
123 - transmitRequest(parentPlatform, request, null, okEvent); 106 + sipSender.transmitRequest(parentPlatform.getDeviceIp(), request, null, okEvent);
124 } 107 }
125 108
126 @Override 109 @Override
@@ -135,8 +118,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -135,8 +118,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
135 keepaliveXml.append("<Status>OK</Status>\r\n"); 118 keepaliveXml.append("<Status>OK</Status>\r\n");
136 keepaliveXml.append("</Notify>\r\n"); 119 keepaliveXml.append("</Notify>\r\n");
137 120
138 - CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()  
139 - : udpSipProvider.getNewCallId(); 121 + CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
140 122
141 Request request = headerProviderPlatformProvider.createMessageRequest( 123 Request request = headerProviderPlatformProvider.createMessageRequest(
142 parentPlatform, 124 parentPlatform,
@@ -144,39 +126,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -144,39 +126,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
144 SipUtils.getNewFromTag(), 126 SipUtils.getNewFromTag(),
145 SipUtils.getNewViaTag(), 127 SipUtils.getNewViaTag(),
146 callIdHeader); 128 callIdHeader);
147 - transmitRequest(parentPlatform, request, errorEvent, okEvent); 129 + sipSender.transmitRequest(parentPlatform.getDeviceIp(), request, errorEvent, okEvent);
148 return callIdHeader.getCallId(); 130 return callIdHeader.getCallId();
149 } 131 }
150 132
151 - private void transmitRequest(ParentPlatform parentPlatform, Request request) throws SipException {  
152 - transmitRequest(parentPlatform, request, null, null);  
153 - }  
154 -  
155 - private void transmitRequest(ParentPlatform parentPlatform, Request request, SipSubscribe.Event errorEvent) throws SipException {  
156 - transmitRequest(parentPlatform, request, errorEvent, null);  
157 - }  
158 -  
159 - private void transmitRequest(ParentPlatform parentPlatform, Request request, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws SipException {  
160 - logger.debug("\n发送消息:\n{}", request);  
161 - if("TCP".equalsIgnoreCase(parentPlatform.getTransport())) {  
162 - tcpSipProvider.sendRequest(request);  
163 -  
164 - } else if("UDP".equalsIgnoreCase(parentPlatform.getTransport())) {  
165 - udpSipProvider.sendRequest(request);  
166 - }  
167 -  
168 - CallIdHeader callIdHeader = (CallIdHeader)request.getHeader(CallIdHeader.NAME);  
169 - // 添加错误订阅  
170 - if (errorEvent != null) {  
171 - sipSubscribe.addErrorSubscribe(callIdHeader.getCallId(), errorEvent);  
172 - }  
173 - // 添加订阅  
174 - if (okEvent != null) {  
175 - sipSubscribe.addOkSubscribe(callIdHeader.getCallId(), okEvent);  
176 - }  
177 -  
178 - }  
179 -  
180 /** 133 /**
181 * 向上级回复通道信息 134 * 向上级回复通道信息
182 * @param channel 通道信息 135 * @param channel 通道信息
@@ -196,11 +149,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -196,11 +149,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
196 String catalogXml = getCatalogXml(channels, sn, parentPlatform, size); 149 String catalogXml = getCatalogXml(channels, sn, parentPlatform, size);
197 150
198 // callid 151 // callid
199 - CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()  
200 - : udpSipProvider.getNewCallId(); 152 + CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
201 153
202 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, catalogXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); 154 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, catalogXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader);
203 - transmitRequest(parentPlatform, request); 155 + sipSender.transmitRequest(parentPlatform.getDeviceIp(), request);
204 156
205 } 157 }
206 158
@@ -283,11 +235,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -283,11 +235,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
283 } 235 }
284 String catalogXml = getCatalogXml(deviceChannels, sn, parentPlatform, channels.size()); 236 String catalogXml = getCatalogXml(deviceChannels, sn, parentPlatform, channels.size());
285 // callid 237 // callid
286 - CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()  
287 - : udpSipProvider.getNewCallId(); 238 + CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
288 239
289 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, catalogXml, fromTag, SipUtils.getNewViaTag(), callIdHeader); 240 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, catalogXml, fromTag, SipUtils.getNewViaTag(), callIdHeader);
290 - transmitRequest(parentPlatform, request, null, eventResult -> { 241 + sipSender.transmitRequest(parentPlatform.getDeviceIp(), request, null, eventResult -> {
291 int indexNext = index + parentPlatform.getCatalogGroup(); 242 int indexNext = index + parentPlatform.getCatalogGroup();
292 try { 243 try {
293 sendCatalogResponse(channels, parentPlatform, sn, fromTag, indexNext); 244 sendCatalogResponse(channels, parentPlatform, sn, fromTag, indexNext);
@@ -323,11 +274,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -323,11 +274,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
323 deviceInfoXml.append("<Result>OK</Result>\r\n"); 274 deviceInfoXml.append("<Result>OK</Result>\r\n");
324 deviceInfoXml.append("</Response>\r\n"); 275 deviceInfoXml.append("</Response>\r\n");
325 276
326 - CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()  
327 - : udpSipProvider.getNewCallId(); 277 + CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
328 278
329 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceInfoXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); 279 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceInfoXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader);
330 - transmitRequest(parentPlatform, request); 280 + sipSender.transmitRequest(parentPlatform.getDeviceIp(), request);
331 } 281 }
332 282
333 /** 283 /**
@@ -354,11 +304,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -354,11 +304,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
354 deviceStatusXml.append("<Status>OK</Status>\r\n"); 304 deviceStatusXml.append("<Status>OK</Status>\r\n");
355 deviceStatusXml.append("</Response>\r\n"); 305 deviceStatusXml.append("</Response>\r\n");
356 306
357 - CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()  
358 - : udpSipProvider.getNewCallId(); 307 + CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
359 308
360 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); 309 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader);
361 - transmitRequest(parentPlatform, request); 310 + sipSender.transmitRequest(parentPlatform.getDeviceIp(), request);
362 311
363 } 312 }
364 313
@@ -398,7 +347,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -398,7 +347,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
398 return; 347 return;
399 } 348 }
400 logger.info("[发送报警通知] {}/{}->{},{}: {}", parentPlatform.getServerGBId(), deviceAlarm.getChannelId(), 349 logger.info("[发送报警通知] {}/{}->{},{}: {}", parentPlatform.getServerGBId(), deviceAlarm.getChannelId(),
401 - deviceAlarm.getLongitude(), deviceAlarm.getLatitude(), JSONObject.toJSON(deviceAlarm)); 350 + deviceAlarm.getLongitude(), deviceAlarm.getLatitude(), JSON.toJSONString(deviceAlarm));
402 String characterSet = parentPlatform.getCharacterSet(); 351 String characterSet = parentPlatform.getCharacterSet();
403 StringBuffer deviceStatusXml = new StringBuffer(600); 352 StringBuffer deviceStatusXml = new StringBuffer(600);
404 deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); 353 deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
@@ -417,11 +366,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -417,11 +366,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
417 deviceStatusXml.append("</info>\r\n"); 366 deviceStatusXml.append("</info>\r\n");
418 deviceStatusXml.append("</Notify>\r\n"); 367 deviceStatusXml.append("</Notify>\r\n");
419 368
420 - CallIdHeader callIdHeader = parentPlatform.getTransport().equalsIgnoreCase("TCP") ? tcpSipProvider.getNewCallId()  
421 - : udpSipProvider.getNewCallId(); 369 + CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
422 370
423 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), SipUtils.getNewFromTag(), SipUtils.getNewViaTag(), callIdHeader); 371 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), SipUtils.getNewFromTag(), SipUtils.getNewViaTag(), callIdHeader);
424 - transmitRequest(parentPlatform, request); 372 + sipSender.transmitRequest(parentPlatform.getDeviceIp(), request);
425 373
426 } 374 }
427 375
@@ -461,14 +409,14 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -461,14 +409,14 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
461 private void sendNotify(ParentPlatform parentPlatform, String catalogXmlContent, 409 private void sendNotify(ParentPlatform parentPlatform, String catalogXmlContent,
462 SubscribeInfo subscribeInfo, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent ) 410 SubscribeInfo subscribeInfo, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent )
463 throws SipException, ParseException, InvalidArgumentException { 411 throws SipException, ParseException, InvalidArgumentException {
464 - MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipFactory.createMessageFactory(); 412 + MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipLayer.getSipFactory().createMessageFactory();
465 String characterSet = parentPlatform.getCharacterSet(); 413 String characterSet = parentPlatform.getCharacterSet();
466 // 设置编码, 防止中文乱码 414 // 设置编码, 防止中文乱码
467 messageFactory.setDefaultContentEncodingCharset(characterSet); 415 messageFactory.setDefaultContentEncodingCharset(characterSet);
468 416
469 SIPRequest notifyRequest = headerProviderPlatformProvider.createNotifyRequest(parentPlatform, catalogXmlContent, subscribeInfo); 417 SIPRequest notifyRequest = headerProviderPlatformProvider.createNotifyRequest(parentPlatform, catalogXmlContent, subscribeInfo);
470 418
471 - transmitRequest(parentPlatform, notifyRequest); 419 + sipSender.transmitRequest(parentPlatform.getDeviceIp(), notifyRequest);
472 } 420 }
473 421
474 private String getCatalogXmlContentForCatalogAddOrUpdate(ParentPlatform parentPlatform, List<DeviceChannel> channels, int sumNum, String type, SubscribeInfo subscribeInfo) { 422 private String getCatalogXmlContentForCatalogAddOrUpdate(ParentPlatform parentPlatform, List<DeviceChannel> channels, int sumNum, String type, SubscribeInfo subscribeInfo) {
@@ -633,21 +581,21 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -633,21 +581,21 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
633 recordXml.append("</Response>\r\n"); 581 recordXml.append("</Response>\r\n");
634 582
635 // callid 583 // callid
636 - CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()  
637 - : udpSipProvider.getNewCallId(); 584 + CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport());
  585 +
638 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, recordXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); 586 Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, recordXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader);
639 - transmitRequest(parentPlatform, request); 587 + sipSender.transmitRequest(parentPlatform.getDeviceIp(), request);
640 588
641 } 589 }
642 590
643 @Override 591 @Override
644 - public void sendMediaStatusNotify(ParentPlatform platform, SendRtpItem sendRtpItem) throws SipException, InvalidArgumentException, ParseException {  
645 - if (sendRtpItem == null || platform == null) { 592 + public void sendMediaStatusNotify(ParentPlatform parentPlatform, SendRtpItem sendRtpItem) throws SipException, InvalidArgumentException, ParseException {
  593 + if (sendRtpItem == null || parentPlatform == null) {
646 return; 594 return;
647 } 595 }
648 596
649 597
650 - String characterSet = platform.getCharacterSet(); 598 + String characterSet = parentPlatform.getCharacterSet();
651 StringBuffer mediaStatusXml = new StringBuffer(200); 599 StringBuffer mediaStatusXml = new StringBuffer(200);
652 mediaStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); 600 mediaStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n");
653 mediaStatusXml.append("<Notify>\r\n"); 601 mediaStatusXml.append("<Notify>\r\n");
@@ -657,10 +605,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -657,10 +605,10 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
657 mediaStatusXml.append("<NotifyType>121</NotifyType>\r\n"); 605 mediaStatusXml.append("<NotifyType>121</NotifyType>\r\n");
658 mediaStatusXml.append("</Notify>\r\n"); 606 mediaStatusXml.append("</Notify>\r\n");
659 607
660 - SIPRequest messageRequest = (SIPRequest)headerProviderPlatformProvider.createMessageRequest(platform, mediaStatusXml.toString(), 608 + SIPRequest messageRequest = (SIPRequest)headerProviderPlatformProvider.createMessageRequest(parentPlatform, mediaStatusXml.toString(),
661 sendRtpItem); 609 sendRtpItem);
662 610
663 - transmitRequest(platform, messageRequest); 611 + sipSender.transmitRequest(parentPlatform.getDeviceIp(),messageRequest);
664 612
665 } 613 }
666 614
@@ -681,21 +629,21 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform { @@ -681,21 +629,21 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
681 logger.info("[向上级发送BYE], sendRtpItem 为NULL"); 629 logger.info("[向上级发送BYE], sendRtpItem 为NULL");
682 return; 630 return;
683 } 631 }
684 - if (platform == null) { 632 + if (parentPlatform == null) {
685 logger.info("[向上级发送BYE], platform 为NULL"); 633 logger.info("[向上级发送BYE], platform 为NULL");
686 return; 634 return;
687 } 635 }
688 - logger.info("[向上级发送BYE], {}/{}", platform.getServerGBId(), sendRtpItem.getChannelId()); 636 + logger.info("[向上级发送BYE], {}/{}", parentPlatform.getServerGBId(), sendRtpItem.getChannelId());
689 String mediaServerId = sendRtpItem.getMediaServerId(); 637 String mediaServerId = sendRtpItem.getMediaServerId();
690 MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId); 638 MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);
691 if (mediaServerItem != null) { 639 if (mediaServerItem != null) {
692 mediaServerService.releaseSsrc(mediaServerItem.getId(), sendRtpItem.getSsrc()); 640 mediaServerService.releaseSsrc(mediaServerItem.getId(), sendRtpItem.getSsrc());
693 - zlmrtpServerFactory.closeRTPServer(mediaServerItem, sendRtpItem.getStreamId()); 641 + zlmrtpServerFactory.closeRtpServer(mediaServerItem, sendRtpItem.getStreamId());
694 } 642 }
695 - SIPRequest byeRequest = headerProviderPlatformProvider.createByeRequest(platform, sendRtpItem); 643 + SIPRequest byeRequest = headerProviderPlatformProvider.createByeRequest(parentPlatform, sendRtpItem);
696 if (byeRequest == null) { 644 if (byeRequest == null) {
697 logger.warn("[向上级发送bye]:无法创建 byeRequest"); 645 logger.warn("[向上级发送bye]:无法创建 byeRequest");
698 } 646 }
699 - transmitRequest(platform,byeRequest); 647 + sipSender.transmitRequest(parentPlatform.getDeviceIp(),byeRequest);
700 } 648 }
701 } 649 }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java
@@ -2,9 +2,9 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request; @@ -2,9 +2,9 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request;
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.bean.ParentPlatform; 4 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
  5 +import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
5 import com.genersoft.iot.vmp.gb28181.utils.SipUtils; 6 import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
6 import gov.nist.javax.sip.SipProviderImpl; 7 import gov.nist.javax.sip.SipProviderImpl;
7 -import gov.nist.javax.sip.SipStackImpl;  
8 import gov.nist.javax.sip.message.SIPRequest; 8 import gov.nist.javax.sip.message.SIPRequest;
9 import gov.nist.javax.sip.message.SIPResponse; 9 import gov.nist.javax.sip.message.SIPResponse;
10 import gov.nist.javax.sip.stack.SIPServerTransactionImpl; 10 import gov.nist.javax.sip.stack.SIPServerTransactionImpl;
@@ -42,58 +42,8 @@ public abstract class SIPRequestProcessorParent { @@ -42,58 +42,8 @@ public abstract class SIPRequestProcessorParent {
42 private final static Logger logger = LoggerFactory.getLogger(SIPRequestProcessorParent.class); 42 private final static Logger logger = LoggerFactory.getLogger(SIPRequestProcessorParent.class);
43 43
44 @Autowired 44 @Autowired
45 - @Qualifier(value="tcpSipProvider")  
46 - private SipProviderImpl tcpSipProvider; 45 + private SIPSender sipSender;
47 46
48 - @Autowired  
49 - @Qualifier(value="udpSipProvider")  
50 - private SipProviderImpl udpSipProvider;  
51 -  
52 - @Autowired  
53 - private SipConfig sipConfig;  
54 -  
55 - /**  
56 - * 根据 RequestEvent 获取 ServerTransaction  
57 - * @param evt  
58 - * @return  
59 - */  
60 - public ServerTransaction getServerTransaction(RequestEvent evt) {  
61 - Request request = evt.getRequest();  
62 - SIPServerTransactionImpl serverTransaction = (SIPServerTransactionImpl)evt.getServerTransaction();  
63 - // 判断TCP还是UDP  
64 - boolean isTcp = false;  
65 - ViaHeader reqViaHeader = (ViaHeader) request.getHeader(ViaHeader.NAME);  
66 - String transport = reqViaHeader.getTransport();  
67 - if (transport.equalsIgnoreCase("TCP")) {  
68 - isTcp = true;  
69 - }  
70 - if (serverTransaction != null && serverTransaction.getOriginalRequest() == null) {  
71 - serverTransaction.setOriginalRequest((SIPRequest) evt.getRequest());  
72 - }  
73 - if (serverTransaction == null) {  
74 - try {  
75 - if (isTcp) {  
76 - SipStackImpl stack = (SipStackImpl)tcpSipProvider.getSipStack();  
77 - serverTransaction = (SIPServerTransactionImpl) stack.findTransaction((SIPRequest)request, true);  
78 - if (serverTransaction == null) {  
79 - serverTransaction = (SIPServerTransactionImpl)tcpSipProvider.getNewServerTransaction(request);  
80 - }  
81 - } else {  
82 - SipStackImpl stack = (SipStackImpl)udpSipProvider.getSipStack();  
83 - serverTransaction = (SIPServerTransactionImpl) stack.findTransaction((SIPRequest)request, true);  
84 - if (serverTransaction == null) {  
85 - serverTransaction = (SIPServerTransactionImpl)udpSipProvider.getNewServerTransaction(request);  
86 - }  
87 - }  
88 - } catch (TransactionAlreadyExistsException e) {  
89 - logger.error(e.getMessage());  
90 - } catch (TransactionUnavailableException e) {  
91 - logger.error(e.getMessage());  
92 - }  
93 - }  
94 - return serverTransaction;  
95 - }  
96 -  
97 public AddressFactory getAddressFactory() { 47 public AddressFactory getAddressFactory() {
98 try { 48 try {
99 return SipFactory.getInstance().createAddressFactory(); 49 return SipFactory.getInstance().createAddressFactory();
@@ -135,25 +85,73 @@ public abstract class SIPRequestProcessorParent { @@ -135,25 +85,73 @@ public abstract class SIPRequestProcessorParent {
135 * 400 85 * 400
136 * 404 86 * 404
137 */ 87 */
138 - public SIPResponse responseAck(ServerTransaction serverTransaction, int statusCode) throws SipException, InvalidArgumentException, ParseException {  
139 - return responseAck(serverTransaction, statusCode, null); 88 + public SIPResponse responseAck(SIPRequest sipRequest, int statusCode) throws SipException, InvalidArgumentException, ParseException {
  89 + return responseAck(sipRequest, statusCode, null);
140 } 90 }
141 91
142 - public SIPResponse responseAck(ServerTransaction serverTransaction, int statusCode, String msg) throws SipException, InvalidArgumentException, ParseException {  
143 - return responseAck(serverTransaction, statusCode, msg, null); 92 + public SIPResponse responseAck(SIPRequest sipRequest, int statusCode, String msg) throws SipException, InvalidArgumentException, ParseException {
  93 + return responseAck(sipRequest, statusCode, msg, null);
144 } 94 }
145 95
146 - public SIPResponse responseAck(ServerTransaction serverTransaction, int statusCode, String msg, ResponseAckExtraParam responseAckExtraParam) throws SipException, InvalidArgumentException, ParseException {  
147 - ToHeader toHeader = (ToHeader) serverTransaction.getRequest().getHeader(ToHeader.NAME);  
148 - if (toHeader.getTag() == null) {  
149 - toHeader.setTag(SipUtils.getNewTag()); 96 +// public SIPResponse responseAck(ServerTransaction serverTransaction, int statusCode, String msg, ResponseAckExtraParam responseAckExtraParam) throws SipException, InvalidArgumentException, ParseException {
  97 +// if (serverTransaction == null) {
  98 +// logger.warn("[回复消息] ServerTransaction 为null");
  99 +// return null;
  100 +// }
  101 +// ToHeader toHeader = (ToHeader) serverTransaction.getRequest().getHeader(ToHeader.NAME);
  102 +// if (toHeader.getTag() == null) {
  103 +// toHeader.setTag(SipUtils.getNewTag());
  104 +// }
  105 +// SIPResponse response = (SIPResponse)getMessageFactory().createResponse(statusCode, serverTransaction.getRequest());
  106 +// if (msg != null) {
  107 +// response.setReasonPhrase(msg);
  108 +// }
  109 +// if (responseAckExtraParam != null) {
  110 +// if (responseAckExtraParam.sipURI != null && serverTransaction.getRequest().getMethod().equals(Request.INVITE)) {
  111 +// logger.debug("responseSdpAck SipURI: {}:{}", responseAckExtraParam.sipURI.getHost(), responseAckExtraParam.sipURI.getPort());
  112 +// Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(
  113 +// SipFactory.getInstance().createAddressFactory().createSipURI(responseAckExtraParam.sipURI.getUser(), responseAckExtraParam.sipURI.getHost()+":"+responseAckExtraParam.sipURI.getPort()
  114 +// ));
  115 +// response.addHeader(SipFactory.getInstance().createHeaderFactory().createContactHeader(concatAddress));
  116 +// }
  117 +// if (responseAckExtraParam.contentTypeHeader != null) {
  118 +// response.setContent(responseAckExtraParam.content, responseAckExtraParam.contentTypeHeader);
  119 +// }
  120 +//
  121 +// if (serverTransaction.getRequest().getMethod().equals(Request.SUBSCRIBE)) {
  122 +// if (responseAckExtraParam.expires == -1) {
  123 +// logger.error("[参数不全] 2xx的SUBSCRIBE回复,必须设置Expires header");
  124 +// }else {
  125 +// ExpiresHeader expiresHeader = SipFactory.getInstance().createHeaderFactory().createExpiresHeader(responseAckExtraParam.expires);
  126 +// response.addHeader(expiresHeader);
  127 +// }
  128 +// }
  129 +// }else {
  130 +// if (serverTransaction.getRequest().getMethod().equals(Request.SUBSCRIBE)) {
  131 +// logger.error("[参数不全] 2xx的SUBSCRIBE回复,必须设置Expires header");
  132 +// }
  133 +// }
  134 +// serverTransaction.sendResponse(response);
  135 +// if (statusCode >= 200 && !"NOTIFY".equalsIgnoreCase(serverTransaction.getRequest().getMethod())) {
  136 +// if (serverTransaction.getDialog() != null) {
  137 +// serverTransaction.getDialog().delete();
  138 +// }
  139 +// }
  140 +// return response;
  141 +// }
  142 +
  143 + public SIPResponse responseAck(SIPRequest sipRequest, int statusCode, String msg, ResponseAckExtraParam responseAckExtraParam) throws SipException, InvalidArgumentException, ParseException {
  144 + if (sipRequest.getToHeader().getTag() == null) {
  145 + sipRequest.getToHeader().setTag(SipUtils.getNewTag());
150 } 146 }
151 - SIPResponse response = (SIPResponse)getMessageFactory().createResponse(statusCode, serverTransaction.getRequest()); 147 + SIPResponse response = (SIPResponse)getMessageFactory().createResponse(statusCode, sipRequest);
  148 + response.setStatusCode(statusCode);
152 if (msg != null) { 149 if (msg != null) {
153 response.setReasonPhrase(msg); 150 response.setReasonPhrase(msg);
154 } 151 }
  152 +
155 if (responseAckExtraParam != null) { 153 if (responseAckExtraParam != null) {
156 - if (responseAckExtraParam.sipURI != null && serverTransaction.getRequest().getMethod().equals(Request.INVITE)) { 154 + if (responseAckExtraParam.sipURI != null && sipRequest.getMethod().equals(Request.INVITE)) {
157 logger.debug("responseSdpAck SipURI: {}:{}", responseAckExtraParam.sipURI.getHost(), responseAckExtraParam.sipURI.getPort()); 155 logger.debug("responseSdpAck SipURI: {}:{}", responseAckExtraParam.sipURI.getHost(), responseAckExtraParam.sipURI.getPort());
158 Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress( 156 Address concatAddress = SipFactory.getInstance().createAddressFactory().createAddress(
159 SipFactory.getInstance().createAddressFactory().createSipURI(responseAckExtraParam.sipURI.getUser(), responseAckExtraParam.sipURI.getHost()+":"+responseAckExtraParam.sipURI.getPort() 157 SipFactory.getInstance().createAddressFactory().createSipURI(responseAckExtraParam.sipURI.getUser(), responseAckExtraParam.sipURI.getHost()+":"+responseAckExtraParam.sipURI.getPort()
@@ -164,7 +162,7 @@ public abstract class SIPRequestProcessorParent { @@ -164,7 +162,7 @@ public abstract class SIPRequestProcessorParent {
164 response.setContent(responseAckExtraParam.content, responseAckExtraParam.contentTypeHeader); 162 response.setContent(responseAckExtraParam.content, responseAckExtraParam.contentTypeHeader);
165 } 163 }
166 164
167 - if (serverTransaction.getRequest().getMethod().equals(Request.SUBSCRIBE)) { 165 + if (sipRequest.getMethod().equals(Request.SUBSCRIBE)) {
168 if (responseAckExtraParam.expires == -1) { 166 if (responseAckExtraParam.expires == -1) {
169 logger.error("[参数不全] 2xx的SUBSCRIBE回复,必须设置Expires header"); 167 logger.error("[参数不全] 2xx的SUBSCRIBE回复,必须设置Expires header");
170 }else { 168 }else {
@@ -173,27 +171,26 @@ public abstract class SIPRequestProcessorParent { @@ -173,27 +171,26 @@ public abstract class SIPRequestProcessorParent {
173 } 171 }
174 } 172 }
175 }else { 173 }else {
176 - if (serverTransaction.getRequest().getMethod().equals(Request.SUBSCRIBE)) { 174 + if (sipRequest.getMethod().equals(Request.SUBSCRIBE)) {
177 logger.error("[参数不全] 2xx的SUBSCRIBE回复,必须设置Expires header"); 175 logger.error("[参数不全] 2xx的SUBSCRIBE回复,必须设置Expires header");
178 } 176 }
179 } 177 }
180 - serverTransaction.sendResponse(response);  
181 - if (statusCode >= 200 && !"NOTIFY".equalsIgnoreCase(serverTransaction.getRequest().getMethod())) {  
182 - if (serverTransaction.getDialog() != null) {  
183 - serverTransaction.getDialog().delete();  
184 - }  
185 - } 178 +
  179 + // 发送response
  180 + sipSender.transmitRequest(sipRequest.getLocalAddress().getHostAddress(), response);
  181 +
186 return response; 182 return response;
187 } 183 }
188 184
189 /** 185 /**
190 * 回复带sdp的200 186 * 回复带sdp的200
191 */ 187 */
192 - public SIPResponse responseSdpAck(ServerTransaction serverTransaction, String sdp, ParentPlatform platform) throws SipException, InvalidArgumentException, ParseException { 188 + public SIPResponse responseSdpAck(SIPRequest request, String sdp, ParentPlatform platform) throws SipException, InvalidArgumentException, ParseException {
  189 +
193 ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); 190 ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP");
194 191
195 // 兼容国标中的使用编码@域名作为RequestURI的情况 192 // 兼容国标中的使用编码@域名作为RequestURI的情况
196 - SipURI sipURI = (SipURI)serverTransaction.getRequest().getRequestURI(); 193 + SipURI sipURI = (SipURI)request.getRequestURI();
197 if (sipURI.getPort() == -1) { 194 if (sipURI.getPort() == -1) {
198 sipURI = SipFactory.getInstance().createAddressFactory().createSipURI(platform.getServerGBId(), platform.getServerIP()+":"+platform.getServerPort()); 195 sipURI = SipFactory.getInstance().createAddressFactory().createSipURI(platform.getServerGBId(), platform.getServerIP()+":"+platform.getServerPort());
199 } 196 }
@@ -202,16 +199,16 @@ public abstract class SIPRequestProcessorParent { @@ -202,16 +199,16 @@ public abstract class SIPRequestProcessorParent {
202 responseAckExtraParam.content = sdp; 199 responseAckExtraParam.content = sdp;
203 responseAckExtraParam.sipURI = sipURI; 200 responseAckExtraParam.sipURI = sipURI;
204 201
205 - return responseAck(serverTransaction, Response.OK, null, responseAckExtraParam); 202 + return responseAck(request, Response.OK, null, responseAckExtraParam);
206 } 203 }
207 204
208 /** 205 /**
209 * 回复带xml的200 206 * 回复带xml的200
210 */ 207 */
211 - public SIPResponse responseXmlAck(ServerTransaction serverTransaction, String xml, ParentPlatform platform, Integer expires) throws SipException, InvalidArgumentException, ParseException { 208 + public SIPResponse responseXmlAck(SIPRequest request, String xml, ParentPlatform platform, Integer expires) throws SipException, InvalidArgumentException, ParseException {
212 ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); 209 ContentTypeHeader contentTypeHeader = SipFactory.getInstance().createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
213 210
214 - SipURI sipURI = (SipURI)serverTransaction.getRequest().getRequestURI(); 211 + SipURI sipURI = (SipURI)request.getRequestURI();
215 if (sipURI.getPort() == -1) { 212 if (sipURI.getPort() == -1) {
216 sipURI = SipFactory.getInstance().createAddressFactory().createSipURI(platform.getServerGBId(), platform.getServerIP()+":"+platform.getServerPort()); 213 sipURI = SipFactory.getInstance().createAddressFactory().createSipURI(platform.getServerGBId(), platform.getServerIP()+":"+platform.getServerPort());
217 } 214 }
@@ -220,7 +217,7 @@ public abstract class SIPRequestProcessorParent { @@ -220,7 +217,7 @@ public abstract class SIPRequestProcessorParent {
220 responseAckExtraParam.content = xml; 217 responseAckExtraParam.content = xml;
221 responseAckExtraParam.sipURI = sipURI; 218 responseAckExtraParam.sipURI = sipURI;
222 responseAckExtraParam.expires = expires; 219 responseAckExtraParam.expires = expires;
223 - return responseAck(serverTransaction, Response.OK, null, responseAckExtraParam); 220 + return responseAck(request, Response.OK, null, responseAckExtraParam);
224 } 221 }
225 222
226 public Element getRootElement(RequestEvent evt) throws DocumentException { 223 public Element getRootElement(RequestEvent evt) throws DocumentException {
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.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.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSON;
  4 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.conf.DynamicTask; 5 import com.genersoft.iot.vmp.conf.DynamicTask;
5 import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; 6 import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
6 import com.genersoft.iot.vmp.gb28181.bean.*; 7 import com.genersoft.iot.vmp.gb28181.bean.*;
@@ -12,8 +13,8 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; @@ -12,8 +13,8 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
12 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; 13 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
13 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; 14 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
14 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; 15 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
15 -import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe;  
16 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; 16 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
  17 +import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe;
17 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; 18 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
18 import com.genersoft.iot.vmp.service.IDeviceService; 19 import com.genersoft.iot.vmp.service.IDeviceService;
19 import com.genersoft.iot.vmp.service.IMediaServerService; 20 import com.genersoft.iot.vmp.service.IMediaServerService;
@@ -40,7 +41,8 @@ import javax.sip.header.HeaderAddress; @@ -40,7 +41,8 @@ import javax.sip.header.HeaderAddress;
40 import java.text.ParseException; 41 import java.text.ParseException;
41 import javax.sip.header.ToHeader; 42 import javax.sip.header.ToHeader;
42 import java.text.ParseException; 43 import java.text.ParseException;
43 -import java.util.*; 44 +import java.util.HashMap;
  45 +import java.util.Map;
44 46
45 /** 47 /**
46 * SIP命令类型: ACK请求 48 * SIP命令类型: ACK请求
@@ -71,6 +73,9 @@ public class AckRequestProcessor extends SIPRequestProcessorParent implements In @@ -71,6 +73,9 @@ public class AckRequestProcessor extends SIPRequestProcessorParent implements In
71 private ZLMRTPServerFactory zlmrtpServerFactory; 73 private ZLMRTPServerFactory zlmrtpServerFactory;
72 74
73 @Autowired 75 @Autowired
  76 + private ZlmHttpHookSubscribe hookSubscribe;
  77 +
  78 + @Autowired
74 private IMediaServerService mediaServerService; 79 private IMediaServerService mediaServerService;
75 80
76 @Autowired 81 @Autowired
@@ -177,8 +182,18 @@ public class AckRequestProcessor extends SIPRequestProcessorParent implements In @@ -177,8 +182,18 @@ public class AckRequestProcessor extends SIPRequestProcessorParent implements In
177 startSendRtpStreamHand(evt, sendRtpItem, parentPlatform, json, param, callIdHeader); 182 startSendRtpStreamHand(evt, sendRtpItem, parentPlatform, json, param, callIdHeader);
178 }); 183 });
179 } else { 184 } else {
180 - JSONObject startSendRtpStreamResult = zlmrtpServerFactory.startSendRtpStream(mediaInfo, param);  
181 - startSendRtpStreamHand(evt, sendRtpItem, parentPlatform, startSendRtpStreamResult, param, callIdHeader); 185 + // 如果是非严格模式,需要关闭端口占用
  186 + JSONObject startSendRtpStreamResult = null;
  187 + if (sendRtpItem.getLocalPort() != 0) {
  188 + if (zlmrtpServerFactory.releasePort(mediaInfo, sendRtpItem.getSsrc())) {
  189 + startSendRtpStreamResult = zlmrtpServerFactory.startSendRtpStream(mediaInfo, param);
  190 + }
  191 + }else {
  192 + startSendRtpStreamResult = zlmrtpServerFactory.startSendRtpStream(mediaInfo, param);
  193 + }
  194 + if (startSendRtpStreamResult != null) {
  195 + startSendRtpStreamHand(evt, sendRtpItem, parentPlatform, startSendRtpStreamResult, param, callIdHeader);
  196 + }
182 } 197 }
183 198
184 199
@@ -192,7 +207,7 @@ public class AckRequestProcessor extends SIPRequestProcessorParent implements In @@ -192,7 +207,7 @@ public class AckRequestProcessor extends SIPRequestProcessorParent implements In
192 logger.info("调用ZLM推流接口, 结果: {}", jsonObject); 207 logger.info("调用ZLM推流接口, 结果: {}", jsonObject);
193 logger.info("RTP推流成功[ {}/{} ],{}->{}:{}, " ,param.get("app"), param.get("stream"), jsonObject.getString("local_port"), param.get("dst_url"), param.get("dst_port")); 208 logger.info("RTP推流成功[ {}/{} ],{}->{}:{}, " ,param.get("app"), param.get("stream"), jsonObject.getString("local_port"), param.get("dst_url"), param.get("dst_port"));
194 } else { 209 } else {
195 - logger.error("RTP推流失败: {}, 参数:{}",jsonObject.getString("msg"),JSONObject.toJSON(param)); 210 + logger.error("RTP推流失败: {}, 参数:{}",jsonObject.getString("msg"), JSON.toJSONString(param));
196 if (sendRtpItem.isOnlyAudio()) { 211 if (sendRtpItem.isOnlyAudio()) {
197 // TODO 可能是语音对讲 212 // TODO 可能是语音对讲
198 }else { 213 }else {
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java
@@ -17,6 +17,7 @@ import com.genersoft.iot.vmp.service.IPlayService; @@ -17,6 +17,7 @@ import com.genersoft.iot.vmp.service.IPlayService;
17 import com.genersoft.iot.vmp.service.bean.MessageForPushChannel; 17 import com.genersoft.iot.vmp.service.bean.MessageForPushChannel;
18 import com.genersoft.iot.vmp.storager.IRedisCatchStorage; 18 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
19 import com.genersoft.iot.vmp.storager.IVideoManagerStorage; 19 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
  20 +import gov.nist.javax.sip.message.SIPRequest;
20 import org.slf4j.Logger; 21 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory; 22 import org.slf4j.LoggerFactory;
22 import org.springframework.beans.factory.InitializingBean; 23 import org.springframework.beans.factory.InitializingBean;
@@ -87,7 +88,7 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In @@ -87,7 +88,7 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In
87 public void process(RequestEvent evt) { 88 public void process(RequestEvent evt) {
88 89
89 try { 90 try {
90 - responseAck(getServerTransaction(evt), Response.OK); 91 + responseAck((SIPRequest) evt.getRequest(), Response.OK);
91 } catch (SipException | InvalidArgumentException | ParseException e) { 92 } catch (SipException | InvalidArgumentException | ParseException e) {
92 logger.error("[回复BYE信息失败],{}", e.getMessage()); 93 logger.error("[回复BYE信息失败],{}", e.getMessage());
93 } 94 }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.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.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.conf.DynamicTask; 4 import com.genersoft.iot.vmp.conf.DynamicTask;
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;
@@ -15,13 +15,15 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; @@ -15,13 +15,15 @@ import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
15 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; 15 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
16 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; 16 import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
17 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; 17 import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
  18 +import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
  19 +import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform;
18 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; 20 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
19 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; 21 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
20 import com.genersoft.iot.vmp.gb28181.utils.SipUtils; 22 import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
21 -import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe;  
22 import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager; 23 import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager;
23 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; 24 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
24 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; 25 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
  26 +import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe;
25 import com.genersoft.iot.vmp.media.zlm.dto.*; 27 import com.genersoft.iot.vmp.media.zlm.dto.*;
26 import com.genersoft.iot.vmp.service.IMediaServerService; 28 import com.genersoft.iot.vmp.service.IMediaServerService;
27 import com.genersoft.iot.vmp.service.IMediaService; 29 import com.genersoft.iot.vmp.service.IMediaService;
@@ -48,12 +50,14 @@ import org.springframework.beans.factory.annotation.Autowired; @@ -48,12 +50,14 @@ import org.springframework.beans.factory.annotation.Autowired;
48 import org.springframework.stereotype.Component; 50 import org.springframework.stereotype.Component;
49 51
50 import javax.sdp.*; 52 import javax.sdp.*;
51 -import javax.sip.*; 53 +import javax.sip.InvalidArgumentException;
  54 +import javax.sip.RequestEvent;
  55 +import javax.sip.SipException;
52 import javax.sip.header.CallIdHeader; 56 import javax.sip.header.CallIdHeader;
53 -import javax.sip.message.Request;  
54 import javax.sip.message.Response; 57 import javax.sip.message.Response;
55 import java.text.ParseException; 58 import java.text.ParseException;
56 import java.time.Instant; 59 import java.time.Instant;
  60 +import java.util.Random;
57 import java.util.Vector; 61 import java.util.Vector;
58 62
59 /** 63 /**
@@ -92,7 +96,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -92,7 +96,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
92 private IPlayService playService; 96 private IPlayService playService;
93 97
94 @Autowired 98 @Autowired
95 - private ISIPCommander commander; 99 + private SIPSender sipSender;
96 100
97 @Autowired 101 @Autowired
98 private AudioBroadcastManager audioBroadcastManager; 102 private AudioBroadcastManager audioBroadcastManager;
@@ -154,16 +158,15 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -154,16 +158,15 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
154 public void process(RequestEvent evt) { 158 public void process(RequestEvent evt) {
155 // Invite Request消息实现,此消息一般为级联消息,上级给下级发送请求视频指令 159 // Invite Request消息实现,此消息一般为级联消息,上级给下级发送请求视频指令
156 try { 160 try {
157 - Request request = evt.getRequest(); 161 + SIPRequest request = (SIPRequest)evt.getRequest();
158 String channelId = SipUtils.getChannelIdFromRequest(request); 162 String channelId = SipUtils.getChannelIdFromRequest(request);
159 String requesterId = SipUtils.getUserIdFromFromHeader(request); 163 String requesterId = SipUtils.getUserIdFromFromHeader(request);
160 CallIdHeader callIdHeader = (CallIdHeader) request.getHeader(CallIdHeader.NAME); 164 CallIdHeader callIdHeader = (CallIdHeader) request.getHeader(CallIdHeader.NAME);
161 - ServerTransaction serverTransaction = getServerTransaction(evt);  
162 - if (requesterId == null) {  
163 - logger.info("无法从FromHeader的Address中获取到平台/设备id,返回400"); 165 + if (requesterId == null || channelId == null) {
  166 + logger.info("无法从FromHeader的Address中获取到平台id,返回400");
164 // 参数不全, 发400,请求错误 167 // 参数不全, 发400,请求错误
165 try { 168 try {
166 - responseAck(serverTransaction, Response.BAD_REQUEST); 169 + responseAck(request, Response.BAD_REQUEST);
167 } catch (SipException | InvalidArgumentException | ParseException e) { 170 } catch (SipException | InvalidArgumentException | ParseException e) {
168 logger.error("[命令发送失败] invite BAD_REQUEST: {}", e.getMessage()); 171 logger.error("[命令发送失败] invite BAD_REQUEST: {}", e.getMessage());
169 } 172 }
@@ -195,7 +198,8 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -195,7 +198,8 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
195 // 查询请求是否来自上级平台\设备 198 // 查询请求是否来自上级平台\设备
196 ParentPlatform platform = storager.queryParentPlatByServerGBId(requesterId); 199 ParentPlatform platform = storager.queryParentPlatByServerGBId(requesterId);
197 if (platform == null) { 200 if (platform == null) {
198 - inviteFromDeviceHandle(serverTransaction, requesterId, channelId); 201 + inviteFromDeviceHandle(request, requesterId, channelId);
  202 +
199 } else { 203 } else {
200 // 查询平台下是否有该通道 204 // 查询平台下是否有该通道
201 DeviceChannel channel = storager.queryChannelInParentPlatform(requesterId, channelId); 205 DeviceChannel channel = storager.queryChannelInParentPlatform(requesterId, channelId);
@@ -207,14 +211,9 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -207,14 +211,9 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
207 StreamProxyItem proxyByAppAndStream =null; 211 StreamProxyItem proxyByAppAndStream =null;
208 // 不是通道可能是直播流 212 // 不是通道可能是直播流
209 if (channel != null && gbStream == null) { 213 if (channel != null && gbStream == null) {
210 -// if (channel.getStatus() == 0) {  
211 -// logger.info("通道离线,返回400");  
212 -// responseAck(serverTransaction, Response.BAD_REQUEST, "channel [" + channel.getChannelId() + "] offline");  
213 -// return;  
214 -// }  
215 // 通道存在,发100,TRYING 214 // 通道存在,发100,TRYING
216 try { 215 try {
217 - responseAck(serverTransaction, Response.TRYING); 216 + responseAck(request, Response.TRYING);
218 } catch (SipException | InvalidArgumentException | ParseException e) { 217 } catch (SipException | InvalidArgumentException | ParseException e) {
219 logger.error("[命令发送失败] invite TRYING: {}", e.getMessage()); 218 logger.error("[命令发送失败] invite TRYING: {}", e.getMessage());
220 } 219 }
@@ -226,7 +225,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -226,7 +225,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
226 if ("proxy".equals(gbStream.getStreamType())) { 225 if ("proxy".equals(gbStream.getStreamType())) {
227 logger.info("[ app={}, stream={} ]找不到zlm {},返回410", gbStream.getApp(), gbStream.getStream(), mediaServerId); 226 logger.info("[ app={}, stream={} ]找不到zlm {},返回410", gbStream.getApp(), gbStream.getStream(), mediaServerId);
228 try { 227 try {
229 - responseAck(serverTransaction, Response.GONE); 228 + responseAck(request, Response.GONE);
230 } catch (SipException | InvalidArgumentException | ParseException e) { 229 } catch (SipException | InvalidArgumentException | ParseException e) {
231 logger.error("[命令发送失败] invite GONE: {}", e.getMessage()); 230 logger.error("[命令发送失败] invite GONE: {}", e.getMessage());
232 } 231 }
@@ -236,7 +235,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -236,7 +235,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
236 if (streamPushItem == null || streamPushItem.getServerId().equals(userSetting.getServerId())) { 235 if (streamPushItem == null || streamPushItem.getServerId().equals(userSetting.getServerId())) {
237 logger.info("[ app={}, stream={} ]找不到zlm {},返回410", gbStream.getApp(), gbStream.getStream(), mediaServerId); 236 logger.info("[ app={}, stream={} ]找不到zlm {},返回410", gbStream.getApp(), gbStream.getStream(), mediaServerId);
238 try { 237 try {
239 - responseAck(serverTransaction, Response.GONE); 238 + responseAck(request, Response.GONE);
240 } catch (SipException | InvalidArgumentException | ParseException e) { 239 } catch (SipException | InvalidArgumentException | ParseException e) {
241 logger.error("[命令发送失败] invite GONE: {}", e.getMessage()); 240 logger.error("[命令发送失败] invite GONE: {}", e.getMessage());
242 } 241 }
@@ -249,7 +248,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -249,7 +248,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
249 if (streamPushItem == null) { 248 if (streamPushItem == null) {
250 logger.info("[ app={}, stream={} ]找不到zlm {},返回410", gbStream.getApp(), gbStream.getStream(), mediaServerId); 249 logger.info("[ app={}, stream={} ]找不到zlm {},返回410", gbStream.getApp(), gbStream.getStream(), mediaServerId);
251 try { 250 try {
252 - responseAck(serverTransaction, Response.GONE); 251 + responseAck(request, Response.GONE);
253 } catch (SipException | InvalidArgumentException | ParseException e) { 252 } catch (SipException | InvalidArgumentException | ParseException e) {
254 logger.error("[命令发送失败] invite GONE: {}", e.getMessage()); 253 logger.error("[命令发送失败] invite GONE: {}", e.getMessage());
255 } 254 }
@@ -260,7 +259,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -260,7 +259,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
260 if (proxyByAppAndStream == null) { 259 if (proxyByAppAndStream == null) {
261 logger.info("[ app={}, stream={} ]找不到zlm {},返回410", gbStream.getApp(), gbStream.getStream(), mediaServerId); 260 logger.info("[ app={}, stream={} ]找不到zlm {},返回410", gbStream.getApp(), gbStream.getStream(), mediaServerId);
262 try { 261 try {
263 - responseAck(serverTransaction, Response.GONE); 262 + responseAck(request, Response.GONE);
264 } catch (SipException | InvalidArgumentException | ParseException e) { 263 } catch (SipException | InvalidArgumentException | ParseException e) {
265 logger.error("[命令发送失败] invite GONE: {}", e.getMessage()); 264 logger.error("[命令发送失败] invite GONE: {}", e.getMessage());
266 } 265 }
@@ -269,14 +268,14 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -269,14 +268,14 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
269 } 268 }
270 } 269 }
271 try { 270 try {
272 - responseAck(serverTransaction, Response.CALL_IS_BEING_FORWARDED); 271 + responseAck(request, Response.CALL_IS_BEING_FORWARDED);
273 } catch (SipException | InvalidArgumentException | ParseException e) { 272 } catch (SipException | InvalidArgumentException | ParseException e) {
274 logger.error("[命令发送失败] invite CALL_IS_BEING_FORWARDED: {}", e.getMessage()); 273 logger.error("[命令发送失败] invite CALL_IS_BEING_FORWARDED: {}", e.getMessage());
275 } 274 }
276 } else if (catalog != null) { 275 } else if (catalog != null) {
277 try { 276 try {
278 // 目录不支持点播 277 // 目录不支持点播
279 - responseAck(serverTransaction, Response.BAD_REQUEST, "catalog channel can not play"); 278 + responseAck(request, Response.BAD_REQUEST, "catalog channel can not play");
280 } catch (SipException | InvalidArgumentException | ParseException e) { 279 } catch (SipException | InvalidArgumentException | ParseException e) {
281 logger.error("[命令发送失败] invite 目录不支持点播: {}", e.getMessage()); 280 logger.error("[命令发送失败] invite 目录不支持点播: {}", e.getMessage());
282 } 281 }
@@ -285,7 +284,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -285,7 +284,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
285 logger.info("通道不存在,返回404"); 284 logger.info("通道不存在,返回404");
286 try { 285 try {
287 // 通道不存在,发404,资源不存在 286 // 通道不存在,发404,资源不存在
288 - responseAck(serverTransaction, Response.NOT_FOUND); 287 + responseAck(request, Response.NOT_FOUND);
289 } catch (SipException | InvalidArgumentException | ParseException e) { 288 } catch (SipException | InvalidArgumentException | ParseException e) {
290 logger.error("[命令发送失败] invite 通道不存在: {}", e.getMessage()); 289 logger.error("[命令发送失败] invite 通道不存在: {}", e.getMessage());
291 } 290 }
@@ -360,7 +359,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -360,7 +359,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
360 // 回复不支持的格式 359 // 回复不支持的格式
361 try { 360 try {
362 // 不支持的格式,发415 361 // 不支持的格式,发415
363 - responseAck(serverTransaction, Response.UNSUPPORTED_MEDIA_TYPE); 362 + responseAck(request, Response.UNSUPPORTED_MEDIA_TYPE);
364 } catch (SipException | InvalidArgumentException | ParseException e) { 363 } catch (SipException | InvalidArgumentException | ParseException e) {
365 logger.error("[命令发送失败] invite 不支持的格式: {}", e.getMessage()); 364 logger.error("[命令发送失败] invite 不支持的格式: {}", e.getMessage());
366 } 365 }
@@ -377,7 +376,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -377,7 +376,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
377 if (device == null) { 376 if (device == null) {
378 logger.warn("点播平台{}的通道{}时未找到设备信息", requesterId, channel); 377 logger.warn("点播平台{}的通道{}时未找到设备信息", requesterId, channel);
379 try { 378 try {
380 - responseAck(serverTransaction, Response.SERVER_INTERNAL_ERROR); 379 + responseAck(request, Response.SERVER_INTERNAL_ERROR);
381 } catch (SipException | InvalidArgumentException | ParseException e) { 380 } catch (SipException | InvalidArgumentException | ParseException e) {
382 logger.error("[命令发送失败] invite 未找到设备信息: {}", e.getMessage()); 381 logger.error("[命令发送失败] invite 未找到设备信息: {}", e.getMessage());
383 } 382 }
@@ -387,7 +386,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -387,7 +386,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
387 if (mediaServerItem == null) { 386 if (mediaServerItem == null) {
388 logger.warn("未找到可用的zlm"); 387 logger.warn("未找到可用的zlm");
389 try { 388 try {
390 - responseAck(serverTransaction, Response.BUSY_HERE); 389 + responseAck(request, Response.BUSY_HERE);
391 } catch (SipException | InvalidArgumentException | ParseException e) { 390 } catch (SipException | InvalidArgumentException | ParseException e) {
392 logger.error("[命令发送失败] invite BUSY_HERE: {}", e.getMessage()); 391 logger.error("[命令发送失败] invite BUSY_HERE: {}", e.getMessage());
393 } 392 }
@@ -403,7 +402,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -403,7 +402,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
403 if (sendRtpItem == null) { 402 if (sendRtpItem == null) {
404 logger.warn("服务器端口资源不足"); 403 logger.warn("服务器端口资源不足");
405 try { 404 try {
406 - responseAck(serverTransaction, Response.BUSY_HERE); 405 + responseAck(request, Response.BUSY_HERE);
407 } catch (SipException | InvalidArgumentException | ParseException e) { 406 } catch (SipException | InvalidArgumentException | ParseException e) {
408 logger.error("[命令发送失败] invite 服务器端口资源不足: {}", e.getMessage()); 407 logger.error("[命令发送失败] invite 服务器端口资源不足: {}", e.getMessage());
409 } 408 }
@@ -435,7 +434,12 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -435,7 +434,12 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
435 } else { 434 } else {
436 content.append("t=0 0\r\n"); 435 content.append("t=0 0\r\n");
437 } 436 }
438 - content.append("m=video " + sendRtpItem.getLocalPort() + " RTP/AVP 96\r\n"); 437 + int localPort = sendRtpItem.getLocalPort();
  438 + if (localPort == 0) {
  439 + // 非严格模式端口不统一, 增加兼容性,修改为一个不为0的端口
  440 + localPort = new Random().nextInt(65535) + 1;
  441 + }
  442 + content.append("m=video " + localPort + " RTP/AVP 96\r\n");
439 content.append("a=sendonly\r\n"); 443 content.append("a=sendonly\r\n");
440 content.append("a=rtpmap:96 PS/90000\r\n"); 444 content.append("a=rtpmap:96 PS/90000\r\n");
441 content.append("y=" + sendRtpItem.getSsrc() + "\r\n"); 445 content.append("y=" + sendRtpItem.getSsrc() + "\r\n");
@@ -453,7 +457,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -453,7 +457,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
453 logger.error("[命令发送失败] 国标级联 发送BYE: {}", e.getMessage()); 457 logger.error("[命令发送失败] 国标级联 发送BYE: {}", e.getMessage());
454 } 458 }
455 }, 60 * 1000); 459 }, 60 * 1000);
456 - responseSdpAck(serverTransaction, content.toString(), platform); 460 + responseSdpAck(request, content.toString(), platform);
457 461
458 } catch (SipException e) { 462 } catch (SipException e) {
459 e.printStackTrace(); 463 e.printStackTrace();
@@ -467,21 +471,15 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -467,21 +471,15 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
467 // 未知错误。直接转发设备点播的错误 471 // 未知错误。直接转发设备点播的错误
468 try { 472 try {
469 Response response = getMessageFactory().createResponse(event.statusCode, evt.getRequest()); 473 Response response = getMessageFactory().createResponse(event.statusCode, evt.getRequest());
470 - serverTransaction.sendResponse(response);  
471 - System.out.println("未知错误。直接转发设备点播的错误");  
472 - if (serverTransaction.getDialog() != null) {  
473 - serverTransaction.getDialog().delete();  
474 - }  
475 - serverTransaction.getDialog().delete();  
476 -  
477 - } catch (ParseException | SipException | InvalidArgumentException e) { 474 + sipSender.transmitRequest(request.getLocalAddress().getHostAddress(), response);
  475 + } catch (ParseException | SipException e) {
478 e.printStackTrace(); 476 e.printStackTrace();
479 } 477 }
480 }); 478 });
481 sendRtpItem.setApp("rtp"); 479 sendRtpItem.setApp("rtp");
482 if ("Playback".equalsIgnoreCase(sessionName)) { 480 if ("Playback".equalsIgnoreCase(sessionName)) {
483 sendRtpItem.setPlayType(InviteStreamType.PLAYBACK); 481 sendRtpItem.setPlayType(InviteStreamType.PLAYBACK);
484 - SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, null, true, true); 482 + SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, null, device.isSsrcCheck(), true);
485 sendRtpItem.setStreamId(ssrcInfo.getStream()); 483 sendRtpItem.setStreamId(ssrcInfo.getStream());
486 // 写入redis, 超时时回复 484 // 写入redis, 超时时回复
487 redisCatchStorage.updateSendRTPSever(sendRtpItem); 485 redisCatchStorage.updateSendRTPSever(sendRtpItem);
@@ -494,13 +492,9 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -494,13 +492,9 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
494 } 492 }
495 redisCatchStorage.deleteSendRTPServer(platform.getServerGBId(), finalChannelId, callIdHeader.getCallId(), null); 493 redisCatchStorage.deleteSendRTPServer(platform.getServerGBId(), finalChannelId, callIdHeader.getCallId(), null);
496 try { 494 try {
497 - responseAck(serverTransaction, Response.REQUEST_TIMEOUT);  
498 - } catch (SipException e) {  
499 - e.printStackTrace();  
500 - } catch (InvalidArgumentException e) {  
501 - e.printStackTrace();  
502 - } catch (ParseException e) {  
503 - e.printStackTrace(); 495 + responseAck(request, Response.REQUEST_TIMEOUT);
  496 + } catch (SipException | InvalidArgumentException | ParseException e) {
  497 + logger.error("[命令发送失败] 国标级联 录像回放 发送REQUEST_TIMEOUT: {}", e.getMessage());
504 } 498 }
505 } else { 499 } else {
506 if (result.getMediaServerItem() != null) { 500 if (result.getMediaServerItem() != null) {
@@ -536,10 +530,11 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -536,10 +530,11 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
536 530
537 // 写入redis, 超时时回复 531 // 写入redis, 超时时回复
538 redisCatchStorage.updateSendRTPSever(sendRtpItem); 532 redisCatchStorage.updateSendRTPSever(sendRtpItem);
  533 + MediaServerItem finalMediaServerItem = mediaServerItem;
539 playService.play(mediaServerItem, ssrcInfo, device, channelId, hookEvent, errorEvent, (code, msg) -> { 534 playService.play(mediaServerItem, ssrcInfo, device, channelId, hookEvent, errorEvent, (code, msg) -> {
540 - logger.info("[上级点播]超时, 用户:{}, 通道:{}", username, finalChannelId);  
541 - redisCatchStorage.deleteSendRTPServer(platform.getServerGBId(), finalChannelId, callIdHeader.getCallId(), null);  
542 - }, null); 535 + logger.info("[上级点播]超时, 用户:{}, 通道:{}", username, channelId);
  536 + redisCatchStorage.deleteSendRTPServer(platform.getServerGBId(), channelId, callIdHeader.getCallId(), null);
  537 + });
543 } else { 538 } else {
544 sendRtpItem.setStreamId(playTransaction.getStream()); 539 sendRtpItem.setStreamId(playTransaction.getStream());
545 // 写入redis, 超时时回复 540 // 写入redis, 超时时回复
@@ -554,30 +549,26 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -554,30 +549,26 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
554 if("push".equals(gbStream.getStreamType())) { 549 if("push".equals(gbStream.getStreamType())) {
555 if (streamPushItem != null && streamPushItem.isPushIng()) { 550 if (streamPushItem != null && streamPushItem.isPushIng()) {
556 // 推流状态 551 // 推流状态
557 - pushStream(evt, serverTransaction, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, 552 + pushStream(evt, request, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
558 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); 553 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
559 } else { 554 } else {
560 // 未推流 拉起 555 // 未推流 拉起
561 - notifyStreamOnline(evt, serverTransaction,gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, 556 + notifyStreamOnline(evt, request,gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
562 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); 557 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
563 } 558 }
564 }else if ("proxy".equals(gbStream.getStreamType())){ 559 }else if ("proxy".equals(gbStream.getStreamType())){
565 - if(null != proxyByAppAndStream &&proxyByAppAndStream.isStatus()){  
566 - pushProxyStream(evt, serverTransaction, gbStream, platform, callIdHeader, mediaServerItem, port, tcpActive,  
567 - mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);  
568 - }else{  
569 - //开启代理拉流  
570 - boolean start1 = streamProxyService.start(gbStream.getApp(), gbStream.getStream());  
571 - if(start1) {  
572 - pushProxyStream(evt, serverTransaction, gbStream, platform, callIdHeader, mediaServerItem, port, tcpActive, 560 + if (null != proxyByAppAndStream) {
  561 + if(proxyByAppAndStream.isStatus()){
  562 + pushProxyStream(evt, request, gbStream, platform, callIdHeader, mediaServerItem, port, tcpActive,
573 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); 563 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
574 }else{ 564 }else{
575 - //失败后通知  
576 - notifyStreamOnline(evt, serverTransaction,gbStream, null, platform, callIdHeader, mediaServerItem, port, tcpActive, 565 + //开启代理拉流
  566 + notifyStreamOnline(evt, request,gbStream, null, platform, callIdHeader, mediaServerItem, port, tcpActive,
577 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); 567 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
578 } 568 }
579 } 569 }
580 570
  571 +
581 } 572 }
582 } 573 }
583 } 574 }
@@ -591,7 +582,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -591,7 +582,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
591 /** 582 /**
592 * 安排推流 583 * 安排推流
593 */ 584 */
594 - private void pushProxyStream(RequestEvent evt, ServerTransaction serverTransaction, GbStream gbStream, ParentPlatform platform, 585 + private void pushProxyStream(RequestEvent evt, SIPRequest request, GbStream gbStream, ParentPlatform platform,
595 CallIdHeader callIdHeader, MediaServerItem mediaServerItem, 586 CallIdHeader callIdHeader, MediaServerItem mediaServerItem,
596 int port, Boolean tcpActive, boolean mediaTransmissionTCP, 587 int port, Boolean tcpActive, boolean mediaTransmissionTCP,
597 String channelId, String addressStr, String ssrc, String requesterId) { 588 String channelId, String addressStr, String ssrc, String requesterId) {
@@ -605,7 +596,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -605,7 +596,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
605 if (sendRtpItem == null) { 596 if (sendRtpItem == null) {
606 logger.warn("服务器端口资源不足"); 597 logger.warn("服务器端口资源不足");
607 try { 598 try {
608 - responseAck(serverTransaction, Response.BUSY_HERE); 599 + responseAck(request, Response.BUSY_HERE);
609 } catch (SipException | InvalidArgumentException | ParseException e) { 600 } catch (SipException | InvalidArgumentException | ParseException e) {
610 logger.error("[命令发送失败] invite 服务器端口资源不足: {}", e.getMessage()); 601 logger.error("[命令发送失败] invite 服务器端口资源不足: {}", e.getMessage());
611 } 602 }
@@ -618,10 +609,9 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -618,10 +609,9 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
618 // 写入redis, 超时时回复 609 // 写入redis, 超时时回复
619 sendRtpItem.setStatus(1); 610 sendRtpItem.setStatus(1);
620 sendRtpItem.setCallId(callIdHeader.getCallId()); 611 sendRtpItem.setCallId(callIdHeader.getCallId());
621 - SIPRequest request = (SIPRequest) evt.getRequest();  
622 sendRtpItem.setFromTag(request.getFromTag()); 612 sendRtpItem.setFromTag(request.getFromTag());
623 613
624 - SIPResponse response = sendStreamAck(mediaServerItem, serverTransaction, sendRtpItem, platform, evt); 614 + SIPResponse response = sendStreamAck(mediaServerItem, request, sendRtpItem, platform, evt);
625 if (response != null) { 615 if (response != null) {
626 sendRtpItem.setToTag(response.getToTag()); 616 sendRtpItem.setToTag(response.getToTag());
627 } 617 }
@@ -630,7 +620,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -630,7 +620,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
630 } 620 }
631 621
632 } 622 }
633 - private void pushStream(RequestEvent evt, ServerTransaction serverTransaction, GbStream gbStream, StreamPushItem streamPushItem, ParentPlatform platform, 623 + private void pushStream(RequestEvent evt, SIPRequest request, GbStream gbStream, StreamPushItem streamPushItem, ParentPlatform platform,
634 CallIdHeader callIdHeader, MediaServerItem mediaServerItem, 624 CallIdHeader callIdHeader, MediaServerItem mediaServerItem,
635 int port, Boolean tcpActive, boolean mediaTransmissionTCP, 625 int port, Boolean tcpActive, boolean mediaTransmissionTCP,
636 String channelId, String addressStr, String ssrc, String requesterId) { 626 String channelId, String addressStr, String ssrc, String requesterId) {
@@ -646,7 +636,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -646,7 +636,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
646 if (sendRtpItem == null) { 636 if (sendRtpItem == null) {
647 logger.warn("服务器端口资源不足"); 637 logger.warn("服务器端口资源不足");
648 try { 638 try {
649 - responseAck(serverTransaction, Response.BUSY_HERE); 639 + responseAck(request, Response.BUSY_HERE);
650 } catch (SipException | InvalidArgumentException | ParseException e) { 640 } catch (SipException | InvalidArgumentException | ParseException e) {
651 logger.error("[命令发送失败] invite 服务器端口资源不足: {}", e.getMessage()); 641 logger.error("[命令发送失败] invite 服务器端口资源不足: {}", e.getMessage());
652 } 642 }
@@ -660,9 +650,8 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -660,9 +650,8 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
660 sendRtpItem.setStatus(1); 650 sendRtpItem.setStatus(1);
661 sendRtpItem.setCallId(callIdHeader.getCallId()); 651 sendRtpItem.setCallId(callIdHeader.getCallId());
662 652
663 - SIPRequest request = (SIPRequest) evt.getRequest();  
664 sendRtpItem.setFromTag(request.getFromTag()); 653 sendRtpItem.setFromTag(request.getFromTag());
665 - SIPResponse response = sendStreamAck(mediaServerItem, serverTransaction, sendRtpItem, platform, evt); 654 + SIPResponse response = sendStreamAck(mediaServerItem, request, sendRtpItem, platform, evt);
666 if (response != null) { 655 if (response != null) {
667 sendRtpItem.setToTag(response.getToTag()); 656 sendRtpItem.setToTag(response.getToTag());
668 } 657 }
@@ -671,36 +660,59 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -671,36 +660,59 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
671 660
672 } else { 661 } else {
673 // 不在线 拉起 662 // 不在线 拉起
674 - notifyStreamOnline(evt, serverTransaction,gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, 663 + notifyStreamOnline(evt, request,gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
675 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); 664 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
676 } 665 }
677 666
678 } else { 667 } else {
679 // 其他平台内容 668 // 其他平台内容
680 - otherWvpPushStream(evt, serverTransaction, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, 669 + otherWvpPushStream(evt, request, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
681 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); 670 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
682 } 671 }
683 } 672 }
684 /** 673 /**
685 * 通知流上线 674 * 通知流上线
686 */ 675 */
687 - private void notifyStreamOnline(RequestEvent evt, ServerTransaction serverTransaction, GbStream gbStream, StreamPushItem streamPushItem, ParentPlatform platform, 676 + private void notifyStreamOnline(RequestEvent evt, SIPRequest request, GbStream gbStream, StreamPushItem streamPushItem, ParentPlatform platform,
688 CallIdHeader callIdHeader, MediaServerItem mediaServerItem, 677 CallIdHeader callIdHeader, MediaServerItem mediaServerItem,
689 int port, Boolean tcpActive, boolean mediaTransmissionTCP, 678 int port, Boolean tcpActive, boolean mediaTransmissionTCP,
690 String channelId, String addressStr, String ssrc, String requesterId) { 679 String channelId, String addressStr, String ssrc, String requesterId) {
691 if ("proxy".equals(gbStream.getStreamType())) { 680 if ("proxy".equals(gbStream.getStreamType())) {
692 // TODO 控制启用以使设备上线 681 // TODO 控制启用以使设备上线
693 logger.info("[ app={}, stream={} ]通道未推流,启用流后开始推流", gbStream.getApp(), gbStream.getStream()); 682 logger.info("[ app={}, stream={} ]通道未推流,启用流后开始推流", gbStream.getApp(), gbStream.getStream());
694 - try {  
695 - responseAck(serverTransaction, Response.BAD_REQUEST, "channel [" + gbStream.getGbId() + "] offline");  
696 - } catch (SipException | InvalidArgumentException | ParseException e) {  
697 - logger.error("[命令发送失败] invite 通道未推流: {}", e.getMessage()); 683 + // 监听流上线
  684 + HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed(gbStream.getApp(), gbStream.getStream(), true, "rtsp", mediaServerItem.getId());
  685 + zlmHttpHookSubscribe.addSubscribe(hookSubscribe, (mediaServerItemInUSe, responseJSON) -> {
  686 + String app = responseJSON.getString("app");
  687 + String stream = responseJSON.getString("stream");
  688 + logger.info("[上级点播]拉流代理已经就绪, {}/{}", app, stream);
  689 + dynamicTask.stop(callIdHeader.getCallId());
  690 + pushProxyStream(evt, request, gbStream, platform, callIdHeader, mediaServerItem, port, tcpActive,
  691 + mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
  692 + });
  693 + dynamicTask.startDelay(callIdHeader.getCallId(), () -> {
  694 + logger.info("[ app={}, stream={} ] 等待拉流代理流超时", gbStream.getApp(), gbStream.getStream());
  695 + zlmHttpHookSubscribe.removeSubscribe(hookSubscribe);
  696 + }, userSetting.getPlatformPlayTimeout());
  697 + boolean start = streamProxyService.start(gbStream.getApp(), gbStream.getStream());
  698 + if (!start) {
  699 + try {
  700 + responseAck(request, Response.BUSY_HERE, "channel [" + gbStream.getGbId() + "] offline");
  701 + } catch (SipException | InvalidArgumentException | ParseException e) {
  702 + logger.error("[命令发送失败] invite 通道未推流: {}", e.getMessage());
  703 + }
  704 + zlmHttpHookSubscribe.removeSubscribe(hookSubscribe);
  705 + dynamicTask.stop(callIdHeader.getCallId());
698 } 706 }
  707 +
  708 +
  709 +
699 } else if ("push".equals(gbStream.getStreamType())) { 710 } else if ("push".equals(gbStream.getStreamType())) {
700 if (!platform.isStartOfflinePush()) { 711 if (!platform.isStartOfflinePush()) {
701 // 平台设置中关闭了拉起离线的推流则直接回复 712 // 平台设置中关闭了拉起离线的推流则直接回复
702 try { 713 try {
703 - responseAck(serverTransaction, Response.TEMPORARILY_UNAVAILABLE, "channel stream not pushing"); 714 + logger.info("[上级点播] 失败,推流设备未推流,channel: {}, app: {}, stream: {}", gbStream.getGbId(), gbStream.getApp(), gbStream.getStream());
  715 + responseAck(request, Response.TEMPORARILY_UNAVAILABLE, "channel stream not pushing");
704 } catch (SipException | InvalidArgumentException | ParseException e) { 716 } catch (SipException | InvalidArgumentException | ParseException e) {
705 logger.error("[命令发送失败] invite 通道未推流: {}", e.getMessage()); 717 logger.error("[命令发送失败] invite 通道未推流: {}", e.getMessage());
706 } 718 }
@@ -718,7 +730,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -718,7 +730,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
718 logger.info("[ app={}, stream={} ] 等待设备开始推流超时", gbStream.getApp(), gbStream.getStream()); 730 logger.info("[ app={}, stream={} ] 等待设备开始推流超时", gbStream.getApp(), gbStream.getStream());
719 try { 731 try {
720 mediaListManager.removedChannelOnlineEventLister(gbStream.getApp(), gbStream.getStream()); 732 mediaListManager.removedChannelOnlineEventLister(gbStream.getApp(), gbStream.getStream());
721 - responseAck(serverTransaction, Response.REQUEST_TIMEOUT); // 超时 733 + responseAck(request, Response.REQUEST_TIMEOUT); // 超时
722 } catch (SipException e) { 734 } catch (SipException e) {
723 e.printStackTrace(); 735 e.printStackTrace();
724 } catch (InvalidArgumentException e) { 736 } catch (InvalidArgumentException e) {
@@ -741,7 +753,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -741,7 +753,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
741 if (sendRtpItem == null) { 753 if (sendRtpItem == null) {
742 logger.warn("上级点时创建sendRTPItem失败,可能是服务器端口资源不足"); 754 logger.warn("上级点时创建sendRTPItem失败,可能是服务器端口资源不足");
743 try { 755 try {
744 - responseAck(serverTransaction, Response.BUSY_HERE); 756 + responseAck(request, Response.BUSY_HERE);
745 } catch (SipException e) { 757 } catch (SipException e) {
746 e.printStackTrace(); 758 e.printStackTrace();
747 } catch (InvalidArgumentException e) { 759 } catch (InvalidArgumentException e) {
@@ -759,16 +771,15 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -759,16 +771,15 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
759 sendRtpItem.setStatus(1); 771 sendRtpItem.setStatus(1);
760 sendRtpItem.setCallId(callIdHeader.getCallId()); 772 sendRtpItem.setCallId(callIdHeader.getCallId());
761 773
762 - SIPRequest request = (SIPRequest) evt.getRequest();  
763 sendRtpItem.setFromTag(request.getFromTag()); 774 sendRtpItem.setFromTag(request.getFromTag());
764 - SIPResponse response = sendStreamAck(mediaServerItem, serverTransaction, sendRtpItem, platform, evt); 775 + SIPResponse response = sendStreamAck(mediaServerItem, request, sendRtpItem, platform, evt);
765 if (response != null) { 776 if (response != null) {
766 sendRtpItem.setToTag(response.getToTag()); 777 sendRtpItem.setToTag(response.getToTag());
767 } 778 }
768 redisCatchStorage.updateSendRTPSever(sendRtpItem); 779 redisCatchStorage.updateSendRTPSever(sendRtpItem);
769 } else { 780 } else {
770 // 其他平台内容 781 // 其他平台内容
771 - otherWvpPushStream(evt, serverTransaction, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, 782 + otherWvpPushStream(evt, request, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
772 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); 783 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
773 } 784 }
774 }); 785 });
@@ -779,7 +790,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -779,7 +790,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
779 dynamicTask.stop(callIdHeader.getCallId()); 790 dynamicTask.stop(callIdHeader.getCallId());
780 mediaListManager.removedChannelOnlineEventLister(gbStream.getApp(), gbStream.getStream()); 791 mediaListManager.removedChannelOnlineEventLister(gbStream.getApp(), gbStream.getStream());
781 try { 792 try {
782 - responseAck(serverTransaction, Response.TEMPORARILY_UNAVAILABLE, response.getMsg()); 793 + responseAck(request, Response.TEMPORARILY_UNAVAILABLE, response.getMsg());
783 } catch (SipException | InvalidArgumentException | ParseException e) { 794 } catch (SipException | InvalidArgumentException | ParseException e) {
784 logger.error("[命令发送失败] 国标级联 点播回复: {}", e.getMessage()); 795 logger.error("[命令发送失败] 国标级联 点播回复: {}", e.getMessage());
785 } 796 }
@@ -791,7 +802,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -791,7 +802,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
791 /** 802 /**
792 * 来自其他wvp的推流 803 * 来自其他wvp的推流
793 */ 804 */
794 - private void otherWvpPushStream(RequestEvent evt, ServerTransaction serverTransaction, GbStream gbStream, StreamPushItem streamPushItem, ParentPlatform platform, 805 + private void otherWvpPushStream(RequestEvent evt, SIPRequest request, GbStream gbStream, StreamPushItem streamPushItem, ParentPlatform platform,
795 CallIdHeader callIdHeader, MediaServerItem mediaServerItem, 806 CallIdHeader callIdHeader, MediaServerItem mediaServerItem,
796 int port, Boolean tcpActive, boolean mediaTransmissionTCP, 807 int port, Boolean tcpActive, boolean mediaTransmissionTCP,
797 String channelId, String addressStr, String ssrc, String requesterId) { 808 String channelId, String addressStr, String ssrc, String requesterId) {
@@ -804,7 +815,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -804,7 +815,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
804 if (sendRtpItem == null || responseSendItemMsg.getMediaServerItem() == null) { 815 if (sendRtpItem == null || responseSendItemMsg.getMediaServerItem() == null) {
805 logger.warn("服务器端口资源不足"); 816 logger.warn("服务器端口资源不足");
806 try { 817 try {
807 - responseAck(serverTransaction, Response.BUSY_HERE); 818 + responseAck(request, Response.BUSY_HERE);
808 } catch (SipException e) { 819 } catch (SipException e) {
809 e.printStackTrace(); 820 e.printStackTrace();
810 } catch (InvalidArgumentException e) { 821 } catch (InvalidArgumentException e) {
@@ -823,9 +834,8 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -823,9 +834,8 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
823 sendRtpItem.setStatus(1); 834 sendRtpItem.setStatus(1);
824 sendRtpItem.setCallId(callIdHeader.getCallId()); 835 sendRtpItem.setCallId(callIdHeader.getCallId());
825 836
826 - SIPRequest request = (SIPRequest) evt.getRequest();  
827 sendRtpItem.setFromTag(request.getFromTag()); 837 sendRtpItem.setFromTag(request.getFromTag());
828 - SIPResponse response = sendStreamAck(responseSendItemMsg.getMediaServerItem(), serverTransaction,sendRtpItem, platform, evt); 838 + SIPResponse response = sendStreamAck(responseSendItemMsg.getMediaServerItem(), request,sendRtpItem, platform, evt);
829 if (response != null) { 839 if (response != null) {
830 sendRtpItem.setToTag(response.getToTag()); 840 sendRtpItem.setToTag(response.getToTag());
831 } 841 }
@@ -839,24 +849,24 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -839,24 +849,24 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
839 StreamPushItem currentStreamPushItem = streamPushService.getPush(streamPushItem.getApp(), streamPushItem.getStream()); 849 StreamPushItem currentStreamPushItem = streamPushService.getPush(streamPushItem.getApp(), streamPushItem.getStream());
840 if (currentStreamPushItem.isPushIng()) { 850 if (currentStreamPushItem.isPushIng()) {
841 // 在线状态 851 // 在线状态
842 - pushStream(evt, serverTransaction, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, 852 + pushStream(evt, request, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
843 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); 853 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
844 854
845 } else { 855 } else {
846 // 不在线 拉起 856 // 不在线 拉起
847 - notifyStreamOnline(evt, serverTransaction, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, 857 + notifyStreamOnline(evt, request, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive,
848 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); 858 mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId);
849 } 859 }
850 } 860 }
851 try { 861 try {
852 - responseAck(serverTransaction, Response.BUSY_HERE); 862 + responseAck(request, Response.BUSY_HERE);
853 } catch (InvalidArgumentException | ParseException | SipException e) { 863 } catch (InvalidArgumentException | ParseException | SipException e) {
854 logger.error("[命令发送失败] 国标级联 点播回复 BUSY_HERE: {}", e.getMessage()); 864 logger.error("[命令发送失败] 国标级联 点播回复 BUSY_HERE: {}", e.getMessage());
855 } 865 }
856 }); 866 });
857 } 867 }
858 868
859 - public SIPResponse sendStreamAck(MediaServerItem mediaServerItem, ServerTransaction serverTransaction, SendRtpItem sendRtpItem, ParentPlatform platform, RequestEvent evt) { 869 + public SIPResponse sendStreamAck(MediaServerItem mediaServerItem, SIPRequest request, SendRtpItem sendRtpItem, ParentPlatform platform, RequestEvent evt) {
860 870
861 StringBuffer content = new StringBuffer(200); 871 StringBuffer content = new StringBuffer(200);
862 content.append("v=0\r\n"); 872 content.append("v=0\r\n");
@@ -879,7 +889,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -879,7 +889,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
879 content.append("f=\r\n"); 889 content.append("f=\r\n");
880 890
881 try { 891 try {
882 - return responseSdpAck(serverTransaction, content.toString(), platform); 892 + return responseSdpAck(request, content.toString(), platform);
883 } catch (SipException e) { 893 } catch (SipException e) {
884 e.printStackTrace(); 894 e.printStackTrace();
885 } catch (InvalidArgumentException e) { 895 } catch (InvalidArgumentException e) {
@@ -890,7 +900,8 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -890,7 +900,8 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
890 return null; 900 return null;
891 } 901 }
892 902
893 - public void inviteFromDeviceHandle(ServerTransaction serverTransaction, String requesterId, String channelId) { 903 + public void inviteFromDeviceHandle(SIPRequest request, String requesterId, String channelId) {
  904 +
894 // 非上级平台请求,查询是否设备请求(通常为接收语音广播的设备) 905 // 非上级平台请求,查询是否设备请求(通常为接收语音广播的设备)
895 Device device = redisCatchStorage.getDevice(requesterId); 906 Device device = redisCatchStorage.getDevice(requesterId);
896 AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(requesterId, channelId); 907 AudioBroadcastCatch audioBroadcastCatch = audioBroadcastManager.get(requesterId, channelId);
@@ -907,11 +918,11 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -907,11 +918,11 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
907 if (device != null) { 918 if (device != null) {
908 logger.info("收到设备" + requesterId + "的语音广播Invite请求"); 919 logger.info("收到设备" + requesterId + "的语音广播Invite请求");
909 try { 920 try {
910 - responseAck(serverTransaction, Response.TRYING); 921 + responseAck(request, Response.TRYING);
911 } catch (SipException | InvalidArgumentException | ParseException e) { 922 } catch (SipException | InvalidArgumentException | ParseException e) {
912 logger.error("[命令发送失败] invite BAD_REQUEST: {}", e.getMessage()); 923 logger.error("[命令发送失败] invite BAD_REQUEST: {}", e.getMessage());
913 } 924 }
914 - String contentString = new String(serverTransaction.getRequest().getRawContent()); 925 + String contentString = new String(request.getRawContent());
915 // jainSip不支持y=字段, 移除移除以解析。 926 // jainSip不支持y=字段, 移除移除以解析。
916 String substring = contentString; 927 String substring = contentString;
917 String ssrc = "0000000404"; 928 String ssrc = "0000000404";
@@ -961,7 +972,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -961,7 +972,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
961 logger.info("不支持的媒体格式,返回415"); 972 logger.info("不支持的媒体格式,返回415");
962 // 回复不支持的格式 973 // 回复不支持的格式
963 try { 974 try {
964 - responseAck(serverTransaction, Response.UNSUPPORTED_MEDIA_TYPE); // 不支持的格式,发415 975 + responseAck(request, Response.UNSUPPORTED_MEDIA_TYPE); // 不支持的格式,发415
965 } catch (SipException | InvalidArgumentException | ParseException e) { 976 } catch (SipException | InvalidArgumentException | ParseException e) {
966 logger.error("[命令发送失败] invite 不支持的媒体格式: {}", e.getMessage()); 977 logger.error("[命令发送失败] invite 不支持的媒体格式: {}", e.getMessage());
967 } 978 }
@@ -1024,7 +1035,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements @@ -1024,7 +1035,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
1024 } else { 1035 } else {
1025 logger.warn("来自无效设备/平台的请求"); 1036 logger.warn("来自无效设备/平台的请求");
1026 try { 1037 try {
1027 - responseAck(serverTransaction, Response.BAD_REQUEST);; // 不支持的格式,发415 1038 + responseAck(request, Response.BAD_REQUEST);; // 不支持的格式,发415
1028 } catch (SipException | InvalidArgumentException | ParseException e) { 1039 } catch (SipException | InvalidArgumentException | ParseException e) {
1029 logger.error("[命令发送失败] invite 来自无效设备/平台的请求, {}", e.getMessage()); 1040 logger.error("[命令发送失败] invite 来自无效设备/平台的请求, {}", e.getMessage());
1030 } 1041 }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.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.alibaba.fastjson.JSONObject; 3 +import com.alibaba.fastjson2.JSONObject;
4 import com.genersoft.iot.vmp.conf.SipConfig; 4 import com.genersoft.iot.vmp.conf.SipConfig;
5 import com.genersoft.iot.vmp.conf.UserSetting; 5 import com.genersoft.iot.vmp.conf.UserSetting;
6 import com.genersoft.iot.vmp.gb28181.bean.*; 6 import com.genersoft.iot.vmp.gb28181.bean.*;
@@ -19,6 +19,7 @@ import com.genersoft.iot.vmp.storager.IRedisCatchStorage; @@ -19,6 +19,7 @@ import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
19 import com.genersoft.iot.vmp.storager.IVideoManagerStorage; 19 import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
20 import com.genersoft.iot.vmp.utils.DateUtil; 20 import com.genersoft.iot.vmp.utils.DateUtil;
21 import com.genersoft.iot.vmp.utils.redis.RedisUtil; 21 import com.genersoft.iot.vmp.utils.redis.RedisUtil;
  22 +import gov.nist.javax.sip.message.SIPRequest;
22 import org.dom4j.DocumentException; 23 import org.dom4j.DocumentException;
23 import org.dom4j.Element; 24 import org.dom4j.Element;
24 import org.slf4j.Logger; 25 import org.slf4j.Logger;
@@ -33,7 +34,6 @@ import org.springframework.util.StringUtils; @@ -33,7 +34,6 @@ import org.springframework.util.StringUtils;
33 34
34 import javax.sip.InvalidArgumentException; 35 import javax.sip.InvalidArgumentException;
35 import javax.sip.RequestEvent; 36 import javax.sip.RequestEvent;
36 -import javax.sip.ServerTransaction;  
37 import javax.sip.SipException; 37 import javax.sip.SipException;
38 import javax.sip.header.FromHeader; 38 import javax.sip.header.FromHeader;
39 import javax.sip.message.Response; 39 import javax.sip.message.Response;
@@ -92,9 +92,8 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements @@ -92,9 +92,8 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements
92 92
93 @Override 93 @Override
94 public void process(RequestEvent evt) { 94 public void process(RequestEvent evt) {
95 - ServerTransaction serverTransaction = getServerTransaction(evt);  
96 try { 95 try {
97 - responseAck(serverTransaction, Response.OK); 96 + responseAck((SIPRequest) evt.getRequest(), Response.OK, null, null);
98 }catch (SipException | InvalidArgumentException | ParseException e) { 97 }catch (SipException | InvalidArgumentException | ParseException e) {
99 e.printStackTrace(); 98 e.printStackTrace();
100 } 99 }