Ver código fonte

버그수정

pangs 5 anos atrás
pai
commit
29063981c0

+ 4 - 3
src/main/java/com/icontrols/kakao/common/SERVERINFO.java

@@ -20,7 +20,8 @@ public class SERVERINFO {
 	// public static final String SendEventIP = "http://112.220.212.226"; //이통사 상용서버
 	
 	public static final String SendDevEventURL = "http://localhost"; // 중계서버로 변경해야함.
-	public static final String SendKakaoEventURL = "https://teldev.hdc-smart.com"; // 중계서버로 변경해야함.
+	public static final String SendKakaoEventURL = "https://telproxy.hdc-smart.com"; // 중계서버로 변경해야함.
+//	public static final String SendKakaoEventURL = "https://teldev.hdc-smart.com"; // 중계서버로 변경해야함.
 //	public static final String SendKakaoEventURL = "https://kakaohome-api.i.kakao.com"; // 중계서버로 변경해야함.
 	
 	public static String SendEventURL = "https://hdc-smart.com";
@@ -37,8 +38,8 @@ public class SERVERINFO {
 
 	public static boolean GasCount_HardCoding_One = false;
 
-	public static final String KAKAO_HEADER_CLIENT_ID = "XMPHQZVWXI";
-	public static final String KAKAO_HEADER_CLIENT_SECRET = "SCJMXYNDVSNKOPRCRKHS";
+	public static final String KAKAO_HEADER_CLIENT_ID = "MPAHXKWELS";
+	public static final String KAKAO_HEADER_CLIENT_SECRET = "SHDPEOWJSKDZALQXLDNS";
 	
 	public static final String KAKAO_EVENT_CLIENT_ID = "pkevk1F4cKHzs7rN4MHe25wYnUm3kRvh";
 	public static final String KAKAO_EVENT_CLIENT_SECRET = "pF2UrvbhkAqbptG4SyrsUU5pTB1DWtqm";

+ 23 - 23
src/main/java/com/icontrols/kakao/common/THINGS_INFO.java

@@ -23,7 +23,7 @@ public final class THINGS_INFO {
 		LIGHT("light","{\"capabilities\" : [ { \"name\" : \"Power\" } ]}"),
 		LIGHT_DIMMER("dimming","{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"Brightness\" } ]}"),
 		COLOR_LIGHT("colorLight", "{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"ColorMode\"}, { \"name\" : \"ColorTemperature\"} ]}"),
-		COLOR_LIGHT_DIMMER("colorDimming", "{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"Brightness\" }, { \"name\" : \"ColorMode\"}, { \"name\" : \"ColorTemperature\"} ]}"),
+		COLOR_LIGHT_DIMMER("colorDimming", "{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"Brightness\" }, { \"name\" : \"ColorMode\"}, { \"name\" : \"ColorTemperature\", \"attributes\" : { \"colorTemperature\": { \"min\":3000, \"max\":5700 } } } ]}"),
 		TEMPER("temper", "{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"Temperature\" }, { \"name\" : \"TemperatureSetpoint\" } ]}"),
 		VENTIL("ventil","{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"AirFlow\" } ]}"),
 		GAS("gas","{\"capabilities\" : [ { \"name\" : \"Lock\" } ] }"),
@@ -53,33 +53,33 @@ public final class THINGS_INFO {
 	
 	public enum DEVICE_DETAIL{
 		LIVINGLIGHT					("livinglight", 				"Light", 			"거실조명"),
-		LIGHT01						("light01",						"Light",			"방조명"),
-		LIGHT02						("light02",						"Light",			"서재조명"),
-		LIGHT03						("light03",						"Light",			"작은방조명"),
-		LIGHT04						("light04",						"Light",			"방조명"),
+		LIGHT01						("light01",						"Light",			"방조명"),
+		LIGHT02						("light02",						"Light",			"방1조명"),
+		LIGHT03						("light03",						"Light",			"방2조명"),
+		LIGHT04						("light04",						"Light",			"방3조명"),
 		DIMMER_LIVINGLIGHT			("dimmer_livinglight", 			"LightDimmer", 		"거실조명"),
-		DIMMER_LIGHT01				("dimmer_light01",				"LightDimmer",		"방조명"),
-		DIMMER_LIGHT02				("dimmer_light02",				"LightDimmer",		"서재조명"),
-		DIMMER_LIGHT03				("dimmer_light03",				"LightDimmer",		"작은방조명"),
-		DIMMER_LIGHT04				("dimmer_light04",				"LightDimmer",		"방조명"),
+		DIMMER_LIGHT01				("dimmer_light01",				"LightDimmer",		"방조명"),
+		DIMMER_LIGHT02				("dimmer_light02",				"LightDimmer",		"방1조명"),
+		DIMMER_LIGHT03				("dimmer_light03",				"LightDimmer",		"방2조명"),
+		DIMMER_LIGHT04				("dimmer_light04",				"LightDimmer",		"방3조명"),
 		COLOR_DIMMER_LIVINGLIGHT	("colorDimmer_livinglight", 	"ColorLightDimmer",	"거실조명"),
-		COLOR_DIMMER_LIGHT01		("colorDimmer_light01",			"ColorLightDimmer",	"방조명"),
-		COLOR_DIMMER_LIGHT02		("colorDimmer_light02",			"ColorLightDimmer",	"서재조명"),
-		COLOR_DIMMER_LIGHT03		("colorDimmer_light03",			"ColorLightDimmer",	"작은방조명"),
-		COLOR_DIMMER_LIGHT04		("colorDimmer_light04",			"ColorLightDimmer",	"방조명"),
+		COLOR_DIMMER_LIGHT01		("colorDimmer_light01",			"ColorLightDimmer",	"방조명"),
+		COLOR_DIMMER_LIGHT02		("colorDimmer_light02",			"ColorLightDimmer",	"방1조명"),
+		COLOR_DIMMER_LIGHT03		("colorDimmer_light03",			"ColorLightDimmer",	"방2조명"),
+		COLOR_DIMMER_LIGHT04		("colorDimmer_light04",			"ColorLightDimmer",	"방3조명"),
 		VENTIL						("ventil",						"AirVentilator",	"환기"),
 		GAS							("gas",							"GasValve",			"가스밸브"),
-		ELEVATOR					("ElevatorCaller",				"ElevatorCaller",	"엘리베이터"),
+		ELEVATOR					("elevator",					"ElevatorCaller",	"엘리베이터"),
 		TEMPER1						("temper_1",					"FloorHeater",		"거실난방"),
-		TEMPER2						("temper_2",					"FloorHeater",		"방난방"),
-		TEMPER3						("temper_3",					"FloorHeater",		"서재난방"),
-		TEMPER4						("temper_4",					"FloorHeater",		"작은방난방"),
-		TEMPER5						("temper_5",					"FloorHeater",		"방난방"),
+		TEMPER2						("temper_2",					"FloorHeater",		"방난방"),
+		TEMPER3						("temper_3",					"FloorHeater",		"방1난방"),
+		TEMPER4						("temper_4",					"FloorHeater",		"방2난방"),
+		TEMPER5						("temper_5",					"FloorHeater",		"방3난방"),
 		ELECTRIC01					("electric01",					"PowerOutlet",		"거실콘센트"),
-		ELECTRIC02					("electric02",					"PowerOutlet",		"방콘센트"),
-		ELECTRIC03					("electric03",					"PowerOutlet",		"서재콘센트"),
-		ELECTRIC04					("electric04",					"PowerOutlet",		"작은방콘센트"),
-		ELECTRIC05					("electric05",					"PowerOutlet",		"방콘센트")
+		ELECTRIC02					("electric02",					"PowerOutlet",		"방콘센트"),
+		ELECTRIC03					("electric03",					"PowerOutlet",		"방1콘센트"),
+		ELECTRIC04					("electric04",					"PowerOutlet",		"방2콘센트"),
+		ELECTRIC05					("electric05",					"PowerOutlet",		"방3콘센트")
 		;
 		
 		
@@ -138,7 +138,7 @@ public final class THINGS_INFO {
 		PARCEL			(11, "PARCEL", 			"parcel", 				"택배도착"),
 		HEMS			(12, "HEMS", 			"hems", 				"원격검침"),
 		CARIN			(13, "CARIN", 			"carin", 				"주차관제(입차/출차)"),
-		ELEVATOR		(14, "ELEVATORCALLER",	"ElevatorCaller", 		"엘리베이터"),
+		ELEVATOR		(14, "elevator",		"ElevatorCaller", 		"엘리베이터"),
 		VISITOR			(15, "VISITOR", 		"visitor", 				"방문자"),
 		EMERGENCY		(16, "EMERGENCY", 		"emergency", 			"방범"),
 		LIGHTDIMMER		(17, "DIMMER", 	"LightDimmer", 			"디밍제어 조명"),

+ 3 - 3
src/main/java/com/icontrols/kakao/service/impl/AccessTokenServiceImpl.java

@@ -108,7 +108,7 @@ public class AccessTokenServiceImpl implements AccessTokenService {
 			
 			e.printStackTrace();
 		}finally {
-			logger.info("AccessTokenService [CREATE] - " + retMap.toString());
+			logger.info("AccessTokenService [CREATE] - [END] - " + retMap.toString());
 		}
 		
 		return retMap;
@@ -176,7 +176,7 @@ public class AccessTokenServiceImpl implements AccessTokenService {
 			retMap.put("error", errMap);
 			e.printStackTrace();
 		}finally {
-			logger.info("AccessTokenService [REFRESH] - " + retMap.toString());
+			logger.info("AccessTokenService [REFRESH] - [END] - " + retMap.toString());
 		}
 		return retMap;
 	}
@@ -243,7 +243,7 @@ public class AccessTokenServiceImpl implements AccessTokenService {
 			
 			retMap.put("error", errMap);
 		}finally {
-			logger.info("AccessTokenService [GET] - " + retMap.toString());
+			logger.info("AccessTokenService [GET] - [END] - " + retMap.toString());
 		}
 		return retMap;
 	}

+ 3 - 0
src/main/java/com/icontrols/kakao/service/impl/KakaoExtensionServiceImpl.java

@@ -256,12 +256,15 @@ public class KakaoExtensionServiceImpl implements KakaoExtensionService {
 		List<ThingsInfo> thingsInfoList = thingsInfoRepository.findByDongAndHoAndEndpointId(Integer.toString(dong), Integer.toString(ho), endpointId);
 		
 		if(thingsInfoList == null || thingsInfoList.size() == 0) {
+			logger.error("[UPDATE-ERROR] - " + dong + "/" + ho + " - "+ endpointId + " is not exist");
 			retMap = new HashMap<String, Object>();
 			retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_NONEXIST));
 		}else {
 			retMap = kMsgHandler.sendDeviceAction(dong, ho, endpointId, capabilityName, desired);
 		}
+		
 		logger.debug("UPDATE-->>retMap : " + retMap.toString());
+		
 		if(retMap.containsKey(KEY_INFO.HTTP_KEY_ERROR)) {
 			param.remove(KEY_INFO.HTTP_KEY_BODY);
 			param.putAll(retMap);

+ 2 - 1
src/main/java/com/icontrols/kakao/socket/utils/SSLClient.java

@@ -83,7 +83,8 @@ public class SSLClient {
 			logger.info("-->ip address -- " + mInetAddress + " -- " + port);
 			sslSocket = sf.createSocket(mInetAddress, port);
 		} catch (Exception e) {
-			logger.info("[SSLClient] TLS Socket Make Exception Error");
+			logger.error("[SSLClient] TLS Socket Make Exception Error");
+			logger.error("[SSLClient] message : " + e.getMessage());
 			e.printStackTrace();
 		}
 	}

+ 16 - 7
src/main/java/com/icontrols/kakao/socket/wallpad/KakaoEventHandler.java

@@ -13,6 +13,7 @@ import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
@@ -34,6 +35,7 @@ import com.icontrols.kakao.entity.DonghoInfo;
 import com.icontrols.kakao.entity.UserInfo;
 import com.icontrols.kakao.repo.DonghoInfoRepository;
 import com.icontrols.kakao.repo.UserInfoRepository;
+import com.icontrols.kakao.service.AuthService;
 
 @Service("kakaoEventHandler")
 public class KakaoEventHandler {
@@ -48,6 +50,9 @@ public class KakaoEventHandler {
 	@Resource(name="wallpadMsgSender")
 	private WallpadMsgSender wallpadMsgSender;
 	
+	@Autowired
+	private AuthService authService;
+	
 	@Async("eventExecutor")
 	public CompletableFuture<Map<String, Object>> sendEventAsync(UserInfo userInfo, Map<String, Object> params) throws InterruptedException{
 		Map<String, Object> retMap = new HashMap<String, Object>();
@@ -82,7 +87,7 @@ public class KakaoEventHandler {
 			Map<String, Object> sendResult = sendStatusResult(userInfo, params);
 			
 			int code = (int) sendResult.get("result");
-			
+			logger.info("[EVENT RESULT] - ["+code+"]");
 			UserInfoRepository repo = null;
 			switch(code) {
 			case KAKAO_RESULT.FAIL_INTERNAL:
@@ -108,6 +113,7 @@ public class KakaoEventHandler {
 				retMap.put("message", "ID-["+userInfo.getId() + "]-FAIL_UNLINKEXTENSION_SERVICE");
 				
 				// 월패드 해지요청
+				new UnlinkExtensionHandler(userInfo.getDonghoInfo().getDong(), userInfo.getDonghoInfo().getHo()).start();
 				
 				break;
 			case KAKAO_RESULT.FAIL_EXPIREDTOKEN:  // 만료된 토큰, 토큰 재발급 뒤 재시도.
@@ -144,10 +150,9 @@ public class KakaoEventHandler {
 			}
 		}catch(Exception e) {
 			retMap.put("result", KAKAO_RESULT.FAIL_INTERNAL);
-			
-			retMap.put("message", "ID-["+userInfo.getId() + "]-" + e.getMessage());
-			logger.error("ERROR" + e.getStackTrace());
+			logger.error("[ERROR] - " + e.getMessage());
 			e.printStackTrace();
+			retMap.put("message", "event send Error = " + e.getMessage());
 		}
 		
 		return CompletableFuture.completedFuture(retMap);
@@ -255,8 +260,8 @@ public class KakaoEventHandler {
 		HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(parameters, headers);
 		
 		String url = SERVERINFO.isDev?SERVERINFO.SendDevEventURL + ":" + SERVERINFO.SendDevEventPort + "/events/token":SERVERINFO.SendKakaoEventURL + ":" + SERVERINFO.SendKakaoEventPort +"/events/token";
-//		String url = "https://kakaohome-api.i.kakao.com/events/token";
 		
+//		String url = "https://kakaohome-api.i.kakao.com/events/token";
 		logger.debug("[TOKEN REFRESH REQUEST] URL : " + url);
 		logger.debug("[TOKEN REFRESH REQUEST] header : " + headers.toString());
 		logger.debug("[TOKEN REFRESH REQUEST] return value : " + entity.toString());
@@ -293,9 +298,13 @@ public class KakaoEventHandler {
 				return userInfo;
 			}
 		}catch(Exception e) {
-			logger.error("[TOKEN REFRESH REQUEST ERROR] - " + e.getMessage());
 			
-			e.printStackTrace();
+			if( e != null) {
+				logger.error("[TOKEN REFRESH REQUEST ERROR] - " + e.getMessage());
+			
+				e.printStackTrace();
+			}else
+				logger.error("Token REFRESH REQUEST ERROR]");
 		}
 		
 		logger.error("****************************************************");

+ 41 - 10
src/main/java/com/icontrols/kakao/socket/wallpad/KakaoMsgHandler.java

@@ -275,7 +275,14 @@ public class KakaoMsgHandler {
 									String childName = j < 10 ? tmpModelId+"0"+j : tmpModelId+j;
 									Node childNode = (Node)xpath.evaluate("//imap/service/devinfo/*[@name='"+ childName +"']", doc, XPathConstants.NODE);
 									logger.debug("childName = " + childName);
-									childCount = Integer.parseInt(XmlUtil.getAttributeWithItem(childNode, "value"));
+									
+									if(childNode == null) break;
+									
+									String tmpValue = XmlUtil.getAttributeWithItem(childNode, "value");
+									
+									if(tmpValue == null) break;
+									
+									childCount = Integer.parseInt(tmpValue);
 									
 									NodeList childList = (NodeList)xpath.evaluate("//imap/service/devinfo/subdevinfo/*[@name='"+ childName +"']", doc, XPathConstants.NODESET);
 									
@@ -306,8 +313,8 @@ public class KakaoMsgHandler {
 			
 			eleMap.put("displayType", THINGS_INFO.THINGS.ELEVATOR.getKakaoDisplayName());
 			eleMap.putAll(getDeviceCapabilities(THINGS_INFO.THINGS.ELEVATOR.getThingsName(), null));
-			eleMap.put("endpointId", "elevator");
-			eleMap.put("name", THINGS_INFO.THINGS.ELEVATOR.getKakaoDisplayName());
+			eleMap.put("endpointId", THINGS_INFO.DEVICE_DETAIL.ELEVATOR.getModelId());
+			eleMap.put("name", THINGS_INFO.THINGS.ELEVATOR.getDesc());
 			eleMap.put("state", new HashMap<String, Object>());
 			
 			body.put("elevator", eleMap);
@@ -388,7 +395,11 @@ public class KakaoMsgHandler {
 		String[] tmpSplit = endpointId.split("_");
 		String modelId = (tmpSplit[0].equals("dimmer") || tmpSplit[0].equals("colorDimmer"))?tmpSplit[1]:tmpSplit[0];
 		
-		if(tmpSplit.length == 1 && !modelId.equals(THINGS_INFO.THINGS.ELEVATOR.getKakaoDisplayName())) {
+		//엘리베이터 특정. -> 엘리베이터는 tmpSplit length가 1이다.
+		// 모드 endpoint id는 _ <- 언더바가 포함돼 있지만 엘리베이터는 그렇지 않음
+		// 엘리베이터가 아닌데도 tmpSplit length가 1인경우는 존재하지 않는 디바이스로 간주.
+		if(tmpSplit.length == 1 && !modelId.equals(THINGS_INFO.DEVICE_DETAIL.ELEVATOR.getModelId())) {
+			logger.error("[sendDeviceAction ERROR] - this is NonExist => " + modelId);
 			retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_NONEXIST));
 			return retMap;
 		}
@@ -396,7 +407,7 @@ public class KakaoMsgHandler {
 		int devNum = 1;
 		
 		if(tmpSplit[0].equals("dimmer") || tmpSplit[0].equals("colorDimmer")) devNum = Integer.parseInt(tmpSplit[2]);
-		else if(modelId.equals(THINGS_INFO.THINGS.ELEVATOR.getKakaoDisplayName())) devNum = 1;
+		else if(modelId.equals(THINGS_INFO.DEVICE_DETAIL.ELEVATOR.getModelId())) devNum = 1;
 		else devNum = Integer.parseInt(tmpSplit[1]);
 		THINGS_INFO.THINGS things = THINGS_INFO.getThingsType(endpointId);
 		
@@ -736,7 +747,7 @@ public class KakaoMsgHandler {
 		logger.debug("ACTION STATUS --> " + desired.toString());
 		try {
 			int brightness = 1;
-			int colorTemer = 1;
+			int colorTemper = 1;
 			switch(things.getEndPoint()) {
 				
 			case THINGS_INFO.THINGS_LIGHT:
@@ -775,19 +786,39 @@ public class KakaoMsgHandler {
 				
 				if(desired.containsKey("brightness")) {
 					brightness = ((int)desired.get("brightness"))/10 == 0 ? 1: ((int)desired.get("brightness"))/10;
-					sb.append("/").append(brightness);
+					if(desired.containsKey("power"))
+						sb.append("/").append(brightness);
+					else
+						sb.append("on/").append(brightness);
 				}else {
 					sb.append("/null");
 				}
 				
 				
 				if(desired.containsKey("colorTemperature")) {
-					colorTemer = ((int)desired.get("colorTemperature"))/1000 == 0 ? 1:((int)desired.get("colorTemperature"))/1000;
-					sb.append("/").append(colorTemer);
+//					colorTemper = ((int)desired.get("colorTemperature"))/1000 == 0 ? 1:((int)desired.get("colorTemperature"))/1000;
+					int tmpColorTemp = (int)desired.get("colorTemperature");
+					
+					if(tmpColorTemp < 3000) tmpColorTemp = 3000;
+					else if(tmpColorTemp > 5700) tmpColorTemp = 5700;
+					
+					colorTemper = (tmpColorTemp)/300 - 9;
+					if(desired.containsKey("power"))
+						sb.append("/").append(colorTemper);
+					else {
+						if(desired.containsKey("brightness")) {
+							sb.append("/").append(colorTemper);	
+						}else {
+							sb = new StringBuffer();
+							sb.append("on/null/").append(colorTemper);
+						}
+						
+					}
 				}else {
 					sb.append("/null");
 				}
 				
+				
 				break;
 				
 			case THINGS_INFO.THINGS_TEMPER:
@@ -888,7 +919,7 @@ public class KakaoMsgHandler {
 			}
 			
 			if(splitStr[2] != null && !splitStr[2].equals("null")) {
-				temp2 = (Integer.parseInt(splitStr[2])*1000);
+				temp2 = ((Integer.parseInt(splitStr[2])+9)*300);
 				state.put("colorMode", "colorTemperature");
 				state.put("colorTemperature", temp2);
 			}

+ 10 - 4
src/main/java/com/icontrols/kakao/socket/wallpad/ThreadServerHandler.java

@@ -223,8 +223,8 @@ public class ThreadServerHandler extends Thread {
 				logger.debug(service.getAttributes().getNamedItem("type").getTextContent());
 
 				model_id = (String) xpath.evaluate("//imap/service/model_id ", doc, XPathConstants.STRING);
-				dev_num = Integer.parseInt((String) xpath.evaluate("//imap/service/dev_num", doc, XPathConstants.STRING));
 				status = (String) xpath.evaluate("//imap/service/status", doc, XPathConstants.STRING);
+				dev_num = status.equalsIgnoreCase("unsubscription")?1:Integer.parseInt((String) xpath.evaluate("//imap/service/dev_num", doc, XPathConstants.STRING));
 				
 				logger.debug("[DeviceEventMsgHandler] - model_id : " + model_id);
 				logger.debug("[DeviceEventMsgHandler] - dev_num  : " + dev_num);
@@ -241,6 +241,12 @@ public class ThreadServerHandler extends Thread {
 					//dong ho 가  같은 유저 모두 조회
 					
 					List<DonghoInfo> dList = repo.findByDongAndHo(dong, ho);
+					
+					if(dList.size() == 0) {
+						logger.info("[EVENT] - 해동 동 호 인원 없음 프로세스 종료");
+						
+						return;
+					}
 					KakaoEventHandler kakaoEventHandler = (KakaoEventHandler)BeanUtils.getBean("kakaoEventHandler");
 					
 					List<CompletableFuture<Map<String, Object>>> fList = new ArrayList<>();
@@ -248,22 +254,22 @@ public class ThreadServerHandler extends Thread {
 					
 					Map<String, Object> state = KakaoMsgHandler.setDeviceState(endpointId, status);
 					
-					logger.info(userSet.toString());
 					userSet.stream()
 						.filter(userInfo -> userInfo.getDeleteFlag().equals("N"))
 						.forEach(userInfo -> {
 						try {
 							UserInfoRepository uRepo = (UserInfoRepository)BeanUtils.getBean("userInfoRepository");
 							Map<String, Object> sendMap = null;
-							
 							if(status.equalsIgnoreCase("unsubscription")) {
 								// 구독해지 처리.
 								userInfo.setDeleteFlag("Y");
 								userInfo.setDeleteType("unsubscription");
 								uRepo.save(userInfo);
-								
+								logger.info("[해지처리]-["+userInfo.getDonghoInfo().getDonghoId()+"]-[userID = " + userInfo.getId()+"]");
 								// 삭제 이벤트 전송해야...
 								sendMap = kakaoMsgHandler.setKDeleteIdsMsg(dong, ho, userInfo);
+								logger.info("[UNSUBSCRIPTION] - [sendMap] - " + sendMap.toString());
+								
 							}else {
 								if(state.containsKey("colorTemperature") && state.containsKey("brightness")) {
 									body.put("colorDimmer_"+endpointId, state);

+ 72 - 0
src/main/java/com/icontrols/kakao/socket/wallpad/UnlinkExtensionHandler.java

@@ -0,0 +1,72 @@
+package com.icontrols.kakao.socket.wallpad;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.icontrols.kakao.common.utils.BeanUtils;
+import com.icontrols.kakao.entity.DonghoInfo;
+import com.icontrols.kakao.entity.UserInfo;
+import com.icontrols.kakao.repo.DonghoInfoRepository;
+import com.icontrols.kakao.service.AuthService;
+
+public class UnlinkExtensionHandler extends Thread{
+	private static final Logger logger = LoggerFactory.getLogger(UnlinkExtensionHandler.class);
+	private String dong;
+	private String ho;
+	
+	Map<String, Object> subsMap = null;
+	
+	AuthService authService;
+	
+	public UnlinkExtensionHandler(String dong, String ho) {
+		this.dong = dong;
+		this.ho = ho;
+		
+		this.subsMap = new HashMap<String, Object>();
+		this.subsMap.put("type", "unsubs");
+		this.subsMap.put("dong", dong);
+		this.subsMap.put("ho", ho);
+		this.subsMap.put("devNum", "1");
+		this.subsMap.put("company", "kakao");
+		
+	}
+	
+	public void run() {
+		try {
+			logger.info("[UnlinkExtensionHandler] - [START]");
+			DonghoInfoRepository dRepo = (DonghoInfoRepository)BeanUtils.getBean("donghoInfoRepository");
+			List<DonghoInfo> dList = dRepo.findByDongAndHo(this.dong, this.ho);
+			
+			// 해당 동호가 검색되지 않으면 프로세스 종료..
+			if(dList.size() == 0) return;
+			
+			DonghoInfo dInfo = dList.get(0);
+			
+			List<UserInfo> uList = dInfo.getUserInfos();
+			
+			int linkedUserCnt = 0;
+			for(UserInfo userInfo:uList) {
+				if(userInfo.getDeleteFlag().equalsIgnoreCase("N")) linkedUserCnt++;
+			}
+
+			// 아직 해지하지 않은 사용자가 있으면 구독 해지를 날리면 안된다.
+			if(linkedUserCnt > 0) return;
+			
+			
+			// 해당 동호수에 인원이 없을 경우 월패드 구독 해지를 진행해야 한다.
+			authService = (AuthService)BeanUtils.getBean("authServiceImpl");
+			Map<String, Object> retMap = authService.subscriptionProcess(subsMap);
+			
+			logger.info("[해지결과] - [" + dong + "]-[" + ho +"]" + retMap.toString());
+		}catch(Exception e) {
+			logger.error("[UnlinkExtensionHandler] - [ERROR] - " + e.getMessage());
+			e.printStackTrace();
+		}finally {
+			logger.info("[UnlinkExtensionHandler] - [END]");
+		}
+	}
+}

+ 2 - 2
src/main/resources/application.properties

@@ -7,11 +7,11 @@ logging.config=classpath:logback-spring.xml
 
 ## 배포용-테스트 단지서버
 #spring.datasource.url=jdbc:mariadb://192.168.100.155:8005/platform_danzi?useUnicode=true&charaterEncoding=utf-8
-#spring.datasource.url=jdbc:mariadb://192.168.100.155:8005/platform_kakao?useUnicode=true&charaterEncoding=utf-8
+spring.datasource.url=jdbc:mariadb://192.168.100.155:8005/platform_kakao?useUnicode=true&charaterEncoding=utf-8
 
 ## 배포용-카카오데모서버
 ##spring.datasource.url=jdbc:mariadb://localhost:8005/platform_danzi?useUnicode=true&charaterEncoding=utf-8 
-spring.datasource.url=jdbc:mariadb://localhost:8005/platform_kakao?useUnicode=true&charaterEncoding=utf-8
+#spring.datasource.url=jdbc:mariadb://localhost:8005/platform_kakao?useUnicode=true&charaterEncoding=utf-8
 spring.datasource.username=valley
 spring.datasource.password=valley123
 

+ 1 - 1
src/main/resources/logback-spring.xml

@@ -20,7 +20,7 @@
         </encoder>
     </appender>
                                                                                                                            
-    <logger name="com.icontrols.kakao" level="INFO"></logger>
+    <logger name="com.icontrols.kakao" level="DEBUG"></logger>
 
     <root level="INFO">
         <appender-ref ref="dailyRollingFileAppender" />