diff --git a/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/message/processor/invite/request/InviteRequestProcessor.java b/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/message/processor/invite/request/InviteRequestProcessor.java index 5f091be..6814a8a 100644 --- a/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/message/processor/invite/request/InviteRequestProcessor.java +++ b/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/message/processor/invite/request/InviteRequestProcessor.java @@ -1,5 +1,6 @@ package cn.skcks.docking.gb28181.mocking.core.sip.message.processor.invite.request; +import cn.hutool.core.date.DateUtil; import cn.skcks.docking.gb28181.core.sip.gb28181.sdp.GB28181Description; import cn.skcks.docking.gb28181.core.sip.listener.SipListener; import cn.skcks.docking.gb28181.core.sip.message.processor.MessageProcessor; @@ -7,16 +8,21 @@ import cn.skcks.docking.gb28181.core.sip.utils.SipUtil; import cn.skcks.docking.gb28181.mocking.core.sip.gb28181.sdp.GB28181DescriptionParser; import cn.skcks.docking.gb28181.mocking.core.sip.response.SipResponseBuilder; import cn.skcks.docking.gb28181.mocking.core.sip.sender.SipSender; +import cn.skcks.docking.gb28181.mocking.orm.mybatis.dynamic.mapper.MockingDeviceMapper; +import gov.nist.javax.sdp.TimeDescriptionImpl; +import gov.nist.javax.sdp.fields.TimeField; import gov.nist.javax.sip.message.SIPRequest; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import javax.sdp.Media; import javax.sdp.MediaDescription; import javax.sdp.SdpParseException; +import javax.sdp.SessionName; import javax.sip.RequestEvent; import javax.sip.header.CallIdHeader; import javax.sip.message.Request; @@ -32,6 +38,8 @@ public class InviteRequestProcessor implements MessageProcessor { private final SipSender sender; + private final MockingDeviceMapper mockingDeviceMapper; + @PostConstruct @Override public void init() { @@ -63,14 +71,74 @@ public class InviteRequestProcessor implements MessageProcessor { log.error("sdp media 解析异常: {}", e.getMessage()); return false; } - }).findFirst().ifPresentOrElse((ignore)->{ - log.info("{}", ignore); + }).findFirst().ifPresentOrElse((item)->{ + SessionName sessionName = gb28181Description.getSessionName(); + try { + String type = sessionName.getValue(); + log.info("type {}", type); + if(StringUtils.equalsAnyIgnoreCase(type,"Play","PlayBack")){ + log.info("点播/回放请求"); + if(StringUtils.equalsIgnoreCase(type,"Play")){ + play(gb28181Description, (MediaDescription) item); + } else { + playback(gb28181Description, (MediaDescription) item); + } + } else if(StringUtils.equalsIgnoreCase(type,"Download")){ + log.info("下载请求"); + } else { + log.error("未知请求类型: {}", type); + sender.sendResponse(senderIp, transport, unsupported(request)); + } + } catch (SdpParseException e) { + log.error("sdp 解析异常: {}", e.getMessage()); + } },()->{ log.info("未找到支持的媒体类型"); - sender.sendResponse(senderIp,transport, ((provider, ip, port) -> - SipResponseBuilder.response(request, - Response.UNSUPPORTED_MEDIA_TYPE, - "Unsupported Media Type"))); + sender.sendResponse(senderIp, transport, unsupported(request)); }); } + + private SipSender.SendResponse unsupported(SIPRequest request) { + return (provider, ip, port) -> SipResponseBuilder.response(request, Response.UNSUPPORTED_MEDIA_TYPE, + "Unsupported Media Type"); + } + + /** + * 模拟设备不支持实时 故直接回放 最近15分钟 至 当前时间录像 + * @param gb28181Description gb28181 sdp + * @param mediaDescription 媒体描述符 + */ + @SneakyThrows + private void play(GB28181Description gb28181Description, MediaDescription mediaDescription){ + TimeField time = new TimeField(); + time.setStart(DateUtil.offsetMinute(DateUtil.date(), -15)); + time.setStop(DateUtil.date()); + playback(gb28181Description, mediaDescription, time); + } + + /** + * 模拟设备 录像回放 当前小时至当前时间录像 + * @param gb28181Description gb28181 sdp + * @param mediaDescription 媒体描述符 + */ + @SneakyThrows + private void playback(GB28181Description gb28181Description, MediaDescription mediaDescription) { + TimeDescriptionImpl timeDescription = (TimeDescriptionImpl) gb28181Description.getTimeDescriptions(true).get(0); + TimeField time = (TimeField) timeDescription.getTime(); + playback(gb28181Description, mediaDescription, time); + } + + @SneakyThrows + private void playback(GB28181Description gb28181Description, MediaDescription mediaDescription, TimeField time){ + Media media = mediaDescription.getMedia(); + int port = media.getMediaPort(); + log.info("目标端口号: {}", port); + log.info("{} ~ {}", time.getStart(), time.getStop()); + + String channelId = gb28181Description.getOrigin().getUsername(); + log.info("通道id: {}", channelId); + String address = gb28181Description.getOrigin().getAddress(); + log.info("目标地址: {}", address); + + } }