Commit f961515317a33fe965287ca5c978b85e9ce1abcc

Authored by 648540858
1 parent 5a7a7a12

合并主线

src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderPlarformProvider.java
... ... @@ -56,7 +56,7 @@ public class SIPRequestHeaderPlarformProvider {
56 56 //via
57 57 ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
58 58 ViaHeader viaHeader = SipFactory.getInstance().createHeaderFactory().createViaHeader(parentPlatform.getDeviceIp(),
59   - Integer.parseInt(parentPlatform.getDevicePort()), parentPlatform.getTransport(), SipUtils.getNewViaTag());
  59 + parentPlatform.getDevicePort(), parentPlatform.getTransport(), SipUtils.getNewViaTag());
60 60 viaHeader.setRPort();
61 61 viaHeaders.add(viaHeader);
62 62 //from
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
... ... @@ -6,9 +6,7 @@ import com.genersoft.iot.vmp.conf.SipConfig;
6 6 import com.genersoft.iot.vmp.conf.UserSetting;
7 7 import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
8 8 import com.genersoft.iot.vmp.gb28181.SipLayer;
9   -import com.genersoft.iot.vmp.gb28181.bean.Device;
10   -import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm;
11   -import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
  9 +import com.genersoft.iot.vmp.gb28181.bean.*;
