PisWebSocketHandlerC2F.java 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package com.its.pis.websocket;
  2. import com.fasterxml.jackson.core.JsonProcessingException;
  3. import com.fasterxml.jackson.core.type.TypeReference;
  4. import com.its.app.utils.ItsUtils;
  5. import com.its.pis.entity.TbPisInfr;
  6. import com.its.pis.process.DbmsJobData;
  7. import com.its.pis.process.DbmsJobType;
  8. import com.its.pis.websocket.common.SubscribeIdentifier;
  9. import com.its.pis.websocket.common.SubscribeRequest;
  10. import com.its.pis.websocket.common.SubscribeResponseAccept;
  11. import com.its.pis.websocket.message.c2f.*;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.apache.commons.io.FileUtils;
  14. import org.springframework.stereotype.Controller;
  15. import org.springframework.web.bind.annotation.RequestMapping;
  16. import org.springframework.web.socket.TextMessage;
  17. import org.springframework.web.socket.WebSocketSession;
  18. import java.io.File;
  19. import java.util.Base64;
  20. @Slf4j
  21. @Controller
  22. @RequestMapping(PisWebSocketConfig.WS_C2F_ENDPOINT)
  23. public class PisWebSocketHandlerC2F extends PisWebSocketHandler {
  24. public PisWebSocketHandlerC2F() {
  25. super("C2F");
  26. log.info("PisWebSocketHandlerC2F() START");
  27. }
  28. //클라이언트가 웹소켓 서버로 메시지를 전송했을 때 실행
  29. @Override
  30. protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
  31. String payloadMessage = message.getPayload();
  32. if (payloadMessage == null || payloadMessage.trim().isEmpty()) {
  33. log.error("C2F: Payload data is empty");
  34. return;
  35. }
  36. log.info("C2F: Payload, RX] {}", payloadMessage);
  37. PisWebSocketSession sessionClient = PisWebSocketSessionManager.getInstance().getSession(session);
  38. if (sessionClient == null) {
  39. log.error("C2F: Request session not found, session will be closed {}", session);
  40. session.close();
  41. return;
  42. }
  43. TbPisInfr pis = sessionClient.getObj();
  44. if (pis == null) {
  45. log.error("C2F: PIS object not found, session will be closed {}", session);
  46. session.close();
  47. return;
  48. }
  49. C2FMessage<C2FMessagePayload> c2fMessage = this.mapper.readValue(payloadMessage, new TypeReference<C2FMessage<C2FMessagePayload>>(){});
  50. if (c2fMessage.getCommand() == null) {
  51. log.error("C2F: C2FMessage, {}", c2fMessage);
  52. log.error("C2F: command data not found, session will be closed {}", session);
  53. session.close();
  54. return;
  55. }
  56. if (C2FConstants.subscribe.equals(c2fMessage.getCommand())) {
  57. log.info("C2F: RX] subscribe");
  58. try {
  59. SubscribeRequest subscribe = this.mapper.readValue(payloadMessage, SubscribeRequest.class);
  60. //log.info("C2F: RX] {}", subscribe);
  61. log.info("RX] {}", this.mapper.writeValueAsString(subscribe));
  62. pis.channelLogin(pis.getSession());
  63. updatePisStts(pis, true);
  64. SubscribeResponseAccept response = SubscribeResponseAccept.builder()
  65. .identifier(SubscribeIdentifier.builder()
  66. .channel("ParkingLotChannel").build())
  67. .essntl_info("Not Setting Info")
  68. .type("confirm_subscription")
  69. .build();
  70. String strMessage = this.mapper.writeValueAsString(response);
  71. sessionClient.sendMessage(response.getType(), new TextMessage(strMessage));
  72. log.info("TX] {}", strMessage);
  73. } catch (JsonProcessingException e) {
  74. log.error("TX] Exception: {}", e.getMessage());
  75. session.close();
  76. }
  77. return;
  78. }
  79. try {
  80. String eventName = c2fMessage.getData().getPayload().getEvent_name();
  81. if (C2FConstants.prk_plce_sttus_info.equals(eventName)) {
  82. C2FMessage<PrkPlceSttusInfo> sttusInfo = this.mapper.readValue(payloadMessage, new TypeReference<C2FMessage<PrkPlceSttusInfo>>(){});
  83. C2FMessage<PrkPlceSttusInfo> sttusTemp = sttusInfo;
  84. sttusTemp.getData().getPayload().getPrk_place_image().setPrk_plce_image_data("base64 image data string");
  85. log.info("C2F: RX] prk_plce_sttus_info");
  86. log.info("RX] {}", this.mapper.writeValueAsString(sttusTemp));
  87. if (sttusInfo.getData().getPayload().getPrk_place_image() != null) {
  88. int imageType = sttusInfo.getData().getPayload().getPrk_place_image().getPrk_plce_image_type();
  89. String imageStringData = sttusInfo.getData().getPayload().getPrk_place_image().getPrk_plce_image_data();
  90. byte[] decodedBytes = Base64.getDecoder().decode(imageStringData);
  91. String saveDir = ItsUtils.createUserDir("/images/");
  92. String outputFileName = saveDir + sttusInfo.getData().getPayload().getPrk_plce_manage_no();
  93. switch(imageType) {
  94. case 0: outputFileName += ".bmp"; break;
  95. case 1: outputFileName += ".gif"; break;
  96. case 2: outputFileName += ".jpg"; break;
  97. case 3: outputFileName += ".png"; break;
  98. default: outputFileName += ""; break;
  99. }
  100. FileUtils.writeByteArrayToFile(new File(outputFileName), decodedBytes);
  101. }
  102. // byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
  103. // FileUtils.writeByteArrayToFile(new File(outputFileName), decodedBytes);
  104. // byte[] fileContent = FileUtils.readFileToByteArray(new File(filePath));
  105. // String encodedString = Base64.getEncoder().encodeToString(fileContent);
  106. } else if (C2FConstants.prk_plce_opr_info.equals(eventName)) {
  107. C2FMessage<PrkPlceOprInfo> oprInfo = this.mapper.readValue(payloadMessage, new TypeReference<C2FMessage<PrkPlceOprInfo>>(){});
  108. log.info("C2F: RX] prk_plce_opr_info");
  109. log.info("RX] {}", this.mapper.writeValueAsString(oprInfo));
  110. } else if (C2FConstants.prk_plce_rl_time_info.equals(eventName) || C2FConstants.prk_plce_rl_time_info_cycle.equals(eventName)) {
  111. C2FMessage<PrkPlceRlTimeResponseInfo> rlTimeInfo = this.mapper.readValue(payloadMessage, new TypeReference<C2FMessage<PrkPlceRlTimeResponseInfo>>(){});
  112. pis.setRlTimeInfo(rlTimeInfo);
  113. dbmsJobProcess.add(new DbmsJobData(DbmsJobType.DATA_TYPE_RL_TIME, false, rlTimeInfo, pis));
  114. log.info("C2F: RX] prk_plce_rl_time_info");
  115. log.info("RX] {}", this.mapper.writeValueAsString(rlTimeInfo));
  116. } else if (C2FConstants.prk_plce_reservation_response_info.equals(eventName)) {
  117. C2FMessage<PrkPlceReservationResponseInfo> reservationInfo = this.mapper.readValue(payloadMessage, new TypeReference<C2FMessage<PrkPlceReservationResponseInfo>>(){});
  118. log.info("C2F: RX] prk_plce_reservation_response_info");
  119. log.info("RX] {}", this.mapper.writeValueAsString(reservationInfo));
  120. } else if (C2FConstants.prk_plce_vhcl_location_response_info.equals(eventName)) {
  121. C2FMessage<PrkPlceVhclLocationResponseInfo> locationInfo = this.mapper.readValue(payloadMessage, new TypeReference<C2FMessage<PrkPlceVhclLocationResponseInfo>>(){});
  122. log.info("C2F: RX] prk_plce_vhcl_location_response_info");
  123. log.info("RX] {}", this.mapper.writeValueAsString(locationInfo));
  124. } else {
  125. log.error("C2F: RX] Unknown event name, {}", eventName);
  126. log.error("RX] Payload, {}", payloadMessage);
  127. }
  128. } catch(NullPointerException e) {
  129. log.error("C2F: RX] NullPointerException, Payload data null, {}", payloadMessage);
  130. }
  131. }
  132. }