invite 请求解析
This commit is contained in:
parent
7a89ac8184
commit
53dd8c1733
@ -1,5 +1,6 @@
|
|||||||
package cn.skcks.docking.gb28181.mocking.core.sip.message.processor.invite.request;
|
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.gb28181.sdp.GB28181Description;
|
||||||
import cn.skcks.docking.gb28181.core.sip.listener.SipListener;
|
import cn.skcks.docking.gb28181.core.sip.listener.SipListener;
|
||||||
import cn.skcks.docking.gb28181.core.sip.message.processor.MessageProcessor;
|
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.gb28181.sdp.GB28181DescriptionParser;
|
||||||
import cn.skcks.docking.gb28181.mocking.core.sip.response.SipResponseBuilder;
|
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.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 gov.nist.javax.sip.message.SIPRequest;
|
||||||
import jakarta.annotation.PostConstruct;
|
import jakarta.annotation.PostConstruct;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.sdp.Media;
|
import javax.sdp.Media;
|
||||||
import javax.sdp.MediaDescription;
|
import javax.sdp.MediaDescription;
|
||||||
import javax.sdp.SdpParseException;
|
import javax.sdp.SdpParseException;
|
||||||
|
import javax.sdp.SessionName;
|
||||||
import javax.sip.RequestEvent;
|
import javax.sip.RequestEvent;
|
||||||
import javax.sip.header.CallIdHeader;
|
import javax.sip.header.CallIdHeader;
|
||||||
import javax.sip.message.Request;
|
import javax.sip.message.Request;
|
||||||
@ -32,6 +38,8 @@ public class InviteRequestProcessor implements MessageProcessor {
|
|||||||
|
|
||||||
private final SipSender sender;
|
private final SipSender sender;
|
||||||
|
|
||||||
|
private final MockingDeviceMapper mockingDeviceMapper;
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
@Override
|
@Override
|
||||||
public void init() {
|
public void init() {
|
||||||
@ -63,14 +71,74 @@ public class InviteRequestProcessor implements MessageProcessor {
|
|||||||
log.error("sdp media 解析异常: {}", e.getMessage());
|
log.error("sdp media 解析异常: {}", e.getMessage());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}).findFirst().ifPresentOrElse((ignore)->{
|
}).findFirst().ifPresentOrElse((item)->{
|
||||||
log.info("{}", ignore);
|
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("未找到支持的媒体类型");
|
log.info("未找到支持的媒体类型");
|
||||||
sender.sendResponse(senderIp,transport, ((provider, ip, port) ->
|
sender.sendResponse(senderIp, transport, unsupported(request));
|
||||||
SipResponseBuilder.response(request,
|
|
||||||
Response.UNSUPPORTED_MEDIA_TYPE,
|
|
||||||
"Unsupported Media Type")));
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user