Bladeren bron

카카오 에러 대응 _01

pangs 6 jaren geleden
bovenliggende
commit
cb6d7df293

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

@@ -1,5 +1,9 @@
 package com.icontrols.kakao.common;
 
+import com.icontrols.kakao.common.utils.BeanUtils;
+import com.icontrols.kakao.repo.DonghoInfoRepository;
+import com.icontrols.kakao.repo.ThingsInfoRepository;
+
 public final class THINGS_INFO {
 	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,
@@ -101,8 +105,16 @@ public final class THINGS_INFO {
 		}
 	}
 	
+	public static boolean isExistThings(String modelId) {
+		THINGS_INFO.THINGS things = getThingsType(modelId);
+		
+		return things == null ? false:true;
+	}
+	
 	public static THINGS_INFO.THINGS getThingsType(String modelId){    
 		
+		ThingsInfoRepository repo = (ThingsInfoRepository)BeanUtils.getBean("thingsInfoRepository");
+		
 		THINGS_INFO.THINGS[] list = THINGS_INFO.THINGS.values();
 		
 		for(THINGS_INFO.THINGS things:list) {
@@ -113,4 +125,7 @@ public final class THINGS_INFO {
 		
 		return null;
 	}
+	
+	
+	
 }

+ 39 - 0
src/main/java/com/icontrols/kakao/controller/AuthController.java

@@ -13,6 +13,8 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 
+import com.icontrols.kakao.entity.ThingsInfo;
+import com.icontrols.kakao.repo.ThingsInfoRepository;
 import com.icontrols.kakao.service.AuthService;
 
 
@@ -23,6 +25,9 @@ public class AuthController {
 	@Autowired
 	AuthService authService;
 	
+	@Autowired
+	ThingsInfoRepository thingsRepo;
+	
 	@RequestMapping(value = "/kakao/auth", method = RequestMethod.POST, consumes = "application/json")
 	public @ResponseBody Map<String, Object> reqCode(@RequestBody Map<String, Object> body) throws Exception {
 		logger.info(body.toString());
@@ -33,11 +38,45 @@ public class AuthController {
 	
 	@RequestMapping(value = "/kakao/test", method = RequestMethod.POST, consumes = "application/json")
 	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")};
+//		
+//		
+//		for(ThingsInfo info:list) {
+//			thingsRepo.save(info);
+//		}
+		
+		
 		logger.info("kakao test --<>>>>>");
 		Map<String, Object> retMap = new HashMap<String, Object>();
 		
 		
 		retMap.put("UUID", UUID.randomUUID().toString());
+		
+		
 		return retMap;
 	}
 }

+ 83 - 0
src/main/java/com/icontrols/kakao/entity/ThingsInfo.java

@@ -0,0 +1,83 @@
+package com.icontrols.kakao.entity;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "tbl_things_info")
+public class ThingsInfo implements Serializable{
+
+	private static final long serialVersionUID = 2220615989970630861L;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.AUTO)
+	private int id;
+
+	@Column(name = "model_id")
+	private String modelId;
+	
+	@Column(name = "endpoint_id")
+	private String endpointId;
+	
+	@Column(name = "dong")
+	private String dong;
+	
+	@Column(name = "ho")
+	private String ho;
+
+	public ThingsInfo(String endpointId, String modelId, String dong, String ho) {
+		super();
+		this.modelId = modelId;
+		this.endpointId = endpointId;
+		this.dong = dong;
+		this.ho = ho;
+	}
+
+	public int getId() {
+		return id;
+	}
+
+	public void setId(int id) {
+		this.id = id;
+	}
+
+	public String getModelId() {
+		return modelId;
+	}
+
+	public void setModelId(String modelId) {
+		this.modelId = modelId;
+	}
+
+	public String getEndpointId() {
+		return endpointId;
+	}
+
+	public void setEndpointId(String endpointId) {
+		this.endpointId = endpointId;
+	}
+
+	public String getDong() {
+		return dong;
+	}
+
+	public void setDong(String dong) {
+		this.dong = dong;
+	}
+
+	public String getHo() {
+		return ho;
+	}
+
+	public void setHo(String ho) {
+		this.ho = ho;
+	}
+	
+	
+}

+ 13 - 0
src/main/java/com/icontrols/kakao/repo/ThingsInfoRepository.java

