| | |
| | | package com.genersoft.iot.vmp.gb28181.transmit.event.response.impl; |
| | | |
| | | import com.genersoft.iot.vmp.conf.SipConfig; |
| | | import com.genersoft.iot.vmp.gb28181.SipLayer; |
| | | import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.SIPSender; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderProvider; |
| | | import com.genersoft.iot.vmp.gb28181.transmit.event.response.SIPResponseProcessorAbstract; |
| | | import gov.nist.javax.sip.ResponseEventExt; |
| | | import gov.nist.javax.sip.stack.SIPDialog; |
| | | import gov.nist.javax.sip.message.SIPResponse; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.sdp.SdpFactory; |
| | | import javax.sdp.SdpParseException; |
| | | import javax.sdp.SessionDescription; |
| | | import javax.sip.InvalidArgumentException; |
| | | import javax.sip.ResponseEvent; |
| | | import javax.sip.SipException; |
| | | import javax.sip.address.SipURI; |
| | | import javax.sip.header.CSeqHeader; |
| | | import javax.sip.message.Request; |
| | | import javax.sip.message.Response; |
| | | import java.text.ParseException; |
| | |
| | | public class InviteResponseProcessor extends SIPResponseProcessorAbstract { |
| | | |
| | | private final static Logger logger = LoggerFactory.getLogger(InviteResponseProcessor.class); |
| | | private String method = "INVITE"; |
| | | private final String method = "INVITE"; |
| | | |
| | | @Autowired |
| | | private SIPProcessorObserver sipProcessorObserver; |
| | | |
| | | |
| | | @Autowired |
| | | private SipLayer sipLayer; |
| | | |
| | | @Autowired |
| | | private SipConfig config; |
| | | |
| | | private SIPSender sipSender; |
| | | |
| | | @Autowired |
| | | private SIPProcessorObserver sipProcessorObserver; |
| | | private SIPRequestHeaderProvider headerProvider; |
| | | |
| | | |
| | | @Override |
| | | public void afterPropertiesSet() throws Exception { |
| | |
| | | sipProcessorObserver.addResponseProcessor(method, this); |
| | | } |
| | | |
| | | @Autowired |
| | | private VideoStreamSessionManager streamSession; |
| | | |
| | | |
| | | /** |
| | | * 处理invite响应 |
| | |
| | | */ |
| | | @Override |
| | | public void process(ResponseEvent evt ){ |
| | | logger.debug("接收到消息:" + evt.getResponse()); |
| | | try { |
| | | Response response = evt.getResponse(); |
| | | SIPResponse response = (SIPResponse)evt.getResponse(); |
| | | int statusCode = response.getStatusCode(); |
| | | // trying不会回复 |
| | | if (statusCode == Response.TRYING) { |
| | |
| | | // 下发ack |
| | | if (statusCode == Response.OK) { |
| | | ResponseEventExt event = (ResponseEventExt)evt; |
| | | SIPDialog dialog = (SIPDialog)evt.getDialog(); |
| | | CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME); |
| | | Request reqAck = dialog.createAck(cseq.getSeqNumber()); |
| | | SipURI requestURI = (SipURI) reqAck.getRequestURI(); |
| | | try { |
| | | requestURI.setHost(event.getRemoteIpAddress()); |
| | | } catch (ParseException e) { |
| | | e.printStackTrace(); |
| | | |
| | | String contentString = new String(response.getRawContent()); |
| | | // jainSip不支持y=字段, 移除以解析。 |
| | | int ssrcIndex = contentString.indexOf("y="); |
| | | // 检查是否有y字段 |
| | | SessionDescription sdp; |
| | | if (ssrcIndex >= 0) { |
| | | //ssrc规定长度为10字节,不取余下长度以避免后续还有“f=”字段 |
| | | String substring = contentString.substring(0, contentString.indexOf("y=")); |
| | | sdp = SdpFactory.getInstance().createSessionDescription(substring); |
| | | } else { |
| | | sdp = SdpFactory.getInstance().createSessionDescription(contentString); |
| | | } |
| | | requestURI.setPort(event.getRemotePort()); |
| | | reqAck.setRequestURI(requestURI); |
| | | logger.info("向 " + event.getRemoteIpAddress() + ":" + event.getRemotePort() + "回复ack"); |
| | | // 查看是否是来自设备的,此是回复 |
| | | |
| | | dialog.sendAck(reqAck); |
| | | SipURI requestUri = sipLayer.getSipFactory().createAddressFactory().createSipURI(sdp.getOrigin().getUsername(), event.getRemoteIpAddress() + ":" + event.getRemotePort()); |
| | | Request reqAck = headerProvider.createAckRequest(response.getLocalAddress().getHostAddress(), requestUri, response); |
| | | |
| | | logger.info("[回复ack] {}-> {}:{} ", sdp.getOrigin().getUsername(), event.getRemoteIpAddress(), event.getRemotePort()); |
| | | sipSender.transmitRequest( response.getLocalAddress().getHostAddress(), reqAck); |
| | | } |
| | | } catch (InvalidArgumentException | SipException e) { |
| | | e.printStackTrace(); |
| | | } catch (InvalidArgumentException | ParseException | SipException | SdpParseException e) { |
| | | logger.info("[点播回复ACK],异常:", e ); |
| | | } |
| | | } |
| | | |