|  |  |  | 
|---|
|  |  |  | 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"); | 
|---|
|  |  |  | 
|---|
|  |  |  | if (parentPlatform == null) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | logger.info("[发送 移动位置订阅] {}/{}->{},{}", parentPlatform.getServerGBId(), gpsMsgInfo.getId(), gpsMsgInfo.getLng(), gpsMsgInfo.getLat()); | 
|---|
|  |  |  | if (logger.isDebugEnabled()) { | 
|---|
|  |  |  | logger.debug("[发送 移动位置订阅] {}/{}->{},{}", parentPlatform.getServerGBId(), gpsMsgInfo.getId(), gpsMsgInfo.getLng(), gpsMsgInfo.getLat()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | String characterSet = parentPlatform.getCharacterSet(); | 
|---|
|  |  |  | StringBuffer deviceStatusXml = new StringBuffer(600); | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|