diff --git a/src/main/java/com/inspect/tcpserver/sip/items/CameraSnapItem.java b/src/main/java/com/inspect/tcpserver/sip/items/CameraSnapItem.java new file mode 100644 index 0000000..cda08fa --- /dev/null +++ b/src/main/java/com/inspect/tcpserver/sip/items/CameraSnapItem.java @@ -0,0 +1,27 @@ +package com.inspect.tcpserver.sip.items; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 图片抓拍请求信令 + */ +@Getter +@Setter +public class CameraSnapItem { + @JacksonXmlProperty(isAttribute = true, localName = "Code") + private String code; + + @JacksonXmlProperty(isAttribute = true, localName = "PicServer") + private int picServer; + + @JacksonXmlProperty(isAttribute = true, localName = "SnapType") + private String snapType; + + @JacksonXmlProperty(isAttribute = true, localName = "Range") + private String range; + + @JacksonXmlProperty(isAttribute = true, localName = "Interval") + private String interval; +} diff --git a/src/main/java/com/inspect/tcpserver/sip/items/ControlCameraItem.java b/src/main/java/com/inspect/tcpserver/sip/items/ControlCameraItem.java new file mode 100644 index 0000000..18d3fa2 --- /dev/null +++ b/src/main/java/com/inspect/tcpserver/sip/items/ControlCameraItem.java @@ -0,0 +1,27 @@ +package com.inspect.tcpserver.sip.items; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 云镜控制信令 + */ +@Getter +@Setter +public class ControlCameraItem { + @JacksonXmlProperty(isAttribute = true, localName = "Code") + private String code; + + @JacksonXmlProperty(isAttribute = true, localName = "Command") + private String command; + + @JacksonXmlProperty(isAttribute = true, localName = "CommandPara1") + private String commandPara1; + + @JacksonXmlProperty(isAttribute = true, localName = "CommandPara2") + private String commandPara2; + + @JacksonXmlProperty(isAttribute = true, localName = "CommandPara3") + private String commandPara3; +} diff --git a/src/main/java/com/inspect/tcpserver/sip/items/RequestHistoryAlarmItem.java b/src/main/java/com/inspect/tcpserver/sip/items/RequestHistoryAlarmItem.java index 63ccec8..1f91272 100644 --- a/src/main/java/com/inspect/tcpserver/sip/items/RequestHistoryAlarmItem.java +++ b/src/main/java/com/inspect/tcpserver/sip/items/RequestHistoryAlarmItem.java @@ -4,6 +4,9 @@ import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import lombok.Getter; import lombok.Setter; +/** + * 历史告警查询信令 + */ @Getter @Setter public class RequestHistoryAlarmItem { diff --git a/src/main/java/com/inspect/tcpserver/sip/items/RequestHistoryVideoItem.java b/src/main/java/com/inspect/tcpserver/sip/items/RequestHistoryVideoItem.java new file mode 100644 index 0000000..07c1b62 --- /dev/null +++ b/src/main/java/com/inspect/tcpserver/sip/items/RequestHistoryVideoItem.java @@ -0,0 +1,33 @@ +package com.inspect.tcpserver.sip.items; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 录像检索信令 + */ +@Getter +@Setter +public class RequestHistoryVideoItem { + @JacksonXmlProperty(isAttribute = true, localName = "Code") + private String code; + + @JacksonXmlProperty(isAttribute = true, localName = "Type") + private String type; + + @JacksonXmlProperty(isAttribute = true, localName = "UserCode") + private String userCode; + + @JacksonXmlProperty(isAttribute = true, localName = "BeginTime") + private String beginTime; + + @JacksonXmlProperty(isAttribute = true, localName = "EndTime") + private String endTime; + + @JacksonXmlProperty(isAttribute = true, localName = "FromIndex") + private int fromIndex; + + @JacksonXmlProperty(isAttribute = true, localName = "ToIndex") + private int toIndex; +} diff --git a/src/main/java/com/inspect/tcpserver/sip/items/RequestResourceItem.java b/src/main/java/com/inspect/tcpserver/sip/items/RequestResourceItem.java index 6102d9a..17a88df 100644 --- a/src/main/java/com/inspect/tcpserver/sip/items/RequestResourceItem.java +++ b/src/main/java/com/inspect/tcpserver/sip/items/RequestResourceItem.java @@ -4,6 +4,9 @@ import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import lombok.Getter; import lombok.Setter; +/** + * 资源信息获取信令 + */ @Getter @Setter public class RequestResourceItem { diff --git a/src/main/java/com/inspect/tcpserver/sip/items/SubscribeAlarmItem.java b/src/main/java/com/inspect/tcpserver/sip/items/SubscribeAlarmItem.java new file mode 100644 index 0000000..d267cdd --- /dev/null +++ b/src/main/java/com/inspect/tcpserver/sip/items/SubscribeAlarmItem.java @@ -0,0 +1,19 @@ +package com.inspect.tcpserver.sip.items; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 订阅告警信令 + */ +@Getter +@Setter +public class SubscribeAlarmItem { + @JacksonXmlProperty(isAttribute = true, localName = "Code") + private String code; + + @JacksonXmlProperty(isAttribute = true, localName = "Type") + private String type; + +} diff --git a/src/main/java/com/inspect/tcpserver/sip/items/SubscribeStatusItem.java b/src/main/java/com/inspect/tcpserver/sip/items/SubscribeStatusItem.java new file mode 100644 index 0000000..955e80b --- /dev/null +++ b/src/main/java/com/inspect/tcpserver/sip/items/SubscribeStatusItem.java @@ -0,0 +1,15 @@ +package com.inspect.tcpserver.sip.items; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 订阅状态事件信令 + */ +@Getter +@Setter +public class SubscribeStatusItem { + @JacksonXmlProperty(isAttribute = true, localName = "Code") + private String code; +} diff --git a/src/main/java/com/inspect/tcpserver/sip/items/SipEventRegistry.java b/src/main/java/com/inspect/tcpserver/sip/registry/SipEventRegistry.java similarity index 50% rename from src/main/java/com/inspect/tcpserver/sip/items/SipEventRegistry.java rename to src/main/java/com/inspect/tcpserver/sip/registry/SipEventRegistry.java index bd9ba8f..6516c2c 100644 --- a/src/main/java/com/inspect/tcpserver/sip/items/SipEventRegistry.java +++ b/src/main/java/com/inspect/tcpserver/sip/registry/SipEventRegistry.java @@ -1,4 +1,6 @@ -package com.inspect.tcpserver.sip.items; +package com.inspect.tcpserver.sip.registry; + +import com.inspect.tcpserver.sip.items.*; import java.util.HashMap; import java.util.Map; @@ -9,6 +11,11 @@ public class SipEventRegistry { static { EVENT_MAP.put("Request_Resource", RequestResourceItem.class); EVENT_MAP.put("Request_History_Alarm", RequestHistoryAlarmItem.class); + EVENT_MAP.put("Request_History_Video", RequestHistoryVideoItem.class); + EVENT_MAP.put("Subscribe_Status", SubscribeStatusItem.class); + EVENT_MAP.put("Subscribe_Alarm", SubscribeAlarmItem.class); + EVENT_MAP.put("Control_Camera", ControlCameraItem.class); + EVENT_MAP.put("Camera_Snap", CameraSnapItem.class); } public static Class getItemClass(String eventType) { diff --git a/src/main/java/com/inspect/tcpserver/sip/service/SipClientService.java b/src/main/java/com/inspect/tcpserver/sip/service/SipClientService.java index dbe6ad3..f0a4f6a 100644 --- a/src/main/java/com/inspect/tcpserver/sip/service/SipClientService.java +++ b/src/main/java/com/inspect/tcpserver/sip/service/SipClientService.java @@ -1,6 +1,6 @@ package com.inspect.tcpserver.sip.service; -import com.inspect.tcpserver.sip.items.SipEventRegistry; +import com.inspect.tcpserver.sip.registry.SipEventRegistry; import com.inspect.tcpserver.sip.utils.DigestUtil; import com.inspect.tcpserver.sip.utils.SipXmlEnvelope; import com.inspect.tcpserver.sip.utils.SipXmlParser; @@ -23,6 +23,7 @@ import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; @Slf4j @@ -80,7 +81,20 @@ public class SipClientService implements SipListener { private AtomicInteger cSeqCounter = new AtomicInteger(1); - String testXml = "\n" + + private static class SubscriptionInfo { + String callId; + FromHeader from; + ToHeader to; + int expires; + String event; + } + + private final Map subscriptions = new ConcurrentHashMap<>(); + + /* + * B.2 资源上报 + */ + String resourcesReportTestXml = "\n" + "\n" + " 1234567890\n" + " \n" + @@ -137,6 +151,25 @@ public class SipClientService implements SipListener { " \n" + "\n"; + /* + * B.9.2.4.1 告警事件通知 + */ + String alarmEventTestXml = "\n" + + "\n" + + "\n" + + "\n"; + /* + * B.9.2.4.2 状态事件通知 + */ + String statusEventTestXml = "\n" + + "\n" + + "\n" + + "\n"; + + String notifyTestXml = "\n" + + "\n" + + "0\n" + + "\n"; @PostConstruct public void init() throws Exception { @@ -216,6 +249,108 @@ public class SipClientService implements SipListener { lastRegisterTransaction.sendRequest(); } + /** + * 发送 SUBSCRIBE 请求 + * + * @param deviceCode SIP 用户名/设备编号 + * @param serverIp FreeSWITCH 服务器 IP + * @param serverPort FreeSWITCH 端口 + * @param event 订阅事件类型,例如 "presence", "message-summary" + * @throws Exception + */ + public void sendSubscribe(String deviceCode, String serverIp, int serverPort, String event) throws Exception { + SipURI requestUri = addressFactory.createSipURI(deviceCode, serverIp); + requestUri.setPort(serverPort); + requestUri.setTransportParam(transport.toUpperCase()); + + Address fromAddress = addressFactory.createAddress("sip:" + username + "@" + localIp); + FromHeader fromHeader = headerFactory.createFromHeader(fromAddress, UUID.randomUUID().toString().substring(0, 8)); + + Address toAddress = addressFactory.createAddress("sip:" + deviceCode + "@" + serverIp); + ToHeader toHeader = headerFactory.createToHeader(toAddress, null); + + CallIdHeader callId = sipProvider.getNewCallId(); + CSeqHeader cSeq = headerFactory.createCSeqHeader(cSeqCounter.getAndIncrement(), Request.SUBSCRIBE); + MaxForwardsHeader maxForwards = headerFactory.createMaxForwardsHeader(70); + + List viaHeaders = new ArrayList<>(); + ViaHeader viaHeader = headerFactory.createViaHeader(localIp, localPort, transport, null); + viaHeaders.add(viaHeader); + + Address contactAddr = addressFactory.createAddress("sip:" + username + "@" + localIp + ":" + localPort); + ContactHeader contactHeader = headerFactory.createContactHeader(contactAddr); + + EventHeader eventHeader = headerFactory.createEventHeader(event); + + ExpiresHeader expiresHeader = headerFactory.createExpiresHeader(expires); + + Request request = messageFactory.createRequest( + requestUri, + Request.SUBSCRIBE, + callId, + cSeq, + fromHeader, + toHeader, + viaHeaders, + maxForwards + ); + + request.addHeader(contactHeader); + request.addHeader(eventHeader); + request.addHeader(expiresHeader); + + ClientTransaction transaction = sipProvider.getNewClientTransaction(request); + transaction.sendRequest(); + } + + /** + * 发送带认证头的 SUBSCRIBE + */ + private void sendSubscribeWithAuth(String deviceCode, String serverIp, int serverPort, String event, AuthorizationHeader authHeader) throws Exception { + SipURI requestUri = addressFactory.createSipURI(deviceCode, serverIp); + requestUri.setPort(serverPort); + requestUri.setTransportParam(transport.toUpperCase()); + + Address fromAddress = addressFactory.createAddress("sip:" + username + "@" + localIp); + FromHeader fromHeader = headerFactory.createFromHeader(fromAddress, UUID.randomUUID().toString().substring(0, 8)); + + Address toAddress = addressFactory.createAddress("sip:" + deviceCode + "@" + serverIp); + ToHeader toHeader = headerFactory.createToHeader(toAddress, null); + + CallIdHeader callId = sipProvider.getNewCallId(); + CSeqHeader cSeq = headerFactory.createCSeqHeader(cSeqCounter.getAndIncrement(), Request.SUBSCRIBE); + MaxForwardsHeader maxForwards = headerFactory.createMaxForwardsHeader(70); + + List viaHeaders = new ArrayList<>(); + ViaHeader viaHeader = headerFactory.createViaHeader(localIp, localPort, transport, null); + viaHeaders.add(viaHeader); + + Address contactAddr = addressFactory.createAddress("sip:" + username + "@" + localIp + ":" + localPort); + ContactHeader contactHeader = headerFactory.createContactHeader(contactAddr); + + EventHeader eventHeader = headerFactory.createEventHeader(event); + ExpiresHeader expiresHeader = headerFactory.createExpiresHeader(expires); + + Request request = messageFactory.createRequest( + requestUri, + Request.SUBSCRIBE, + callId, + cSeq, + fromHeader, + toHeader, + viaHeaders, + maxForwards + ); + + request.addHeader(contactHeader); + request.addHeader(eventHeader); + request.addHeader(expiresHeader); + request.addHeader(authHeader); + + ClientTransaction transaction = sipProvider.getNewClientTransaction(request); + transaction.sendRequest(); + } + public void sendXmlResource(String targetSipUri, String xml) throws Exception { log.info("Sending XML resource to {}", targetSipUri); @@ -257,10 +392,10 @@ public class SipClientService implements SipListener { public void processResponse(ResponseEvent responseEvent) { Response response = responseEvent.getResponse(); int status = response.getStatusCode(); - log.info("Received response: {}", status); CSeqHeader cSeqHeader = (CSeqHeader) response.getHeader(CSeqHeader.NAME); if (cSeqHeader == null) return; String method = cSeqHeader.getMethod(); + log.info("Received response: {}, method: {}", status, method); try { if (Request.REGISTER.equalsIgnoreCase(method)) { @@ -323,10 +458,92 @@ public class SipClientService implements SipListener { } }, delay * 1000L); - sendNotify(username, domain, port, testXml); + //sendNotify(username, domain, port, testXml); + sendSubscribe(username, domain, port, "Push_Resource"); } else { log.warn("REGISTER response: {}", status); } + } else if (Request.SUBSCRIBE.equalsIgnoreCase(method)) { + if (status == 401 || status == 407) { + // TODO: 处理认证,参考 REGISTER 的认证逻辑 + log.info("SUBSCRIBE 需要认证,返回码 {}", status); + + WWWAuthenticateHeader wwwAuth = null; + ProxyAuthenticateHeader proxyAuth = null; + + if (status == 401) { + wwwAuth = (WWWAuthenticateHeader) response.getHeader(WWWAuthenticateHeader.NAME); + } else if (status == 407) { + proxyAuth = (ProxyAuthenticateHeader) response.getHeader(ProxyAuthenticateHeader.NAME); + } + + String realm = null; + String nonce = null; + String qop = null; + if (wwwAuth != null) { + realm = wwwAuth.getRealm(); + nonce = wwwAuth.getNonce(); + qop = wwwAuth.getQop(); + } else if (proxyAuth != null) { + realm = proxyAuth.getRealm(); + nonce = proxyAuth.getNonce(); + qop = proxyAuth.getQop(); + } else { + log.error("No Authenticate header found for SUBSCRIBE"); + return; + } + + // 保存上次 SUBSCRIBE 请求参数,供重发使用 + ClientTransaction origTransaction = responseEvent.getClientTransaction(); + Request origRequest = origTransaction.getRequest(); + FromHeader fromHeader = (FromHeader) origRequest.getHeader(FromHeader.NAME); + ToHeader toHeader = (ToHeader) origRequest.getHeader(ToHeader.NAME); + String deviceCode = ((SipURI) toHeader.getAddress().getURI()).getUser(); + String serverIp = ((SipURI) toHeader.getAddress().getURI()).getHost(); + int serverPort = ((SipURI) toHeader.getAddress().getURI()).getPort(); + serverPort = serverPort < 0 ? 5060 : serverPort; + log.info("deviceCode: {}, serverIp: {}, serverPort: {}", deviceCode, serverIp, serverPort); + EventHeader eventHeader = (EventHeader) origRequest.getHeader(EventHeader.NAME); + String event = eventHeader.getEventType(); + + String uri = "sip:" + serverIp + ":" + serverPort; + String nc = "00000001"; + String cNonce = generateCNonce(); + + String responseDigest = DigestUtil.computeResponse( + username, + password, + realm, + nonce, + Request.SUBSCRIBE, + uri, + nc, + cNonce, + qop + ); + + AuthorizationHeader authHeader = headerFactory.createAuthorizationHeader("Digest"); + authHeader.setUsername(username); + authHeader.setRealm(realm); + authHeader.setNonce(nonce); + authHeader.setURI(addressFactory.createURI(uri)); + authHeader.setResponse(responseDigest); + if (qop != null) { + authHeader.setQop(qop); + authHeader.setCNonce(cNonce); + authHeader.setNonceCount(Integer.parseInt(nc, 16)); + } + + // 重发带认证的 SUBSCRIBE + sendSubscribeWithAuth(deviceCode, serverIp, serverPort, event, authHeader); + } else if (status >= 200 && status < 300) { + log.info("SUBSCRIBE 成功: {}", status); + // 成功订阅后,向服务器上报资源 NOTIFY +// sendNotify(username, domain, port, resourcesReportTestXml); + sendNotify(username, domain, port, notifyTestXml); + } else { + log.warn("SUBSCRIBE 响应: {}", status); + } } else if (Request.MESSAGE.equalsIgnoreCase(method)) { log.info("MESSAGE response: {}", status); } else if (Request.NOTIFY.equalsIgnoreCase(method)) { @@ -413,7 +630,8 @@ public class SipClientService implements SipListener { Address contactAddr = addressFactory.createAddress("sip:" + username + "@" + localHost + ":" + localPort); ContactHeader contactHeader = headerFactory.createContactHeader(contactAddr); - EventHeader eventHeader = headerFactory.createEventHeader("Push_Resource"); +// EventHeader eventHeader = headerFactory.createEventHeader("Push_Resource"); + EventHeader eventHeader = headerFactory.createEventHeader("Notify_Test"); SubscriptionStateHeader subscriptionStateHeader = headerFactory.createSubscriptionStateHeader(SubscriptionStateHeader.TERMINATED); @@ -477,11 +695,46 @@ public class SipClientService implements SipListener { SipXmlEnvelope envelope = SipXmlParser.parse(xml, itemClass); //handleSipEvent(envelope); } + } else if (Request.NOTIFY.equalsIgnoreCase(method)) { + ContentTypeHeader ct = (ContentTypeHeader) request.getHeader(ContentTypeHeader.NAME); + if (ct != null && "application".equalsIgnoreCase(ct.getContentType()) && "xml".equalsIgnoreCase(ct.getContentSubType())) { + String xml = new String(request.getRawContent(), StandardCharsets.UTF_8); + log.info("Received NOTIFY XML:\n{}", xml); + + // 可以解析 SUBSCRIBE 通知内容 + String eventType = SipXmlParser.peekEventType(xml); + log.info("NOTIFY EventType: {}", eventType); + + // 回复 200 OK + ServerTransaction st = requestEvent.getServerTransaction(); + if (st == null) { + st = sipProvider.getNewServerTransaction(request); + } + Response ok = messageFactory.createResponse(Response.OK, request); + st.sendResponse(ok); + } + } else if (Request.SUBSCRIBE.equals(request.getMethod())) { + String xml = new String(request.getRawContent(), StandardCharsets.UTF_8); + + ExpiresHeader expiresHeader = (ExpiresHeader) request.getHeader(ExpiresHeader.NAME); + int expires = (expiresHeader != null) ? expiresHeader.getExpires() : 0; + log.info("Received SUBSCRIBE expires: {}, XML:\n{}", expires, xml); + ServerTransaction transaction = sipProvider.getNewServerTransaction(request); + Response response = messageFactory.createResponse(Response.OK, request); + transaction.sendResponse(response); + + if (expires > 0) { + saveSubscription(request, expires); + sendInitialNotify(request, transaction, "initial"); + } else { + removeSubscription(request); + } + } + else { - } else { Response notImpl = messageFactory.createResponse(Response.NOT_IMPLEMENTED, request); requestEvent.getServerTransaction().sendResponse(notImpl); - log.warn("Method {} not implemented, replied 501", method); + log.info("Method {} not implemented, replied 501", method); } } catch (Exception ex) { log.error("Error processing request: {}", ex.getMessage(), ex); @@ -580,4 +833,92 @@ public class SipClientService implements SipListener { } return sb.toString(); } + + private void saveSubscription(Request request, int expires) { + CallIdHeader callIdHeader = (CallIdHeader) request.getHeader(CallIdHeader.NAME); + ToHeader toHeader = (ToHeader) request.getHeader(ToHeader.NAME); + FromHeader fromHeader = (FromHeader) request.getHeader(FromHeader.NAME); + + String key = callIdHeader.getCallId() + "|" + fromHeader.getTag() + "|" + toHeader.getTag(); + + SubscriptionInfo info = new SubscriptionInfo(); + info.callId = callIdHeader.getCallId(); + info.from = fromHeader; + info.to = toHeader; + info.expires = expires; + info.event = ((EventHeader) request.getHeader(EventHeader.NAME)).getEventType(); + + subscriptions.put(key, info); + + System.out.println("保存订阅: " + key + " 有效期 " + expires + " 秒"); + } + + + private void sendInitialNotify(Request subscribeRequest, ServerTransaction st, String bodyText) { + try { + // 获取必要头字段 + CallIdHeader callIdHeader = (CallIdHeader) subscribeRequest.getHeader(CallIdHeader.NAME); + CSeqHeader cseqHeader = (CSeqHeader) subscribeRequest.getHeader(CSeqHeader.NAME); + FromHeader fromHeader = (FromHeader) subscribeRequest.getHeader(FromHeader.NAME); + ToHeader toHeader = (ToHeader) subscribeRequest.getHeader(ToHeader.NAME); + EventHeader eventHeader = (EventHeader) subscribeRequest.getHeader(EventHeader.NAME); + ContactHeader contactHeader = (ContactHeader) subscribeRequest.getHeader(ContactHeader.NAME); + + List viaHeaders = new ArrayList<>(); + ViaHeader viaHeader = headerFactory.createViaHeader(localIp, localPort, transport.toUpperCase(), null); + viaHeaders.add(viaHeader); + // 创建 NOTIFY 请求 + Request notifyRequest = messageFactory.createRequest( + subscribeRequest.getRequestURI(), + Request.NOTIFY, + callIdHeader, + headerFactory.createCSeqHeader(cseqHeader.getSeqNumber() + 1, Request.NOTIFY), + fromHeader, + toHeader, + viaHeaders, + headerFactory.createMaxForwardsHeader(70) + ); + + // 加入 Contact + notifyRequest.addHeader(contactHeader); + + // 必须的事件头 + notifyRequest.addHeader(eventHeader); + + // Subscription-State 头 + SubscriptionStateHeader ssHeader = headerFactory.createSubscriptionStateHeader("active"); + ssHeader.setExpires(3600); + notifyRequest.addHeader(ssHeader); + + // 消息体 + String xmlBody = "\n" + + "\n" + + " " + bodyText + "\n" + + ""; + ContentTypeHeader contentTypeHeader = headerFactory.createContentTypeHeader("application", "xml"); + notifyRequest.setContent(xmlBody, contentTypeHeader); + + // 发送 + ClientTransaction ct = sipProvider.getNewClientTransaction(notifyRequest); + ct.sendRequest(); + + System.out.println("发送初始 NOTIFY: " + callIdHeader.getCallId()); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + + private void removeSubscription(Request request) { + CallIdHeader callIdHeader = (CallIdHeader) request.getHeader(CallIdHeader.NAME); + ToHeader toHeader = (ToHeader) request.getHeader(ToHeader.NAME); + FromHeader fromHeader = (FromHeader) request.getHeader(FromHeader.NAME); + + String key = callIdHeader.getCallId() + "|" + fromHeader.getTag() + "|" + toHeader.getTag(); + subscriptions.remove(key); + + System.out.println("删除订阅: " + key); + } + } diff --git a/src/main/java/com/inspect/tcpserver/tcp/NettyServer.java b/src/main/java/com/inspect/tcpserver/tcp/NettyServer.java index 19102c4..78675f8 100644 --- a/src/main/java/com/inspect/tcpserver/tcp/NettyServer.java +++ b/src/main/java/com/inspect/tcpserver/tcp/NettyServer.java @@ -353,7 +353,7 @@ public class NettyServer { case PushType.result:// insert into basedata_mont_taskresult and patrol_task_result_main json = downXml2Json.DownStreamJson2Xml(binaryModel.uuid, binaryModel.id, compactXml, TaskResultControl.class); //root@Linx:/home/atia/data/log/inspect-main# grep -rn "type:61, messageBody:" info.log - log.info(Color.YELLOW + "###### 客户端[{}]上报巡视结果 ######" + Color.END, sendCode); + log.info(Color.YELLOW + "###### 客户端[{}]上报巡视结果 ######\n {}" + Color.END, sendCode, json); break; default: log.info(Color.RED + "###### 客户端[{}]上报的非法消息不予处理 ######" + Color.END, sendCode);