|
@@ -3,7 +3,12 @@ package com.its.pis.websocket;
|
|
|
import com.fasterxml.jackson.core.type.TypeReference;
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import com.its.app.utils.ItsUtils;
|
|
|
+import com.its.pis.entity.TbPisInfr;
|
|
|
+import com.its.pis.global.AppRepository;
|
|
|
import com.its.pis.websocket.C2F.message.*;
|
|
|
+import com.its.pis.websocket.common.PisSubscribeIdentifier;
|
|
|
+import com.its.pis.websocket.common.PisSubscribeRequest;
|
|
|
+import com.its.pis.websocket.common.PisSubscribeResponseAccept;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.io.FileUtils;
|
|
|
import org.springframework.stereotype.Controller;
|
|
@@ -15,6 +20,7 @@ import org.springframework.web.socket.handler.TextWebSocketHandler;
|
|
|
|
|
|
import java.io.File;
|
|
|
import java.util.Base64;
|
|
|
+import java.util.List;
|
|
|
import java.util.Map;
|
|
|
|
|
|
@Slf4j
|
|
@@ -41,39 +47,99 @@ public class ItsWebSocketHandler extends TextWebSocketHandler {
|
|
|
@Override
|
|
|
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
|
|
|
// 클라이언트가 연결되었을때 실행
|
|
|
- log.info("afterConnectionEstablished: {}", session.getHandshakeHeaders().entrySet());
|
|
|
+ String ipAddr = session.getRemoteAddress().getHostString();
|
|
|
+ String token = null;
|
|
|
+ for (Map.Entry<String, List<String>> l : session.getHandshakeHeaders().entrySet()) {
|
|
|
+ if ("sec-websocket-protocol".equals(l.getKey())) {
|
|
|
+ token = l.getValue().get(0);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (token == null) {
|
|
|
+ log.error("afterConnectionEstablished: {}, token not found, session will be closed", ipAddr);
|
|
|
+ session.close();
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- log.info("afterConnectionEstablished: {}, {}, {}, {}", session.getBinaryMessageSizeLimit(), session.getTextMessageSizeLimit(), session.getRemoteAddress().getHostString(), session.getAcceptedProtocol());
|
|
|
- log.info("afterConnectionEstablished: " + session.getRemoteAddress() + ", URI: " + session.getUri() + ", UUID: " + session.getId());
|
|
|
- session.setBinaryMessageSizeLimit(1*1024*1024);
|
|
|
- session.setTextMessageSizeLimit(1*1024*1024);
|
|
|
- super.afterConnectionEstablished(session);
|
|
|
+ log.info("afterConnectionEstablished: ipAddr={}, token={}", ipAddr, token);
|
|
|
+
|
|
|
+ for (Map.Entry<String, TbPisInfr> e : AppRepository.getInstance().getPisNmbrMap().entrySet()) {
|
|
|
+ TbPisInfr pis = e.getValue();
|
|
|
+ if (token.equals(pis.getPIS_TOKEN())) {
|
|
|
+ ItsWebSocketSession vo = new ItsWebSocketSession(pis, this, session);
|
|
|
+ pis.channelOpen(vo);
|
|
|
+ ItsWebSocketSessionManager.getInstance().addSession(session, vo);
|
|
|
+
|
|
|
+ session.setBinaryMessageSizeLimit(1*1024*1024);
|
|
|
+ session.setTextMessageSizeLimit(1*1024*1024);
|
|
|
+ super.afterConnectionEstablished(session);
|
|
|
+ log.info("afterConnectionEstablished: connection accept, {}, {}", pis.getPIS_ID(), pis.getPIS_NM());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- ItsWebSocketSession vo = new ItsWebSocketSession(this, session);
|
|
|
- ItsWebSocketSessionManager.getInstance().addSession(session, vo);
|
|
|
+ log.error("afterConnectionEstablished: ipAddr={}, token={}, not found token, session will be closed", ipAddr, token);
|
|
|
+ session.close();
|
|
|
}
|
|
|
|
|
|
//클라이언트가 웹소켓 서버로 메시지를 전송했을 때 실행
|
|
|
@Override
|
|
|
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
|
|
|
- log.info("handleTextMessage: {}, {}, {}, {}", session.getBinaryMessageSizeLimit(), session.getTextMessageSizeLimit(), session.getRemoteAddress().getHostString(), session.getAcceptedProtocol());
|
|
|
- log.info("handleTextMessage: " + session.getRemoteAddress() + ", Uri[" + session.getUri() + "], UUID[" + session.getId() + "]");//, message[" + message.getPayload() + "]");
|
|
|
- /*List<String> requests = ItsUtils.split(message.getPayload(), ":");
|
|
|
- if (requests.size() != 2) {
|
|
|
- log.error("Request data parsing error: {}", requests);
|
|
|
+
|
|
|
+ String payloadMessage = message.getPayload();
|
|
|
+ if (payloadMessage == null || payloadMessage.trim().isEmpty()) {
|
|
|
+ log.error("handleTextMessage: Payload data is empty");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ log.info("handleTextMessage: Payload, RX] {}", payloadMessage);
|
|
|
+
|
|
|
+ ItsWebSocketSession sessionClient = ItsWebSocketSessionManager.getInstance().getSession(session);
|
|
|
+ if (sessionClient == null) {
|
|
|
+ log.error("handleTextMessage: Request session not found, session will be closed {}", session);
|
|
|
session.close();
|
|
|
return;
|
|
|
}
|
|
|
-*/
|
|
|
- //C2FMessage<C2FMessagePayload> c2fMessage = this.mapper.readValue(message.getPayload(), C2FMessage.class);
|
|
|
- C2FMessage<C2FMessagePayload> c2fMessage = this.mapper.readValue(message.getPayload(), new TypeReference<C2FMessage<C2FMessagePayload>>(){});
|
|
|
- log.error("{}", c2fMessage);
|
|
|
+
|
|
|
+ C2FMessage<C2FMessagePayload> c2fMessage = this.mapper.readValue(payloadMessage, new TypeReference<C2FMessage<C2FMessagePayload>>(){});
|
|
|
+ if (c2fMessage.getCommand() == null) {
|
|
|
+ log.error("handleTextMessage: C2FMessage, {}", c2fMessage);
|
|
|
+ log.error("handleTextMessage: command data not found, session will be closed {}", session);
|
|
|
+ session.close();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if ("subscribe".equals(c2fMessage.getCommand())) {
|
|
|
+ log.info("handleTextMessage: RX] subscribe");
|
|
|
+
|
|
|
+ PisSubscribeRequest subscribe = this.mapper.readValue(payloadMessage, PisSubscribeRequest.class);
|
|
|
+ //log.info("handleTextMessage: RX] {}", subscribe);
|
|
|
+ log.info("RX] {}", this.mapper.writeValueAsString(subscribe));
|
|
|
+ TbPisInfr pis = sessionClient.getObj();
|
|
|
+ if (pis == null) {
|
|
|
+ log.error("handleTextMessage: PIS object not found, session will be closed {}", session);
|
|
|
+ session.close();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ pis.channelLogin(pis.getSession());
|
|
|
+
|
|
|
+ PisSubscribeResponseAccept response = PisSubscribeResponseAccept.builder()
|
|
|
+ .identifier(PisSubscribeIdentifier.builder()
|
|
|
+ .channel("ParkingLotChannel").build())
|
|
|
+ .essntl_info("Not Setting Info")
|
|
|
+ .type("confirm_subscription").build();
|
|
|
+ String strMessage = this.mapper.writeValueAsString(response);
|
|
|
+ sessionClient.sendMessage(response.getType(), new TextMessage(strMessage));
|
|
|
+ log.info("TX] {}", strMessage);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
try {
|
|
|
String eventName = c2fMessage.getData().getPayload().getEvent_name();
|
|
|
if ("prk_plce_sttus_info".equals(eventName)) {
|
|
|
- C2FMessage<PrkPlceSttusInfo> sttusInfo = this.mapper.readValue(message.getPayload(), new TypeReference<C2FMessage<PrkPlceSttusInfo>>(){});
|
|
|
- log.error("{}", this.mapper.writeValueAsString(sttusInfo));
|
|
|
+ C2FMessage<PrkPlceSttusInfo> sttusInfo = this.mapper.readValue(payloadMessage, new TypeReference<C2FMessage<PrkPlceSttusInfo>>(){});
|
|
|
+ C2FMessage<PrkPlceSttusInfo> sttusTemp = sttusInfo;
|
|
|
+ sttusTemp.getData().getPayload().getPrk_place_image().setPrk_plce_image_data("base64 image data string");
|
|
|
+ log.info("handleTextMessage: RX] prk_plce_sttus_info");
|
|
|
+ log.info("RX] {}", this.mapper.writeValueAsString(sttusTemp));
|
|
|
|
|
|
if (sttusInfo.getData().getPayload().getPrk_place_image() != null) {
|
|
|
int imageType = sttusInfo.getData().getPayload().getPrk_place_image().getPrk_plce_image_type();
|
|
@@ -97,36 +163,28 @@ public class ItsWebSocketHandler extends TextWebSocketHandler {
|
|
|
// String encodedString = Base64.getEncoder().encodeToString(fileContent);
|
|
|
|
|
|
} else if ("prk_plce_opr_info".equals(eventName)) {
|
|
|
- C2FMessage<PrkPlceOprInfo> oprInfo = this.mapper.readValue(message.getPayload(), new TypeReference<C2FMessage<PrkPlceOprInfo>>(){});
|
|
|
- //PrkPlceOprInfo oprInfo = (PrkPlceOprInfo)c2fMessage.getData().getPayload();
|
|
|
- log.error("{}", this.mapper.writeValueAsString(oprInfo));
|
|
|
- } else if ("prk_plce_rl_time_info".equals(eventName)) {
|
|
|
- C2FMessage<PrkPlceRlTimeResponseInfo> rlTimeInfo = this.mapper.readValue(message.getPayload(), new TypeReference<C2FMessage<PrkPlceRlTimeResponseInfo>>(){});
|
|
|
- //PrkPlceRlTimeInfo rlTimeInfo = (PrkPlceRlTimeInfo)c2fMessage.getData().getPayload();
|
|
|
- log.error("{}", this.mapper.writeValueAsString(rlTimeInfo));
|
|
|
+ C2FMessage<PrkPlceOprInfo> oprInfo = this.mapper.readValue(payloadMessage, new TypeReference<C2FMessage<PrkPlceOprInfo>>(){});
|
|
|
+ log.info("handleTextMessage: RX] prk_plce_opr_info");
|
|
|
+ log.info("RX] {}", this.mapper.writeValueAsString(oprInfo));
|
|
|
+ } else if ("prk_plce_rl_time_info".equals(eventName) || "prk_plce_rl_time_info_cycle".equals(eventName)) {
|
|
|
+ C2FMessage<PrkPlceRlTimeResponseInfo> rlTimeInfo = this.mapper.readValue(payloadMessage, new TypeReference<C2FMessage<PrkPlceRlTimeResponseInfo>>(){});
|
|
|
+ log.info("handleTextMessage: RX] prk_plce_rl_time_info");
|
|
|
+ log.info("RX] {}", this.mapper.writeValueAsString(rlTimeInfo));
|
|
|
} else if ("prk_plce_reservation_response_info".equals(eventName)) {
|
|
|
- C2FMessage<PrkPlceReservationResponseInfo> reservationInfo = this.mapper.readValue(message.getPayload(), new TypeReference<C2FMessage<PrkPlceReservationResponseInfo>>(){});
|
|
|
- //PrkPlceReservationResponseInfo reservationInfo = (PrkPlceReservationResponseInfo)c2fMessage.getData().getPayload();
|
|
|
- log.error("{}", this.mapper.writeValueAsString(reservationInfo));
|
|
|
+ C2FMessage<PrkPlceReservationResponseInfo> reservationInfo = this.mapper.readValue(payloadMessage, new TypeReference<C2FMessage<PrkPlceReservationResponseInfo>>(){});
|
|
|
+ log.info("handleTextMessage: RX] prk_plce_reservation_response_info");
|
|
|
+ log.info("RX] {}", this.mapper.writeValueAsString(reservationInfo));
|
|
|
} else if ("prk_plce_vhcl_location_response_info".equals(eventName)) {
|
|
|
- C2FMessage<PrkPlceVhclLocationResponseInfo> locationInfo = this.mapper.readValue(message.getPayload(), new TypeReference<C2FMessage<PrkPlceVhclLocationResponseInfo>>(){});
|
|
|
- //PrkPlceVhclLocationResponseInfo locationInfo = (PrkPlceVhclLocationResponseInfo)c2fMessage.getData().getPayload();
|
|
|
- log.error("{}", this.mapper.writeValueAsString(locationInfo));
|
|
|
+ C2FMessage<PrkPlceVhclLocationResponseInfo> locationInfo = this.mapper.readValue(payloadMessage, new TypeReference<C2FMessage<PrkPlceVhclLocationResponseInfo>>(){});
|
|
|
+ log.info("handleTextMessage: RX] prk_plce_vhcl_location_response_info");
|
|
|
+ log.info("RX] {}", this.mapper.writeValueAsString(locationInfo));
|
|
|
} else {
|
|
|
- log.error("Unknown event name: {}", eventName);
|
|
|
- log.error("Payload: {}", message.getPayload());
|
|
|
+ log.error("handleTextMessage: RX] Unknown event name, {}", eventName);
|
|
|
+ log.error("RX] Payload, {}", payloadMessage);
|
|
|
}
|
|
|
} catch(NullPointerException e) {
|
|
|
- log.error("Payload data null. {}", message.getPayload());
|
|
|
- }
|
|
|
-
|
|
|
- ItsWebSocketSession sessionClient = ItsWebSocketSessionManager.getInstance().getSession(session);
|
|
|
- if (sessionClient == null) {
|
|
|
- log.error("Request session not found: {}", session);
|
|
|
- session.close();
|
|
|
- return;
|
|
|
+ log.error("handleTextMessage: RX] NullPointerException, Payload data null, {}", payloadMessage);
|
|
|
}
|
|
|
- //log.info("Payload: {}", message.getPayload());
|
|
|
}
|
|
|
|
|
|
//클라이언트 연결을 끊었을 때 실행
|
|
@@ -135,6 +193,18 @@ public class ItsWebSocketHandler extends TextWebSocketHandler {
|
|
|
log.info("afterConnectionClosed: " + session.getRemoteAddress() + ", URI: " + session.getUri() + ", UUID: " + session.getId());
|
|
|
ItsWebSocketSessionManager.getInstance().removeSession(session);
|
|
|
super.afterConnectionClosed(session, status);
|
|
|
+ for (Map.Entry<String, TbPisInfr> e : AppRepository.getInstance().getPisNmbrMap().entrySet()) {
|
|
|
+ TbPisInfr pis = e.getValue();
|
|
|
+ pis.channelClosed();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
|
|
|
+ log.error("handleTransportError: {}", exception.getMessage());
|
|
|
+ if (session.isOpen()) {
|
|
|
+ session.close();
|
|
|
+ }
|
|
|
+ super.handleTransportError(session, exception);
|
|
|
+ }
|
|
|
}
|