@@ -0,0 +1,13 @@
+package com.icontrols.kakao.repo;
+
+import java.util.List;
+
+import org.springframework.data.repository.CrudRepository;
+
+import com.icontrols.kakao.entity.ThingsInfo;
+
+public interface ThingsInfoRepository extends CrudRepository<ThingsInfo, Long> {
+	List<ThingsInfo> findByDongAndHo(String dong, String ho);
+	
+	List<ThingsInfo> findByDongAndHoAndEndpointId(String dong, String ho, String endpointId);
+}

+ 41 - 14
src/main/java/com/icontrols/kakao/service/impl/KakaoExtensionServiceImpl.java

@@ -134,6 +134,8 @@ public class KakaoExtensionServiceImpl implements KakaoExtensionService {
         logger.debug("								ASYNC D END");
         logger.debug("******************************************************************************");
 		
+        
+        boolean isError = false;
 		for(CompletableFuture<Map<String, Object>> future:fList) {
         	Map<String, Object> retMap = future.get();
         	
@@ -141,22 +143,40 @@ public class KakaoExtensionServiceImpl implements KakaoExtensionService {
         	logger.debug(endpointId + "-------->" + retMap.toString());
         	
         	if(retMap.containsKey(KEY_INFO.HTTP_KEY_ERROR)) {
-				unreachableIds.add(endpointId);
-				
-				HashMap<String, Object> tmpMap = new HashMap<String, Object>();
-				tmpMap.put("power", "off");
-				
-				retMap.clear();
-				retMap.put(endpointId, tmpMap);
+        		Map<String, Object> errMap = (Map<String, Object>)retMap.get(KEY_INFO.HTTP_KEY_ERROR);
+        		
+        		int errorCode = Integer.parseInt((String)errMap.get(KEY_INFO.ERROR_KEY_CODE));
+        		logger.error("errror code == " + errorCode);
+        		
+        		if(errorCode == KAKAO_RESULT.FAIL_UNREACHABLE) {
+        			unreachableIds.add(endpointId);
+        			
+        			HashMap<String, Object> tmpMap = new HashMap<String, Object>();
+        			tmpMap.put("power", "off");
+
+        			retMap.clear();
+        			retMap.put(endpointId, tmpMap);
+        			
+        			retMap.remove(KEY_INFO.BODY_KEY_ENDPOINT_ID);
+                	body.putAll(retMap);
+        		} else {
+        			isError = true;
+        			
+        			retMap.remove(KEY_INFO.BODY_KEY_ENDPOINT_ID);
+        			body = retMap;
+        			break;
+        		}
 			}
-        	
-        	retMap.remove(KEY_INFO.BODY_KEY_ENDPOINT_ID);
-        	
-        	body.putAll(retMap);
         }
 		
-		param.put(KEY_INFO.HTTP_KEY_UNREACHABLEIDS, unreachableIds);
-		param.put(KEY_INFO.HTTP_KEY_BODY, body);
+		if(!isError) {
+			param.put(KEY_INFO.HTTP_KEY_UNREACHABLEIDS, unreachableIds);
+			
+			param.put(KEY_INFO.HTTP_KEY_BODY, body);
+		}else {
+			param.remove(KEY_INFO.HTTP_KEY_BODY);
+			param.putAll(body);
+		}
 		
 		return param;
 	}
@@ -180,7 +200,14 @@ public class KakaoExtensionServiceImpl implements KakaoExtensionService {
 		String endpointId = (String)body.get(KEY_INFO.BODY_KEY_ENDPOINT_ID);
 		String capabilityName = (String)body.get(KEY_INFO.BODY_KEY_CAPABILITY_NAME);
 		
-		param.put(KEY_INFO.HTTP_KEY_BODY, kMsgHandler.sendDeviceAction(dong, ho, endpointId, capabilityName, desired));
+		Map<String, Object> retMap = kMsgHandler.sendDeviceAction(dong, ho, endpointId, capabilityName, desired);
+		
+		if(retMap.containsKey(KEY_INFO.HTTP_KEY_ERROR)) {
+			param.putAll(retMap);
+			param.remove(KEY_INFO.HTTP_KEY_BODY);
+		}
+		else
+			param.put(KEY_INFO.HTTP_KEY_BODY, kMsgHandler.sendDeviceAction(dong, ho, endpointId, capabilityName, desired));
 		return param;
 	}
 }

