| | |
| | | import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; |
| | | 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.DateUtil; |
| | | 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 javax.sip.header.*; |
| | | import javax.sip.message.Request; |
| | | import java.lang.reflect.Field; |
| | | import java.net.InetAddress; |
| | | import java.text.ParseException; |
| | | import java.util.ArrayList; |
| | | import java.util.HashSet; |
| | |
| | | catalogXml.append("<Owner>" + channel.getOwner() + "</Owner>\r\n"); |
| | | catalogXml.append("<CivilCode>" + channel.getCivilCode() + "</CivilCode>\r\n"); |
| | | catalogXml.append("<Address>" + channel.getAddress() + "</Address>\r\n"); |
| | | catalogXml.append("<Longitude>" + channel.getLongitude() + "</Longitude>\r\n"); |
| | | catalogXml.append("<Latitude>" + channel.getLatitude() + "</Latitude>\r\n"); |
| | | catalogXml.append("<Longitude>" + channel.getLongitudeWgs84() + "</Longitude>\r\n"); |
| | | catalogXml.append("<Latitude>" + channel.getLatitudeWgs84() + "</Latitude>\r\n"); |
| | | catalogXml.append("<IPAddress>" + channel.getIpAddress() + "</IPAddress>\r\n"); |
| | | catalogXml.append("<Port>" + channel.getPort() + "</Port>\r\n"); |
| | | catalogXml.append("<Info>\r\n"); |
| | |
| | | // 设置编码, 防止中文乱码 |
| | | messageFactory.setDefaultContentEncodingCharset(characterSet); |
| | | Dialog dialog = subscribeInfo.getDialog(); |
| | | if (dialog == null || !dialog.getState().equals(DialogState.CONFIRMED)) return; |
| | | if (dialog == null || !dialog.getState().equals(DialogState.CONFIRMED)) { |
| | | return; |
| | | } |
| | | SIPRequest notifyRequest = (SIPRequest)dialog.createRequest(Request.NOTIFY); |
| | | ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); |
| | | notifyRequest.setContent(catalogXmlContent, contentTypeHeader); |
| | |
| | | } |
| | | notifyRequest.addHeader(event); |
| | | SipURI sipURI = (SipURI) notifyRequest.getRequestURI(); |
| | | if (subscribeInfo.getTransaction() != null) { |
| | | SIPRequest request = (SIPRequest) subscribeInfo.getTransaction().getRequest(); |
| | | sipURI.setHost(request.getRemoteAddress().getHostAddress()); |
| | | sipURI.setPort(request.getRemotePort()); |
| | | }else { |
| | | sipURI.setHost(parentPlatform.getServerIP()); |
| | | sipURI.setPort(parentPlatform.getServerPort()); |
| | | } |
| | | sipURI.setHost(parentPlatform.getServerIP()); |
| | | sipURI.setPort(parentPlatform.getServerPort()); |
| | | |
| | | ClientTransaction transaction = null; |
| | | if ("TCP".equals(parentPlatform.getTransport())) { |
| | |
| | | } |
| | | |
| | | @Override |
| | | public boolean sendMediaStatusNotify(ParentPlatform platform, SendRtpItem sendRtpItem) { |
| | | if (sendRtpItem == null) { |
| | | return false; |
| | | } |
| | | if (platform == null) { |
| | | return false; |
| | | } |
| | | |
| | | byte[] dialogByteArray = sendRtpItem.getDialog(); |
| | | if (dialogByteArray == null) { |
| | | return false; |
| | | } |
| | | try{ |
| | | SIPDialog dialog = (SIPDialog) SerializeUtils.deSerialize(dialogByteArray); |
| | | SipStack sipStack; |
| | | if ("TCP".equals(platform.getTransport())) { |
| | | sipStack = tcpSipProvider.getSipStack(); |
| | | } else { |
| | | sipStack = udpSipProvider.getSipStack(); |
| | | } |
| | | SIPDialog sipDialog = ((SipStackImpl) sipStack).putDialog(dialog); |
| | | if (dialog != sipDialog) { |
| | | dialog = sipDialog; |
| | | } |
| | | if ("TCP".equals(platform.getTransport())) { |
| | | dialog.setSipProvider(tcpSipProvider); |
| | | } else { |
| | | dialog.setSipProvider(udpSipProvider); |
| | | } |
| | | |
| | | Field sipStackField = SIPDialog.class.getDeclaredField("sipStack"); |
| | | sipStackField.setAccessible(true); |
| | | sipStackField.set(dialog, sipStack); |
| | | Field eventListenersField = SIPDialog.class.getDeclaredField("eventListeners"); |
| | | eventListenersField.setAccessible(true); |
| | | eventListenersField.set(dialog, new HashSet<>()); |
| | | |
| | | SIPRequest messageRequest = (SIPRequest)dialog.createRequest(Request.MESSAGE); |
| | | String characterSet = platform.getCharacterSet(); |
| | | StringBuffer mediaStatusXml = new StringBuffer(200); |
| | | mediaStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); |
| | | mediaStatusXml.append("<Notify>\r\n"); |
| | | mediaStatusXml.append("<CmdType>MediaStatus</CmdType>\r\n"); |
| | | mediaStatusXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); |
| | | mediaStatusXml.append("<DeviceID>" + sendRtpItem.getChannelId() + "</DeviceID>\r\n"); |
| | | mediaStatusXml.append("<NotifyType>121</NotifyType>\r\n"); |
| | | mediaStatusXml.append("</Notify>\r\n"); |
| | | ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); |
| | | messageRequest.setContent(mediaStatusXml.toString(), contentTypeHeader); |
| | | SipURI sipURI = (SipURI) messageRequest.getRequestURI(); |
| | | sipURI.setHost(platform.getServerIP()); |
| | | sipURI.setPort(platform.getServerPort()); |
| | | ClientTransaction clientTransaction; |
| | | if ("TCP".equals(platform.getTransport())) { |
| | | clientTransaction = tcpSipProvider.getNewClientTransaction(messageRequest); |
| | | }else { |
| | | clientTransaction = udpSipProvider.getNewClientTransaction(messageRequest); |
| | | } |
| | | dialog.sendRequest(clientTransaction); |
| | | } catch (SipException e) { |
| | | e.printStackTrace(); |
| | | return false; |
| | | } catch (ParseException e) { |
| | | e.printStackTrace(); |
| | | return false; |
| | | } catch (NoSuchFieldException e) { |
| | | throw new RuntimeException(e); |
| | | } catch (IllegalAccessException e) { |
| | | throw new RuntimeException(e); |
| | | } |
| | | return true; |
| | | |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public void streamByeCmd(ParentPlatform platform, String callId) { |
| | | if (platform == null) { |
| | | return; |
| | |
| | | byte[] dialogByteArray = sendRtpItem.getDialog(); |
| | | if (dialogByteArray != null) { |
| | | SIPDialog dialog = (SIPDialog) SerializeUtils.deSerialize(dialogByteArray); |
| | | SipStack sipStack = udpSipProvider.getSipStack(); |
| | | SipStack sipStack; |
| | | if ("TCP".equals(platform.getTransport())) { |
| | | sipStack = tcpSipProvider.getSipStack(); |
| | | } else { |
| | | sipStack = udpSipProvider.getSipStack(); |
| | | } |
| | | SIPDialog sipDialog = ((SipStackImpl) sipStack).putDialog(dialog); |
| | | if (dialog != sipDialog) { |
| | | dialog = sipDialog; |
| | | } else { |
| | | try { |
| | | dialog.setSipProvider(udpSipProvider); |
| | | Field sipStackField = SIPDialog.class.getDeclaredField("sipStack"); |
| | | sipStackField.setAccessible(true); |
| | | sipStackField.set(dialog, sipStack); |
| | | Field eventListenersField = SIPDialog.class.getDeclaredField("eventListeners"); |
| | | eventListenersField.setAccessible(true); |
| | | eventListenersField.set(dialog, new HashSet<>()); |
| | | |
| | | byte[] transactionByteArray = sendRtpItem.getTransaction(); |
| | | ClientTransaction clientTransaction = (ClientTransaction) SerializeUtils.deSerialize(transactionByteArray); |
| | | Request byeRequest = dialog.createRequest(Request.BYE); |
| | | |
| | | SipURI byeURI = (SipURI) byeRequest.getRequestURI(); |
| | | SIPRequest request = (SIPRequest) clientTransaction.getRequest(); |
| | | byeURI.setHost(request.getRemoteAddress().getHostAddress()); |
| | | byeURI.setPort(request.getRemotePort()); |
| | | if ("TCP".equals(platform.getTransport())) { |
| | | clientTransaction = tcpSipProvider.getNewClientTransaction(byeRequest); |
| | | } else if ("UDP".equals(platform.getTransport())) { |
| | | clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest); |
| | | } |
| | | dialog.sendRequest(clientTransaction); |
| | | } catch (SipException e) { |
| | | e.printStackTrace(); |
| | | } catch (ParseException e) { |
| | | e.printStackTrace(); |
| | | } catch (NoSuchFieldException e) { |
| | | e.printStackTrace(); |
| | | } catch (IllegalAccessException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | |
| | | } |
| | | try { |
| | | if ("TCP".equals(platform.getTransport())) { |
| | | dialog.setSipProvider(tcpSipProvider); |
| | | } else { |
| | | dialog.setSipProvider(udpSipProvider); |
| | | } |
| | | Field sipStackField = SIPDialog.class.getDeclaredField("sipStack"); |
| | | sipStackField.setAccessible(true); |
| | | sipStackField.set(dialog, sipStack); |
| | | Field eventListenersField = SIPDialog.class.getDeclaredField("eventListeners"); |
| | | eventListenersField.setAccessible(true); |
| | | eventListenersField.set(dialog, new HashSet<>()); |
| | | |
| | | Request byeRequest = dialog.createRequest(Request.BYE); |
| | | |
| | | SipURI byeURI = (SipURI) byeRequest.getRequestURI(); |
| | | byeURI.setHost(platform.getServerIP()); |
| | | byeURI.setPort(platform.getServerPort()); |
| | | ClientTransaction clientTransaction; |
| | | if ("TCP".equals(platform.getTransport())) { |
| | | clientTransaction = tcpSipProvider.getNewClientTransaction(byeRequest); |
| | | } else { |
| | | clientTransaction = udpSipProvider.getNewClientTransaction(byeRequest); |
| | | } |
| | | dialog.sendRequest(clientTransaction); |
| | | } catch (SipException e) { |
| | | e.printStackTrace(); |
| | | } catch (ParseException e) { |
| | | e.printStackTrace(); |
| | | } catch (NoSuchFieldException e) { |
| | | e.printStackTrace(); |
| | | } catch (IllegalAccessException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |