From 2fa97835fea98ad31ba2390fe07d91b01e44e088 Mon Sep 17 00:00:00 2001 From: shikong <919411476@qq.com> Date: Wed, 13 Sep 2023 13:56:44 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9B=AE=E5=BD=95=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mocking/api/device/DeviceController.java | 6 ++-- .../request/catalog/CatalogCmdProcessor.java | 33 ++++++++++++++----- .../core/sip/request/SipRequestBuilder.java | 32 +++++++++--------- .../mocking/service/device/DeviceService.java | 4 +-- 4 files changed, 45 insertions(+), 30 deletions(-) diff --git a/gb28181-mocking-api/src/main/java/cn/skcks/docking/gb28181/mocking/api/device/DeviceController.java b/gb28181-mocking-api/src/main/java/cn/skcks/docking/gb28181/mocking/api/device/DeviceController.java index 7906494..c8b898b 100644 --- a/gb28181-mocking-api/src/main/java/cn/skcks/docking/gb28181/mocking/api/device/DeviceController.java +++ b/gb28181-mocking-api/src/main/java/cn/skcks/docking/gb28181/mocking/api/device/DeviceController.java @@ -22,8 +22,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.List; - @Slf4j @Tag(name = "设备信息") @RestController @@ -59,8 +57,8 @@ public class DeviceController { @Operation(summary = "根据国标id(20位) 查询指定设备信息") @GetJson("/info/gbDeviceId") - public JsonResponse> infoByGbDeviceId(@RequestParam String gbDeviceId) { - List MockingDevice = deviceService.getDeviceByGbDeviceId(gbDeviceId); + public JsonResponse infoByGbDeviceId(@RequestParam String gbDeviceId) { + MockingDevice MockingDevice = deviceService.getDeviceByGbDeviceId(gbDeviceId).orElse(null); return JsonResponse.success(MockingDevice); } diff --git a/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/message/processor/message/request/catalog/CatalogCmdProcessor.java b/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/message/processor/message/request/catalog/CatalogCmdProcessor.java index 9abcc88..b1bcf98 100644 --- a/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/message/processor/message/request/catalog/CatalogCmdProcessor.java +++ b/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/message/processor/message/request/catalog/CatalogCmdProcessor.java @@ -5,6 +5,8 @@ import cn.skcks.docking.gb28181.mocking.core.sip.message.processor.message.reque import cn.skcks.docking.gb28181.mocking.core.sip.message.processor.message.request.catalog.dto.CatalogItemDTO; import cn.skcks.docking.gb28181.mocking.core.sip.message.processor.message.request.catalog.dto.CatalogRequestDTO; import cn.skcks.docking.gb28181.mocking.core.sip.message.processor.message.request.catalog.dto.CatalogResponseDTO; +import cn.skcks.docking.gb28181.mocking.core.sip.request.SipRequestBuilder; +import cn.skcks.docking.gb28181.mocking.core.sip.sender.SipSender; import cn.skcks.docking.gb28181.mocking.orm.mybatis.dynamic.model.MockingDevice; import cn.skcks.docking.gb28181.mocking.service.device.DeviceService; import gov.nist.javax.sip.message.SIPRequest; @@ -12,12 +14,16 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import javax.sip.header.CallIdHeader; +import javax.sip.header.FromHeader; +import java.util.Collections; import java.util.List; @Slf4j @RequiredArgsConstructor @Component public class CatalogCmdProcessor { + private final SipSender sender; private final DeviceService deviceService; public void process(SIPRequest request, byte[] content){ @@ -25,15 +31,17 @@ public class CatalogCmdProcessor { String sn = catalogRequestDTO.getSn(); String deviceId = catalogRequestDTO.getDeviceId(); - List mockingDeviceList = deviceService.getDeviceByGbDeviceId(deviceId); - List catalogItemDTOList = mockingDeviceList.stream() - .filter(MockingDevice::getEnable) - .map(item -> CatalogItemDTO.builder() - .deviceId(item.getGbChannelId()) - .name(item.getName()) - .address(item.getAddress()) - .manufacturer(item.getName()) - .build()).toList(); + MockingDevice mockingDevice = deviceService.getDeviceByGbDeviceId(deviceId).orElse(null); + if(mockingDevice == null){ + return; + } + CatalogItemDTO catalogItemDTO = CatalogItemDTO.builder() + .deviceId(mockingDevice.getGbChannelId()) + .name(mockingDevice.getName()) + .address(mockingDevice.getAddress()) + .manufacturer(mockingDevice.getName()) + .build(); + List catalogItemDTOList = Collections.singletonList(catalogItemDTO); CatalogDeviceListDTO catalogDeviceListDTO = new CatalogDeviceListDTO(catalogItemDTOList.size(), catalogItemDTOList); CatalogResponseDTO catalogResponseDTO = CatalogResponseDTO.builder() .sn(sn) @@ -42,6 +50,13 @@ public class CatalogCmdProcessor { .sumNum(Long.valueOf(catalogDeviceListDTO.getNum())) .build(); + long cSeq = request.getCSeq().getSeqNumber() + 1; + FromHeader fromHeader = request.getFromHeader(); + sender.sendRequest((provider, ip, port)->{ + CallIdHeader callIdHeader = provider.getNewCallId(); + return SipRequestBuilder.createMessageRequest(mockingDevice, + ip, port, cSeq, XmlUtils.toXml(catalogResponseDTO), fromHeader.getTag(), callIdHeader); + }); } } diff --git a/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/request/SipRequestBuilder.java b/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/request/SipRequestBuilder.java index 51d736d..221028c 100644 --- a/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/request/SipRequestBuilder.java +++ b/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/request/SipRequestBuilder.java @@ -1,10 +1,12 @@ package cn.skcks.docking.gb28181.mocking.core.sip.request; +import cn.skcks.docking.gb28181.core.sip.gb28181.constant.GB28181Constant; import cn.skcks.docking.gb28181.core.sip.message.MessageHelper; import cn.skcks.docking.gb28181.core.sip.utils.SipUtil; import cn.skcks.docking.gb28181.mocking.config.sip.ServerConfig; import cn.skcks.docking.gb28181.mocking.config.sip.SipConfig; import cn.skcks.docking.gb28181.mocking.orm.mybatis.dynamic.model.MockingDevice; +import gov.nist.javax.sip.message.MessageFactoryImpl; import lombok.SneakyThrows; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeansException; @@ -14,14 +16,11 @@ import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Component; import org.springframework.util.DigestUtils; -import javax.sip.InvalidArgumentException; -import javax.sip.PeerUnavailableException; import javax.sip.SipFactory; import javax.sip.address.Address; import javax.sip.address.SipURI; import javax.sip.header.*; import javax.sip.message.Request; -import java.text.ParseException; import java.util.Collections; import java.util.List; import java.util.UUID; @@ -144,14 +143,15 @@ public class SipRequestBuilder implements ApplicationContextAware { return request; } - public static Request createMessageRequest(MockingDevice device, String ip, int port,String content, String viaTag, String fromTag, String toTag, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException { + @SneakyThrows + public static Request createMessageRequest(MockingDevice device, String ip, int port,long cSeq,String content, String fromTag, CallIdHeader callIdHeader) { Request request; String target = StringUtils.joinWith(":", serverConfig.getIp(), serverConfig.getPort()); // sip uri SipURI requestURI = MessageHelper.createSipURI(serverConfig.getId(), target); // via - List viaHeaders = getViaHeaders(serverConfig.getIp(), serverConfig.getPort(), sipConfig.getTransport(), viaTag); + List viaHeaders = getViaHeaders(serverConfig.getIp(), serverConfig.getPort(), sipConfig.getTransport(), null ); String from = StringUtils.joinWith(":", ip, port); // from @@ -161,21 +161,23 @@ public class SipRequestBuilder implements ApplicationContextAware { // to SipURI toSipURI = MessageHelper.createSipURI(serverConfig.getId(), target); Address toAddress = MessageHelper.createAddress(toSipURI); - ToHeader toHeader = MessageHelper.createToHeader(toAddress, toTag); + ToHeader toHeader = MessageHelper.createToHeader(toAddress, null); // Forwards MaxForwardsHeader maxForwards = MessageHelper.createMaxForwardsHeader(70); // ceq -// CSeqHeader cSeqHeader = getSipFactory().createHeaderFactory().createCSeqHeader(getCSeq(), Request.MESSAGE); + CSeqHeader cSeqHeader = getSipFactory().createHeaderFactory().createCSeqHeader(cSeq, Request.MESSAGE); -// request = getSipFactory().createMessageFactory().createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader, -// toHeader, viaHeaders, maxForwards); + // 使用 GB28181 默认编码 否则中文将会乱码 + MessageFactoryImpl messageFactory = (MessageFactoryImpl) getSipFactory().createMessageFactory(); + messageFactory.setDefaultContentEncodingCharset(GB28181Constant.CHARSET); + request = messageFactory.createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader, + toHeader, viaHeaders, maxForwards); -// request.addHeader(SipUtil.createUserAgentHeader()); -// -// ContentTypeHeader contentTypeHeader = getSipFactory().createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); -// request.setContent(content, contentTypeHeader); -// return request; - return null; + request.addHeader(SipUtil.createUserAgentHeader()); + + ContentTypeHeader contentTypeHeader = getSipFactory().createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); + request.setContent(content, contentTypeHeader); + return request; } } diff --git a/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/service/device/DeviceService.java b/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/service/device/DeviceService.java index 1ee080a..85c0b43 100644 --- a/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/service/device/DeviceService.java +++ b/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/service/device/DeviceService.java @@ -36,8 +36,8 @@ public class DeviceService { s.where(MockingDeviceDynamicSqlSupport.deviceCode, isEqualTo(deviceCode))); } - public List getDeviceByGbDeviceId(String gbDeviceId){ - return deviceMapper.select(s-> + public Optional getDeviceByGbDeviceId(String gbDeviceId){ + return deviceMapper.selectOne(s-> s.where(MockingDeviceDynamicSqlSupport.gbDeviceId,isEqualTo(gbDeviceId))); }