From e09e541c827157884e013ff0b50aa88b8b0f46be Mon Sep 17 00:00:00 2001 From: panlinlin <648540858@qq.com> Date: 星期五, 15 一月 2021 17:47:58 +0800 Subject: [PATCH] 完成向上级联->点播--精简代码 --- src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java | 254 ++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 204 insertions(+), 50 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java index ab70a5e..4dea5d4 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java @@ -1,71 +1,225 @@ package com.genersoft.iot.vmp.gb28181.transmit.request.impl; +import javax.sip.InvalidArgumentException; import javax.sip.RequestEvent; +import javax.sip.SipException; +import javax.sip.address.SipURI; +import javax.sip.header.ContentTypeHeader; +import javax.sip.header.FromHeader; +import javax.sip.header.SubjectHeader; +import javax.sip.message.Request; +import javax.sip.message.Response; +import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; +import com.genersoft.iot.vmp.gb28181.sdp.Codec; +import com.genersoft.iot.vmp.gb28181.sdp.MediaDescription; +import com.genersoft.iot.vmp.gb28181.sdp.SdpParser; +import com.genersoft.iot.vmp.gb28181.sdp.SessionDescription; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommanderFroPlatform; import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor; +import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import gov.nist.javax.sip.address.AddressImpl; +import gov.nist.javax.sip.address.SipUri; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.text.ParseException; +import java.util.List; /** * @Description:澶勭悊INVITE璇锋眰 - * @author: swwheihei - * @date: 2020骞�5鏈�3鏃� 涓嬪崍4:43:52 + * @author: panll + * @date: 2021骞�1鏈�14鏃� */ public class InviteRequestProcessor extends SIPRequestAbstractProcessor { + + private final static Logger logger = LoggerFactory.getLogger(MessageRequestProcessor.class); + + private SIPCommanderFroPlatform cmderFroPlatform; + + private IVideoManagerStorager storager; /** * 澶勭悊invite璇锋眰 * - * @param request + * @param evt * 璇锋眰娑堟伅 */ @Override public void process(RequestEvent evt) { - // TODO 浼樺厛绾�99 Invite Request娑堟伅瀹炵幇锛屾娑堟伅涓�鑸负绾ц仈娑堟伅锛屼笂绾х粰涓嬬骇鍙戦�佽姹傝棰戞寚浠� -// Request request = requestEvent.getRequest(); -// -// try { -// // 鍙戦��100 Trying -// ServerTransaction serverTransaction = getServerTransaction(requestEvent); -// // 鏌ヨ鐩爣鍦板潃 -// URI reqUri = request.getRequestURI(); -// URI contactURI = currUser.get(reqUri); -// -// System.out.println("processInvite rqStr=" + reqUri + " contact=" + contactURI); -// -// // 鏍规嵁Request uri鏉ヨ矾鐢憋紝鍚庣画鐨勫搷搴旀秷鎭�氳繃VIA鏉ヨ矾鐢� -// Request cliReq = messageFactory.createRequest(request.toString()); -// cliReq.setRequestURI(contactURI); -// -// HeaderFactory headerFactory = SipFactory.getInstance().createHeaderFactory(); -// Via callerVia = (Via) request.getHeader(Via.NAME); -// Via via = (Via) headerFactory.createViaHeader(SIPMain.ip, SIPMain.port, "UDP", -// callerVia.getBranch() + "sipphone"); -// -// cliReq.removeHeader(Via.NAME); -// cliReq.addHeader(via); -// -// // 鏇存柊contact鐨勫湴鍧� -// ContactHeader contactHeader = headerFactory.createContactHeader(); -// Address address = SipFactory.getInstance().createAddressFactory() -// .createAddress("sip:sipsoft@" + SIPMain.ip + ":" + SIPMain.port); -// contactHeader.setAddress(address); -// contactHeader.setExpires(3600); -// cliReq.setHeader(contactHeader); -// -// clientTransactionId = sipProvider.getNewClientTransaction(cliReq); -// clientTransactionId.sendRequest(); -// -// System.out.println("processInvite clientTransactionId=" + clientTransactionId.toString()); -// -// System.out.println("send invite to callee: " + cliReq); -// } catch (TransactionUnavailableException e1) { -// e1.printStackTrace(); -// } catch (SipException e) { -// e.printStackTrace(); -// } catch (ParseException e) { -// e.printStackTrace(); -// } catch (Exception e) { -// e.printStackTrace(); -// } + // Invite Request娑堟伅瀹炵幇锛屾娑堟伅涓�鑸负绾ц仈娑堟伅锛屼笂绾х粰涓嬬骇鍙戦�佽姹傝棰戞寚浠� + try { + Request request = evt.getRequest(); + SipURI sipURI = (SipURI) request.getRequestURI(); + String channelId = sipURI.getUser(); + String platformId = null; +// SubjectHeader subjectHeader = (SubjectHeader)request.getHeader(SubjectHeader.NAME); +// // 鏌ヨ閫氶亾鏄惁瀛樺湪 涓嶅瓨鍦ㄥ洖澶�404 +// if (subjectHeader != null) { // 瀛樺湪鍒欎粠subjectHeader 鑾峰彇骞冲彴淇℃伅 +// String subject = subjectHeader.getSubject(); +// if (subject != null) { +// String[] info1 = subject.split(","); +// if (info1 != null && info1 .length == 2) { +// String[] info2 = info1[1].split(":"); +// if (info2 != null && info2.length == 2) { +// platformId = info2[0]; +// } +// } +// } +// } + + FromHeader fromHeader = (FromHeader)request.getHeader(FromHeader.NAME); + AddressImpl address = (AddressImpl) fromHeader.getAddress(); + SipUri uri = (SipUri) address.getURI(); + platformId = uri.getUser(); + + if (platformId == null || channelId == null) { + response400Ack(evt); // 鍙傛暟涓嶅叏锛� 鍙�400锛岃姹傞敊璇� + return; + } + // 鏌ヨ骞冲彴涓嬫槸鍚︽湁璇ラ�氶亾 + DeviceChannel channel = storager.queryChannelInParentPlatform(platformId, channelId); + if (channel == null) { + response404Ack(evt); // 閫氶亾涓嶅瓨鍦紝鍙�404锛岃祫婧愪笉瀛樺湪 + return; + }else { + response100Ack(evt); // 閫氶亾瀛樺湪锛屽彂100锛宼rying + } + // 瑙f瀽sdp娑堟伅 + SessionDescription sdp = new SdpParser().parse(request.getRawContent()); + // 鑾峰彇鏀寔鐨勬牸寮� + List<MediaDescription> mediaDescriptions = sdp.getMediaDescriptions(); + // 鏌ョ湅鏄惁鏀寔PS 璐熻浇96 + String ip = null; + int port = -1; + for (MediaDescription mediaDescription : mediaDescriptions) { + + List<Codec> codecs = mediaDescription.getCodecs(); + for (Codec codec : codecs) { + if("96".equals(codec.getPayloadType()) || "PS".equals(codec.getName()) || "ps".equals(codec.getName())) { + ip = mediaDescription.getIpAddress().getHostName(); + port = mediaDescription.getPort(); + break; + } + } + } + if (ip == null || port == -1) { // TODO 娌℃湁鍚堥�傜殑瑙嗛娴佹牸寮忥紝 鍙厤缃槸鍚︿娇鐢ㄧ涓�涓猰edia淇℃伅 + if (mediaDescriptions.size() > 0) { + ip = mediaDescriptions.get(0).getIpAddress().getHostName(); + port = mediaDescriptions.get(0).getPort(); + } + } + + if (ip == null || port == -1) { + response488Ack(evt); + return; + } + + + String ssrc = sdp.getSsrc(); + // 閫氱煡涓嬬骇鎺ㄦ祦锛� + // 鏌ユ壘鍚堥�傜殑绔彛鎺ㄦ祦锛� + // 鍙戦�� 200ok + // 鏀跺埌ack鍚庤皟鐢ㄦ帹娴佹帴鍙� + + + + + } catch (SipException | InvalidArgumentException | ParseException e) { + e.printStackTrace(); + } catch (IOException e) { + logger.warn("sdp瑙f瀽閿欒"); + e.printStackTrace(); + } + } + /*** + * 鍥炲100 trying + * @param evt + * @throws SipException + * @throws InvalidArgumentException + * @throws ParseException + */ + private void response100Ack(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException { + Response response = getMessageFactory().createResponse(Response.TRYING, evt.getRequest()); + getServerTransaction(evt).sendResponse(response); + } + + /*** + * 鍥炲404 + * @param evt + * @throws SipException + * @throws InvalidArgumentException + * @throws ParseException + */ + private void response404Ack(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException { + Response response = getMessageFactory().createResponse(Response.NOT_FOUND, evt.getRequest()); + getServerTransaction(evt).sendResponse(response); + } + + /*** + * 鍥炲400 + * @param evt + * @throws SipException + * @throws InvalidArgumentException + * @throws ParseException + */ + private void response400Ack(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException { + Response response = getMessageFactory().createResponse(Response.BAD_REQUEST, evt.getRequest()); + getServerTransaction(evt).sendResponse(response); + } + + /*** + * 鍥炲488 + * @param evt + * @throws SipException + * @throws InvalidArgumentException + * @throws ParseException + */ + private void response488Ack(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException { + Response response = getMessageFactory().createResponse(Response.NOT_ACCEPTABLE_HERE, evt.getRequest()); + getServerTransaction(evt).sendResponse(response); + } + + /*** + * 鍥炲200 OK + * @param evt + * @throws SipException + * @throws InvalidArgumentException + * @throws ParseException + */ + private void responseAck(RequestEvent evt, String sdp) throws SipException, InvalidArgumentException, ParseException { + Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest()); + ContentTypeHeader contentTypeHeader = getHeaderFactory().createContentTypeHeader("APPLICATION", "SDP"); + response.setContent(sdp, contentTypeHeader); + getServerTransaction(evt).sendResponse(response); + } + + + + + + + + + + + public SIPCommanderFroPlatform getCmderFroPlatform() { + return cmderFroPlatform; + } + + public void setCmderFroPlatform(SIPCommanderFroPlatform cmderFroPlatform) { + this.cmderFroPlatform = cmderFroPlatform; + } + + public IVideoManagerStorager getStorager() { + return storager; + } + + public void setStorager(IVideoManagerStorager storager) { + this.storager = storager; + } } -- Gitblit v1.8.0