Explorar o código

(데모버전)

pangs %!s(int64=5) %!d(string=hai) anos
pai
achega
d74b452745

+ 19 - 17
src/main/java/com/icontrols/kakao/common/KAKAO_RESULT.java

@@ -4,27 +4,29 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Map;
 
 
 public class KAKAO_RESULT {
 public class KAKAO_RESULT {
-	public static final int SUCCESS 			= 200, 
-							FAIL_INTERNAL 		= -200,
-							FAIL_EXPIREDTOKEN 	= -201,
-							FAIL_UNREACHABLE	= -202,
-							FAIL_NONEXIST		= -203,
-							FAIL_THING_INTERNAL	= -204,
-							FAIL_INVALID_REQ	= -205,
-							FAIL_INVALID_TOKEN	= -206,
-							FAIL_INVALID_CLIENT	= -207;
+	public static final int SUCCESS 						= 200, 
+							FAIL_INTERNAL 					= -200,
+							FAIL_EXPIREDTOKEN 				= -201,
+							FAIL_UNREACHABLE				= -202,
+							FAIL_NONEXIST					= -203,
+							FAIL_THING_INTERNAL				= -204,
+							FAIL_INVALID_REQ				= -205,
+							FAIL_INVALID_TOKEN				= -206,
+							FAIL_INVALID_CLIENT				= -207,
+							FAIL_UNLINKEXTENSION_SERVICE 	= -208;
 	
 	
 	public enum CODE {
 	public enum CODE {
 		SUCCESS(200, "정상동작", "Success"),
 		SUCCESS(200, "정상동작", "Success"),
 		
 		
-		FAIL_INTERNAL		(-200, "InternalServerError", 	"내부 서버 에러"),
-		FAIL_EXPIREDTOKEN	(-201, "ExpiredAccessToken", 	"인증토큰 만료"),
-		FAIL_UNREACHABLE	(-202, "ThingUnreachable", 		"Things 연결 실패"),
-		FAIL_NONEXIST		(-203, "ThingNonexistent", 		"정의되지않은 기기 Endpoint"),
-		FAIL_THING_INTERNAL	(-204, "ThingInternalError", 	"기기에서 처리할 수 없는 요청" ),
-		FAIL_INVALID_REQ	(-205, "InvalidRequest", 		"올바르지 않은 요청메세지"),
-		FAIL_INVALID_TOKEN	(-206, "InvalidAccessToken", 	"유효하지 않은 인증토큰"),
-		FAIL_INVALID_CLIENT	(-207, "InvalidClient", 		"Client 인증 실패");
+		FAIL_INTERNAL				(-200, "InternalServerError", 	"내부 서버 에러"),
+		FAIL_EXPIREDTOKEN			(-201, "ExpiredAccessToken", 	"인증토큰 만료"),
+		FAIL_UNREACHABLE			(-202, "ThingUnreachable", 		"Things 연결 실패"),
+		FAIL_NONEXIST				(-203, "ThingNonexistent", 		"정의되지않은 기기 Endpoint"),
+		FAIL_THING_INTERNAL			(-204, "ThingInternalError", 	"기기에서 처리할 수 없는 요청" ),
+		FAIL_INVALID_REQ			(-205, "InvalidRequest", 		"올바르지 않은 요청메세지"),
+		FAIL_INVALID_TOKEN			(-206, "InvalidAccessToken", 	"유효하지 않은 인증토큰"),
+		FAIL_INVALID_CLIENT			(-207, "InvalidClient", 		"Client 인증 실패"),
+		FAIL_UNLINKEXTENSION_SERVICE(-208, "UnlinkExtensionService","Client 인증 실패");
 		
 		
 		private int resultCode;
 		private int resultCode;
 		private String message;
 		private String message;

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

@@ -2,12 +2,16 @@ package com.icontrols.kakao.common;
 
 
 import java.util.Arrays;
 import java.util.Arrays;
 
 
+import org.slf4j.LoggerFactory;
+
 import com.icontrols.kakao.common.utils.BeanUtils;
 import com.icontrols.kakao.common.utils.BeanUtils;
 import com.icontrols.kakao.repo.ThingsInfoRepository;
 import com.icontrols.kakao.repo.ThingsInfoRepository;
+import com.icontrols.kakao.socket.wallpad.KakaoMsgHandler;
 
 
 import ch.qos.logback.classic.Logger;
 import ch.qos.logback.classic.Logger;
 
 
 public final class THINGS_INFO {
 public final class THINGS_INFO {
+	
 	public static final int THINGS_LIGHT 		= 1,  THINGS_TEMPER  	= 2,  THINGS_ELECPLUG 	= 3,  THINGS_GAS 		= 4,
 	public static final int THINGS_LIGHT 		= 1,  THINGS_TEMPER  	= 2,  THINGS_ELECPLUG 	= 3,  THINGS_GAS 		= 4,
 							THINGS_ILGALSWITCH 	= 5,  THINGS_WALLPAD  	= 6,  THINGS_VENTIL 	= 7,  THINGS_NOTICE 	= 8,
 							THINGS_ILGALSWITCH 	= 5,  THINGS_WALLPAD  	= 6,  THINGS_VENTIL 	= 7,  THINGS_NOTICE 	= 8,
 							THINGS_VOTE			= 9,  THINGS_PARKING  	= 10, THINGS_PARCEL 	= 11, THINGS_HEMS 		= 12,
 							THINGS_VOTE			= 9,  THINGS_PARKING  	= 10, THINGS_PARCEL 	= 11, THINGS_HEMS 		= 12,
@@ -23,7 +27,8 @@ public final class THINGS_INFO {
 		TEMPER("temper", "{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"Temperature\" }, { \"name\" : \"TemperatureSetpoint\" } ]}"),
 		TEMPER("temper", "{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"Temperature\" }, { \"name\" : \"TemperatureSetpoint\" } ]}"),
 		VENTIL("ventil","{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"AirFlow\" } ]}"),
 		VENTIL("ventil","{\"capabilities\" : [ { \"name\" : \"Power\" }, { \"name\" : \"AirFlow\" } ]}"),
 		GAS("gas","{\"capabilities\" : [ { \"name\" : \"Lock\" } ] }"),
 		GAS("gas","{\"capabilities\" : [ { \"name\" : \"Lock\" } ] }"),
-		ELEVATOR("elevator", "{\"capabilities\" : [ { \"name\" : \"ElevatorCall\" } ] }");
+		ELEVATOR("elevator", "{\"capabilities\" : [ { \"name\" : \"ElevatorCall\" } ] }"),
+		ELECTRIC("electric", "{\"capabilities\" : [ { \"name\" : \"Power\" } ]}");
 		
 		
 		private String thingsName;
 		private String thingsName;
 		private String capJsonStr;
 		private String capJsonStr;
@@ -69,7 +74,12 @@ public final class THINGS_INFO {
 		TEMPER2						("temper_2",					"FloorHeater",		"안방난방"),
 		TEMPER2						("temper_2",					"FloorHeater",		"안방난방"),
 		TEMPER3						("temper_3",					"FloorHeater",		"서재난방"),
 		TEMPER3						("temper_3",					"FloorHeater",		"서재난방"),
 		TEMPER4						("temper_4",					"FloorHeater",		"작은방난방"),
 		TEMPER4						("temper_4",					"FloorHeater",		"작은방난방"),
-		TEMPER5						("temper_5",					"FloorHeater",		"주방난방")
+		TEMPER5						("temper_5",					"FloorHeater",		"주방난방"),
+		ELECTRIC01					("electric01",					"PowerOutlet",		"거실콘센트"),
+		ELECTRIC02					("electric02",					"PowerOutlet",		"안방콘센트"),
+		ELECTRIC03					("electric03",					"PowerOutlet",		"서재콘센트"),
+		ELECTRIC04					("electric04",					"PowerOutlet",		"작은방콘센트"),
+		ELECTRIC05					("electric05",					"PowerOutlet",		"주방콘센트")
 		;
 		;
 		
 		
 		
 		
@@ -128,7 +138,7 @@ public final class THINGS_INFO {
 		PARCEL			(11, "PARCEL", 			"parcel", 				"택배도착"),
 		PARCEL			(11, "PARCEL", 			"parcel", 				"택배도착"),
 		HEMS			(12, "HEMS", 			"hems", 				"원격검침"),
 		HEMS			(12, "HEMS", 			"hems", 				"원격검침"),
 		CARIN			(13, "CARIN", 			"carin", 				"주차관제(입차/출차)"),
 		CARIN			(13, "CARIN", 			"carin", 				"주차관제(입차/출차)"),
-		ELEVATOR		(14, "ELEVATOR", 		"ElevatorCaller", 		"엘리베이터"),
+		ELEVATOR		(14, "ELEVATORCALLER",	"ElevatorCaller", 		"엘리베이터"),
 		VISITOR			(15, "VISITOR", 		"visitor", 				"방문자"),
 		VISITOR			(15, "VISITOR", 		"visitor", 				"방문자"),
 		EMERGENCY		(16, "EMERGENCY", 		"emergency", 			"방범"),
 		EMERGENCY		(16, "EMERGENCY", 		"emergency", 			"방범"),
 		LIGHTDIMMER		(17, "DIMMER", 	"LightDimmer", 			"디밍제어 조명"),
 		LIGHTDIMMER		(17, "DIMMER", 	"LightDimmer", 			"디밍제어 조명"),
@@ -207,16 +217,17 @@ public final class THINGS_INFO {
 //			if(modelId.toLowerCase().contains(things.getThingsName().toLowerCase())) {
 //			if(modelId.toLowerCase().contains(things.getThingsName().toLowerCase())) {
 //				return things;
 //				return things;
 //			}
 //			}
-			if(splitModelId[0].equalsIgnoreCase(things.getThingsName())) {
+			if(splitModelId[0].equalsIgnoreCase(things.getThingsName()) || splitModelId[0].contains(things.getThingsName().toLowerCase())) {
 				System.out.println(splitModelId[0] + "--" + things.getThingsName());
 				System.out.println(splitModelId[0] + "--" + things.getThingsName());
 				return things;
 				return things;
 			}
 			}
 		}
 		}
+		System.out.println("[ERROR] - " + modelId + " --> NULL");
 		return null;
 		return null;
 	}
 	}
 	
 	
 	public static boolean isAvailableThings(String modelId) {
 	public static boolean isAvailableThings(String modelId) {
-		return Arrays.asList("livinglight", "light", "temper", "ventil", "gas").contains(modelId);
+		return Arrays.asList("livinglight", "light", "temper", "ventil", "gas", "electric").contains(modelId);
 	}
 	}
 	
 	
 }
 }

+ 2 - 1
src/main/java/com/icontrols/kakao/common/utils/UtilLib.java

@@ -10,6 +10,7 @@ import org.slf4j.LoggerFactory;
 
 
 import com.icontrols.kakao.controller.MainController;
 import com.icontrols.kakao.controller.MainController;
 
 
+
 public class UtilLib {
 public class UtilLib {
 	private static final Logger logger = LoggerFactory.getLogger(MainController.class);
 	private static final Logger logger = LoggerFactory.getLogger(MainController.class);
 
 
@@ -22,7 +23,7 @@ public class UtilLib {
 		String deviceID = dong + "_" + ho + "_" + modelId + "_" + roomNum + "_" + cirNum;
 		String deviceID = dong + "_" + ho + "_" + modelId + "_" + roomNum + "_" + cirNum;
 		AES256Util aes = new AES256Util();
 		AES256Util aes = new AES256Util();
 		String enc = aes.encrypt(deviceID);
 		String enc = aes.encrypt(deviceID);
-		logger.info(enc);
+//		logger.info(enc);
 		String random = UUID.randomUUID().toString().substring(0, 3);
 		String random = UUID.randomUUID().toString().substring(0, 3);
 		result = random + enc;
 		result = random + enc;
 
 

+ 2 - 2
src/main/java/com/icontrols/kakao/config/DanziFilter.java

@@ -21,11 +21,11 @@ public class DanziFilter implements Filter{
 	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
 	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
 			throws IOException, ServletException {
 			throws IOException, ServletException {
 		
 		
-		logger.info("[Request Access]");
+//		logger.info("[Request Access]");
 		
 		
 		HttpServletResponse res = (HttpServletResponse) response;
 		HttpServletResponse res = (HttpServletResponse) response;
 		
 		
-		logger.debug("[Request Header Names] - " + res.getHeaderNames().toString());
+//		logger.debug("[Request Header Names] - " + res.getHeaderNames().toString());
 		chain.doFilter(request, response);
 		chain.doFilter(request, response);
 	}
 	}
 
 

+ 3 - 3
src/main/java/com/icontrols/kakao/config/DanziTokenInterceptor.java

@@ -17,9 +17,9 @@ public class DanziTokenInterceptor implements HandlerInterceptor {
 	@Override
 	@Override
 	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
 	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
 			throws Exception {
 			throws Exception {
-		logger.info("***");
-		logger.info("[Interceptor preHandle] - " + request.getHeader(HEADER_AUTH));
-		
+//		logger.info("***");
+//		logger.info("[Interceptor preHandle] - " + request.getHeader(HEADER_AUTH));
+//		
 		
 		
 		return HandlerInterceptor.super.preHandle(request, response, handler);
 		return HandlerInterceptor.super.preHandle(request, response, handler);
 	}
 	}

+ 32 - 25
src/main/java/com/icontrols/kakao/controller/AuthController.java

@@ -39,30 +39,37 @@ public class AuthController {
 	@RequestMapping(value = "/kakao/test", method = RequestMethod.POST, consumes = "application/json")
 	@RequestMapping(value = "/kakao/test", method = RequestMethod.POST, consumes = "application/json")
 	public @ResponseBody Map<String, Object> test(@RequestBody Map<String, Object> body) throws Exception {
 	public @ResponseBody Map<String, Object> test(@RequestBody Map<String, Object> body) throws Exception {
 		
 		
-		ThingsInfo[] list = {new ThingsInfo("temper_5", "temper" , "802", "1103"),
-		 new ThingsInfo("light02_4", "light02" , "802", "1103"),
-		 new ThingsInfo("light03_3", "light03" , "802", "1103"),
-		 new ThingsInfo("temper_4", "temper" , "802", "1103"),    
-		 new ThingsInfo("light01_4", "light01" , "802", "1103"),        
-		 new ThingsInfo("light02_3", "light02" , "802", "1103"),        
-		 new ThingsInfo("light03_2", "light03" , "802", "1103"),        
-		 new ThingsInfo("temper_3", "temper" , "802", "1103"),        
-		 new ThingsInfo("ventil_1", "ventil" , "802", "1103"),   
-		 new ThingsInfo("temper_2", "temper" , "802", "1103"),   
-		 new ThingsInfo("temper_1", "temper" , "802", "1103"),   
-		 new ThingsInfo("light01_1", "light01" , "802", "1103"),   
-		 new ThingsInfo("light01_3", "light01" , "802", "1103"),   
-		 new ThingsInfo("light02_2", "light02" , "802", "1103"),   
-		 new ThingsInfo("light03_1", "light03" , "802", "1103"),   
-		 new ThingsInfo("livinglight_1", "livinglight" , "802", "1103"),       
-		 new ThingsInfo("light01_2", "light01" , "802", "1103"),       
-		 new ThingsInfo("light02_1", "light02" , "802", "1103"),       
-		 new ThingsInfo("gas_1", "gas" , "802", "1103"),       
-		 new ThingsInfo("livinglight_2", "livinglight" , "802", "1103"),       
-		 new ThingsInfo("livinglight_3", "livinglight" , "802", "1103"),       
-		 new ThingsInfo("livinglight_4", "livinglight" , "802", "1103"),       
-		 new ThingsInfo("livinglight_5", "livinglight" , "802", "1103"),
-		 new ThingsInfo("ElevatorCaller", "elevator" , "802", "1103")};
+		ThingsInfo[] list = {
+				new ThingsInfo("temper_5", "temper" , "802", "2504"),
+		 new ThingsInfo("light02_4", "light02" , "802", "2504"),
+		 new ThingsInfo("light03_3", "light03" , "802", "2504"),
+		 new ThingsInfo("temper_4", "temper" , "802", "2504"),    
+		 new ThingsInfo("light01_4", "light01" , "802", "2504"),        
+		 new ThingsInfo("light02_3", "light02" , "802", "2504"),        
+		 new ThingsInfo("light03_2", "light03" , "802", "2504"),        
+		 new ThingsInfo("temper_3", "temper" , "802", "2504"),        
+		 new ThingsInfo("ventil_1", "ventil" , "802", "2504"),   
+		 new ThingsInfo("temper_2", "temper" , "802", "2504"),   
+		 new ThingsInfo("temper_1", "temper" , "802", "2504"),   
+		 new ThingsInfo("light01_1", "light01" , "802", "2504"),   
+		 new ThingsInfo("light01_3", "light01" , "802", "2504"),   
+		 new ThingsInfo("light02_2", "light02" , "802", "2504"),   
+		 new ThingsInfo("light03_1", "light03" , "802", "2504"),   
+		 new ThingsInfo("colorDimming_livinglight_5", "livinglight" , "802", "2504"),       
+		 new ThingsInfo("light01_2", "light01" , "802", "2504"),       
+		 new ThingsInfo("light02_1", "light02" , "802", "2504"),       
+		 new ThingsInfo("gas_1", "gas" , "802", "2504"),      
+		 new ThingsInfo("colorDimming_livinglight_1", "livinglight" , "802", "2504"),       
+		 new ThingsInfo("colorDimming_livinglight_2", "livinglight" , "802", "2504"),       
+		 new ThingsInfo("colorDimming_livinglight_3", "livinglight" , "802", "2504"),       
+		 new ThingsInfo("colorDimming_livinglight_4", "livinglight" , "802", "2504"),
+		 new ThingsInfo("ElevatorCaller", "elevator" , "802", "2504"),
+		 new ThingsInfo("electric01", "electric" , "802", "2504"),       
+		 new ThingsInfo("electric02", "electric" , "802", "2504"),       
+		 new ThingsInfo("electric03", "electric" , "802", "2504"),       
+		 new ThingsInfo("electric04", "electric" , "802", "2504"),
+		 new ThingsInfo("electric05", "electric" , "802", "2504")
+		 };
 		
 		
 		
 		
 		for(ThingsInfo info:list) {
 		for(ThingsInfo info:list) {
@@ -70,7 +77,7 @@ public class AuthController {
 		}
 		}
 		
 		
 		
 		
-		logger.info("kakao test --<>>>>>");
+		logger.info("kakao test --<>>>>> --> " + thingsRepo.count());
 		Map<String, Object> retMap = new HashMap<String, Object>();
 		Map<String, Object> retMap = new HashMap<String, Object>();
 		
 		
 		
 		

+ 14 - 14
src/main/java/com/icontrols/kakao/controller/KakaoDanziController.java

@@ -49,20 +49,20 @@ public class KakaoDanziController {
 														HttpServletResponse response, 
 														HttpServletResponse response, 
 														HttpServletRequest request
 														HttpServletRequest request
 														) throws Exception{
 														) throws Exception{
-		try {
-			String requestId = (String)params.get("id");
-			String requestType = (String) params.get("type");
-			String authorization = (String) params.get("authorization");
-			String body = params.containsKey("body")?params.get("body").toString():"";
-			
-			if(body.length() > 255) body = body.substring(0, 255);
-			
-			AccessLog log = new AccessLog(requestId, authorization, requestType, body);
-			accessLogRepository.save(log);
-		}catch(Exception e) {
-			logger.error("log 저장 실패 " + e.getMessage());
-			e.printStackTrace();
-		}
+//		try {
+//			String requestId = (String)params.get("id");
+//			String requestType = (String) params.get("type");
+//			String authorization = (String) params.get("authorization");
+//			String body = params.containsKey("body")?params.get("body").toString():"";
+//			
+//			if(body.length() > 255) body = body.substring(0, 255);
+//			
+//			AccessLog log = new AccessLog(requestId, authorization, requestType, body);
+//			accessLogRepository.save(log);
+//		}catch(Exception e) {
+//			logger.error("log 저장 실패 " + e.getMessage());
+//			e.printStackTrace();
+//		}
 		
 		
 		logger.debug("[REQUEST] - "+ params.toString());
 		logger.debug("[REQUEST] - "+ params.toString());
 		
 		

+ 1 - 0
src/main/java/com/icontrols/kakao/repo/DonghoInfoRepository.java

@@ -7,6 +7,7 @@ import org.springframework.data.repository.CrudRepository;
 import com.icontrols.kakao.entity.DonghoInfo;
 import com.icontrols.kakao.entity.DonghoInfo;
 
 
 public interface DonghoInfoRepository extends CrudRepository<DonghoInfo, Long> {
 public interface DonghoInfoRepository extends CrudRepository<DonghoInfo, Long> {
+	int countByDongAndHoAndDeleteFlag(String dong, String ho, String deleteFlag);
 	List<DonghoInfo> findByDongAndHo(String dong, String ho);
 	List<DonghoInfo> findByDongAndHo(String dong, String ho);
 	List<DonghoInfo> findByKakaoAccessTokenAndKakaoRefreshToken(String kakaoAccessToken, String kakaoRefreshToken);
 	List<DonghoInfo> findByKakaoAccessTokenAndKakaoRefreshToken(String kakaoAccessToken, String kakaoRefreshToken);
 }
 }

+ 1 - 0
src/main/java/com/icontrols/kakao/service/AuthService.java

@@ -5,4 +5,5 @@ import java.util.Map;
 public interface AuthService {
 public interface AuthService {
 	public Map<String, Object> authProcess(Map<String, Object> param) throws Exception;
 	public Map<String, Object> authProcess(Map<String, Object> param) throws Exception;
 	public Map<String, Object> subscriptionProcess(Map<String, Object> param) throws Exception;
 	public Map<String, Object> subscriptionProcess(Map<String, Object> param) throws Exception;
+	public Map<String, Object> remoteRegisterNewDevice(Map<String, Object> param) throws Exception;
 }
 }

+ 5 - 0
src/main/java/com/icontrols/kakao/service/impl/AuthServiceImpl.java

@@ -26,4 +26,9 @@ public class AuthServiceImpl implements AuthService {
 		return kMsgHandler.subscriptionProcess(param);
 		return kMsgHandler.subscriptionProcess(param);
 	}
 	}
 
 
+	@Override
+	public Map<String, Object> remoteRegisterNewDevice(Map<String, Object> param) throws Exception {
+		// TODO Auto-generated method stub
+		return kMsgHandler.remoteRegisterNewDevice(param);
+	}
 }
 }

+ 39 - 25
src/main/java/com/icontrols/kakao/service/impl/KakaoExtensionServiceImpl.java

@@ -21,6 +21,7 @@ import com.icontrols.kakao.entity.DonghoInfo;
 import com.icontrols.kakao.entity.ThingsInfo;
 import com.icontrols.kakao.entity.ThingsInfo;
 import com.icontrols.kakao.repo.DonghoInfoRepository;
 import com.icontrols.kakao.repo.DonghoInfoRepository;
 import com.icontrols.kakao.repo.ThingsInfoRepository;
 import com.icontrols.kakao.repo.ThingsInfoRepository;
+import com.icontrols.kakao.service.AuthService;
 import com.icontrols.kakao.service.KakaoExtensionService;
 import com.icontrols.kakao.service.KakaoExtensionService;
 import com.icontrols.kakao.socket.wallpad.KakaoMsgHandler;
 import com.icontrols.kakao.socket.wallpad.KakaoMsgHandler;
 import com.icontrols.kakao.socket.wallpad.WallpadMsgSender;
 import com.icontrols.kakao.socket.wallpad.WallpadMsgSender;
@@ -39,6 +40,9 @@ public class KakaoExtensionServiceImpl implements KakaoExtensionService {
 	@Resource(name="wallpadMsgSender")
 	@Resource(name="wallpadMsgSender")
 	WallpadMsgSender wallpadMsgSender;
 	WallpadMsgSender wallpadMsgSender;
 	
 	
+	@Autowired
+	AuthService authService;
+	
 	@Autowired
 	@Autowired
 	DonghoInfoRepository donghoRepository;
 	DonghoInfoRepository donghoRepository;
 	
 	
@@ -48,11 +52,8 @@ public class KakaoExtensionServiceImpl implements KakaoExtensionService {
 	@Override
 	@Override
 	public Map<String, Object> request_grantAuthorization(Map<String, Object> param) throws Exception {
 	public Map<String, Object> request_grantAuthorization(Map<String, Object> param) throws Exception {
 		String dong_ho = JWTUtils2.getHomeIdFromToken((String)param.get(KEY_INFO.HTTP_KEY_AUTHORIZATION));
 		String dong_ho = JWTUtils2.getHomeIdFromToken((String)param.get(KEY_INFO.HTTP_KEY_AUTHORIZATION));
-//		int dong = Integer.parseInt(dong_ho.split("/")[0]);
-//		int ho = Integer.parseInt(dong_ho.split("/")[1]);
-		
-		int dong = 802;
-		int ho = 1103;
+		int dong = Integer.parseInt(dong_ho.split("/")[0]);
+		int ho = Integer.parseInt(dong_ho.split("/")[1]);
 		
 		
 		Map<String, Object> body = (HashMap)param.get(KEY_INFO.HTTP_KEY_BODY);
 		Map<String, Object> body = (HashMap)param.get(KEY_INFO.HTTP_KEY_BODY);
 		
 		
@@ -71,15 +72,28 @@ public class KakaoExtensionServiceImpl implements KakaoExtensionService {
 																									(String) body.get(KEY_INFO.BODY_KEY_ACCESS_TOKEN), 
 																									(String) body.get(KEY_INFO.BODY_KEY_ACCESS_TOKEN), 
 																									(String) body.get(KEY_INFO.BODY_KEY_REFRESH_TOKEN)
 																									(String) body.get(KEY_INFO.BODY_KEY_REFRESH_TOKEN)
 																								);
 																								);
-			
 			if(dList.size() > 0)
 			if(dList.size() > 0)
 				donghoInfo.setId(dList.get(0).getId());
 				donghoInfo.setId(dList.get(0).getId());
 
 
-			donghoRepository.save(donghoInfo);
+			
 			
 			
 			logger.debug("dongho info saved complete " );
 			logger.debug("dongho info saved complete " );
 			logger.debug(donghoInfo.toString());
 			logger.debug(donghoInfo.toString());
 			
 			
+			Map<String, Object> subsMap = new HashMap<String, Object>();
+			
+			subsMap.put("type", "subs");
+			subsMap.put("dong", dong_ho.split("/")[0]);
+			subsMap.put("ho", dong_ho.split("/")[1]);
+			subsMap.put("devNum", "1");
+			subsMap.put("company", "kakao");
+			
+			authService.subscriptionProcess(subsMap);
+			
+			
+			authService.remoteRegisterNewDevice(subsMap);
+			
+			donghoRepository.save(donghoInfo);
 		}catch(Exception e) {
 		}catch(Exception e) {
 			logger.error("[Auth Database Insert Error]");
 			logger.error("[Auth Database Insert Error]");
 			e.printStackTrace();
 			e.printStackTrace();
@@ -94,11 +108,8 @@ public class KakaoExtensionServiceImpl implements KakaoExtensionService {
 	@Override
 	@Override
 	public Map<String, Object> request_discover(Map<String, Object> param) throws Exception{
 	public Map<String, Object> request_discover(Map<String, Object> param) throws Exception{
 		String dong_ho = JWTUtils2.getHomeIdFromToken((String)param.get(KEY_INFO.HTTP_KEY_AUTHORIZATION));
 		String dong_ho = JWTUtils2.getHomeIdFromToken((String)param.get(KEY_INFO.HTTP_KEY_AUTHORIZATION));
-//		int dong = Integer.parseInt(dong_ho.split("/")[0]);
-//		int ho = Integer.parseInt(dong_ho.split("/")[1]);
-		
-		int dong = 802;
-		int ho = 1103;
+		int dong = Integer.parseInt(dong_ho.split("/")[0]);
+		int ho = Integer.parseInt(dong_ho.split("/")[1]);
 		
 		
 		Map<String, Object> listMap = kMsgHandler.getDevicesStatusList(dong, ho);
 		Map<String, Object> listMap = kMsgHandler.getDevicesStatusList(dong, ho);
 		param.putAll(listMap);
 		param.putAll(listMap);
@@ -110,21 +121,19 @@ public class KakaoExtensionServiceImpl implements KakaoExtensionService {
 	@Override
 	@Override
 	public Map<String, Object> request_queryState(Map<String, Object> param) throws Exception {
 	public Map<String, Object> request_queryState(Map<String, Object> param) throws Exception {
 		String dong_ho = JWTUtils2.getHomeIdFromToken((String)param.get(KEY_INFO.HTTP_KEY_AUTHORIZATION));
 		String dong_ho = JWTUtils2.getHomeIdFromToken((String)param.get(KEY_INFO.HTTP_KEY_AUTHORIZATION));
-//		int dong = Integer.parseInt(dong_ho.split("/")[0]);
-//		int ho = Integer.parseInt(dong_ho.split("/")[1]);
-		
-		int dong = 802;
-		int ho = 1103;
+		int dong = Integer.parseInt(dong_ho.split("/")[0]);
+		int ho = Integer.parseInt(dong_ho.split("/")[1]);
 		
 		
 		Map <String, Object> body = (HashMap)param.get(KEY_INFO.HTTP_KEY_BODY);
 		Map <String, Object> body = (HashMap)param.get(KEY_INFO.HTTP_KEY_BODY);
 		
 		
 		List<String> endpointIds = body.containsKey(KEY_INFO.BODY_KEY_ENDPOINT_IDS)?(ArrayList)body.get(KEY_INFO.BODY_KEY_ENDPOINT_IDS):null;
 		List<String> endpointIds = body.containsKey(KEY_INFO.BODY_KEY_ENDPOINT_IDS)?(ArrayList)body.get(KEY_INFO.BODY_KEY_ENDPOINT_IDS):null;
 		List<String> unreachableIds = new ArrayList<String>();
 		List<String> unreachableIds = new ArrayList<String>();
-		Map<String, Object> allDeviceMap = (Map<String, Object>) kMsgHandler.getDevicesStatusList(dong, ho).get(KEY_INFO.HTTP_KEY_BODY);
+		Map<String, Object> allDeviceMap = null;
 		
 		
 		Map<String, Object> retMap = new HashMap<String, Object>();
 		Map<String, Object> retMap = new HashMap<String, Object>();
 		
 		
-		logger.debug(allDeviceMap.toString());
+		logger.info("[QUERYSTATE] - " + endpointIds);
+		
 		try {
 		try {
 			if(endpointIds == null) {
 			if(endpointIds == null) {
 				param.remove(KEY_INFO.HTTP_KEY_BODY);
 				param.remove(KEY_INFO.HTTP_KEY_BODY);
@@ -137,6 +146,9 @@ public class KakaoExtensionServiceImpl implements KakaoExtensionService {
 				return param;
 				return param;
 			}
 			}
 			
 			
+			allDeviceMap = (Map<String, Object>) kMsgHandler.getDevicesStatusList(dong, ho).get(KEY_INFO.HTTP_KEY_BODY);
+			logger.debug("[DEViCES] - " + allDeviceMap.toString());
+			
 			for(String endpointId:endpointIds) {
 			for(String endpointId:endpointIds) {
 				// 1. db 에서 해당 endpointId가 존재하는지 확인한다.
 				// 1. db 에서 해당 endpointId가 존재하는지 확인한다.
 				// 없으면 endpointId가 잘못된것 -203 에러를 뱉자.
 				// 없으면 endpointId가 잘못된것 -203 에러를 뱉자.
@@ -190,11 +202,8 @@ public class KakaoExtensionServiceImpl implements KakaoExtensionService {
 	@Override
 	@Override
 	public Map<String, Object> request_updateState(Map<String, Object> param) throws Exception {
 	public Map<String, Object> request_updateState(Map<String, Object> param) throws Exception {
 		String dong_ho = JWTUtils2.getHomeIdFromToken((String)param.get(KEY_INFO.HTTP_KEY_AUTHORIZATION));
 		String dong_ho = JWTUtils2.getHomeIdFromToken((String)param.get(KEY_INFO.HTTP_KEY_AUTHORIZATION));
-//		int dong = Integer.parseInt(dong_ho.split("/")[0]);
-//		int ho = Integer.parseInt(dong_ho.split("/")[1]);
-		
-		int dong = 802;
-		int ho = 1103;
+		int dong = Integer.parseInt(dong_ho.split("/")[0]);
+		int ho = Integer.parseInt(dong_ho.split("/")[1]);
 		
 		
 		@SuppressWarnings("unchecked")
 		@SuppressWarnings("unchecked")
 		Map <String, Object> body = (HashMap<String, Object>)param.get(KEY_INFO.HTTP_KEY_BODY);
 		Map <String, Object> body = (HashMap<String, Object>)param.get(KEY_INFO.HTTP_KEY_BODY);
@@ -208,16 +217,21 @@ public class KakaoExtensionServiceImpl implements KakaoExtensionService {
 		logger.debug("[UPDATE] - " + body.toString());
 		logger.debug("[UPDATE] - " + body.toString());
 		
 		
 		List<ThingsInfo> thingsInfoList = thingsInfoRepository.findByDongAndHoAndEndpointId(Integer.toString(dong), Integer.toString(ho), endpointId);
 		List<ThingsInfo> thingsInfoList = thingsInfoRepository.findByDongAndHoAndEndpointId(Integer.toString(dong), Integer.toString(ho), endpointId);
+		
 		if(thingsInfoList == null || thingsInfoList.size() == 0) {
 		if(thingsInfoList == null || thingsInfoList.size() == 0) {
 			retMap = new HashMap<String, Object>();
 			retMap = new HashMap<String, Object>();
 			retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_NONEXIST));
 			retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_NONEXIST));
 		}else {
 		}else {
 			retMap = kMsgHandler.sendDeviceAction(dong, ho, endpointId, capabilityName, desired);
 			retMap = kMsgHandler.sendDeviceAction(dong, ho, endpointId, capabilityName, desired);
 		}
 		}
-		
+		logger.debug("UPDATE-->>retMap : " + retMap.toString());
 		if(retMap.containsKey(KEY_INFO.HTTP_KEY_ERROR)) {
 		if(retMap.containsKey(KEY_INFO.HTTP_KEY_ERROR)) {
 			param.remove(KEY_INFO.HTTP_KEY_BODY);
 			param.remove(KEY_INFO.HTTP_KEY_BODY);
 			param.putAll(retMap);
 			param.putAll(retMap);
+		}else {
+			body.clear();
+			body.putAll(retMap);
+			param.put(KEY_INFO.HTTP_KEY_BODY, body);
 		}
 		}
 
 
 		return param;
 		return param;

+ 11 - 1
src/main/java/com/icontrols/kakao/socket/wallpad/KakaoEventHandler.java

@@ -101,18 +101,28 @@ public class KakaoEventHandler {
 			
 			
 			int code = (int) sendResult.get("result");
 			int code = (int) sendResult.get("result");
 			
 			
+			DonghoInfoRepository repo = null;
 			switch(code) {
 			switch(code) {
 			case KAKAO_RESULT.FAIL_INTERNAL:
 			case KAKAO_RESULT.FAIL_INTERNAL:
 				break;
 				break;
 			case KAKAO_RESULT.FAIL_INVALID_TOKEN: // 유효하지 않은 토큰, 연동 해제한 계정 토큰
 			case KAKAO_RESULT.FAIL_INVALID_TOKEN: // 유효하지 않은 토큰, 연동 해제한 계정 토큰
 				logger.info("["+donghoInfo.getKakaoAccessToken()+"] - 유효하지 않은 토큰..삭제요청");
 				logger.info("["+donghoInfo.getKakaoAccessToken()+"] - 유효하지 않은 토큰..삭제요청");
-				DonghoInfoRepository repo = (DonghoInfoRepository)BeanUtils.getBean("donghoInfoRepository");
+				repo = (DonghoInfoRepository)BeanUtils.getBean("donghoInfoRepository");
 				donghoInfo.setDeleteFlag("Y");
 				donghoInfo.setDeleteFlag("Y");
 				repo.save(donghoInfo);
 				repo.save(donghoInfo);
 				
 				
 				retMap.put("result", KAKAO_RESULT.FAIL_INTERNAL);
 				retMap.put("result", KAKAO_RESULT.FAIL_INTERNAL);
 				retMap.put("message", "ID-["+donghoInfo.getId() + "]-FAIL_INVALID_TOKEN");
 				retMap.put("message", "ID-["+donghoInfo.getId() + "]-FAIL_INVALID_TOKEN");
 				break;
 				break;
+			case KAKAO_RESULT.FAIL_UNLINKEXTENSION_SERVICE: // 서비스를 해지한 경우
+				logger.info("["+donghoInfo.getKakaoAccessToken()+"] - 서비스 해제 토근..삭제요청");
+				repo = (DonghoInfoRepository)BeanUtils.getBean("donghoInfoRepository");
+				donghoInfo.setDeleteFlag("Y");
+				repo.save(donghoInfo);
+				
+				retMap.put("result", KAKAO_RESULT.FAIL_UNLINKEXTENSION_SERVICE);
+				retMap.put("message", "ID-["+donghoInfo.getId() + "]-FAIL_UNLINKEXTENSION_SERVICE");
+				break;
 			case KAKAO_RESULT.FAIL_EXPIREDTOKEN:  // 만료된 토큰, 토큰 재발급 뒤 재시도.
 			case KAKAO_RESULT.FAIL_EXPIREDTOKEN:  // 만료된 토큰, 토큰 재발급 뒤 재시도.
 				// 재시도 할때는 따로 결과를 받지 않을려고.. 성공할때까지 계속 시도하는것도 비효율적.
 				// 재시도 할때는 따로 결과를 받지 않을려고.. 성공할때까지 계속 시도하는것도 비효율적.
 				logger.info("["+donghoInfo.getKakaoAccessToken()+"]-인증토큰 만료 토큰 갱신 요청");
 				logger.info("["+donghoInfo.getKakaoAccessToken()+"]-인증토큰 만료 토큰 갱신 요청");

+ 98 - 32
src/main/java/com/icontrols/kakao/socket/wallpad/KakaoMsgHandler.java

@@ -82,7 +82,8 @@ public class KakaoMsgHandler {
 			String code = (String)param.get("code");
 			String code = (String)param.get("code");
 			
 			
 			String targetIP = IPGenerator.getIPFromDongHo(dong, ho);
 			String targetIP = IPGenerator.getIPFromDongHo(dong, ho);
-			String twinid = UUID.randomUUID().toString();
+//			String twinid = UUID.randomUUID().toString();
+			String twinid = "KAKAO"+dong+"_"+ho;
 			String alias = "Kakao";
 			String alias = "Kakao";
 			StringBuffer sb = new StringBuffer();
 			StringBuffer sb = new StringBuffer();
 			
 			
@@ -91,7 +92,7 @@ public class KakaoMsgHandler {
 			.append("      <device_info alias=\"").append(alias).append("\" twinid=\"").append(twinid).append("\" auth_number=\"" + code + "\" />\r\n")
 			.append("      <device_info alias=\"").append(alias).append("\" twinid=\"").append(twinid).append("\" auth_number=\"" + code + "\" />\r\n")
 			.append(XMLGenerator.MakeXMLTail());
 			.append(XMLGenerator.MakeXMLTail());
 			
 			
-			logger.debug(sb.toString());
+			logger.info(sb.toString());
 			
 			
 			SSLClient.sendToWallpad(targetIP, sb.toString());
 			SSLClient.sendToWallpad(targetIP, sb.toString());
 			
 			
@@ -131,6 +132,37 @@ public class KakaoMsgHandler {
 		return retMap;
 		return retMap;
 	}
 	}
 	
 	
+	public Map<String, Object> remoteRegisterNewDevice(Map<String, Object> param) { 
+Map<String, Object> retMap = new HashMap<String, Object>();
+		
+		try {
+			int dong = Integer.parseInt((String)param.get("dong"));
+			int ho = Integer.parseInt((String)param.get("ho"));
+			String code = (String)param.get("code");
+			
+			String targetIP = IPGenerator.getIPFromDongHo(dong, ho);
+			String twinid = "KAKAO_"+dong+"_"+ho;
+			String alias = "KAKAO HOME";
+			StringBuffer sb = new StringBuffer();
+			
+			sb.append(XMLGenerator.MakeXMLHeaderForSUBS("remote_register_new_device"))
+			.append("      <home_info dong=\"").append(dong).append("\" ho=\"").append(ho).append("\" ip=\"").append(targetIP).append("\" type=\"main\"/>\r\n")
+			.append("      <device_info alias=\"").append(alias).append("\" twinid=\"").append(twinid).append("\"  />\r\n")
+			.append(XMLGenerator.MakeXMLTail());
+			
+			logger.info(sb.toString());
+			
+			SSLClient.sendToWallpad(targetIP, sb.toString());
+			
+			retMap.put("result", ERROR_INFO.CODE.SUCCESS.getContents());
+			retMap.put("resultCode", ERROR_INFO.CODE.SUCCESS.getmIdx());
+		}catch(Exception e) {
+			retMap.put("result", ERROR_INFO.CODE.FAIL_999.getContents());
+			retMap.put("resultCode", ERROR_INFO.CODE.FAIL_999.getmIdx());
+			e.printStackTrace();
+		}
+		return retMap;
+	}
 	/**
 	/**
 	 * 월패드와 연결된 기기들의 전체 상태를 월패드에 요청하고 응답 받는다.
 	 * 월패드와 연결된 기기들의 전체 상태를 월패드에 요청하고 응답 받는다.
 	 * 지원 기기가 추가되면 해당 부분은 수정이 필요하다. 
 	 * 지원 기기가 추가되면 해당 부분은 수정이 필요하다. 
@@ -193,7 +225,7 @@ public class KakaoMsgHandler {
 							// status의 구성요소에 맞게 capability가 구성되어야 한다. 
 							// status의 구성요소에 맞게 capability가 구성되어야 한다. 
 							
 							
 							
 							
-							if(tmpModelId.equalsIgnoreCase("light")) {
+							if(tmpModelId.equalsIgnoreCase("light") || tmpModelId.equalsIgnoreCase("electric")) {
 								for(int j=1; j <= childCount; j++) {
 								for(int j=1; j <= childCount; j++) {
 									String childName = j < 10 ? tmpModelId+"0"+j : tmpModelId+j;
 									String childName = j < 10 ? tmpModelId+"0"+j : tmpModelId+j;
 									Node childNode = (Node)xpath.evaluate("//imap/service/devinfo/*[@name='"+ childName +"']", doc, XPathConstants.NODE);
 									Node childNode = (Node)xpath.evaluate("//imap/service/devinfo/*[@name='"+ childName +"']", doc, XPathConstants.NODE);
@@ -310,7 +342,7 @@ public class KakaoMsgHandler {
 		Map<String, Object> retMap = new HashMap<String, Object>();
 		Map<String, Object> retMap = new HashMap<String, Object>();
 		
 		
 		String[] tmpSplit = endpointId.split("_");
 		String[] tmpSplit = endpointId.split("_");
-		String modelId = (tmpSplit[0].equals("dimmer") || tmpSplit[0].equals("colorDimmer"))?tmpSplit[0]:tmpSplit[1];
+		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())) {
 		if(tmpSplit.length == 1 && !modelId.equals(THINGS_INFO.THINGS.ELEVATOR.getKakaoDisplayName())) {
 			retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_NONEXIST));
 			retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_NONEXIST));
@@ -330,7 +362,7 @@ public class KakaoMsgHandler {
 			return retMap;
 			return retMap;
 		}
 		}
 		
 		
-		String action = KakaoMsgHandler.setDeviceActionStr(modelId, actionName, desired);
+		String action = KakaoMsgHandler.setDeviceActionStr(endpointId, modelId, actionName, desired);
 		
 		
 		if(action.length() == 0) {
 		if(action.length() == 0) {
 			retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_INVALID_REQ));
 			retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_INVALID_REQ));
@@ -455,6 +487,7 @@ public class KakaoMsgHandler {
 			break;
 			break;
 			
 			
 		case THINGS_INFO.THINGS_ELECPLUG:
 		case THINGS_INFO.THINGS_ELECPLUG:
+			jsonString = THINGS_INFO.THINGS_CAPABILITY.ELECTRIC.getCapJsonStr();
 			break;
 			break;
 		}
 		}
 		Map<String, Object> capabilities = CommonUtil.jsonToMap(jsonString);
 		Map<String, Object> capabilities = CommonUtil.jsonToMap(jsonString);
@@ -485,14 +518,20 @@ public class KakaoMsgHandler {
 						if(cNodeName.contains("light")) {
 						if(cNodeName.contains("light")) {
 							String[] strSplit = status.split("/");
 							String[] strSplit = status.split("/");
 							// split 이 안됐다면 on off만 되는 예전 방식으로 전등 상태를 받았다는 뜻.
 							// split 이 안됐다면 on off만 되는 예전 방식으로 전등 상태를 받았다는 뜻.
-							if(!strSplit[1].equals("null") && strSplit[2].equals("null")) 
-								endpointId = "dimmer_"+endpointId;
-							else if(!strSplit[2].equals("null"))
-								endpointId = "colorDimmer_"+endpointId;
+							if(strSplit.length > 1) {
+								if(!strSplit[1].equals("null") && strSplit[2].equals("null")) {
+									endpointId = "dimmer_"+endpointId;
+									cNodeName = "dimmer_" + cNodeName;
+								}
+								else if(!strSplit[2].equals("null")) {
+									endpointId = "colorDimmer_"+endpointId;
+									cNodeName = "colorDimmer_"+cNodeName;
+								}
+							}
 						}
 						}
 						
 						
 			 			String tmpModelId = cNodeName.equals("temper")?endpointId:cNodeName;
 			 			String tmpModelId = cNodeName.equals("temper")?endpointId:cNodeName;
-						
+						logger.debug("tmpModelId = " + tmpModelId + " || endpointID = " + endpointId);
 			 			
 			 			
 						
 						
 						THINGS_INFO.DEVICE_DETAIL detailDev = THINGS_INFO.getDeviceInfo(tmpModelId, status);
 						THINGS_INFO.DEVICE_DETAIL detailDev = THINGS_INFO.getDeviceInfo(tmpModelId, status);
@@ -575,14 +614,18 @@ public class KakaoMsgHandler {
 	 * @return
 	 * @return
 	 */
 	 */
 	
 	
-	public static String setDeviceActionStr(String modelId, String capability, Map<String, Object> desired) {
+	public static String setDeviceActionStr(String endPointId, String modelId, String capability, Map<String, Object> desired) {
 		StringBuffer sb = new StringBuffer();
 		StringBuffer sb = new StringBuffer();
 		
 		
-		THINGS_INFO.THINGS things = THINGS_INFO.getThingsType(modelId);
+		THINGS_INFO.THINGS things = THINGS_INFO.getThingsType(endPointId);
 		
 		
 		logger.debug("[setDeiceActionStr] - modelId = " + modelId + " || capability = " + capability + " || things endpoint = " + things.getEndPoint());
 		logger.debug("[setDeiceActionStr] - modelId = " + modelId + " || capability = " + capability + " || things endpoint = " + things.getEndPoint());
+		logger.debug("ACTION STATUS --> " + desired.toString());
 		try {
 		try {
+			int brightness = 1;
+			int colorTemer = 1;
 			switch(things.getEndPoint()) {
 			switch(things.getEndPoint()) {
+				
 			case THINGS_INFO.THINGS_LIGHT:
 			case THINGS_INFO.THINGS_LIGHT:
 				if(capability.equals("Power") && desired.containsKey("power")) {
 				if(capability.equals("Power") && desired.containsKey("power")) {
 					String tmpState = (String)desired.get("power");
 					String tmpState = (String)desired.get("power");
@@ -594,11 +637,15 @@ public class KakaoMsgHandler {
 				
 				
 				if(capability.equals("Power") && desired.containsKey("power")) {
 				if(capability.equals("Power") && desired.containsKey("power")) {
 					String tmpState = (String)desired.get("power");
 					String tmpState = (String)desired.get("power");
-					if(tmpState.equals("on") || tmpState.equals("off")) sb.append(tmpState);
+					if(tmpState.equals("on") || tmpState.equals("off")) {
+						sb.append(tmpState);
+						sb.append("/null/null");
+					}
 				}
 				}
 				
 				
 				if(desired.containsKey("brightness")) {
 				if(desired.containsKey("brightness")) {
-					sb.append("/").append(((int)desired.get("brightness"))/10*10);
+					brightness = ((int)desired.get("brightness"))/10 == 0 ? 1: ((int)desired.get("brightness"))/10;
+					sb.append("on").append("/").append(brightness).append("/null");
 				}
 				}
 				
 				
 				break;
 				break;
@@ -607,30 +654,42 @@ public class KakaoMsgHandler {
 				
 				
 				if(capability.equals("Power") && desired.containsKey("power")) {
 				if(capability.equals("Power") && desired.containsKey("power")) {
 					String tmpState = (String)desired.get("power");
 					String tmpState = (String)desired.get("power");
-					if(tmpState.equals("on") || tmpState.equals("off")) sb.append(tmpState);
+					if(tmpState.equals("on") || tmpState.equals("off")) {
+						sb.append(tmpState);
+					}
 				}
 				}
 				
 				
+				
 				if(desired.containsKey("brightness")) {
 				if(desired.containsKey("brightness")) {
-					sb.append("/").append(((int)desired.get("brightness"))/10*10);
-				}else if(!desired.containsKey("brightness") && desired.containsKey("colorTemperature")) {
+					brightness = ((int)desired.get("brightness"))/10 == 0 ? 1: ((int)desired.get("brightness"))/10;
+					sb.append("/").append(brightness);
+				}else {
 					sb.append("/null");
 					sb.append("/null");
 				}
 				}
 				
 				
+				
 				if(desired.containsKey("colorTemperature")) {
 				if(desired.containsKey("colorTemperature")) {
-					sb.append("/").append(((int)desired.get("colorTemperature"))/1000*10);
+					colorTemer = ((int)desired.get("colorTemperature"))/1000 == 0 ? 1:((int)desired.get("colorTemperature"))/1000;
+					sb.append("/").append(colorTemer);
+				}else {
+					sb.append("/null");
 				}
 				}
+				
 				break;
 				break;
 				
 				
 			case THINGS_INFO.THINGS_TEMPER:
 			case THINGS_INFO.THINGS_TEMPER:
 				if(capability.equals("Power") && desired.containsKey("power")) {
 				if(capability.equals("Power") && desired.containsKey("power")) {
 					String tmpState = (String)desired.get("power");
 					String tmpState = (String)desired.get("power");
 					if(tmpState.equals("on") || tmpState.equals("off")) sb.append(tmpState);
 					if(tmpState.equals("on") || tmpState.equals("off")) sb.append(tmpState);
+					
+					if(tmpState.equals("on") && desired.containsKey("targetSetpoint")) sb.append("/").append(desired.get("targetSetpoint"));
 				}
 				}
 					
 					
 				if(capability.equals("TemperatureSetpoint") && desired.containsKey("targetSetpoint")) {
 				if(capability.equals("TemperatureSetpoint") && desired.containsKey("targetSetpoint")) {
 					sb.append("on/").append(desired.get("targetSetpoint"));
 					sb.append("on/").append(desired.get("targetSetpoint"));
 				}
 				}
 				
 				
+				
 				break;
 				break;
 				
 				
 			case THINGS_INFO.THINGS_GAS:
 			case THINGS_INFO.THINGS_GAS:
@@ -644,6 +703,12 @@ public class KakaoMsgHandler {
 				if(capability.equals("Power") && desired.containsKey("power")) {
 				if(capability.equals("Power") && desired.containsKey("power")) {
 					String tmpState = (String)desired.get("power");
 					String tmpState = (String)desired.get("power");
 					if(tmpState.equals("on") || tmpState.equals("off")) sb.append(tmpState);
 					if(tmpState.equals("on") || tmpState.equals("off")) sb.append(tmpState);
+					
+					if(tmpState.equals("on") && desired.containsKey("fanSpeed")) {
+						String tmpFanSpeed = (String)desired.get("fanSpeed");
+						if(tmpFanSpeed.equals("low") || tmpFanSpeed.equals("middle") || tmpFanSpeed.equals("high"))
+							sb.append(desired.get("fanSpeed"));
+					}
 				}
 				}
 				
 				
 				if(capability.equals("AirFlow") && desired.containsKey("fanSpeed")) {
 				if(capability.equals("AirFlow") && desired.containsKey("fanSpeed")) {
@@ -655,8 +720,12 @@ public class KakaoMsgHandler {
 				break;
 				break;
 				
 				
 			case THINGS_INFO.THINGS_ELECPLUG: // 지원하지 않음
 			case THINGS_INFO.THINGS_ELECPLUG: // 지원하지 않음
-				if(desired.containsKey("power")) sb.append(desired.get("power"));
-				else if(desired.containsKey("mode")) sb.append(desired.get("mode"));
+				if(capability.equals("Power") && desired.containsKey("power")) {
+					String tmpState = (String)desired.get("power");
+					if(tmpState.equals("on"))
+						sb.append("on");
+					else if(tmpState.equals("off")) sb.append("off");
+				}
 				break;
 				break;
 				
 				
 			case THINGS_INFO.THINGS_ELEVATOR:
 			case THINGS_INFO.THINGS_ELEVATOR:
@@ -687,27 +756,24 @@ public class KakaoMsgHandler {
 		String[] splitStr = status.split("\\/");
 		String[] splitStr = status.split("\\/");
 		int temp1, temp2 = 0;
 		int temp1, temp2 = 0;
 		switch(things.getEndPoint()) {
 		switch(things.getEndPoint()) {
-		case THINGS_INFO.THINGS_LIGHT:
-			state.put("power", splitStr[0]);
+		case THINGS_INFO.THINGS_ELECPLUG:
+			state.put("power", splitStr[1]);
+			
 			break;
 			break;
+		case THINGS_INFO.THINGS_LIGHT:
 		case THINGS_INFO.THINGS_LIGHT_DIMMER:
 		case THINGS_INFO.THINGS_LIGHT_DIMMER:
-			state.put("power", splitStr[0]);
-			if(!splitStr[1].equals("null")) {
-				temp1 = Integer.parseInt(splitStr[1]);
-				state.put("brightness", temp1);
-			}
-			break;
 		case THINGS_INFO.THINGS_COLOR_LIGHT_DIMMER:
 		case THINGS_INFO.THINGS_COLOR_LIGHT_DIMMER:
 			
 			
 			state.put("power", splitStr[0]);
 			state.put("power", splitStr[0]);
 			
 			
-
-			if(!splitStr[1].equals("null")) {
-				temp1 = Integer.parseInt(splitStr[1]);
+			if(things.getEndPoint() == THINGS_INFO.THINGS_LIGHT) break; 
+				
+			if(splitStr[1] != null && !splitStr[1].equals("null")) {
+				temp1 = Integer.parseInt(splitStr[1]) * 10;
 				state.put("brightness", temp1);
 				state.put("brightness", temp1);
 			}
 			}
 			
 			
-			if(!splitStr[2].equals("null")) {
+			if(splitStr[2] != null && !splitStr[2].equals("null")) {
 				temp2 = (Integer.parseInt(splitStr[2])*1000);
 				temp2 = (Integer.parseInt(splitStr[2])*1000);
 				state.put("colorMode", "colorTemperature");
 				state.put("colorMode", "colorTemperature");
 				state.put("colorTemperature", temp2);
 				state.put("colorTemperature", temp2);

+ 26 - 16
src/main/java/com/icontrols/kakao/socket/wallpad/ThreadServerHandler.java

@@ -93,7 +93,7 @@ public class ThreadServerHandler extends Thread {
 							
 							
 							if (0 < sbInBuffer.toString().indexOf("</imap>")) { // </imap> 으로 제대로 닫혔다면 클라이언트의 이벤트 메세지를 제대로 수신 했다는 말.
 							if (0 < sbInBuffer.toString().indexOf("</imap>")) { // </imap> 으로 제대로 닫혔다면 클라이언트의 이벤트 메세지를 제대로 수신 했다는 말.
 								bRcvOK = true;
 								bRcvOK = true;
-								logger.info("[iMAPSvrProc().run()] Received DONE!!");
+								logger.debug("[iMAPSvrProc().run()] Received DONE!!");
 								break;
 								break;
 							}
 							}
 						} catch (Exception e) {
 						} catch (Exception e) {
@@ -104,7 +104,7 @@ public class ThreadServerHandler extends Thread {
 						Thread.sleep(100);
 						Thread.sleep(100);
 					}
 					}
 				} catch (Exception e) {
 				} catch (Exception e) {
-					logger.info("[Exception] iMAPSvrProc.run() ===== 2 =====");
+					logger.error("[Exception] iMAPSvrProc.run() ===== 2 =====");
 					connectedClientSocket.close();
 					connectedClientSocket.close();
 					logger.error("message : " + e);
 					logger.error("message : " + e);
 					return;
 					return;
@@ -120,8 +120,8 @@ public class ThreadServerHandler extends Thread {
 			}
 			}
 			
 			
 			// 응답을 제대로 받은 이후의 처리 .. 제대로 된 응다블 받지 못했다면 위에서 소켓 연결 해제 
 			// 응답을 제대로 받은 이후의 처리 .. 제대로 된 응다블 받지 못했다면 위에서 소켓 연결 해제 
-			logger.info("-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
-			logger.info("strRcvMSG :: > " + strRcvMSG);
+			logger.debug("-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
+			logger.debug("strRcvMSG :: > " + strRcvMSG);
 			
 			
 			strRcvMSG = strRcvMSG.substring(strRcvMSG.indexOf("<")); // 이 부분에 대한 예시 데이터가 있으면 이해하기 좋을거 같다. 테스트 하면서 뽑아내고 주석으로 잘아보자.
 			strRcvMSG = strRcvMSG.substring(strRcvMSG.indexOf("<")); // 이 부분에 대한 예시 데이터가 있으면 이해하기 좋을거 같다. 테스트 하면서 뽑아내고 주석으로 잘아보자.
 			
 			
@@ -139,15 +139,15 @@ public class ThreadServerHandler extends Thread {
 			// id 가 c2 인 Node의 val attribute 값 가져오기
 			// id 가 c2 인 Node의 val attribute 값 가져오기
 			Node service = (Node) xpath.evaluate("//imap/service", doc, XPathConstants.NODE);
 			Node service = (Node) xpath.evaluate("//imap/service", doc, XPathConstants.NODE);
 			String requestType = XmlUtil.getAttributeWithItem(service, "type");
 			String requestType = XmlUtil.getAttributeWithItem(service, "type");
-			logger.info("[ThreadServerHandler]-service type : " + requestType);
+			logger.debug("[ThreadServerHandler]-service type : " + requestType);
 			
 			
 			String retXML = "";
 			String retXML = "";
 			if (requestType.equalsIgnoreCase("notice")) {
 			if (requestType.equalsIgnoreCase("notice")) {
 				String requestCmd = XmlUtil.getAttributeWithItem(service, "name");
 				String requestCmd = XmlUtil.getAttributeWithItem(service, "name");
 				
 				
-				logger.info("[ThreadServerHandler]-requestCmd : " + requestCmd);
+				logger.debug("[ThreadServerHandler]-requestCmd : " + requestCmd);
 //				if (requestCmd.equalsIgnoreCase("msg_device_event")) { // 상태변경이벤트인경우에 처리
 //				if (requestCmd.equalsIgnoreCase("msg_device_event")) { // 상태변경이벤트인경우에 처리
-					logger.info("[ThreadServerHandler]-strRcvMSG : " + strRcvMSG);
+					logger.debug("[ThreadServerHandler]-strRcvMSG : " + strRcvMSG);
 					// 빈번하게 실행 될 가능성이 높다.
 					// 빈번하게 실행 될 가능성이 높다.
 					DeviceEventMsgHandler emh = new DeviceEventMsgHandler(doc, requestCmd);
 					DeviceEventMsgHandler emh = new DeviceEventMsgHandler(doc, requestCmd);
 					emh.start();
 					emh.start();
@@ -189,8 +189,8 @@ public class ThreadServerHandler extends Thread {
 
 
 				// id 가 c2 인 Node의 val attribute 값 가져오기
 				// id 가 c2 인 Node의 val attribute 값 가져오기
 				Node iMap = (Node) xpath.evaluate("//imap", doc, XPathConstants.NODE);
 				Node iMap = (Node) xpath.evaluate("//imap", doc, XPathConstants.NODE);
-				logger.info("[DeviceEventMsgHandler] - address : " + iMap.getAttributes().getNamedItem("address").getTextContent());
-				logger.info("[DeviceEventMsgHandler] - sender : "  + iMap.getAttributes().getNamedItem("sender").getTextContent());
+				logger.debug("[DeviceEventMsgHandler] - address : " + iMap.getAttributes().getNamedItem("address").getTextContent());
+				logger.debug("[DeviceEventMsgHandler] - sender : "  + iMap.getAttributes().getNamedItem("sender").getTextContent());
 
 
 
 
 				String dongho = XmlUtil.getAttributeWithItem(iMap, "sender");
 				String dongho = XmlUtil.getAttributeWithItem(iMap, "sender");
@@ -203,19 +203,20 @@ public class ThreadServerHandler extends Thread {
 				String dong = dongho.substring(0, idxdong).trim();
 				String dong = dongho.substring(0, idxdong).trim();
 				String ho = dongho.substring(idxdong + 1, idxho).trim();
 				String ho = dongho.substring(idxdong + 1, idxho).trim();
 				
 				
-				logger.info("[DeviceEventMsgHandler] - [동:" + dong + "호:" + ho + "]");
+				
 
 
 				Node service = (Node) xpath.evaluate("//imap/service", doc, XPathConstants.NODE);
 				Node service = (Node) xpath.evaluate("//imap/service", doc, XPathConstants.NODE);
-				logger.info(service.getAttributes().getNamedItem("type").getTextContent());
+				logger.debug(service.getAttributes().getNamedItem("type").getTextContent());
 
 
 				model_id = (String) xpath.evaluate("//imap/service/model_id ", doc, XPathConstants.STRING);
 				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));
 				dev_num = Integer.parseInt((String) xpath.evaluate("//imap/service/dev_num", doc, XPathConstants.STRING));
 				status = (String) xpath.evaluate("//imap/service/status", doc, XPathConstants.STRING);
 				status = (String) xpath.evaluate("//imap/service/status", doc, XPathConstants.STRING);
 				
 				
-				logger.info("[DeviceEventMsgHandler] - model_id : " + model_id);
-				logger.info("[DeviceEventMsgHandler] - dev_num  : " + dev_num);
-				logger.info("[DeviceEventMsgHandler] - status   : " + status);
+				logger.debug("[DeviceEventMsgHandler] - model_id : " + model_id);
+				logger.debug("[DeviceEventMsgHandler] - dev_num  : " + dev_num);
+				logger.debug("[DeviceEventMsgHandler] - status   : " + status);
 
 
+				logger.info("[DeviceEventMsgHandler] - [동:" + dong + "호:" + ho + "] - [" + model_id + "] - [" + dev_num + "] - ["+status+"]");
 				String endpointId = model_id + "_" + dev_num;
 				String endpointId = model_id + "_" + dev_num;
 				
 				
 				Map <String, Object> body = new HashMap<String, Object>();
 				Map <String, Object> body = new HashMap<String, Object>();
@@ -234,7 +235,15 @@ public class ThreadServerHandler extends Thread {
 					dList.stream().filter(donghoInfo -> donghoInfo.getDeleteFlag().equals("N"))
 					dList.stream().filter(donghoInfo -> donghoInfo.getDeleteFlag().equals("N"))
 									.forEach(donghoInfo -> { 
 									.forEach(donghoInfo -> { 
 										try {
 										try {
-											body.put(endpointId, KakaoMsgHandler.setDeviceState(endpointId, status));
+											Map<String, Object> state = KakaoMsgHandler.setDeviceState(endpointId, status);
+											
+											if(state.containsKey("colorTemperature") && state.containsKey("brightness")) {
+												body.put("colorDimmer_"+endpointId, state);
+											}else if(state.containsKey("brightness")) {
+												body.put("dimmer_"+endpointId, state);	
+											}else {
+												body.put(endpointId, state);
+											}
 											logger.debug("body --> " + body.toString());
 											logger.debug("body --> " + body.toString());
 											
 											
 											Map<String, Object> sendMap = kakaoMsgHandler.setKakaoEventMsg(donghoInfo, body);
 											Map<String, Object> sendMap = kakaoMsgHandler.setKakaoEventMsg(donghoInfo, body);
@@ -266,7 +275,8 @@ public class ThreadServerHandler extends Thread {
 							if(code == KAKAO_RESULT.SUCCESS) {
 							if(code == KAKAO_RESULT.SUCCESS) {
 								logger.info("[EVENT SUCCESS] - " + message);
 								logger.info("[EVENT SUCCESS] - " + message);
 							} else {
 							} else {
-								logger.error("[EVENT ERROR] - " + message);
+								logger.error("[EVENT ERROR] - [CODE-" + code + "]" + message);
+								
 							}							
 							}							
 						}catch(Exception e) {
 						}catch(Exception e) {
 							logger.error("[ERROR - future get] - " + e.getMessage());
 							logger.error("[ERROR - future get] - " + e.getMessage());

+ 39 - 1
src/main/java/com/icontrols/kakao/socket/wallpad/WallpadMsgSender.java

@@ -80,7 +80,8 @@ public class WallpadMsgSender {
 			.append(XMLGenerator.MakeXMLTail());
 			.append(XMLGenerator.MakeXMLTail());
 		
 		
 			xmlData = sb.toString();
 			xmlData = sb.toString();
-			
+			logger.info("[SUBS]");
+			logger.info(sb.toString());
 			int bRet = imapSocket.doWork(xmlData);
 			int bRet = imapSocket.doWork(xmlData);
 			
 			
 			if(bRet < 0) {
 			if(bRet < 0) {
@@ -140,6 +141,43 @@ public class WallpadMsgSender {
 		}
 		}
 	}
 	}
 	
 	
+	public Document remoteRegisterNewDevice(Map<String, Object> param) {
+		Document doc = null;
+		int dong = Integer.parseInt((String)param.get("dong"));
+		int ho = Integer.parseInt((String)param.get("ho"));
+
+		String alias = "KAKAO HOME";
+		String twinid = UUID.randomUUID().toString();
+		String targetIP = IPGenerator.getIPFromDongHo(dong, ho);
+		try {
+			iMapRequestSync imapSocket = new iMapRequestSync(
+					IPGenerator.getIPFromDongHo(dong, ho),
+					SERVERINFO.clientNewPort);
+			
+			String xmlData = null;
+			StringBuffer sb = new StringBuffer();
+			
+			sb.append(XMLGenerator.MakeXMLHeaderForNotice(REMOTE_KIND.remote_register_new_device_auth_number.getContents()))
+			.append("      <home_info dong=\"").append(dong).append("\" ho=\"").append(ho).append("\" ip=\"").append(targetIP).append("\" type=\"main\"/>\r\n")
+			.append("      <device_info alias=\"" + alias + "\" twinid=\"" + twinid).append("\" />\r\n")
+			.append(XMLGenerator.MakeXMLTail());
+		
+			xmlData = sb.toString();
+			
+			int bRet = imapSocket.doWork(xmlData);
+			
+			if(bRet < 0) {
+				logger.error("[remoteDeviceList ERROR] - document null");
+				return null;
+			}
+			
+			return imapSocket.getDocument();
+		}catch(Exception e) {
+			logger.error("[remoteDeviceList ERROR] - " + e.getMessage());
+			return null;
+		}
+	}
+	
 	/**
 	/**
 	 * 월패드와 연결된 기기목록을 요청한다 
 	 * 월패드와 연결된 기기목록을 요청한다 
 	 * @param dong
 	 * @param dong

+ 6 - 3
src/main/resources/application.properties

@@ -1,16 +1,19 @@
 logging.config=classpath:logback-spring.xml
 logging.config=classpath:logback-spring.xml
 
 
-## local 황의현 개발 디비
+## local 황의현 개발 디비
 #spring.datasource.url=jdbc:mariadb://localhost:33060/platform_danzi?useUnicode=true&charaterEncoding=utf-8
 #spring.datasource.url=jdbc:mariadb://localhost:33060/platform_danzi?useUnicode=true&charaterEncoding=utf-8
 #spring.datasource.username=root
 #spring.datasource.username=root
 #spring.datasource.password=pangpang
 #spring.datasource.password=pangpang
 
 
-## 단지서버 디비
+## 배포용-테스트 단지서버
 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_danzi?useUnicode=true&charaterEncoding=utf-8
+
+## 배포용-카카오데모서버
+##spring.datasource.url=jdbc:mariadb://localhost:8005/platform_danzi?useUnicode=true&charaterEncoding=utf-8
 spring.datasource.username=valley
 spring.datasource.username=valley
 spring.datasource.password=valley123
 spring.datasource.password=valley123
 
 
 spring.jpa.hibernate.ddl-auto=update
 spring.jpa.hibernate.ddl-auto=update
 spring.jpa.generate-ddl=true
 spring.jpa.generate-ddl=true
 
 
-server.port=8002
+server.port=8003

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

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