|  |  |  | 
|---|
|  |  |  | import java.text.ParseException; | 
|---|
|  |  |  | import java.util.ArrayList; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import javax.sip.Dialog; | 
|---|
|  |  |  | import javax.sip.InvalidArgumentException; | 
|---|
|  |  |  | import javax.sip.PeerUnavailableException; | 
|---|
|  |  |  | import javax.sip.SipFactory; | 
|---|
|  |  |  | 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.header.*; | 
|---|
|  |  |  | import javax.sip.message.Request; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.genersoft.iot.vmp.common.StreamInfo; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; | 
|---|
|  |  |  | 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:摄像头命令request创造器 TODO 冗余代码太多待优化 | 
|---|
|  |  |  | * @author: songww | 
|---|
|  |  |  | * @description:摄像头命令request创造器 TODO 冗余代码太多待优化 | 
|---|
|  |  |  | * @author: swwheihei | 
|---|
|  |  |  | * @date: 2020年5月6日 上午9:29:02 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Component | 
|---|
|  |  |  | public class SIPRequestHeaderProvider { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private SipLayer layer; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private SipConfig sipConfig; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public Request createMessageRequest(Device device, String content, String viaTag, String fromTag, String toTag) throws ParseException, InvalidArgumentException { | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private SipFactory sipFactory; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private IRedisCatchStorage redisCatchStorage; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private VideoStreamSessionManager streamSession; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public Request createMessageRequest(Device device, String content, String viaTag, String fromTag, String toTag, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException { | 
|---|
|  |  |  | Request request = null; | 
|---|
|  |  |  | Host host = device.getHost(); | 
|---|
|  |  |  | // sipuri | 
|---|
|  |  |  | SipURI requestURI = layer.getAddressFactory().createSipURI(device.getDeviceId(), host.getAddress()); | 
|---|
|  |  |  | SipURI requestURI = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress()); | 
|---|
|  |  |  | // via | 
|---|
|  |  |  | ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); | 
|---|
|  |  |  | ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(), | 
|---|
|  |  |  | ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), device.getTransport(), viaTag); | 
|---|
|  |  |  | viaHeader.setRPort(); | 
|---|
|  |  |  | viaHeaders.add(viaHeader); | 
|---|
|  |  |  | // from | 
|---|
|  |  |  | SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), | 
|---|
|  |  |  | sipConfig.getIp() + ":" + sipConfig.getPort()); | 
|---|
|  |  |  | Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI); | 
|---|
|  |  |  | FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag); | 
|---|
|  |  |  | // to | 
|---|
|  |  |  | SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), sipConfig.getDomain()); | 
|---|
|  |  |  | Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI); | 
|---|
|  |  |  | ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, toTag); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // Forwards | 
|---|
|  |  |  | MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); | 
|---|
|  |  |  | // ceq | 
|---|
|  |  |  | CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(1L, Request.MESSAGE); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | request = sipFactory.createMessageFactory().createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader, | 
|---|
|  |  |  | toHeader, viaHeaders, maxForwards); | 
|---|
|  |  |  | ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "MANSCDP+xml"); | 
|---|
|  |  |  | request.setContent(content, contentTypeHeader); | 
|---|
|  |  |  | return request; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public Request createInviteRequest(Device device, String channelId, String content, String viaTag, String fromTag, String toTag, String ssrc, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException { | 
|---|
|  |  |  | Request request = null; | 
|---|
|  |  |  | //请求行 | 
|---|
|  |  |  | SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress()); | 
|---|
|  |  |  | //via | 
|---|
|  |  |  | ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); | 
|---|
|  |  |  | ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), device.getTransport(), viaTag); | 
|---|
|  |  |  | viaHeader.setRPort(); | 
|---|
|  |  |  | viaHeaders.add(viaHeader); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //from | 
|---|
|  |  |  | SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(),sipConfig.getDomain()); | 
|---|
|  |  |  | Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI); | 
|---|
|  |  |  | FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag); //必须要有标记,否则无法创建会话,无法回应ack | 
|---|
|  |  |  | //to | 
|---|
|  |  |  | SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(channelId,sipConfig.getDomain()); | 
|---|
|  |  |  | Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI); | 
|---|
|  |  |  | ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress,null); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //Forwards | 
|---|
|  |  |  | MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //ceq | 
|---|
|  |  |  | CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(Request.INVITE), Request.INVITE); | 
|---|
|  |  |  | request = sipFactory.createMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort())); | 
|---|
|  |  |  | // Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), device.getHost().getIp()+":"+device.getHost().getPort())); | 
|---|
|  |  |  | request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); | 
|---|
|  |  |  | // Subject | 
|---|
|  |  |  | SubjectHeader subjectHeader = sipFactory.createHeaderFactory().createSubjectHeader(String.format("%s:%s,%s:%s", channelId, ssrc, sipConfig.getId(), 0)); | 
|---|
|  |  |  | request.addHeader(subjectHeader); | 
|---|
|  |  |  | ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); | 
|---|
|  |  |  | request.setContent(content, contentTypeHeader); | 
|---|
|  |  |  | return request; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public Request createPlaybackInviteRequest(Device device, String channelId, String content, String viaTag, String fromTag, String toTag, CallIdHeader callIdHeader, String ssrc) throws ParseException, InvalidArgumentException, PeerUnavailableException { | 
|---|
|  |  |  | Request request = null; | 
|---|
|  |  |  | //请求行 | 
|---|
|  |  |  | SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress()); | 
|---|
|  |  |  | // via | 
|---|
|  |  |  | ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); | 
|---|
|  |  |  | ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), device.getTransport(), viaTag); | 
|---|
|  |  |  | viaHeader.setRPort(); | 
|---|
|  |  |  | viaHeaders.add(viaHeader); | 
|---|
|  |  |  | //from | 
|---|
|  |  |  | SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(),sipConfig.getDomain()); | 
|---|
|  |  |  | Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI); | 
|---|
|  |  |  | FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag); //必须要有标记,否则无法创建会话,无法回应ack | 
|---|
|  |  |  | //to | 
|---|
|  |  |  | SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(channelId, sipConfig.getDomain()); | 
|---|
|  |  |  | Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI); | 
|---|
|  |  |  | ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress,null); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //Forwards | 
|---|
|  |  |  | MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //ceq | 
|---|
|  |  |  | CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(Request.INVITE), Request.INVITE); | 
|---|
|  |  |  | request = sipFactory.createMessageFactory().createRequest(requestLine, Request.INVITE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort())); | 
|---|
|  |  |  | // Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), device.getHost().getIp()+":"+device.getHost().getPort())); | 
|---|
|  |  |  | request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); | 
|---|
|  |  |  | // Subject | 
|---|
|  |  |  | SubjectHeader subjectHeader = sipFactory.createHeaderFactory().createSubjectHeader(String.format("%s:%s,%s:%s", channelId, ssrc, sipConfig.getId(), 0)); | 
|---|
|  |  |  | request.addHeader(subjectHeader); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); | 
|---|
|  |  |  | request.setContent(content, contentTypeHeader); | 
|---|
|  |  |  | return request; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public Request createByteRequest(Device device, String channelId, String viaTag, String fromTag, String toTag, String callId) throws ParseException, InvalidArgumentException, PeerUnavailableException { | 
|---|
|  |  |  | Request request = null; | 
|---|
|  |  |  | //请求行 | 
|---|
|  |  |  | SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress()); | 
|---|
|  |  |  | // via | 
|---|
|  |  |  | ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); | 
|---|
|  |  |  | ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), device.getTransport(), viaTag); | 
|---|
|  |  |  | viaHeaders.add(viaHeader); | 
|---|
|  |  |  | //from | 
|---|
|  |  |  | SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(),sipConfig.getDomain()); | 
|---|
|  |  |  | Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI); | 
|---|
|  |  |  | FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag); //必须要有标记,否则无法创建会话,无法回应ack | 
|---|
|  |  |  | //to | 
|---|
|  |  |  | SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(channelId,sipConfig.getDomain()); | 
|---|
|  |  |  | Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI); | 
|---|
|  |  |  | ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress,toTag); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //Forwards | 
|---|
|  |  |  | MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //ceq | 
|---|
|  |  |  | CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(1L, Request.BYE); | 
|---|
|  |  |  | CallIdHeader callIdHeader = sipFactory.createHeaderFactory().createCallIdHeader(callId); | 
|---|
|  |  |  | request = sipFactory.createMessageFactory().createRequest(requestLine, Request.BYE, callIdHeader, cSeqHeader,fromHeader, toHeader, viaHeaders, maxForwards); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort())); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return request; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public Request createSubscribeRequest(Device device, String content, String viaTag, String fromTag, String toTag, Integer expires, String event, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException { | 
|---|
|  |  |  | Request request = null; | 
|---|
|  |  |  | // sipuri | 
|---|
|  |  |  | SipURI requestURI = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress()); | 
|---|
|  |  |  | // via | 
|---|
|  |  |  | ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); | 
|---|
|  |  |  | ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), sipConfig.getPort(), | 
|---|
|  |  |  | device.getTransport(), viaTag); | 
|---|
|  |  |  | viaHeader.setRPort(); | 
|---|
|  |  |  | viaHeaders.add(viaHeader); | 
|---|
|  |  |  | // from | 
|---|
|  |  |  | SipURI fromSipURI = layer.getAddressFactory().createSipURI(sipConfig.getSipId(), | 
|---|
|  |  |  | sipConfig.getSipIp() + ":" + sipConfig.getSipPort()); | 
|---|
|  |  |  | Address fromAddress = layer.getAddressFactory().createAddress(fromSipURI); | 
|---|
|  |  |  | FromHeader fromHeader = layer.getHeaderFactory().createFromHeader(fromAddress, fromTag); | 
|---|
|  |  |  | SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), | 
|---|
|  |  |  | sipConfig.getIp() + ":" + sipConfig.getPort()); | 
|---|
|  |  |  | Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI); | 
|---|
|  |  |  | FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, fromTag); | 
|---|
|  |  |  | // to | 
|---|
|  |  |  | SipURI toSipURI = layer.getAddressFactory().createSipURI(device.getDeviceId(), sipConfig.getSipDomain()); | 
|---|
|  |  |  | 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(); | 
|---|
|  |  |  | SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), sipConfig.getDomain()); | 
|---|
|  |  |  | Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI); | 
|---|
|  |  |  | ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, toTag); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // Forwards | 
|---|
|  |  |  | MaxForwardsHeader maxForwards = layer.getHeaderFactory().createMaxForwardsHeader(70); | 
|---|
|  |  |  | MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // ceq | 
|---|
|  |  |  | CSeqHeader cSeqHeader = layer.getHeaderFactory().createCSeqHeader(1L, Request.MESSAGE); | 
|---|
|  |  |  | CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(Request.SUBSCRIBE), Request.SUBSCRIBE); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | request = layer.getMessageFactory().createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader, | 
|---|
|  |  |  | request = sipFactory.createMessageFactory().createRequest(requestURI, Request.SUBSCRIBE, callIdHeader, cSeqHeader, fromHeader, | 
|---|
|  |  |  | toHeader, viaHeaders, maxForwards); | 
|---|
|  |  |  | ContentTypeHeader contentTypeHeader = layer.getHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), sipConfig.getIp()+":"+sipConfig.getPort())); | 
|---|
|  |  |  | request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // Expires | 
|---|
|  |  |  | ExpiresHeader expireHeader = sipFactory.createHeaderFactory().createExpiresHeader(expires); | 
|---|
|  |  |  | request.addHeader(expireHeader); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // Event | 
|---|
|  |  |  | EventHeader eventHeader = sipFactory.createHeaderFactory().createEventHeader(event); | 
|---|
|  |  |  | request.addHeader(eventHeader); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "MANSCDP+xml"); | 
|---|
|  |  |  | request.setContent(content, contentTypeHeader); | 
|---|
|  |  |  | return request; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public Request createInviteRequest(Device device, String channelId, String content, String viaTag, String fromTag, String toTag) throws ParseException, InvalidArgumentException { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public Request createInfoRequest(Device device, StreamInfo streamInfo, String content, Long cseq) | 
|---|
|  |  |  | throws PeerUnavailableException, ParseException, InvalidArgumentException { | 
|---|
|  |  |  | Request request = null; | 
|---|
|  |  |  | Host host = device.getHost(); | 
|---|
|  |  |  | //请求行 | 
|---|
|  |  |  | SipURI requestLine = layer.getAddressFactory().createSipURI(channelId, host.getAddress()); | 
|---|
|  |  |  | //via | 
|---|
|  |  |  | if (streamInfo == null) return null; | 
|---|
|  |  |  | Dialog dialog = streamSession.getDialog(streamInfo.getDeviceID(), streamInfo.getChannelId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | SipURI requestLine = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), | 
|---|
|  |  |  | device.getHostAddress()); | 
|---|
|  |  |  | // via | 
|---|
|  |  |  | ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); | 
|---|
|  |  |  | // ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(), device.getTransport(), viaTag); | 
|---|
|  |  |  | ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(device.getHost().getIp(), device.getHost().getPort(), device.getTransport(), viaTag); | 
|---|
|  |  |  | ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(device.getIp(), device.getPort(), | 
|---|
|  |  |  | device.getTransport(), null); | 
|---|
|  |  |  | viaHeader.setRPort(); | 
|---|
|  |  |  | viaHeaders.add(viaHeader); | 
|---|
|  |  |  | //from | 
|---|
|  |  |  | SipURI fromSipURI = layer.getAddressFactory().createSipURI(sipConfig.getSipId(),sipConfig.getSipDomain()); | 
|---|
|  |  |  | Address fromAddress = layer.getAddressFactory().createAddress(fromSipURI); | 
|---|
|  |  |  | FromHeader fromHeader = layer.getHeaderFactory().createFromHeader(fromAddress, fromTag); //必须要有标记,否则无法创建会话,无法回应ack | 
|---|
|  |  |  | //to | 
|---|
|  |  |  | SipURI toSipURI = layer.getAddressFactory().createSipURI(channelId,sipConfig.getSipDomain()); | 
|---|
|  |  |  | Address toAddress = layer.getAddressFactory().createAddress(toSipURI); | 
|---|
|  |  |  | ToHeader toHeader = layer.getHeaderFactory().createToHeader(toAddress,null); | 
|---|
|  |  |  | // from | 
|---|
|  |  |  | SipURI fromSipURI = sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), | 
|---|
|  |  |  | sipConfig.getDomain()); | 
|---|
|  |  |  | Address fromAddress = sipFactory.createAddressFactory().createAddress(fromSipURI); | 
|---|
|  |  |  | FromHeader fromHeader = sipFactory.createHeaderFactory().createFromHeader(fromAddress, dialog.getLocalTag()); | 
|---|
|  |  |  | // to | 
|---|
|  |  |  | SipURI toSipURI = sipFactory.createAddressFactory().createSipURI(streamInfo.getChannelId(), | 
|---|
|  |  |  | sipConfig.getDomain()); | 
|---|
|  |  |  | Address toAddress = sipFactory.createAddressFactory().createAddress(toSipURI); | 
|---|
|  |  |  | ToHeader toHeader = sipFactory.createHeaderFactory().createToHeader(toAddress, dialog.getRemoteTag()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //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); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Address concatAddress = layer.getAddressFactory().createAddress(layer.getAddressFactory().createSipURI(sipConfig.getSipId(), sipConfig.getSipIp()+":"+sipConfig.getSipPort())); | 
|---|
|  |  |  | // Address concatAddress = layer.getAddressFactory().createAddress(layer.getAddressFactory().createSipURI(sipConfig.getSipId(), device.getHost().getIp()+":"+device.getHost().getPort())); | 
|---|
|  |  |  | request.addHeader(layer.getHeaderFactory().createContactHeader(concatAddress)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ContentTypeHeader contentTypeHeader = layer.getHeaderFactory().createContentTypeHeader("Application", "SDP"); | 
|---|
|  |  |  | request.setContent(content, contentTypeHeader); | 
|---|
|  |  |  | return request; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public Request createPlaybackInviteRequest(Device device, String channelId, 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<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); | 
|---|
|  |  |  | // ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(), device.getTransport(), viaTag); | 
|---|
|  |  |  | ViaHeader viaHeader = layer.getHeaderFactory().createViaHeader(device.getHost().getIp(), device.getHost().getPort(), device.getTransport(), viaTag); | 
|---|
|  |  |  | viaHeader.setRPort(); | 
|---|
|  |  |  | viaHeaders.add(viaHeader); | 
|---|
|  |  |  | //from | 
|---|
|  |  |  | SipURI fromSipURI = layer.getAddressFactory().createSipURI(sipConfig.getSipId(),sipConfig.getSipDomain()); | 
|---|
|  |  |  | Address fromAddress = layer.getAddressFactory().createAddress(fromSipURI); | 
|---|
|  |  |  | FromHeader fromHeader = layer.getHeaderFactory().createFromHeader(fromAddress, fromTag); //必须要有标记,否则无法创建会话,无法回应ack | 
|---|
|  |  |  | //to | 
|---|
|  |  |  | SipURI toSipURI = layer.getAddressFactory().createSipURI(channelId,sipConfig.getSipDomain()); | 
|---|
|  |  |  | Address toAddress = layer.getAddressFactory().createAddress(toSipURI); | 
|---|
|  |  |  | ToHeader toHeader = layer.getHeaderFactory().createToHeader(toAddress,null); | 
|---|
|  |  |  | // callid | 
|---|
|  |  |  | CallIdHeader callIdHeader = dialog.getCallId(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //callid | 
|---|
|  |  |  | CallIdHeader callIdHeader = null; | 
|---|
|  |  |  | if(device.getTransport().equals("TCP")) { | 
|---|
|  |  |  | callIdHeader = layer.getTcpSipProvider().getNewCallId(); | 
|---|
|  |  |  | // Forwards | 
|---|
|  |  |  | MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); | 
|---|
|  |  |  | if (cseq == null) { | 
|---|
|  |  |  | cseq = redisCatchStorage.getCSEQ(Request.INFO); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Address concatAddress = layer.getAddressFactory().createAddress(layer.getAddressFactory().createSipURI(sipConfig.getSipId(), sipConfig.getSipIp()+":"+sipConfig.getSipPort())); | 
|---|
|  |  |  | // Address concatAddress = layer.getAddressFactory().createAddress(layer.getAddressFactory().createSipURI(sipConfig.getSipId(), device.getHost().getIp()+":"+device.getHost().getPort())); | 
|---|
|  |  |  | request.addHeader(layer.getHeaderFactory().createContactHeader(concatAddress)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ContentTypeHeader contentTypeHeader = layer.getHeaderFactory().createContentTypeHeader("Application", "SDP"); | 
|---|
|  |  |  | // ceq | 
|---|
|  |  |  | CSeqHeader cSeqHeader = sipFactory.createHeaderFactory() | 
|---|
|  |  |  | .createCSeqHeader(cseq, Request.INFO); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | request = sipFactory.createMessageFactory().createRequest(requestLine, Request.INFO, callIdHeader, cSeqHeader, | 
|---|
|  |  |  | fromHeader, toHeader, viaHeaders, maxForwards); | 
|---|
|  |  |  | Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory() | 
|---|
|  |  |  | .createSipURI(sipConfig.getId(), sipConfig.getIp() + ":" + sipConfig.getPort())); | 
|---|
|  |  |  | request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", | 
|---|
|  |  |  | "MANSRTSP"); | 
|---|
|  |  |  | request.setContent(content, contentTypeHeader); | 
|---|
|  |  |  | return request; | 
|---|
|  |  |  | } | 
|---|