12 10 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
13 11 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
14 12 import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
... ... @@ -624,9 +622,9 @@ public class SIPCommander implements ISIPCommander {
624 622  
625 623 logger.info("[语音喊话] {} 分配的ZLM为: {} [{}:{}]", stream, mediaServerItem.getId(), mediaServerItem.getIp(), sendRtpItem.getPort());
626 624 HookSubscribeForStreamChange hookSubscribeForStreamChange = HookSubscribeFactory.on_stream_changed("rtp", stream, true, "rtsp", mediaServerItem.getId());
627   - subscribe.addSubscribe(hookSubscribeForStreamChange, (MediaServerItem mediaServerItemInUse, JSONObject json) -> {
  625 + subscribe.addSubscribe(hookSubscribeForStreamChange, (mediaServerItemInUse, hookParam) -> {
628 626 if (event != null) {
629   - event.response(mediaServerItemInUse, json);
  627 + event.response(mediaServerItemInUse, hookParam);
630 628 subscribe.removeSubscribe(hookSubscribeForStreamChange);
631 629 }
632 630 });
... ... @@ -634,9 +632,9 @@ public class SIPCommander implements ISIPCommander {
634 632 CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()), device.getTransport());
635 633 callIdHeader.setCallId(callId);
636 634 HookSubscribeForStreamPush hookSubscribeForStreamPush = HookSubscribeFactory.on_publish("rtp", stream, null, mediaServerItem.getId());
637   - subscribe.addSubscribe(hookSubscribeForStreamPush, (MediaServerItem mediaServerItemInUse, JSONObject json) -> {
  635 + subscribe.addSubscribe(hookSubscribeForStreamPush, (mediaServerItemInUse, hookParam) -> {
638 636 if (eventForPush != null) {
639   - eventForPush.response(mediaServerItemInUse, json);
  637 + eventForPush.response(mediaServerItemInUse, hookParam);
640 638 }
641 639 });
642 640 //
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
... ... @@ -19,6 +19,7 @@ import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe;
19 19 import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory;
20 20 import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamChange;
21 21 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
  22 +import com.genersoft.iot.vmp.media.zlm.dto.hook.HookParam;
22 23 import com.genersoft.iot.vmp.service.IMediaServerService;
23 24 import com.genersoft.iot.vmp.service.bean.GPSMsgInfo;
24 25 import com.genersoft.iot.vmp.service.bean.SSRCInfo;
... ... @@ -899,9 +900,9 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
899 900  
900 901 logger.info("{} 分配的ZLM为: {} [{}:{}]", stream, mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort());
901 902 HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", stream, true, "rtsp", mediaServerItem.getId());
902   - subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> {
  903 + subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, HookParam hookParam) -> {
903 904 if (event != null) {
904   - event.response(mediaServerItemInUse, json);
  905 + event.response(mediaServerItemInUse, hookParam);
905 906 subscribe.removeSubscribe(hookSubscribe);
906 907 }
907 908 });
... ...
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/BroadcastNotifyMessageHandler.java
... ... @@ -10,6 +10,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessag
10 10 import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler;
11 11 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
12 12 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
  13 +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
13 14 import com.genersoft.iot.vmp.service.IDeviceService;
14 15 import com.genersoft.iot.vmp.service.IMediaServerService;
15 16 import com.genersoft.iot.vmp.service.IPlatformService;
... ... @@ -127,10 +128,9 @@ public class BroadcastNotifyMessageHandler extends SIPRequestProcessorParent imp
127 128  
128 129 // 消息发送成功, 向上级发送invite,获取推流
129 130 try {
130   - platformService.broadcastInvite(platform, deviceChannel.getChannelId(), mediaServerForMinimumLoad, (mediaServerItem, response)->{
  131 + platformService.broadcastInvite(platform, deviceChannel.getChannelId(), mediaServerForMinimumLoad, (mediaServerItem, hookParam)->{
  132 + OnStreamChangedHookParam streamChangedHookParam = (OnStreamChangedHookParam)hookParam;
131 133 // 上级平台推流成功
132   - String app = response.getString("app");
133   - String stream = response.getString("stream");
134 134 AudioBroadcastCatch broadcastCatch = audioBroadcastManager.get(device.getDeviceId(), targetId);
135 135 if (broadcastCatch != null ) {
136 136 if (playService.audioBroadcastInUse(device, targetId)) {
... ... @@ -138,24 +138,24 @@ public class BroadcastNotifyMessageHandler extends SIPRequestProcessorParent imp
138 138 platform.getServerGBId(), deviceChannel.getChannelId());
139 139 // 查看语音通道已经建立且已经占用 回复BYE
140 140 try {
141   - platformService.stopBroadcast(platform, deviceChannel.getChannelId(), stream);
  141 + platformService.stopBroadcast(platform, deviceChannel.getChannelId(), streamChangedHookParam.getStream());
142 142 } catch (InvalidArgumentException | ParseException | SsrcTransactionNotFoundException |
143 143 SipException e) {
144 144 logger.info("[消息发送失败] 国标级联 语音喊话 platform: {}, channel: {}", platform.getServerGBId(), deviceChannel.getChannelId());
145 145 }
146 146 }else {
147 147 // 查看语音通道已经建立但是未占用
148   - broadcastCatch.setApp(app);
149   - broadcastCatch.setStream(stream);
  148 + broadcastCatch.setApp(streamChangedHookParam.getApp());
  149 + broadcastCatch.setStream(streamChangedHookParam.getStream());
150 150 broadcastCatch.setMediaServerItem(mediaServerItem);
151 151 audioBroadcastManager.update(broadcastCatch);
152 152 // 推流到设备
153   - SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(null, targetId, stream, null);
  153 + SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(null, targetId, streamChangedHookParam.getStream(), null);
154 154 if (sendRtpItem == null) {
155   - logger.warn("[国标级联] 语音喊话 异常,未找到发流信息, channelId: {}, stream: {}", targetId, stream);
156   - logger.info("[国标级联] 语音喊话 重新开始,channelId: {}, stream: {}", targetId, stream);
  155 + logger.warn("[国标级联] 语音喊话 异常,未找到发流信息, channelId: {}, stream: {}", targetId, streamChangedHookParam.getStream());
  156 + logger.info("[国标级联] 语音喊话 重新开始,channelId: {}, stream: {}", targetId, streamChangedHookParam.getStream());
157 157 try {
158   - playService.audioBroadcastCmd(device, targetId, mediaServerItem, app, stream, 60, true, msg -> {
  158 + playService.audioBroadcastCmd(device, targetId, mediaServerItem, streamChangedHookParam.getApp(), streamChangedHookParam.getStream(), 60, true, msg -> {
159 159 logger.info("[语音喊话] 通道建立成功, device: {}, channel: {}", device.getDeviceId(), targetId);
160 160 });
161 161 } catch (SipException | InvalidArgumentException | ParseException e) {
... ... @@ -173,7 +173,7 @@ public class BroadcastNotifyMessageHandler extends SIPRequestProcessorParent imp
173 173 }
174 174 }else {
175 175 try {
176   - playService.audioBroadcastCmd(device, targetId, mediaServerItem, app, stream, 60, true, msg -> {
  176 + playService.audioBroadcastCmd(device, targetId, mediaServerItem, streamChangedHookParam.getApp(), streamChangedHookParam.getStream(), 60, true, msg -> {
177 177 logger.info("[语音喊话] 通道建立成功, device: {}, channel: {}", device.getDeviceId(), targetId);
178 178 });
179 179 } catch (SipException | InvalidArgumentException | ParseException e) {
... ...
src/main/java/com/genersoft/iot/vmp/service/IPlayService.java
... ... @@ -7,6 +7,7 @@ import com.genersoft.iot.vmp.gb28181.bean.Device;
7 7 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
8 8 import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
9 9 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
  10 +import com.genersoft.iot.vmp.media.zlm.dto.hook.HookParam;
10 11 import com.genersoft.iot.vmp.service.bean.ErrorCallback;
11 12 import com.genersoft.iot.vmp.service.bean.SSRCInfo;
12 13 import com.genersoft.iot.vmp.vmanager.bean.AudioBroadcastResult;
... ... @@ -28,7 +29,7 @@ public interface IPlayService {
28 29 ErrorCallback<Object> callback);
29 30 SSRCInfo play(MediaServerItem mediaServerItem, String deviceId, String channelId, ErrorCallback<Object> callback);
30 31  
31   - StreamInfo onPublishHandlerForPlay(MediaServerItem mediaServerItem, JSONObject response, String deviceId, String channelId);
  32 + StreamInfo onPublishHandlerForPlay(MediaServerItem mediaServerItem, HookParam hookParam, String deviceId, String channelId);
32 33  
33 34 MediaServerItem getNewMediaServerItem(Device device);
34 35  
... ...
src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java
1 1 package com.genersoft.iot.vmp.service.impl;
2 2  
3   -import com.alibaba.fastjson2.JSONObject;
4 3 import com.genersoft.iot.vmp.common.InviteInfo;
5 4 import com.genersoft.iot.vmp.common.InviteSessionType;
6 5 import com.genersoft.iot.vmp.conf.DynamicTask;
... ... @@ -16,6 +15,7 @@ import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe;
16 15 import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory;
17 16 import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamChange;
18 17 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
  18 +import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
19 19 import com.genersoft.iot.vmp.service.IInviteStreamService;
20 20 import com.genersoft.iot.vmp.service.IMediaServerService;
21 21 import com.genersoft.iot.vmp.service.IPlatformService;
... ... @@ -442,10 +442,11 @@ public class PlatformServiceImpl implements IPlatformService {
442 442 inviteStreamService.removeInviteInfo(inviteInfo);
443 443 }else {
444 444 // 流确实尚在推流,直接回调结果
445   - JSONObject json = new JSONObject();
446   - json.put("app", inviteInfo.getStreamInfo().getApp());
447   - json.put("stream", inviteInfo.getStreamInfo().getStream());
448   - hookEvent.response(mediaServerItemForStreamInfo, json);
  445 + OnStreamChangedHookParam hookParam = new OnStreamChangedHookParam();
  446 + hookParam.setApp(inviteInfo.getStreamInfo().getApp());
  447 + hookParam.setStream(inviteInfo.getStreamInfo().getStream());
  448 +
  449 + hookEvent.response(mediaServerItemForStreamInfo, hookParam);
449 450 return;
450 451 }
451 452 }
... ... @@ -498,14 +499,14 @@ public class PlatformServiceImpl implements IPlatformService {
498 499 }
499 500 }
500 501 }, userSetting.getPlayTimeout());
501   - commanderForPlatform.broadcastInviteCmd(platform, channelId, mediaServerItem, ssrcInfo, (mediaServerItemForInvite, response)->{
  502 + commanderForPlatform.broadcastInviteCmd(platform, channelId, mediaServerItem, ssrcInfo, (mediaServerItemForInvite, hookParam)->{
502 503 logger.info("[国标级联] 发起语音喊话 收到上级推流 deviceId: {}, channelId: {}", platform.getServerGBId(), channelId);
503 504 dynamicTask.stop(timeOutTaskKey);
504 505 // hook响应
505   - playService.onPublishHandlerForPlay(mediaServerItemForInvite, response, platform.getServerGBId(), channelId);
  506 + playService.onPublishHandlerForPlay(mediaServerItemForInvite, hookParam, platform.getServerGBId(), channelId);
506 507 // 收到流
507 508 if (hookEvent != null) {
508   - hookEvent.response(mediaServerItem, response);
  509 + hookEvent.response(mediaServerItem, hookParam);
509 510 }
510 511 }, event -> {
511 512 // 收到200OK 检测ssrc是否有变化,防止上级自定义了ssrc
... ... @@ -524,30 +525,20 @@ public class PlatformServiceImpl implements IPlatformService {
524 525 logger.info("[点播消息] 收到invite 200, 发现下级自定义了ssrc: {}", ssrcInResponse);
525 526 if (!mediaServerItem.isRtpEnable()) {
526 527 logger.info("[点播消息] SSRC修正 {}->{}", ssrcInfo.getSsrc(), ssrcInResponse);
527   -
528   - if (!ssrcFactory.checkSsrc(mediaServerItem.getId(), ssrcInResponse)) {
529   - // ssrc 不可用
530   - // 释放ssrc
531   - mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
532   - streamSession.remove(platform.getServerGBId(), channelId, ssrcInfo.getStream());
533   - event.msg = "下级自定义了ssrc,但是此ssrc不可用";
534   - event.statusCode = 400;
535   - errorEvent.response(event);
536   - return;
537   - }
538   -
  528 + // 释放ssrc
  529 + mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
539 530 // 单端口模式streamId也有变化,需要重新设置监听
540 531 if (!mediaServerItem.isRtpEnable()) {
541 532 // 添加订阅
542 533 HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId());
543 534 subscribe.removeSubscribe(hookSubscribe);
544 535 hookSubscribe.getContent().put("stream", String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase());
545   - subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject response) -> {
546   - logger.info("[ZLM HOOK] ssrc修正后收到订阅消息: " + response.toJSONString());
  536 + subscribe.addSubscribe(hookSubscribe, (mediaServerItemInUse, hookParam) -> {
  537 + logger.info("[ZLM HOOK] ssrc修正后收到订阅消息: " + hookParam);
547 538 dynamicTask.stop(timeOutTaskKey);
548 539 // hook响应
549   - playService.onPublishHandlerForPlay(mediaServerItemInUse, response, platform.getServerGBId(), channelId);
550   - hookEvent.response(mediaServerItemInUse, response);
  540 + playService.onPublishHandlerForPlay(mediaServerItemInUse, hookParam, platform.getServerGBId(), channelId);
  541 + hookEvent.response(mediaServerItemInUse, hookParam);
551 542 });
552 543 }
553 544 // 关闭rtp server
... ...
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
... ... @@ -293,12 +293,12 @@ public class PlayServiceImpl implements IPlayService {
293 293  
294 294 // 查看设备是否已经在推流
295 295 try {
296   - cmder.talkStreamCmd(mediaServerItem, sendRtpItem, device, channelId, callId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> {
297   - logger.info("[语音对讲] 流已生成, 开始推流: " + response.toJSONString());
  296 + cmder.talkStreamCmd(mediaServerItem, sendRtpItem, device, channelId, callId, (mediaServerItemInuse, hookParam) -> {
  297 + logger.info("[语音对讲] 流已生成, 开始推流: " + hookParam);
298 298 dynamicTask.stop(timeOutTaskKey);
299 299 // TODO 暂不做处理
300   - }, (MediaServerItem mediaServerItemInuse, JSONObject json) -> {
301   - logger.info("[语音对讲] 设备开始推流: " + json.toJSONString());
  300 + }, (mediaServerItemInuse, hookParam) -> {
  301 + logger.info("[语音对讲] 设备开始推流: " + hookParam);
302 302 dynamicTask.stop(timeOutTaskKey);
303 303  
304 304 }, (event) -> {
... ... @@ -617,10 +617,10 @@ public class PlayServiceImpl implements IPlayService {
617 617 }
618 618  
619 619 @Override
620   - public StreamInfo onPublishHandlerForPlay(MediaServerItem mediaServerItem, JSONObject response, String deviceId, String channelId) {
621   - StreamInfo streamInfo = onPublishHandler(mediaServerItem, response, deviceId, channelId);
  620 + public StreamInfo onPublishHandlerForPlay(MediaServerItem mediaServerItem, HookParam hookParam, String deviceId, String channelId) {
  621 + OnStreamChangedHookParam streamChangedHookParam = (OnStreamChangedHookParam) hookParam;
  622 + StreamInfo streamInfo = onPublishHandler(mediaServerItem, streamChangedHookParam, deviceId, channelId);
622 623 Device device = redisCatchStorage.getDevice(deviceId);
623   - OnStreamChangedHookParam streamChangedHookParam = (OnStreamChangedHookParam)hookParam;
624 624 if (streamInfo != null) {
625 625 DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId);
626 626 if (deviceChannel != null) {
... ... @@ -1571,7 +1571,7 @@ public class PlayServiceImpl implements IPlayService {
1571 1571 }
1572 1572 }
1573 1573  
1574   - talk(mediaServerItem, device, channelId, stream, (MediaServerItem mediaServerItem1, JSONObject response) -> {
  1574 + talk(mediaServerItem, device, channelId, stream, (mediaServerItem1, hookParam) -> {
1575 1575 logger.info("[语音对讲] 收到设备发来的流");
1576 1576 }, eventResult -> {
1577 1577 logger.warn("[语音对讲] 失败,{}/{}, 错误码 {} {}", device.getDeviceId(), channelId, eventResult.statusCode, eventResult.msg);
... ...