|  |  |  | 
|---|
|  |  |  | 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.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.gb28181.bean.Device; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * @Description:摄像头命令request创造器 TODO 冗余代码太多待优化 | 
|---|
|  |  |  | * @description:摄像头命令request创造器 TODO 冗余代码太多待优化 | 
|---|
|  |  |  | * @author: swwheihei | 
|---|
|  |  |  | * @date: 2020年5月6日 上午9:29:02 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @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; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | request = sipFactory.createMessageFactory().createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader, | 
|---|
|  |  |  | toHeader, viaHeaders, maxForwards); | 
|---|
|  |  |  | ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "MANSCDP+xml"); | 
|---|
|  |  |  | ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); | 
|---|
|  |  |  | request.setContent(content, contentTypeHeader); | 
|---|
|  |  |  | return request; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //ceq | 
|---|
|  |  |  | CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(1L, Request.INVITE); | 
|---|
|  |  |  | 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())); | 
|---|
|  |  |  | 
|---|
|  |  |  | MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //ceq | 
|---|
|  |  |  | CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(1L, Request.INVITE); | 
|---|
|  |  |  | 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())); | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // Forwards | 
|---|
|  |  |  | MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // ceq | 
|---|
|  |  |  | CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(1L, Request.SUBSCRIBE); | 
|---|
|  |  |  | CSeqHeader cSeqHeader = sipFactory.createHeaderFactory().createCSeqHeader(redisCatchStorage.getCSEQ(Request.SUBSCRIBE), Request.SUBSCRIBE); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | request = sipFactory.createMessageFactory().createRequest(requestURI, Request.SUBSCRIBE, callIdHeader, cSeqHeader, fromHeader, | 
|---|
|  |  |  | toHeader, viaHeaders, maxForwards); | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // Event | 
|---|
|  |  |  | EventHeader eventHeader = sipFactory.createHeaderFactory().createEventHeader(event); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | int random = (int)Math.random() * 1000000000; | 
|---|
|  |  |  | eventHeader.setEventId(random + ""); | 
|---|
|  |  |  | request.addHeader(eventHeader); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "MANSCDP+xml"); | 
|---|
|  |  |  | ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); | 
|---|
|  |  |  | request.setContent(content, contentTypeHeader); | 
|---|
|  |  |  | return request; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public Request createInfoRequest(Device device, StreamInfo streamInfo, String content) | 
|---|
|  |  |  | throws PeerUnavailableException, ParseException, InvalidArgumentException { | 
|---|
|  |  |  | Request request = null; | 
|---|
|  |  |  | if (streamInfo == null) { | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | Dialog dialog = streamSession.getDialogByStream(streamInfo.getDeviceID(), streamInfo.getChannelId(), streamInfo.getStream()); | 
|---|
|  |  |  | if (dialog == null) { | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | SipURI requestLine = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), | 
|---|
|  |  |  | device.getHostAddress()); | 
|---|
|  |  |  | // via | 
|---|
|  |  |  | ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); | 
|---|
|  |  |  | ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(device.getIp(), device.getPort(), | 
|---|
|  |  |  | device.getTransport(), null); | 
|---|
|  |  |  | 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, 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 = dialog.getCallId(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // Forwards | 
|---|
|  |  |  | MaxForwardsHeader maxForwards = sipFactory.createHeaderFactory().createMaxForwardsHeader(70); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Long cseq = redisCatchStorage.getCSEQ(Request.INVITE); | 
|---|
|  |  |  | // 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; | 
|---|
|  |  |  | } | 
|---|