package com.genersoft.iot.vmp.gb28181.transmit.cmd; import java.text.ParseException; import java.util.ArrayList; import javax.sip.InvalidArgumentException; import javax.sip.address.Address; import javax.sip.address.SipURI; import javax.sip.header.CSeqHeader; import javax.sip.header.CallIdHeader; import javax.sip.header.ContentTypeHeader; import javax.sip.header.FromHeader; import javax.sip.header.MaxForwardsHeader; import javax.sip.header.ToHeader; import javax.sip.header.ViaHeader; import javax.sip.message.Request; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.gb28181.SipLayer; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.Host; /** * @Description:TODO(这里用一句话描述这个类的作用) * @author: songww * @date: 2020年5月6日 上午9:29:02 */ @Component public class SIPRequestHeaderProvider { @Autowired private SipLayer layer; @Autowired private SipConfig config; public Request createMessageRequest(Device device, String content, String viaTag, String fromTag, String toTag) throws ParseException, InvalidArgumentException { Request request = null; Host host = device.getHost(); // sipuri SipURI requestURI = layer.getAddressFactory().createSipURI(device.getDeviceId(), host.getAddress()); // via ArrayList viaHeaders = new ArrayList(); ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(config.getSipIp(), config.getSipPort(), device.getTransport(), viaTag); viaHeaders.add(viaHeader); // from SipURI fromSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(), config.getSipIp() + ":" + config.getSipPort()); Address fromAddress = layer.getAddressFactory().createAddress(fromSipURI); FromHeader fromHeader = layer.getHeaderFactory().createFromHeader(fromAddress, fromTag); // to SipURI toSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(), host.getAddress()); Address toAddress = layer.getAddressFactory().createAddress(toSipURI); ToHeader toHeader = layer.getHeaderFactory().createToHeader(toAddress, toTag); // callid CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? layer.getTcpSipProvider().getNewCallId() : layer.getUdpSipProvider().getNewCallId(); // Forwards MaxForwardsHeader maxForwards = layer.getHeaderFactory().createMaxForwardsHeader(70); // ceq CSeqHeader cSeqHeader = layer.getHeaderFactory().createCSeqHeader(1L, Request.MESSAGE); request = layer.getMessageFactory().createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader, toHeader, viaHeaders, maxForwards); ContentTypeHeader contentTypeHeader = layer.getHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); request.setContent(content, contentTypeHeader); return request; } public Request createInviteRequest(Device device, String content, String viaTag, String fromTag, String toTag) throws ParseException, InvalidArgumentException { Request request = null; Host host = device.getHost(); //请求行 SipURI requestLine = layer.getAddressFactory().createSipURI(device.getDeviceId(), host.getAddress()); //via ArrayList viaHeaders = new ArrayList(); ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(config.getSipIp(), config.getSipPort(), device.getTransport(), viaTag); viaHeader.setRPort(); viaHeaders.add(viaHeader); //from SipURI fromSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(),config.getSipIp()+":"+config.getSipPort()); Address fromAddress = layer.getAddressFactory().createAddress(fromSipURI); FromHeader fromHeader = layer.getHeaderFactory().createFromHeader(fromAddress, fromTag); //必须要有标记,否则无法创建会话,无法回应ack //to SipURI toSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(),host.getAddress()); Address toAddress = layer.getAddressFactory().createAddress(toSipURI); ToHeader toHeader = layer.getHeaderFactory().createToHeader(toAddress,null); //callid CallIdHeader callIdHeader = null; if(device.getTransport().equals("TCP")) { callIdHeader = layer.getTcpSipProvider().getNewCallId(); } if(device.getTransport().equals("UDP")) { callIdHeader = layer.getUdpSipProvider().getNewCallId(); } //Forwards MaxForwardsHeader maxForwards = layer.getHeaderFactory().createMaxForwardsHeader(70); //ceq CSeqHeader cSeqHeader = layer.getHeaderFactory().createCSeqHeader(1L, Request.INVITE); request = layer.getMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards); ContentTypeHeader contentTypeHeader = layer.getHeaderFactory().createContentTypeHeader("Application", "SDP"); request.setContent(content, contentTypeHeader); return request; } }