+ 137 - 12
src/main/java/com/icontrols/kakao/socket/wallpad/KakaoMsgHandler.java

@@ -222,17 +222,67 @@ public class KakaoMsgHandler {
 	 */
 	public Map<String, Object> getDeviceStatus(int dong, int ho, String endpointId){
 		Map<String, Object> retMap = new HashMap<String, Object>();
+		String modelId = "";
+		int devNum = 1;
+
+		Document doc = null;
+
+		// endpoint Id로 존재하는 THINGS 인지 확인 
+		// 발생 ERROR FAIL_NONEXIST
+		try {
+			String[] tmpSplit = endpointId.split("_");
+			
+			modelId = tmpSplit[0];
+			devNum = Integer.parseInt(tmpSplit[1]);	// 회로 번호
+			
+			if(!THINGS_INFO.isExistThings(modelId)) {
+				retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_NONEXIST));
+				logger.error("[ERROR]-[(" + endpointId + ") - Non Exist]");
+				return retMap;
+			}
+		}catch(Exception e) { 
+			retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_NONEXIST));
+			logger.error("[ERROR]-[(" + endpointId + ") - Non Exist]");
+			return retMap;
+		}
 		
-		String[] tmpSplit = endpointId.split("_");
-		
-		String modelId = tmpSplit[0];				// 기기 ID
-		int devNum = Integer.parseInt(tmpSplit[1]);	// 회로 번호
-		
-		Document doc = new WallpadMsgSender().remoteDeviceStatus(dong, ho, modelId, devNum);
+		try {
+			doc = new WallpadMsgSender().remoteDeviceStatus(dong, ho, modelId, devNum);
+			
+			if(doc == null) {
+				retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_UNREACHABLE));
+				logger.error("[ERROR]-[Document is Null] - [" + dong + "-" + ho + "] ["+ modelId +"]");
+				return retMap;
+			}
+		}catch(Exception e) { 
+			retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_NONEXIST));
+			logger.error("[ERROR]-[(" + endpointId + ") - Non Exist]");
+			return retMap;
+		}
 		
-		if(doc == null) {
-			retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_UNREACHABLE));
-			logger.error("[ERROR]-[Document is Null] - [" + dong + "-" + ho + "] ["+ modelId +"]");
+		return getStatusMap(endpointId, doc);
+	}
+	
+	public Map<String, Object> getDeviceStatus_bak(int dong, int ho, String endpointId){
+		Map<String, Object> retMap = new HashMap<String, Object>();
+		Document doc = null;
+
+		try {
+			String[] tmpSplit = endpointId.split("_");
+			
+			String modelId = tmpSplit[0];				// 기기 ID
+			int devNum = Integer.parseInt(tmpSplit[1]);	// 회로 번호
+			
+			doc = new WallpadMsgSender().remoteDeviceStatus(dong, ho, modelId, devNum);
+			
+			if(doc == null) {
+				retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_UNREACHABLE));
+				logger.error("[ERROR]-[Document is Null] - [" + dong + "-" + ho + "] ["+ modelId +"]");
+				return retMap;
+			}
+		}catch(Exception e) { 
+			retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_NONEXIST));
+			logger.error("[ERROR]-[(" + endpointId + ") - Non Exist]");
 			return retMap;
 		}
 		
@@ -267,12 +317,13 @@ public class KakaoMsgHandler {
 			retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_INVALID_REQ));
 			return retMap;
 		}
-		String action = KakaoMsgHandler.setDeviceActionStr(modelId, desired);
+		String action = KakaoMsgHandler.setDeviceActionStr(modelId, actionName, desired);
 		
 		if(action.length() == 0) {
 			retMap.put(KEY_INFO.HTTP_KEY_ERROR, KAKAO_RESULT.getErrorInfo(KAKAO_RESULT.FAIL_INVALID_REQ));
 			return retMap;
 		}
