|
@@ -1,8 +1,13 @@
|
|
|
package com.evp.comm.server.xnet.server.process.response;
|
|
|
|
|
|
+import com.evp.comm.server.dto.EvpsCenter;
|
|
|
+import com.evp.comm.server.dto.EvpsSequenceDto;
|
|
|
+import com.evp.comm.server.dto.EvpsServiceDto;
|
|
|
+import com.evp.comm.server.entity.TbEvpEvent;
|
|
|
import com.evp.comm.server.entity.TbEvpService;
|
|
|
import com.evp.comm.server.process.dbms.DbmsData;
|
|
|
import com.evp.comm.server.process.dbms.DbmsDataProcess;
|
|
|
+import com.evp.comm.server.repository.ApplicationRepository;
|
|
|
import com.evp.comm.server.xnet.server.process.protocol.EvpsProtocolConst;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.slf4j.MDC;
|
|
@@ -30,6 +35,7 @@ routeList 경로수 Integer 2
|
|
|
routeLng1 경로LNG1 Integer 4 ( DD.DDDDDD x 1000000 )
|
|
|
................................................................
|
|
|
*/
|
|
|
+
|
|
|
@Slf4j
|
|
|
public class EvpsService implements EvpsCommResponse {
|
|
|
private final DbmsDataProcess dbmsDataProcess;
|
|
@@ -45,113 +51,56 @@ public class EvpsService implements EvpsCommResponse {
|
|
|
MDC.put("id", packet.getCenter().getLogKey());
|
|
|
log.info("[{}], EvpsService.response.", packet.getCenter().getLogKey());
|
|
|
|
|
|
+ if (packet.getPacket().getCurrent() == 1 && packet.getPacket().getTotal() == 1) {
|
|
|
+ // 모든 정보가 하나의 프레임으로 전송된 경우
|
|
|
+ return makeData(packet.getCenter(), packet.getPacket().getBuffer(), true);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 패킷이 분할되어 전송된 경우
|
|
|
+ EvpsServiceDto serviceDto = null;
|
|
|
+ int sequence = packet.getPacket().getSequence();
|
|
|
if (packet.getPacket().getCurrent() == 1) {
|
|
|
- // 제일 첫번째 패킷
|
|
|
- if (packet.getPacket().getFrameLength() < EvpsProtocolConst.MIN_SERVICE_DATA_SIZE) {
|
|
|
- log.error("[{}], EvpsService.response: Data Frame Length Error: Required minimum frame length({}), Cur({}). will be closed.",
|
|
|
- packet.getCenter().getLogKey(), EvpsProtocolConst.MIN_SERVICE_DATA_SIZE, packet.getPacket().getFrameLength());
|
|
|
- return false;
|
|
|
- }
|
|
|
- TbEvpService service = new TbEvpService();
|
|
|
-
|
|
|
- int idx = EvpsProtocolConst.EVPS_HEAD_SIZE;
|
|
|
- byte[] buffer = packet.getPacket().getBuffer();
|
|
|
-
|
|
|
- // 서비스ID
|
|
|
- byte[] serviceIdArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_SERVICE_ID_SIZE);
|
|
|
- service.setServiceId(new String(serviceIdArr).trim());
|
|
|
- idx += EvpsProtocolConst.EVPS_SERVICE_ID_SIZE;
|
|
|
-
|
|
|
- // 차량번호
|
|
|
- byte[] vehNoArr = Arrays.copyOfRange(packet.getPacket().getBuffer(), idx, idx+EvpsProtocolConst.EVPS_VEHICLE_NO_SIZE);
|
|
|
- service.setEvNo(new String(vehNoArr).trim());
|
|
|
- idx += EvpsProtocolConst.EVPS_VEHICLE_NO_SIZE;
|
|
|
-
|
|
|
- // 현재위치LAT
|
|
|
- int currentLat = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
- service.setCurLat(currentLat/EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
-
|
|
|
- // 현재위치LNG
|
|
|
- int currentLng = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
- service.setCurLng(currentLng/EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
-
|
|
|
- // 서비스명
|
|
|
- byte[] serviceNameArr = Arrays.copyOfRange(packet.getPacket().getBuffer(), idx, idx+EvpsProtocolConst.EVPS_SERVICE_NAME_SIZE);
|
|
|
- service.setServiceNm(new String(serviceNameArr).trim());
|
|
|
- idx += EvpsProtocolConst.EVPS_SERVICE_NAME_SIZE;
|
|
|
-
|
|
|
- // 도착위치LAT
|
|
|
- int arrivalLat = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
- service.setArrLat(arrivalLat/EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
-
|
|
|
- // 도착위치LNG
|
|
|
- int arrivalLng = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
- service.setArrLng(arrivalLng/EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
-
|
|
|
- // 차량길이
|
|
|
- int vehicleLength = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
- service.setVehLen(vehicleLength);
|
|
|
-
|
|
|
- // 재난번호
|
|
|
- byte[] ocrNoArr = Arrays.copyOfRange(packet.getPacket().getBuffer(), idx, idx+EvpsProtocolConst.EVPS_OCR_NO_SIZE);
|
|
|
- service.setOcrNo(new String(ocrNoArr).trim());
|
|
|
- idx += EvpsProtocolConst.EVPS_OCR_NO_SIZE;
|
|
|
-
|
|
|
- // 재난종별명
|
|
|
- byte[] ocrTypeArr = Arrays.copyOfRange(packet.getPacket().getBuffer(), idx, idx+EvpsProtocolConst.EVPS_OCR_TYPE_SIZE);
|
|
|
- service.setOcrType(new String(ocrTypeArr).trim());
|
|
|
- idx += EvpsProtocolConst.EVPS_OCR_TYPE_SIZE;
|
|
|
-
|
|
|
- // 예상도착시각
|
|
|
- int arrivalTime = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
- service.setArrTm(arrivalTime);
|
|
|
-
|
|
|
- // 거리
|
|
|
- int distance = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
- service.setServiceDist(distance);
|
|
|
-
|
|
|
- service.setStatusCd(0);
|
|
|
-
|
|
|
- this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INS_SERVICE, packet.getCenter(), service));
|
|
|
-
|
|
|
- if (packet.getPacket().getTotal() == 1) {
|
|
|
- // 프레임이 한번에 전송되어서 온것
|
|
|
- // 경로수
|
|
|
- int routeCount = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
- int reqRouteSize = routeCount * 8; // lat(4), lng(4)
|
|
|
- if (packet.getPacket().getFrameLength() != EvpsProtocolConst.EVPS_HEAD_SIZE + EvpsProtocolConst.MIN_SERVICE_DATA_SIZE + reqRouteSize) {
|
|
|
- List<HashMap<String, Object>> lists = new ArrayList<>();
|
|
|
- for (int ii = 0; ii < routeCount; ii++) {
|
|
|
-
|
|
|
- int routeLat = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
- int routeLng = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
-
|
|
|
- service.setArrLng(arrivalLng/EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
-
|
|
|
- HashMap<String, Object> param = new HashMap<>();
|
|
|
- param.put("SERVICE_ID", service.getServiceId());
|
|
|
- param.put("SEQ_NO", ii+1);
|
|
|
- param.put("LAT", routeLat/EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
- param.put("LNG", routeLng/EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
-
|
|
|
- lists.add(param);
|
|
|
- }
|
|
|
- if (!lists.isEmpty()) {
|
|
|
- this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INS_ROUTE, packet.getCenter(), lists));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else {
|
|
|
- // 패킷이 분할되서 온것
|
|
|
- }
|
|
|
+ // 첫번째 프레임
|
|
|
+ // sequence 에 대항하는 서비스 정보를 메모리에 저장하고 서비스 ID에 대한 메모리 정보를 얻는다.
|
|
|
+ byte[] serviceIdArr = Arrays.copyOfRange(packet.getPacket().getBuffer(), 0, EvpsProtocolConst.EVPS_SERVICE_ID_SIZE);
|
|
|
+ String serviceId = new String(serviceIdArr).trim();
|
|
|
+ EvpsSequenceDto sequenceDto = new EvpsSequenceDto();
|
|
|
+ sequenceDto.setSequence(sequence);
|
|
|
+ sequenceDto.setServiceId(serviceId);
|
|
|
+ packet.getCenter().getSequenceMap().put(sequence, sequenceDto); // SequenceMap 에 SequenceDto 를 저장한다.
|
|
|
+ // 서비스 정보를 메모리에서 얻어온다.
|
|
|
+ serviceDto = ApplicationRepository.serviceMap.get(serviceId);
|
|
|
}
|
|
|
else {
|
|
|
- // 패킷이 분할되서 온것
|
|
|
-
|
|
|
- if (packet.getPacket().getCurrent() == packet.getPacket().getTotal()) {
|
|
|
- // 마지막 패킷이 들어온것
|
|
|
+ // 분할된 프레임
|
|
|
+ // sequence 에 대한 정보를 메모리에서 구하고 얻어온 서비스 ID로 서비스 정보를 메모리에서 얻어온다.
|
|
|
+ EvpsSequenceDto sequenceDto = packet.getCenter().getSequenceMap().get(sequence);
|
|
|
+ if (sequenceDto != null) {
|
|
|
+ // 서비스 정보를 메모리에서 얻어온다.
|
|
|
+ serviceDto = ApplicationRepository.serviceMap.get(sequenceDto.getServiceId());
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ if (serviceDto == null) {
|
|
|
+ // 서비스 정보를 메모리에서 얻어 오지 못한 경우.
|
|
|
+ log.error("[{}], EvpsService.response: Not Found Service Information. Sequence: {}, Curr: ({}), Tot: ({})",
|
|
|
+ packet.getCenter().getLogKey(), sequence, packet.getPacket().getCurrent(), packet.getPacket().getTotal());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 서비스 메모리에 교차로 정보 패킷을 순차적으로 적재
|
|
|
+ serviceDto.addNodeBuffer(packet.getPacket().getBuffer());
|
|
|
+ if (packet.getPacket().getCurrent() == packet.getPacket().getTotal()) {
|
|
|
+ // 분할된 프레임을 모두 받았음. 즉 마지막 프레임을 수신한 경우 데이터 처리
|
|
|
+ log.info("[{}], EvpsService.response: Recv All Frames. Service Id: {}, Sequence: {}, Curr: ({}), Tot: ({})",
|
|
|
+ packet.getCenter().getLogKey(), serviceDto.getServiceId(), sequence, packet.getPacket().getCurrent(), packet.getPacket().getTotal());
|
|
|
+
|
|
|
+ // 저장한 프레임 전체를 이용해서 데이터 생성
|
|
|
+ result = makeData(packet.getCenter(), serviceDto.getNodeBuffer().array(), false);
|
|
|
+
|
|
|
+ // SequenceMap 에서 SequenceDto 를 제거한다.
|
|
|
+ packet.getCenter().getSequenceMap().remove(sequence);
|
|
|
+ }
|
|
|
}
|
|
|
catch (Exception e) {
|
|
|
log.error("[{}], EvpsService.response: Exception. will be closed. {}", packet.getCenter().getLogKey(), e.getMessage());
|
|
@@ -164,4 +113,114 @@ public class EvpsService implements EvpsCommResponse {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
+ private boolean makeData(EvpsCenter center, byte[] buffer, boolean oneFrame) {
|
|
|
+ if (buffer == null || buffer.length < EvpsProtocolConst.MIN_SERVICE_DATA_SIZE) {
|
|
|
+ log.error("[{}], EvpsService.response: Data Length Error: Required minimum data length({}), Cur({}). will be closed.",
|
|
|
+ center.getLogKey(), EvpsProtocolConst.MIN_SERVICE_DATA_SIZE, buffer == null ? 0 : buffer.length);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ // 첫번째 패킷인 경우 서비스 정보를 메모리에 저장하고 데이터베이스에 저장한다.
|
|
|
+ // 만일 분할 된 패킷인 경우 패킷을 메노리에 저장하고 리턴
|
|
|
+ int idx = 0;
|
|
|
+
|
|
|
+ // 서비스ID
|
|
|
+ byte[] serviceIdArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_SERVICE_ID_SIZE);
|
|
|
+ idx += EvpsProtocolConst.EVPS_SERVICE_ID_SIZE;
|
|
|
+ // 차량번호
|
|
|
+ byte[] vehNoArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_VEHICLE_NO_SIZE);
|
|
|
+ idx += EvpsProtocolConst.EVPS_VEHICLE_NO_SIZE;
|
|
|
+ // 현재위치LAT
|
|
|
+ int currentLat = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+ // 현재위치LNG
|
|
|
+ int currentLng = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+ // 서비스명
|
|
|
+ byte[] serviceNameArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_SERVICE_NAME_SIZE);
|
|
|
+ idx += EvpsProtocolConst.EVPS_SERVICE_NAME_SIZE;
|
|
|
+ // 도착위치LAT
|
|
|
+ int arrivalLat = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+ // 도착위치LNG
|
|
|
+ int arrivalLng = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+ // 차량길이
|
|
|
+ int vehicleLength = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+ // 재난번호
|
|
|
+ byte[] ocrNoArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_OCR_NO_SIZE);
|
|
|
+ idx += EvpsProtocolConst.EVPS_OCR_NO_SIZE;
|
|
|
+ // 재난종별명
|
|
|
+ byte[] ocrTypeArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_OCR_TYPE_SIZE);
|
|
|
+ idx += EvpsProtocolConst.EVPS_OCR_TYPE_SIZE;
|
|
|
+ // 예상도착시각
|
|
|
+ int arrivalTime = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+ // 거리
|
|
|
+ int distance = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+
|
|
|
+ // 서비스 시작 정보 입력
|
|
|
+ TbEvpService service = new TbEvpService();
|
|
|
+ service.setServiceId(new String(serviceIdArr).trim());
|
|
|
+ service.setEvNo(new String(vehNoArr).trim());
|
|
|
+ service.setCurLat(currentLat/EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
+ service.setCurLng(currentLng/EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
+ service.setServiceNm(new String(serviceNameArr).trim());
|
|
|
+ service.setArrLat(arrivalLat/EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
+ service.setArrLng(arrivalLng/EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
+ service.setVehLen(vehicleLength);
|
|
|
+ service.setOcrNo(new String(ocrNoArr).trim());
|
|
|
+ service.setOcrType(new String(ocrTypeArr).trim());
|
|
|
+ service.setArrTm(arrivalTime);
|
|
|
+ service.setServiceDist(distance);
|
|
|
+ service.setStatusCd(TbEvpService.SERVICE_START);
|
|
|
+
|
|
|
+ EvpsServiceDto serviceDto = new EvpsServiceDto(service.getServiceId());
|
|
|
+ serviceDto.setService(service);
|
|
|
+
|
|
|
+ if (oneFrame) {
|
|
|
+ ApplicationRepository.serviceMap.put(service.getServiceId(), serviceDto);
|
|
|
+
|
|
|
+ this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INS_SERVICE, center, service));
|
|
|
+
|
|
|
+ // 이벤트 정보 입력(서비스 시작)
|
|
|
+ TbEvpEvent event = new TbEvpEvent(service.getServiceId(), TbEvpEvent.EVPS_EVENT_SERVICE_START);
|
|
|
+ event.setCurLat(service.getCurLat());
|
|
|
+ event.setCurLng(service.getCurLng());
|
|
|
+ event.setCurSpd(service.getCurSpd());
|
|
|
+ event.setRemDist(service.getServiceDist());
|
|
|
+ this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INS_EVENT, center, event));
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ int routeCount = ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+ int reqRouteSize = routeCount * 8; // lat(4), lng(4)
|
|
|
+ int reqDataSize = EvpsProtocolConst.EVPS_HEAD_SIZE + EvpsProtocolConst.MIN_SERVICE_DATA_SIZE + reqRouteSize;
|
|
|
+ if (buffer.length != reqDataSize) {
|
|
|
+ log.error("[{}], EvpsService.response: Data Length Error: Required data length({}), Cur({}). will be closed.",
|
|
|
+ center.getLogKey(), reqDataSize, buffer.length);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<HashMap<String, Object>> lists = new ArrayList<>();
|
|
|
+ for (int ii = 0; ii < routeCount; ii++) {
|
|
|
+
|
|
|
+ int routeLat = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+ int routeLng = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+
|
|
|
+ service.setArrLng(arrivalLng / EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
+
|
|
|
+ HashMap<String, Object> param = new HashMap<>();
|
|
|
+ param.put("SERVICE_ID", service.getServiceId());
|
|
|
+ param.put("SEQ_NO", ii + 1);
|
|
|
+ param.put("LAT", routeLat / EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
+ param.put("LNG", routeLng / EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
+
|
|
|
+ lists.add(param);
|
|
|
+ }
|
|
|
+ if (!lists.isEmpty()) {
|
|
|
+ this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INS_ROUTE, center, lists));
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("[{}], EvpsService.response: Service Route List {} EA.", center.getLogKey(), lists.size());
|
|
|
+
|
|
|
+ if (!lists.isEmpty()) {
|
|
|
+ this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INS_NODE, center, lists));
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
}
|