From 18214b8b82847adb990138c221f7fc6c33b61619 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: Tue, 30 Jan 2024 18:13:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=9B=BD=E6=A0=87=E7=BA=A7?= =?UTF-8?q?=E8=81=94=E5=BD=95=E5=83=8F=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gb28181/GB28181ResourceServiceImpl.java | 47 +++++- .../event/record/RecordEndEventListener.java | 5 - .../cmd/DeviceControlQueryMessageHandler.java | 24 +-- .../query/cmd/AlarmQueryMessageHandler.java | 16 -- .../query/cmd/CatalogQueryMessageHandler.java | 2 +- .../cmd/DeviceInfoQueryMessageHandler.java | 13 +- .../cmd/DeviceStatusQueryMessageHandler.java | 12 +- .../cmd/RecordInfoQueryMessageHandler.java | 157 +++++++++++------- .../iot/vmp/service/IResourceService.java | 7 +- .../vmp/service/bean/PlayBackCallback.java | 7 - .../impl/StreamProxyResourceServiceImpl.java | 50 +++++- .../impl/StreamPushResourceServiceImpl.java | 43 +++++ .../vmp/storager/dao/DeviceChannelMapper.java | 2 +- .../storager/dao/ParentPlatformMapper.java | 4 +- 14 files changed, 252 insertions(+), 137 deletions(-) delete mode 100755 src/main/java/com/genersoft/iot/vmp/service/bean/PlayBackCallback.java diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/GB28181ResourceServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/GB28181ResourceServiceImpl.java index c6821a8e..67596817 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/GB28181ResourceServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/GB28181ResourceServiceImpl.java @@ -1,5 +1,6 @@ package com.genersoft.iot.vmp.gb28181; +import com.genersoft.iot.vmp.common.CommonCallback; import com.genersoft.iot.vmp.common.CommonGbChannel; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.common.enums.DeviceControlType; @@ -7,9 +8,10 @@ import com.genersoft.iot.vmp.conf.exception.ControllerException; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; import com.genersoft.iot.vmp.gb28181.bean.DragZoomRequest; +import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; import com.genersoft.iot.vmp.gb28181.bean.command.PTZCommand; +import com.genersoft.iot.vmp.gb28181.event.record.RecordEndEventListener; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; -import com.genersoft.iot.vmp.gb28181.utils.SipUtils; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.service.IPlayService; import com.genersoft.iot.vmp.service.IResourcePlayCallback; @@ -18,8 +20,8 @@ import com.genersoft.iot.vmp.service.bean.CommonGbChannelType; import com.genersoft.iot.vmp.service.bean.InviteErrorCode; import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper; import com.genersoft.iot.vmp.storager.dao.DeviceMapper; +import com.genersoft.iot.vmp.utils.DateUtil; import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; -import org.aspectj.bridge.ICommand; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -27,8 +29,8 @@ import org.springframework.stereotype.Service; import javax.sip.InvalidArgumentException; import javax.sip.SipException; -import javax.sip.message.Response; import java.text.ParseException; +import java.util.ArrayList; /** @@ -51,6 +53,9 @@ public class GB28181ResourceServiceImpl implements IResourceService { @Autowired private ISIPCommander commander; + @Autowired + private RecordEndEventListener recordEndEventListener; + @Override public boolean deleteChannel(CommonGbChannel commonGbChannel) { if (!CommonGbChannelType.GB28181.equals(commonGbChannel.getType())) { @@ -275,6 +280,42 @@ public class GB28181ResourceServiceImpl implements IResourceService { } + @Override + public void queryrecord(CommonGbChannel commonGbChannel, int sn, int secrecy, String type, String startTime, String endTime, CommonCallback callback) { + CheckCommonGbChannelResult checkResult = checkCommonGbChannel(commonGbChannel); + + if (checkResult.errorMsg != null) { + logger.warn("[资源类-国标28181] 国标录像查询失败: {}", checkResult.errorMsg); + return; + } + if (checkResult.device == null || checkResult.channel == null) { + logger.warn("[资源类-国标28181] 国标录像查询失败: 设备获取失败"); + return; + } + // 接收录像数据 + recordEndEventListener.addEndEventHandler(checkResult.device.getDeviceId(), checkResult.channel.getChannelId(), (recordInfo)->{ + if (recordInfo == null ) { + logger.info("[资源类-国标28181] 录像查询, 结果为空,设备: {}, 通道:{}", + checkResult.device.getDeviceId(), checkResult.channel.getChannelId()); + return; + } + if (recordInfo.getRecordList() == null) { + recordInfo.setRecordList(new ArrayList<>()); + } + logger.info("[资源类-国标28181] 录像查询收到数据,设备: {}, 通道:{},共{}条", + checkResult.device.getDeviceId(), checkResult.channel.getChannelId(), recordInfo.getRecordList().size()); + if (callback != null) { + callback.run(recordInfo); + } + }); + try { + commander.recordInfoQuery(checkResult.device, checkResult.channel.getChannelId(), DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(startTime), + DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(endTime), sn, secrecy, type, null, null); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[命令发送失败] 录像查询: {}", e.getMessage()); + } + } + @Override public void streamOffline(String app, String streamId) { // TODO diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java index 167b9f20..a7e8ed6f 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java @@ -1,10 +1,8 @@ package com.genersoft.iot.vmp.gb28181.event.record; import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; -import com.genersoft.iot.vmp.utils.redis.RedisUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; @@ -43,9 +41,6 @@ public class RecordEndEventListener implements ApplicationListener resourceServiceMap; + @Override public void afterPropertiesSet() throws Exception { queryMessageHandler.addHandler(cmdType, this); @@ -73,7 +69,14 @@ public class RecordInfoQueryMessageHandler extends SIPRequestProcessorParent imp @Override public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { + logger.info("[国标级联] 录像查询, 平台:{}",parentPlatform.getServerGBId()); SIPRequest request = (SIPRequest) evt.getRequest(); + try { + responseAck(request, Response.OK); + } catch (SipException | InvalidArgumentException | ParseException e) { + logger.error("[命令发送失败] 错误信息: {}", e.getMessage()); + } + Element snElement = rootElement.element("SN"); int sn = Integer.parseInt(snElement.getText()); Element deviceIDElement = rootElement.element("DeviceID"); @@ -88,6 +91,8 @@ public class RecordInfoQueryMessageHandler extends SIPRequestProcessorParent imp if (endTimeElement != null) { endTime = endTimeElement.getText(); } + logger.info("[国标级联] 录像查询, 平台:{}, 通道: {}, 时间: {}-{}", + parentPlatform.getServerGBId(), channelId, startTime, endTime); Element secrecyElement = rootElement.element("Secrecy"); int secrecy = 0; if (secrecyElement != null) { @@ -100,54 +105,84 @@ public class RecordInfoQueryMessageHandler extends SIPRequestProcessorParent imp } // 确认是直播还是国标, 国标直接请求下级,直播请求录像管理服务 CommonGbChannel commonGbChannel = platformChannelService.queryChannelByPlatformIdAndChannelDeviceId(parentPlatform.getId(), channelId); - if (commonGbChannel.getType().equals(CommonGbChannelType.GB28181)) { // 国标 - // 向国标设备请求录像数据 - Device device = deviceChannelService.getDeviceByChannelCommonGbId(commonGbChannel.getCommonGbId()); - - // 接收录像数据 - recordEndEventListener.addEndEventHandler(device.getDeviceId(), channelId, (recordInfo)->{ - try { - logger.info("[国标级联] 录像查询收到数据, 通道: {},准备转发===", channelId); - cmderFroPlatform.recordInfo(commonGbChannel, parentPlatform, request.getFromTag(), recordInfo); - } catch (SipException | InvalidArgumentException | ParseException e) { - logger.error("[命令发送失败] 国标级联 回复录像数据: {}", e.getMessage()); - } - }); - try { - commander.recordInfoQuery(device, channelId, DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(startTime), - DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(endTime), sn, secrecy, type, (eventResult -> { - // 回复200 OK - try { - responseAck(request, Response.OK); - } catch (SipException | InvalidArgumentException | ParseException e) { - logger.error("[命令发送失败] 录像查询回复: {}", e.getMessage()); - } - }),(eventResult -> { - // 查询失败 - try { - responseAck(request, eventResult.statusCode, eventResult.msg); - } catch (SipException | InvalidArgumentException | ParseException e) { - logger.error("[命令发送失败] 录像查询回复: {}", e.getMessage()); - } - })); - } catch (InvalidArgumentException | ParseException | SipException e) { - logger.error("[命令发送失败] 录像查询: {}", e.getMessage()); - } - - }else if (commonGbChannel.getType().equals(CommonGbChannelType.PUSH) - || commonGbChannel.getType().equals(CommonGbChannelType.PROXY)) { // 直播流 - // TODO - try { - responseAck(request, Response.NOT_IMPLEMENTED); // 回复未实现 - } catch (SipException | InvalidArgumentException | ParseException e) { - logger.error("[命令发送失败] 录像查询: {}", e.getMessage()); - } - }else { // 错误的请求 - try { - responseAck(request, Response.BAD_REQUEST); - } catch (SipException | InvalidArgumentException | ParseException e) { - logger.error("[命令发送失败] 录像查询: {}", e.getMessage()); - } + if (commonGbChannel == null) { + logger.error("[DeviceInfo查询]失败:平台未关联通道 platformId {}, channelId: {}", parentPlatform.getServerGBId(), channelId); + return; } + IResourceService resourceService = resourceServiceMap.get(commonGbChannel.getType()); + if (resourceService == null) { + logger.error("[DeviceInfo查询]失败:平台未关联通道 platformId {}, channelId: {}", parentPlatform.getServerGBId(), channelId); + return; + } + + resourceService.queryrecord(commonGbChannel, sn, secrecy, type, startTime, endTime, (recordInfo -> { + if (recordInfo == null ) { + logger.info("[DeviceInfo查询] 录像查询, 结果为空,platformId {}, channelId: {}", + parentPlatform.getServerGBId(), channelId); + return; + } + if (recordInfo.getRecordList() == null) { + recordInfo.setRecordList(new ArrayList<>()); + } + // 向上级发送录像数据 + logger.info("[国标级联]录像查询收到数据, 共{}条, platformId {}, channelId: {}", + recordInfo.getRecordList().size(), parentPlatform.getServerGBId(), channelId); + try { + cmderFroPlatform.recordInfo(commonGbChannel, parentPlatform, request.getFromTag(), recordInfo); + } catch (InvalidArgumentException | ParseException | SipException e) { + logger.error("[命令发送失败] 国标级联-录像查询: {}", e.getMessage()); + } + })); + + +// if (commonGbChannel.getType().equals(CommonGbChannelType.GB28181)) { // 国标 +// // 向国标设备请求录像数据 +// Device device = deviceChannelService.getDeviceByChannelCommonGbId(commonGbChannel.getCommonGbId()); +// +// // 接收录像数据 +// recordEndEventListener.addEndEventHandler(device.getDeviceId(), channelId, (recordInfo)->{ +// try { +// logger.info("[国标级联] 录像查询收到数据, 通道: {},准备转发===", channelId); +// cmderFroPlatform.recordInfo(commonGbChannel, parentPlatform, request.getFromTag(), recordInfo); +// } catch (SipException | InvalidArgumentException | ParseException e) { +// logger.error("[命令发送失败] 国标级联 回复录像数据: {}", e.getMessage()); +// } +// }); +// try { +// commander.recordInfoQuery(device, channelId, DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(startTime), +// DateUtil.ISO8601Toyyyy_MM_dd_HH_mm_ss(endTime), sn, secrecy, type, (eventResult -> { +// // 回复200 OK +// try { +// responseAck(request, Response.OK); +// } catch (SipException | InvalidArgumentException | ParseException e) { +// logger.error("[命令发送失败] 录像查询回复: {}", e.getMessage()); +// } +// }),(eventResult -> { +// // 查询失败 +// try { +// responseAck(request, eventResult.statusCode, eventResult.msg); +// } catch (SipException | InvalidArgumentException | ParseException e) { +// logger.error("[命令发送失败] 录像查询回复: {}", e.getMessage()); +// } +// })); +// } catch (InvalidArgumentException | ParseException | SipException e) { +// logger.error("[命令发送失败] 录像查询: {}", e.getMessage()); +// } +// +// }else if (commonGbChannel.getType().equals(CommonGbChannelType.PUSH) +// || commonGbChannel.getType().equals(CommonGbChannelType.PROXY)) { // 直播流 +// // TODO +// try { +// responseAck(request, Response.NOT_IMPLEMENTED); // 回复未实现 +// } catch (SipException | InvalidArgumentException | ParseException e) { +// logger.error("[命令发送失败] 录像查询: {}", e.getMessage()); +// } +// }else { // 错误的请求 +// try { +// responseAck(request, Response.BAD_REQUEST); +// } catch (SipException | InvalidArgumentException | ParseException e) { +// logger.error("[命令发送失败] 录像查询: {}", e.getMessage()); +// } +// } } } diff --git a/src/main/java/com/genersoft/iot/vmp/service/IResourceService.java b/src/main/java/com/genersoft/iot/vmp/service/IResourceService.java index cd6bdde7..5fea6e7e 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/IResourceService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/IResourceService.java @@ -1,8 +1,9 @@ package com.genersoft.iot.vmp.service; +import com.genersoft.iot.vmp.common.CommonCallback; import com.genersoft.iot.vmp.common.CommonGbChannel; -import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.gb28181.bean.DragZoomRequest; +import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; import com.genersoft.iot.vmp.gb28181.bean.command.PTZCommand; /** @@ -82,4 +83,8 @@ public interface IResourceService { * 看守位控制 */ void setHomePosition(CommonGbChannel commonGbChannel, boolean enabled, Integer resetTime, Integer presetIndex); + + + void queryrecord(CommonGbChannel commonGbChannel, int sn, int secrecy, String type, + String startTime, String endTime, CommonCallback callback); } diff --git a/src/main/java/com/genersoft/iot/vmp/service/bean/PlayBackCallback.java b/src/main/java/com/genersoft/iot/vmp/service/bean/PlayBackCallback.java deleted file mode 100755 index 33a09bd4..00000000 --- a/src/main/java/com/genersoft/iot/vmp/service/bean/PlayBackCallback.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.genersoft.iot.vmp.service.bean; - -public interface PlayBackCallback { - - void call(PlayBackResult msg); - -} diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyResourceServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyResourceServiceImpl.java index f503c498..1f625bd9 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyResourceServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyResourceServiceImpl.java @@ -1,12 +1,16 @@ package com.genersoft.iot.vmp.service.impl; +import com.genersoft.iot.vmp.common.CommonCallback; import com.genersoft.iot.vmp.common.CommonGbChannel; -import com.genersoft.iot.vmp.common.StreamInfo; -import com.genersoft.iot.vmp.gb28181.GB28181ResourceServiceImpl; +import com.genersoft.iot.vmp.gb28181.bean.DragZoomRequest; +import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; import com.genersoft.iot.vmp.gb28181.bean.command.PTZCommand; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.media.zlm.dto.StreamProxy; -import com.genersoft.iot.vmp.service.*; +import com.genersoft.iot.vmp.service.IMediaServerService; +import com.genersoft.iot.vmp.service.IResourcePlayCallback; +import com.genersoft.iot.vmp.service.IResourceService; +import com.genersoft.iot.vmp.service.IStreamProxyPlayService; import com.genersoft.iot.vmp.service.bean.CommonGbChannelType; import com.genersoft.iot.vmp.service.bean.InviteErrorCode; import com.genersoft.iot.vmp.storager.dao.StreamProxyMapper; @@ -94,4 +98,44 @@ public class StreamProxyResourceServiceImpl implements IResourceService { public void startDownload(CommonGbChannel channel, Long startTime, Long stopTime, Integer downloadSpeed, IResourcePlayCallback playCallback) { } + + @Override + public void resetAlarm(CommonGbChannel commonGbChannel, Integer alarmMethod, Integer alarmType) { + + } + + @Override + public void setGuard(CommonGbChannel commonGbChannel, boolean setGuard) { + + } + + @Override + public void setRecord(CommonGbChannel commonGbChannel, Boolean isRecord) { + + } + + @Override + public void setIFame(CommonGbChannel commonGbChannel) { + + } + + @Override + public void setTeleBoot(CommonGbChannel commonGbChannel) { + + } + + @Override + public void dragZoom(CommonGbChannel commonGbChannel, DragZoomRequest.DragZoom dragZoom, boolean isIn) { + + } + + @Override + public void setHomePosition(CommonGbChannel commonGbChannel, boolean enabled, Integer resetTime, Integer presetIndex) { + + } + + @Override + public void queryrecord(CommonGbChannel commonGbChannel, int sn, int secrecy, String type, String startTime, String endTime, CommonCallback callback) { + + } } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushResourceServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushResourceServiceImpl.java index 2dec3457..c7e85951 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushResourceServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushResourceServiceImpl.java @@ -1,6 +1,9 @@ package com.genersoft.iot.vmp.service.impl; +import com.genersoft.iot.vmp.common.CommonCallback; import com.genersoft.iot.vmp.common.CommonGbChannel; +import com.genersoft.iot.vmp.gb28181.bean.DragZoomRequest; +import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; import com.genersoft.iot.vmp.gb28181.bean.command.PTZCommand; import com.genersoft.iot.vmp.service.IResourcePlayCallback; import com.genersoft.iot.vmp.service.IResourceService; @@ -43,4 +46,44 @@ public class StreamPushResourceServiceImpl implements IResourceService { public void startDownload(CommonGbChannel channel, Long startTime, Long stopTime, Integer downloadSpeed, IResourcePlayCallback playCallback) { } + + @Override + public void resetAlarm(CommonGbChannel commonGbChannel, Integer alarmMethod, Integer alarmType) { + + } + + @Override + public void setGuard(CommonGbChannel commonGbChannel, boolean setGuard) { + + } + + @Override + public void setRecord(CommonGbChannel commonGbChannel, Boolean isRecord) { + + } + + @Override + public void setIFame(CommonGbChannel commonGbChannel) { + + } + + @Override + public void setTeleBoot(CommonGbChannel commonGbChannel) { + + } + + @Override + public void dragZoom(CommonGbChannel commonGbChannel, DragZoomRequest.DragZoom dragZoom, boolean isIn) { + + } + + @Override + public void setHomePosition(CommonGbChannel commonGbChannel, boolean enabled, Integer resetTime, Integer presetIndex) { + + } + + @Override + public void queryrecord(CommonGbChannel commonGbChannel, int sn, int secrecy, String type, String startTime, String endTime, CommonCallback callback) { + + } } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java index fc49758f..0994479a 100755 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java @@ -538,6 +538,6 @@ public interface DeviceChannelMapper { " "}) List getCommonChannelIdList(@Param("deviceId") String deviceId, @Param("online") Boolean online); - @Select("select de.* from wvp_device de left join wvp_device_channel dc on de.device_id = dc.deviceId where dc.common_gb_channel_id=#{commonGbId}") + @Select("select de.* from wvp_device de left join wvp_device_channel dc on de.device_id = dc.device_id where dc.common_gb_channel_id=#{commonGbId}") Device getDeviceByChannelCommonGbId(@Param("commonGbId") int commonGbId); } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java index 57138099..d40faa71 100755 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/ParentPlatformMapper.java @@ -2,9 +2,7 @@ package com.genersoft.iot.vmp.storager.dao; import com.genersoft.iot.vmp.common.CommonGbChannel; import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; -import com.genersoft.iot.vmp.storager.dao.dto.ChannelSourceInfo; import org.apache.ibatis.annotations.*; -import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import java.util.List; @@ -22,7 +20,7 @@ public interface ParentPlatformMapper { "status,start_offline_push,catalog_group,create_time,update_time) " + " VALUES (#{enable}, #{name}, #{serverGBId}, #{serverGBDomain}, #{serverIP}, #{serverPort}, #{deviceGBId}, #{deviceIp}, " + " #{devicePort}, #{username}, #{password}, #{expires}, #{keepTimeout}, #{transport}, #{characterSet}, #{ptz}, " + - " #{rtcp}, #{asMessageChannel}, #{autoPushChannel}, #{shareAllChannel}, #{shareGroup}, #{shareRegion, #{systemCatalog}, " + + " #{rtcp}, #{asMessageChannel}, #{autoPushChannel}, #{shareAllChannel}, #{shareGroup}, #{shareRegion}, #{systemCatalog}, " + " #{status}, #{startOfflinePush}, #{catalogGroup}, #{createTime}, #{updateTime})") int addParentPlatform(ParentPlatform parentPlatform);