+		
 		Document doc = new WallpadMsgSender().remoteDeviceControl(
 																dong, 
 																ho, 
@@ -427,7 +478,76 @@ public class KakaoMsgHandler {
 	 * @param desired
 	 * @return
 	 */
-	public static String setDeviceActionStr(String modelId, Map<String, Object> desired) {
+	
+	public static String setDeviceActionStr(String modelId, String actionName, Map<String, Object> desired) {
+		StringBuffer sb = new StringBuffer();
+		
+		THINGS_INFO.THINGS things = THINGS_INFO.getThingsType(modelId);
+		try {
+			switch(things.getEndPoint()) {
+			case THINGS_INFO.THINGS_LIGHT:
+				if(actionName.equals("Power") && desired.containsKey("power")) {
+					String tmpState = (String)desired.get("power");
+					if(tmpState.equals("on") || tmpState.equals("off")) sb.append(tmpState);
+				}
+				break;
+				
+			case THINGS_INFO.THINGS_TEMPER:
+				if(actionName.equals("Power") && desired.containsKey("power")) {
+					String tmpState = (String)desired.get("power");
+					if(tmpState.equals("on") || tmpState.equals("off")) sb.append(tmpState);
+				}
+					
+				if(actionName.equals("TemperatureSetpoint") && desired.containsKey("targetSetpoint")) {
+					double tempPoint = (double)desired.get("targetSetpoint");
+					sb.append("on/").append(Double.toString(tempPoint));
+				}
+				
+				break;
+				
+			case THINGS_INFO.THINGS_GAS:
+				if(actionName.equals("Lock") && desired.containsKey("locked")){
+					if((boolean)desired.get("locked"))
+						sb.append("close");
+				}
+				break;
+				
+			case THINGS_INFO.THINGS_VENTIL:
+				if(actionName.equals("Power") && desired.containsKey("power")) {
+					String tmpState = (String)desired.get("power");
+					if(tmpState.equals("on") || tmpState.equals("off")) sb.append(tmpState);
+				}
+				
+				if(actionName.equals("AirFlow") && desired.containsKey("fanSpeed")) {
+					String tmpFanSpeed = (String)desired.get("fanSpeed");
+					
+					if(tmpFanSpeed.equals("low") || tmpFanSpeed.equals("middle") || tmpFanSpeed.equals("high"))
+						sb.append("on/").append(desired.get("fanSpeed"));
+				}
+				break;
+				
+			case THINGS_INFO.THINGS_ELECPLUG:
+				if(desired.containsKey("power")) sb.append(desired.get("power"));
+				else if(desired.containsKey("mode")) sb.append(desired.get("mode"));
+				break;
+				
+			case THINGS_INFO.THINGS_ELEVATOR:
+				if(actionName.equals("ElevatorCall") && desired.containsKey("callDirection")) {
+					if("down".equalsIgnoreCase((String)desired.get("callDirection"))) {
+						sb.append(desired.get("callDirection"));
+					}
+				}
+			}
+		}catch(Exception e) {
+			
+		}
+		
+		
+		logger.info("[---->>]" + sb.toString());
+		return sb.toString();
+	}
+	
+	public static String setDeviceActionStr_bak(String modelId, Map<String, Object> desired) {
 		StringBuffer sb = new StringBuffer();
 		
 		THINGS_INFO.THINGS things = THINGS_INFO.getThingsType(modelId);
@@ -454,10 +574,12 @@ public class KakaoMsgHandler {
 			if(desired.containsKey("power")) sb.append(desired.get("power"));
 			else if(desired.containsKey("fanSpeed")) sb.append("on/").append(desired.get("fanSpeed"));
 			break;
+			
 		case THINGS_INFO.THINGS_ELECPLUG:
 			if(desired.containsKey("power")) sb.append(desired.get("power"));
 			else if(desired.containsKey("mode")) sb.append(desired.get("mode"));
 			break;
+			
 		case THINGS_INFO.THINGS_ELEVATOR:
 			if(desired.containsKey("callDirection")) {
 				if("down".equalsIgnoreCase((String)desired.get("callDirection"))) {
@@ -503,7 +625,10 @@ public class KakaoMsgHandler {
 			
 		case THINGS_INFO.THINGS_VENTIL:
 			state.put("power", splitStr[0]);
-			if(splitStr[0].equalsIgnoreCase("on")) state.put("fanSpeed", splitStr[1]);
+			if(splitStr[0].equalsIgnoreCase("on")) {
+				if(splitStr[1].equals("mid")) state.put("fanSpeed", "middle");
+				else state.put("fanSpeed", splitStr[1]);
+			}
 			break;
 		case THINGS_INFO.THINGS_ELEVATOR:
 			state.put("callDirection", "down");