|
@@ -16,7 +16,6 @@ import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
|
|
|
/*
|
|
|
-serviceId 서비스ID String 19
|
|
|
lcList 교차로 갯수 Integer 2
|
|
|
intLcNo1 교차로 번호1 Integer 4 국토부 표준 NODE ID
|
|
|
intName1 교차로명1 String 100 교차로명
|
|
@@ -41,7 +40,7 @@ public class EvpsNode implements EvpsCommResponse {
|
|
|
|
|
|
if (packet.getPacket().getCurrent() == 1 && packet.getPacket().getTotal() == 1) {
|
|
|
// 모든 정보가 하나의 프레임으로 전송된 경우
|
|
|
- return makeData(packet.getCenter(), packet.getPacket().getBuffer());
|
|
|
+ return makeData(packet, packet.getPacket().getBuffer());
|
|
|
}
|
|
|
|
|
|
// 패킷이 분할되어 전송된 경우
|
|
@@ -50,8 +49,7 @@ public class EvpsNode implements EvpsCommResponse {
|
|
|
if (packet.getPacket().getCurrent() == 1) {
|
|
|
// 첫번째 프레임
|
|
|
// sequence 에 대항하는 서비스 정보를 메모리에 저장하고 서비스 ID에 대한 메모리 정보를 얻는다.
|
|
|
- byte[] serviceIdArr = Arrays.copyOfRange(packet.getPacket().getBuffer(), 0, EvpsProtocolConst.EVPS_SERVICE_ID_SIZE);
|
|
|
- String serviceId = new String(serviceIdArr).trim();
|
|
|
+ String serviceId = packet.getPacket().getServiceId();
|
|
|
EvpsSequenceDto sequenceDto = new EvpsSequenceDto();
|
|
|
sequenceDto.setSequence(sequence);
|
|
|
sequenceDto.setServiceId(serviceId);
|
|
@@ -84,7 +82,7 @@ public class EvpsNode implements EvpsCommResponse {
|
|
|
packet.getCenter().getLogKey(), serviceDto.getServiceId(), sequence, packet.getPacket().getCurrent(), packet.getPacket().getTotal());
|
|
|
|
|
|
// 저장한 프레임 전체를 이용해서 데이터 생성
|
|
|
- result = makeData(packet.getCenter(), serviceDto.getNodeBuffer().array());
|
|
|
+ result = makeData(packet, serviceDto.getNodeBuffer().array());
|
|
|
|
|
|
// SequenceMap 에서 SequenceDto 를 제거한다.
|
|
|
packet.getCenter().getSequenceMap().remove(sequence);
|
|
@@ -101,32 +99,30 @@ public class EvpsNode implements EvpsCommResponse {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- private boolean makeData(EvpsCenter center, byte[] buffer) {
|
|
|
+ private boolean makeData(RecvPacketDto packet, byte[] buffer) {
|
|
|
+ EvpsCenter center = packet.getCenter();
|
|
|
if (buffer == null || buffer.length < EvpsProtocolConst.MIN_NODE_DATA_SIZE) {
|
|
|
log.error("[{}], EvpsNode.response: Data Length Error: Required minimum data length({}), Cur({}). will be closed.",
|
|
|
center.getLogKey(), EvpsProtocolConst.MIN_NODE_DATA_SIZE, buffer == null ? 0: buffer.length);
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- // 서비스ID
|
|
|
- int idx = 0;
|
|
|
- byte[] serviceIdArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_SERVICE_ID_SIZE);
|
|
|
- idx += EvpsProtocolConst.EVPS_SERVICE_ID_SIZE;
|
|
|
- String serviceId = new String(serviceIdArr).trim();
|
|
|
+ String serviceId = packet.getPacket().getServiceId();
|
|
|
|
|
|
+ int idx = 0;
|
|
|
// 교차로수(2 Byte)
|
|
|
int nodeCount = ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
- int reqNodeSize = nodeCount * 112; // nodeId(4), name(100), lat(4), lng(4)
|
|
|
- int reqDataSize = EvpsProtocolConst.MIN_NODE_DATA_SIZE + reqNodeSize;
|
|
|
- if (buffer.length != reqDataSize) {
|
|
|
+ int reqDataSize = EvpsProtocolConst.MIN_NODE_DATA_NODE_SIZE * nodeCount;
|
|
|
+ if ((buffer.length - idx) < reqDataSize) {
|
|
|
log.error("[{}], EvpsNode.response: Data Length Error: Required data length({}), Cur({}). will be closed.",
|
|
|
- center.getLogKey(), reqDataSize, buffer.length);
|
|
|
+ center.getLogKey(), reqDataSize, (buffer.length-idx));
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
List<HashMap<String, Object>> lists = new ArrayList<>();
|
|
|
+ List<HashMap<String, Object>> phaseLists = new ArrayList<>();
|
|
|
for (int ii = 0; ii < nodeCount; ii++) {
|
|
|
- int nodeId = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+ long nodeId = ((long) (buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
byte[] nodeNmArr = Arrays.copyOfRange(buffer, idx, idx+EvpsProtocolConst.EVPS_NODE_NAME_SIZE);
|
|
|
idx += EvpsProtocolConst.EVPS_NODE_NAME_SIZE;
|
|
|
int currentLat = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
@@ -141,13 +137,57 @@ public class EvpsNode implements EvpsCommResponse {
|
|
|
param.put("LNG", currentLng/EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
|
|
|
lists.add(param);
|
|
|
- }
|
|
|
|
|
|
+ int phaseCount = ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+ int reqPhaseDataSize = EvpsProtocolConst.NODE_DATA_PHASE_SIZE * phaseCount;
|
|
|
+ if ((buffer.length - idx) < reqPhaseDataSize) {
|
|
|
+ log.error("[{}], EvpsNode.response: Phase Data Length Error: Required data length({}), Cur({}). will be closed.",
|
|
|
+ center.getLogKey(), reqPhaseDataSize, (buffer.length-idx));
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ for (int jj = 0; jj < phaseCount; jj++) {
|
|
|
+ int ring = buffer[idx++] & 0xFF;
|
|
|
+ int phaseNo = buffer[idx++] & 0xFF;
|
|
|
+ int planClass = buffer[idx++] & 0xFF;
|
|
|
+ int flowNo = buffer[idx++] & 0xFF;
|
|
|
+ int headLat = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+ int headLng = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+ int midLat = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+ int midLng = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+ int endLat = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+ int endLng = ((buffer[idx++] & 0xFF) << 24) | ((buffer[idx++] & 0xFF) << 16) | ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+ int headAngle = ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+ int endAngle = ((buffer[idx++] & 0xFF) << 8) | (buffer[idx++] & 0xFF);
|
|
|
+
|
|
|
+ HashMap<String, Object> phaseParam = new HashMap<>();
|
|
|
+ param.put("SERVICE_ID", serviceId);
|
|
|
+ param.put("SEQ_NO", jj+1);
|
|
|
+ param.put("NODE_ID", nodeId);
|
|
|
+
|
|
|
+ param.put("RING", ring);
|
|
|
+ param.put("PHASE_NO", phaseNo);
|
|
|
+ param.put("PLAN_CLASS", planClass);
|
|
|
+ param.put("FLOW_NO", flowNo);
|
|
|
+ param.put("HEAD_LAT", headLat/EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
+ param.put("HEAD_LNG", headLng/EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
+ param.put("MID_LAT", midLat/EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
+ param.put("MID_LNG", midLng/EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
+ param.put("END_LAT", endLat/EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
+ param.put("END_LNG", endLng/EvpsProtocolConst.EVPS_GEO_CORRECT);
|
|
|
+ param.put("HEAD_ANGLE", headAngle);
|
|
|
+ param.put("END_ANGLE", endAngle);
|
|
|
+
|
|
|
+ phaseLists.add(phaseParam);
|
|
|
+ }
|
|
|
+ }
|
|
|
log.info("[{}], EvpsNode.response: Service Node List {} EA.", center.getLogKey(), lists.size());
|
|
|
|
|
|
if (!lists.isEmpty()) {
|
|
|
this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INS_NODE, center, lists));
|
|
|
}
|
|
|
+ if (!phaseLists.isEmpty()) {
|
|
|
+ this.dbmsDataProcess.add(new DbmsData(DbmsData.DBMS_DATA_INS_PHASE, center, phaseLists));
|
|
|
+ }
|
|
|
return true;
|
|
|
}
|
|
|
}
|