|
|
@@ -27,9 +27,7 @@ import org.springframework.util.StringUtils;
|
|
|
|
|
|
import javax.sip.*;
|
|
|
import javax.sip.address.SipURI;
|
|
|
-import javax.sip.header.CallIdHeader;
|
|
|
-import javax.sip.header.ViaHeader;
|
|
|
-import javax.sip.header.WWWAuthenticateHeader;
|
|
|
+import javax.sip.header.*;
|
|
|
import javax.sip.message.Request;
|
|
|
import java.lang.reflect.Field;
|
|
|
import java.text.ParseException;
|
|
|
@@ -68,6 +66,9 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
|
|
|
@Qualifier(value="udpSipProvider")
|
|
|
private SipProviderImpl udpSipProvider;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private SipFactory sipFactory;
|
|
|
+
|
|
|
@Override
|
|
|
public boolean register(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) {
|
|
|
return register(parentPlatform, null, null, errorEvent, okEvent, false);
|
|
|
@@ -88,7 +89,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
|
|
|
public boolean register(ParentPlatform parentPlatform, @Nullable String callId, @Nullable WWWAuthenticateHeader www,
|
|
|
SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent, boolean registerAgain) {
|
|
|
try {
|
|
|
- Request request = null;
|
|
|
+ Request request;
|
|
|
String tm = Long.toString(System.currentTimeMillis());
|
|
|
if (!registerAgain ) {
|
|
|
// //callid
|
|
|
@@ -364,16 +365,18 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
|
|
|
: udpSipProvider.getNewCallId();
|
|
|
callIdHeader.setCallId(subscribeInfo.getCallId());
|
|
|
|
|
|
- String tm = Long.toString(System.currentTimeMillis());
|
|
|
-
|
|
|
- Request request = headerProviderPlarformProvider.createNotifyRequest(parentPlatform,
|
|
|
- deviceStatusXml.toString(),callIdHeader,
|
|
|
- "z9hG4bK-" + UUID.randomUUID().toString().replace("-", ""), subscribeInfo);
|
|
|
- transmitRequest(parentPlatform, request);
|
|
|
+//
|
|
|
+ sendNotify(parentPlatform, deviceStatusXml.toString(), subscribeInfo, eventResult -> {
|
|
|
+ logger.error("发送NOTIFY通知消息失败。错误:{} {}", eventResult.statusCode, eventResult.msg);
|
|
|
+ }, null);
|
|
|
|
|
|
- } catch (SipException | ParseException | InvalidArgumentException e) {
|
|
|
+ } catch (SipException | ParseException e) {
|
|
|
e.printStackTrace();
|
|
|
return false;
|
|
|
+ } catch (NoSuchFieldException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (IllegalAccessException e) {
|
|
|
+ e.printStackTrace();
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
@@ -386,37 +389,89 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
|
|
|
if (index == null) {
|
|
|
index = 0;
|
|
|
}
|
|
|
-
|
|
|
+ if (index >= deviceChannels.size()) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
try {
|
|
|
- if (index > deviceChannels.size() - 1) {
|
|
|
- return true;
|
|
|
- }
|
|
|
- Request request = getCatalogNotifyRequestForCatalogAddOrUpdate(parentPlatform, deviceChannels.get(index), deviceChannels.size(), type, subscribeInfo);
|
|
|
- index += 1;
|
|
|
Integer finalIndex = index;
|
|
|
- transmitRequest(parentPlatform, request, null, (eventResult -> {
|
|
|
- sendNotifyForCatalogAddOrUpdate(type, parentPlatform, deviceChannels, subscribeInfo, finalIndex);
|
|
|
+ String catalogXmlContent = getCatalogXmlContentForCatalogAddOrUpdate(parentPlatform, deviceChannels.get(index ), deviceChannels.size(), type, subscribeInfo);
|
|
|
+ sendNotify(parentPlatform, catalogXmlContent, subscribeInfo, eventResult -> {
|
|
|
+ logger.error("发送NOTIFY通知消息失败。错误:{} {}", eventResult.statusCode, eventResult.msg);
|
|
|
+ }, (eventResult -> {
|
|
|
+ sendNotifyForCatalogAddOrUpdate(type, parentPlatform, deviceChannels, subscribeInfo, finalIndex + 1);
|
|
|
}));
|
|
|
- } catch (SipException | ParseException | InvalidArgumentException e) {
|
|
|
+ } catch (SipException | ParseException e) {
|
|
|
e.printStackTrace();
|
|
|
return false;
|
|
|
+ } catch (NoSuchFieldException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (IllegalAccessException e) {
|
|
|
+ e.printStackTrace();
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
- private Request getCatalogNotifyRequestForCatalogAddOrUpdate(ParentPlatform parentPlatform, DeviceChannel channel, int size, String type,
|
|
|
- SubscribeInfo subscribeInfo) throws ParseException, InvalidArgumentException,
|
|
|
- PeerUnavailableException {
|
|
|
- String catalogXmlContent = getCatalogXmlContentForCatalogAddOrUpdate(parentPlatform, channel, size, type, subscribeInfo);
|
|
|
-
|
|
|
- CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
|
|
|
- : udpSipProvider.getNewCallId();
|
|
|
- callIdHeader.setCallId(subscribeInfo.getCallId());
|
|
|
- Request request = headerProviderPlarformProvider.createNotifyRequest(parentPlatform, catalogXmlContent,
|
|
|
- callIdHeader, "z9hG4bK-" + UUID.randomUUID().toString().replace("-", ""), subscribeInfo);
|
|
|
- return request;
|
|
|
+ private void sendNotify(ParentPlatform parentPlatform, String catalogXmlContent,
|
|
|
+ SubscribeInfo subscribeInfo, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent )
|
|
|
+ throws NoSuchFieldException, IllegalAccessException, SipException, ParseException {
|
|
|
+ Dialog dialog = subscribeInfo.getDialog();
|
|
|
+ Request notifyRequest = dialog.createRequest(Request.NOTIFY);
|
|
|
+
|
|
|
+ ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml");
|
|
|
+
|
|
|
+ notifyRequest.setContent(catalogXmlContent, contentTypeHeader);
|
|
|
+
|
|
|
+ SubscriptionStateHeader subscriptionState = sipFactory.createHeaderFactory()
|
|
|
+ .createSubscriptionStateHeader(SubscriptionStateHeader.ACTIVE);
|
|
|
+ notifyRequest.addHeader(subscriptionState);
|
|
|
+
|
|
|
+ EventHeader event = sipFactory.createHeaderFactory().createEventHeader(subscribeInfo.getEventType());
|
|
|
+ if (subscribeInfo.getEventId() != null) {
|
|
|
+ event.setEventId(subscribeInfo.getEventId());
|
|
|
+ }
|
|
|
+ notifyRequest.addHeader(event);
|
|
|
+
|
|
|
+ SipURI sipURI = (SipURI) notifyRequest.getRequestURI();
|
|
|
+ SIPRequest request = (SIPRequest) subscribeInfo.getTransaction().getRequest();
|
|
|
+ sipURI.setHost(request.getRemoteAddress().getHostName());
|
|
|
+ sipURI.setPort(request.getRemotePort());
|
|
|
+ ClientTransaction transaction = null;
|
|
|
+ if ("TCP".equals(parentPlatform.getTransport())) {
|
|
|
+ transaction = tcpSipProvider.getNewClientTransaction(notifyRequest);
|
|
|
+ } else if ("UDP".equals(parentPlatform.getTransport())) {
|
|
|
+ transaction = udpSipProvider.getNewClientTransaction(notifyRequest);
|
|
|
+ }
|
|
|
+ // 添加错误订阅
|
|
|
+ if (errorEvent != null) {
|
|
|
+ sipSubscribe.addErrorSubscribe(subscribeInfo.getCallId(), errorEvent);
|
|
|
+ }
|
|
|
+ // 添加订阅
|
|
|
+ if (okEvent != null) {
|
|
|
+ sipSubscribe.addOkSubscribe(subscribeInfo.getCallId(), okEvent);
|
|
|
+ }
|
|
|
+ if (transaction == null) {
|
|
|
+ logger.error("平台{}的Transport错误:{}",parentPlatform.getServerGBId(), parentPlatform.getTransport());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ dialog.sendRequest(transaction);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
+// private Request getCatalogNotifyRequestForCatalogAddOrUpdate(ParentPlatform parentPlatform, DeviceChannel channel, int size, String type,
|
|
|
+// SubscribeInfo subscribeInfo) throws ParseException, InvalidArgumentException,
|
|
|
+// PeerUnavailableException, NoSuchFieldException, IllegalAccessException {
|
|
|
+// String catalogXmlContent = getCatalogXmlContentForCatalogAddOrUpdate(parentPlatform, channel, size, type, subscribeInfo);
|
|
|
+//
|
|
|
+// CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
|
|
|
+// : udpSipProvider.getNewCallId();
|
|
|
+// callIdHeader.setCallId(subscribeInfo.getCallId());
|
|
|
+// String tm = Long.toString(System.currentTimeMillis());
|
|
|
+//
|
|
|
+// Request request = headerProviderPlarformProvider.createNotifyRequest(parentPlatform, catalogXmlContent,
|
|
|
+// callIdHeader, "z9hG4bK-" + UUID.randomUUID().toString().replace("-", ""),"FromRegister" + tm, subscribeInfo);
|
|
|
+// return request;
|
|
|
+// }
|
|
|
+
|
|
|
private String getCatalogXmlContentForCatalogAddOrUpdate(ParentPlatform parentPlatform, DeviceChannel channel, int sumNum, String type, SubscribeInfo subscribeInfo) {
|
|
|
StringBuffer catalogXml = new StringBuffer(600);
|
|
|
if (parentPlatform.getServerGBId().equals(channel.getParentId())) {
|
|
|
@@ -465,34 +520,31 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
|
|
|
if (index == null) {
|
|
|
index = 0;
|
|
|
}
|
|
|
-
|
|
|
- if (index > deviceChannels.size() - 1) {
|
|
|
+ if (index >= deviceChannels.size()) {
|
|
|
return true;
|
|
|
}
|
|
|
try {
|
|
|
- String catalogXml = getCatalogXmlContentForCatalogOther(deviceChannels.get(index), type, parentPlatform);
|
|
|
- CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
|
|
|
- : udpSipProvider.getNewCallId();
|
|
|
- Request request = headerProviderPlarformProvider.createNotifyRequest(parentPlatform, catalogXml,
|
|
|
- callIdHeader,
|
|
|
- "z9hG4bK-" + UUID.randomUUID().toString().replace("-", ""), subscribeInfo);
|
|
|
- index += 1;
|
|
|
Integer finalIndex = index;
|
|
|
- transmitRequest(parentPlatform, request, null, eventResult -> {
|
|
|
- sendNotifyForCatalogOther(type, parentPlatform, deviceChannels, subscribeInfo, finalIndex);
|
|
|
- });
|
|
|
+ String catalogXmlContent = getCatalogXmlContentForCatalogOther(parentPlatform, deviceChannels.get(index), type);
|
|
|
+ sendNotify(parentPlatform, catalogXmlContent, subscribeInfo, eventResult -> {
|
|
|
+ logger.error("发送NOTIFY通知消息失败。错误:{} {}", eventResult.statusCode, eventResult.msg);
|
|
|
+ }, (eventResult -> {
|
|
|
+ sendNotifyForCatalogOther(type, parentPlatform, deviceChannels, subscribeInfo, finalIndex + 1);
|
|
|
+ }));
|
|
|
} catch (SipException e) {
|
|
|
e.printStackTrace();
|
|
|
- } catch (InvalidArgumentException e) {
|
|
|
- e.printStackTrace();
|
|
|
} catch (ParseException e) {
|
|
|
e.printStackTrace();
|
|
|
+ } catch (NoSuchFieldException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (IllegalAccessException e) {
|
|
|
+ e.printStackTrace();
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
- private String getCatalogXmlContentForCatalogOther(DeviceChannel channel, String type, ParentPlatform parentPlatform) {
|
|
|
+ private String getCatalogXmlContentForCatalogOther(ParentPlatform parentPlatform, DeviceChannel channel, String type) {
|
|
|
if (parentPlatform.getServerGBId().equals(channel.getParentId())) {
|
|
|
channel.setParentId(parentPlatform.getDeviceGBId());
|
|
|
}
|
|
|
@@ -594,6 +646,7 @@ public class SIPCommanderFroPlatform implements ISIPCommanderForPlatform {
|
|
|
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().getHostName());
|