|  |  | 
 |  |  | package com.genersoft.iot.vmp.gb28181.transmit.cmd.impl; | 
 |  |  |  | 
 |  |  | import com.alibaba.fastjson2.JSON; | 
 |  |  | import com.genersoft.iot.vmp.gb28181.SipLayer; | 
 |  |  | import com.genersoft.iot.vmp.gb28181.bean.*; | 
 |  |  | import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.SIPSender; | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; | 
 |  |  | import com.genersoft.iot.vmp.gb28181.transmit.cmd.SIPRequestHeaderPlarformProvider; | 
 |  |  | import com.genersoft.iot.vmp.gb28181.utils.SipUtils; | 
 |  |  | import com.genersoft.iot.vmp.storager.dao.dto.PlatformRegisterInfo; | 
 |  |  | import com.genersoft.iot.vmp.utils.DateUtil; | 
 |  |  | import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; | 
 |  |  | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 
 |  |  | import com.genersoft.iot.vmp.service.IMediaServerService; | 
 |  |  | import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; | 
 |  |  | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; | 
 |  |  | import com.genersoft.iot.vmp.storager.dao.dto.PlatformRegisterInfo; | 
 |  |  | import com.genersoft.iot.vmp.utils.DateUtil; | 
 |  |  | import gov.nist.javax.sip.message.MessageFactoryImpl; | 
 |  |  | import gov.nist.javax.sip.message.SIPRequest; | 
 |  |  | import org.slf4j.Logger; | 
 |  |  | 
 |  |  | import org.springframework.stereotype.Component; | 
 |  |  | import org.springframework.util.ObjectUtils; | 
 |  |  |  | 
 |  |  | import javax.sip.*; | 
 |  |  | import javax.sip.header.*; | 
 |  |  | import javax.sip.InvalidArgumentException; | 
 |  |  | import javax.sip.SipException; | 
 |  |  | import javax.sip.header.CallIdHeader; | 
 |  |  | import javax.sip.header.WWWAuthenticateHeader; | 
 |  |  | import javax.sip.message.Request; | 
 |  |  | import java.text.ParseException; | 
 |  |  | import java.util.ArrayList; | 
 |  |  | 
 |  |  |     private ZLMRTPServerFactory zlmrtpServerFactory; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private SipFactory sipFactory; | 
 |  |  |     private SipLayer sipLayer; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private SIPSender sipSender; | 
 |  |  | 
 |  |  |                             SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent, boolean registerAgain, boolean isRegister) throws SipException, InvalidArgumentException, ParseException { | 
 |  |  |             Request request; | 
 |  |  |             if (!registerAgain ) { | 
 |  |  |                 CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getTransport()); | 
 |  |  |                 CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport()); | 
 |  |  |  | 
 |  |  |                 request = headerProviderPlatformProvider.createRegisterRequest(parentPlatform, | 
 |  |  |                         redisCatchStorage.getCSEQ(), SipUtils.getNewFromTag(), | 
 |  |  | 
 |  |  |                 }); | 
 |  |  |  | 
 |  |  |             }else { | 
 |  |  |                 CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getTransport()); | 
 |  |  |                 CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport()); | 
 |  |  |                 request = headerProviderPlatformProvider.createRegisterRequest(parentPlatform, SipUtils.getNewFromTag(), null, callId, www, callIdHeader, isRegister); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             sipSender.transmitRequest( request, null, okEvent); | 
 |  |  |             sipSender.transmitRequest(parentPlatform.getDeviceIp(), request, null, okEvent); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  | 
 |  |  |             keepaliveXml.append("<Status>OK</Status>\r\n"); | 
 |  |  |             keepaliveXml.append("</Notify>\r\n"); | 
 |  |  |  | 
 |  |  |         CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getTransport()); | 
 |  |  |         CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport()); | 
 |  |  |  | 
 |  |  |             Request request = headerProviderPlatformProvider.createMessageRequest( | 
 |  |  |                     parentPlatform, | 
 |  |  | 
 |  |  |                     SipUtils.getNewFromTag(), | 
 |  |  |                     SipUtils.getNewViaTag(), | 
 |  |  |                     callIdHeader); | 
 |  |  |             sipSender.transmitRequest( request, errorEvent, okEvent); | 
 |  |  |             sipSender.transmitRequest(parentPlatform.getDeviceIp(), request, errorEvent, okEvent); | 
 |  |  |         return callIdHeader.getCallId(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |         String catalogXml = getCatalogXml(channels, sn, parentPlatform, size); | 
 |  |  |  | 
 |  |  |         // callid | 
 |  |  |         CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getTransport()); | 
 |  |  |         CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport()); | 
 |  |  |  | 
 |  |  |         Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, catalogXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); | 
 |  |  |         sipSender.transmitRequest( request); | 
 |  |  |         sipSender.transmitRequest(parentPlatform.getDeviceIp(), request); | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |         } | 
 |  |  |         String catalogXml = getCatalogXml(deviceChannels, sn, parentPlatform, channels.size()); | 
 |  |  |         // callid | 
 |  |  |         CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getTransport()); | 
 |  |  |         CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport()); | 
 |  |  |  | 
 |  |  |         Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, catalogXml, fromTag, SipUtils.getNewViaTag(), callIdHeader); | 
 |  |  |         sipSender.transmitRequest( request, null, eventResult -> { | 
 |  |  |         sipSender.transmitRequest(parentPlatform.getDeviceIp(), request, null, eventResult -> { | 
 |  |  |             int indexNext = index + parentPlatform.getCatalogGroup(); | 
 |  |  |             try { | 
 |  |  |                 sendCatalogResponse(channels, parentPlatform, sn, fromTag, indexNext); | 
 |  |  | 
 |  |  |         deviceInfoXml.append("<Result>OK</Result>\r\n"); | 
 |  |  |         deviceInfoXml.append("</Response>\r\n"); | 
 |  |  |  | 
 |  |  |         CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getTransport()); | 
 |  |  |         CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport()); | 
 |  |  |  | 
 |  |  |         Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceInfoXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); | 
 |  |  |         sipSender.transmitRequest( request); | 
 |  |  |         sipSender.transmitRequest(parentPlatform.getDeviceIp(), request); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public void deviceStatusResponse(ParentPlatform parentPlatform, String sn, String fromTag) throws SipException, InvalidArgumentException, ParseException { | 
 |  |  |     public void deviceStatusResponse(ParentPlatform parentPlatform,String channelId, String sn, String fromTag,int status) throws SipException, InvalidArgumentException, ParseException { | 
 |  |  |         if (parentPlatform == null) { | 
 |  |  |             return ; | 
 |  |  |         } | 
 |  |  |         String statusStr = (status==1)?"ONLINE":"OFFLINE"; | 
 |  |  |         String characterSet = parentPlatform.getCharacterSet(); | 
 |  |  |         StringBuffer deviceStatusXml = new StringBuffer(600); | 
 |  |  |         deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); | 
 |  |  |         deviceStatusXml.append("<Response>\r\n"); | 
 |  |  |         deviceStatusXml.append("<CmdType>DeviceStatus</CmdType>\r\n"); | 
 |  |  |         deviceStatusXml.append("<SN>" +sn + "</SN>\r\n"); | 
 |  |  |         deviceStatusXml.append("<DeviceID>" + parentPlatform.getDeviceGBId() + "</DeviceID>\r\n"); | 
 |  |  |         deviceStatusXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); | 
 |  |  |         deviceStatusXml.append("<Result>OK</Result>\r\n"); | 
 |  |  |         deviceStatusXml.append("<Online>ONLINE</Online>\r\n"); | 
 |  |  |         deviceStatusXml.append("<Online>"+statusStr+"</Online>\r\n"); | 
 |  |  |         deviceStatusXml.append("<Status>OK</Status>\r\n"); | 
 |  |  |         deviceStatusXml.append("</Response>\r\n"); | 
 |  |  |  | 
 |  |  |         CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getTransport()); | 
 |  |  |         CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport()); | 
 |  |  |  | 
 |  |  |         Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); | 
 |  |  |         sipSender.transmitRequest( request); | 
 |  |  |  | 
 |  |  |         sipSender.transmitRequest(parentPlatform.getDeviceIp(), request); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  | 
 |  |  |         deviceStatusXml.append("</info>\r\n"); | 
 |  |  |         deviceStatusXml.append("</Notify>\r\n"); | 
 |  |  |  | 
 |  |  |         CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getTransport()); | 
 |  |  |         CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport()); | 
 |  |  |  | 
 |  |  |         Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), SipUtils.getNewFromTag(), SipUtils.getNewViaTag(), callIdHeader); | 
 |  |  |         sipSender.transmitRequest( request); | 
 |  |  |         sipSender.transmitRequest(parentPlatform.getDeviceIp(), request); | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |     private void sendNotify(ParentPlatform parentPlatform, String catalogXmlContent, | 
 |  |  |                                    SubscribeInfo subscribeInfo, SipSubscribe.Event errorEvent,  SipSubscribe.Event okEvent ) | 
 |  |  |             throws SipException, ParseException, InvalidArgumentException { | 
 |  |  |       MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipFactory.createMessageFactory(); | 
 |  |  |       MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipLayer.getSipFactory().createMessageFactory(); | 
 |  |  |         String characterSet = parentPlatform.getCharacterSet(); | 
 |  |  |        // 设置编码, 防止中文乱码 | 
 |  |  |       messageFactory.setDefaultContentEncodingCharset(characterSet); | 
 |  |  |  | 
 |  |  |         SIPRequest notifyRequest = headerProviderPlatformProvider.createNotifyRequest(parentPlatform, catalogXmlContent, subscribeInfo); | 
 |  |  |  | 
 |  |  |         sipSender.transmitRequest( notifyRequest); | 
 |  |  |         sipSender.transmitRequest(parentPlatform.getDeviceIp(), notifyRequest); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private  String getCatalogXmlContentForCatalogAddOrUpdate(ParentPlatform parentPlatform, List<DeviceChannel> channels, int sumNum, String type, SubscribeInfo subscribeInfo) { | 
 |  |  | 
 |  |  |         recordXml.append("</Response>\r\n"); | 
 |  |  |  | 
 |  |  |         // callid | 
 |  |  |         CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getTransport()); | 
 |  |  |         CallIdHeader callIdHeader = sipSender.getNewCallIdHeader(parentPlatform.getDeviceIp(),parentPlatform.getTransport()); | 
 |  |  |  | 
 |  |  |         Request request = headerProviderPlatformProvider.createMessageRequest(parentPlatform, recordXml.toString(), fromTag, SipUtils.getNewViaTag(), callIdHeader); | 
 |  |  |         sipSender.transmitRequest( request); | 
 |  |  |         sipSender.transmitRequest(parentPlatform.getDeviceIp(), request); | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void sendMediaStatusNotify(ParentPlatform platform, SendRtpItem sendRtpItem) throws SipException, InvalidArgumentException, ParseException { | 
 |  |  |         if (sendRtpItem == null || platform == null) { | 
 |  |  |     public void sendMediaStatusNotify(ParentPlatform parentPlatform, SendRtpItem sendRtpItem) throws SipException, InvalidArgumentException, ParseException { | 
 |  |  |         if (sendRtpItem == null || parentPlatform == null) { | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         String characterSet = platform.getCharacterSet(); | 
 |  |  |         String characterSet = parentPlatform.getCharacterSet(); | 
 |  |  |         StringBuffer mediaStatusXml = new StringBuffer(200); | 
 |  |  |         mediaStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); | 
 |  |  |         mediaStatusXml.append("<Notify>\r\n"); | 
 |  |  | 
 |  |  |         mediaStatusXml.append("<NotifyType>121</NotifyType>\r\n"); | 
 |  |  |         mediaStatusXml.append("</Notify>\r\n"); | 
 |  |  |  | 
 |  |  |         SIPRequest messageRequest = (SIPRequest)headerProviderPlatformProvider.createMessageRequest(platform, mediaStatusXml.toString(), | 
 |  |  |         SIPRequest messageRequest = (SIPRequest)headerProviderPlatformProvider.createMessageRequest(parentPlatform, mediaStatusXml.toString(), | 
 |  |  |                 sendRtpItem); | 
 |  |  |  | 
 |  |  |         sipSender.transmitRequest(messageRequest); | 
 |  |  |         sipSender.transmitRequest(parentPlatform.getDeviceIp(),messageRequest); | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void streamByeCmd(ParentPlatform platform, SendRtpItem sendRtpItem) throws SipException, InvalidArgumentException, ParseException { | 
 |  |  |     public void streamByeCmd(ParentPlatform parentPlatform, SendRtpItem sendRtpItem) throws SipException, InvalidArgumentException, ParseException { | 
 |  |  |         if (sendRtpItem == null ) { | 
 |  |  |             logger.info("[向上级发送BYE], sendRtpItem 为NULL"); | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         if (platform == null) { | 
 |  |  |         if (parentPlatform == null) { | 
 |  |  |             logger.info("[向上级发送BYE], platform 为NULL"); | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         logger.info("[向上级发送BYE], {}/{}", platform.getServerGBId(), sendRtpItem.getChannelId()); | 
 |  |  |         logger.info("[向上级发送BYE], {}/{}", parentPlatform.getServerGBId(), sendRtpItem.getChannelId()); | 
 |  |  |         String mediaServerId = sendRtpItem.getMediaServerId(); | 
 |  |  |         MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId); | 
 |  |  |         if (mediaServerItem != null) { | 
 |  |  |             mediaServerService.releaseSsrc(mediaServerItem.getId(), sendRtpItem.getSsrc()); | 
 |  |  |             zlmrtpServerFactory.closeRtpServer(mediaServerItem, sendRtpItem.getStreamId()); | 
 |  |  |         } | 
 |  |  |         SIPRequest byeRequest = headerProviderPlatformProvider.createByeRequest(platform, sendRtpItem); | 
 |  |  |         SIPRequest byeRequest = headerProviderPlatformProvider.createByeRequest(parentPlatform, sendRtpItem); | 
 |  |  |         if (byeRequest == null) { | 
 |  |  |             logger.warn("[向上级发送bye]:无法创建 byeRequest"); | 
 |  |  |         } | 
 |  |  |         sipSender.transmitRequest(byeRequest); | 
 |  |  |         sipSender.transmitRequest(parentPlatform.getDeviceIp(),byeRequest); | 
 |  |  |     } | 
 |  |  | } |